{"version":3,"file":"mass-tools.min.js","sources":["../node_modules/is-any-array/lib-esm/index.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedian.js","../node_modules/ml-spectra-processing/lib-esm/x/xCheck.js","../node_modules/ml-array-rescale/lib-es6/index.js","../node_modules/ml-array-min/lib-es6/index.js","../node_modules/ml-array-max/lib-es6/index.js","../node_modules/ml-matrix/src/inspect.js","../node_modules/ml-matrix/src/util.js","../node_modules/ml-matrix/src/matrix.js","../node_modules/ml-matrix/src/stat.js","../node_modules/ml-matrix/src/mathOperations.js","../node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","../node_modules/ml-matrix/src/dc/lu.js","../node_modules/ml-matrix/src/dc/util.js","../node_modules/ml-matrix/src/dc/qr.js","../node_modules/ml-matrix/src/dc/svd.js","../node_modules/ml-matrix/src/decompositions.js","../node_modules/ml-matrix/src/dc/cholesky.js","../node_modules/ml-spectra-processing/lib-esm/x/xFindClosestIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xGetFromToIndex.js","../node_modules/ml-spectra-processing/lib-esm/x/xMaxValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinValue.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsMonotonic.js","../node_modules/ml-spectra-processing/lib-esm/x/xMinMaxValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xNoiseStandardDeviation.js","../node_modules/ml-spectra-processing/lib-esm/x/xMedianAbsoluteDeviation.js","../node_modules/ml-spectra-processing/lib-esm/x/xSum.js","../node_modules/ml-spectra-processing/lib-esm/x/xNormed.js","../node_modules/ml-spectra-processing/lib-esm/x/utils/getOutputArray.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyCheck.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyFilterTopYValues.js","../node_modules/ml-spectra-processing/lib-esm/x/xSort.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyJoinX.js","../node_modules/ml-spectra-processing/lib-esm/xy/xySortX.js","../node_modules/ml-spectra-processing/lib-esm/xyArray/xyArrayAlign.js","../node_modules/ml-spectra-processing/lib-esm/xyArray/utils/getSlots.js","../node_modules/ml-spectra-processing/lib-esm/xyArray/xyArrayWeightedMerge.js","../node_modules/ml-spectra-processing/lib-esm/xyArray/xyArrayAlignToFirst.js","../node_modules/ml-spectra-processing/lib-esm/xyArray/utils/getSlotsToFirst.js","../node_modules/ml-spectra-processing/lib-esm/xyObject/xyObjectCheck.js","../node_modules/ml-spectra-processing/lib-esm/xyObject/xyObjectMaxXPoint.js","../node_modules/ml-spectra-processing/lib-esm/xyObject/xyObjectMinXPoint.js","../node_modules/ml-xsadd/lib-es6/xsadd.js","../node_modules/ml-spectra-processing/lib-esm/utils/createRandomArray.js","../packages/ms-spectrum/src/getBestPeaks.js","../packages/mf-parser/src/Kind.js","../packages/mf-parser/src/util/parseCharge.js","../packages/mf-parser/src/parse.js","../packages/mf-parser/src/util/subSuperscript.js","../packages/mf-parser/src/Format.js","../packages/mf-parser/src/util/formatCharge.js","../packages/mf-parser/src/util/toDisplay.js","../packages/mf-parser/src/Style.js","../packages/chemical-elements/src/constants.js","../packages/chemical-elements/src/elementsAndIsotopes.js","../packages/chemical-elements/src/elements.js","../packages/chemical-elements/src/elementsAndIsotopesObject.js","../packages/chemical-elements/src/elementsAndStableIsotopes.js","../packages/chemical-elements/src/elementsAndStableIsotopesObject.js","../packages/chemical-elements/src/elementsObject.js","../packages/chemical-elements/src/stableIsotopesObject.js","../packages/chemical-elements/src/isotopesObject.js","../packages/chemical-elements/src/unsaturationsObject.js","../packages/mf-parser/src/ensureCase.js","../packages/chemical-groups/src/groups.js","../packages/chemical-groups/src/groupsObject.js","../packages/chemical-groups/src/groupsToSequence.js","../packages/mf-parser/src/util/getIsotopeRatioInfo.js","../packages/mf-parser/src/util/getEA.js","../packages/mf-parser/src/util/getElements.js","../packages/mf-parser/src/util/partToAtoms.js","../packages/mf-parser/src/util/partToMF.js","../packages/mf-parser/src/util/getInfo.js","../packages/mf-parser/src/util/getIsotopesInfo.js","../packages/mf-parser/src/util/partsToMF.js","../packages/atom-sorter/src/index.js","../packages/mf-parser/src/util/toParts.js","../packages/mf-parser/src/MF.js","../packages/mf-parser/src/util/toHtml.js","../packages/mf-parser/src/util/toText.js","../packages/mf-parser/src/util/partsToDisplay.js","../packages/ms-spectrum/src/getPeaks.js","../node_modules/ml-spectra-processing/lib-esm/xyObject/xyObjectSumY.js","../node_modules/peaks-similarity/lib-esm/calculateOverlapFromDiff.js","../node_modules/peaks-similarity/lib-esm/checkPeaks.js","../node_modules/peaks-similarity/lib-esm/extract.js","../node_modules/peaks-similarity/lib-esm/getCommonArray.js","../node_modules/ml-stat/array.js","../node_modules/ml-stat/matrix.js","../node_modules/ml-stat/index.js","../node_modules/peaks-similarity/lib-esm/normalize.js","../node_modules/peaks-similarity/lib-esm/commonExtractAndNormalize.js","../node_modules/peaks-similarity/lib-esm/extractAndNormalize.js","../node_modules/peaks-similarity/lib-esm/getIntersection.js","../node_modules/peaks-similarity/lib-esm/index.js","../node_modules/@lukeed/uuid/dist/index.mjs","../node_modules/ml-savitzky-golay-generalized/lib-esm/index.js","../node_modules/ml-gsd/lib-esm/gsd.js","../node_modules/ml-spectra-processing/lib-esm/x/xIsEquallySpaced.js","../node_modules/ml-gsd/lib-esm/utils/optimizeTop.js","../node_modules/ml-peak-shape-generator/lib-esm/util/constants.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/gaussian/Gaussian.js","../node_modules/ml-peak-shape-generator/lib-esm/util/erfinv.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/lorentzian/Lorentzian.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/pseudoVoigt/PseudoVoigt.js","../node_modules/ml-peak-shape-generator/lib-esm/shapes/1d/getShape1D.js","../packages/ms-spectrum/src/appendPeaksCharge.js","../packages/ms-spectrum/src/peakPicking.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyEnsureGrowingX.js","../node_modules/ml-regression-base/src/maybeToPrecision.js","../node_modules/ml-regression-base/src/checkArrayLength.js","../node_modules/ml-regression-base/src/index.js","../node_modules/ml-regression-simple-linear/node_modules/ml-regression-base/lib-esm/checkArrayLength.js","../node_modules/ml-regression-simple-linear/node_modules/ml-regression-base/lib-esm/maybeToPrecision.js","../node_modules/ml-regression-simple-linear/node_modules/ml-regression-base/lib-esm/index.js","../node_modules/ml-regression-simple-linear/lib-esm/index.js","../node_modules/ml-regression-power/src/index.js","../packages/ms-spectrum/src/Spectrum.js","../packages/ms-spectrum/src/peaksWidth.js","../packages/ms-spectrum/src/getPeakChargeBySimilarity.js","../packages/ms-spectrum/src/getFragmentPeaks.js","../packages/ms-spectrum/src/isContinuous.js","../packages/ms-spectrum/src/getMassRemainder.js","../packages/ms-spectrum/src/MSComparator.js","../node_modules/ml-distance/lib-esm/similarities/cosine.js","../node_modules/ml-spectra-processing/lib-esm/xy/xyFilterMinYValue.js","../packages/ms-spectrum/src/jsgraph/getPeaksAnnotation.js","../packages/ms-spectrum/src/jsgraph/index.js","../packages/mf-matcher/src/unsaturationMatcher.js","../packages/mf-matcher/src/generalMatcher.js","../packages/mf-utilities/src/getMsInfo.js","../packages/mf-utilities/src/getMsem.js","../packages/mf-utilities/src/mfDiff.js","../packages/mf-utilities/src/processRange.js","../packages/mf-utilities/src/preprocessIonizations.js","../packages/mf-utilities/src/preprocessRanges.js","../packages/mf-matcher/src/msemMatcher.js","../packages/mf-finder/src/TargetMassCache.js","../packages/mf-finder/src/findMFsSync.js","../packages/mf-finder/src/findMFs.js","../node_modules/sum-object-keys/lib/index.js","../packages/mf-generator/src/generateMFs.js","../node_modules/openchemlib-utils/lib-esm/util/makeRacemic.js","../node_modules/openchemlib-utils/lib-esm/util/getXAtomicNumber.js","../node_modules/openchemlib-utils/lib-esm/util/tagAtom.js","../node_modules/openchemlib-utils/lib-esm/util/isCsp3.js","../node_modules/openchemlib-utils/lib-esm/hose/getHoseCodesForAtomsInternal.js","../node_modules/openchemlib-utils/lib-esm/diastereotopic/getChiralOrHeterotopicCarbons.js","../node_modules/openchemlib-utils/lib-esm/hose/getHoseCodesForAtoms.js","../node_modules/openchemlib-utils/lib-esm/diastereotopic/ensureHeterotopicChiralBonds.js","../node_modules/openchemlib-utils/lib-esm/util/getMF.js","../node_modules/papaparse/papaparse.min.js","../node_modules/openchemlib-utils/lib-esm/reaction/utils/getReactantInfo.js","../node_modules/openchemlib-utils/lib-esm/util/getCharge.js","../node_modules/openchemlib-utils/lib-esm/reaction/utils/applyOneReactantReaction.js","../node_modules/openchemlib-utils/lib-esm/reaction/utils/trimTree.js","../node_modules/openchemlib-utils/lib-esm/reaction/utils/groupTreesByProducts.js","../node_modules/openchemlib-utils/lib-esm/reaction/applyReactions.js","../packages/mass-fragmentation/src/utils/getFragmentableRings.js","../packages/mass-fragmentation/src/utils/getRingsInfo.js","../packages/mass-fragmentation/src/fragment.js","../packages/mass-fragmentation/src/fragmentAcyclicBonds.js","../packages/mass-fragmentation/src/fragmentRings.js","../node_modules/openchemlib/dist/openchemlib-core.js","../node_modules/openchemlib/core.js","../packages/mass-fragmentation/src/database/getDatabase.js","../packages/mass-fragmentation/src/utils/getMasses.js","../packages/mass-fragmentation/src/reactionFragmentation.js","../packages/emdb/src/from/fromMolecules.js","../packages/nucleotide/src/sequenceToMF.js","../packages/nucleotide/src/ensureUppercaseSequence.js","../packages/nucleotide/src/furanThreeTerm.js","../packages/nucleotide/src/addFiveTerm.js","../packages/nucleotide/src/baseLoss.js","../packages/nucleotide/src/addFiveTermBaseLoss.js","../packages/nucleotide/src/addInternalTerm.js","../packages/nucleotide/src/addThreeTerm.js","../packages/nucleotide/src/addThreeTermBaseLoss.js","../packages/nucleotide/src/generateFragments.js","../packages/peptide/src/aminoAcids.js","../packages/peptide/src/isoElectricPoint.js","../packages/peptide/src/splitPeptide.js","../packages/peptide/src/allowNeutralLoss.js","../packages/peptide/src/getAA.js","../packages/peptide/src/chargePeptide.js","../packages/peptide/src/sequenceToMF.js","../packages/peptide/src/generatePeptideFragments.js","../packages/peptide/src/digestPeptide.js","../packages/peptide/src/index.js","../packages/emdb/src/from/util/fragmentPeptide.js","../node_modules/jszip/dist/jszip.min.js","../node_modules/cross-fetch/dist/browser-ponyfill.js","../packages/emdb/src/util/fetchArrayBuffer.js","../packages/emdb/src/loadCommercials.js","../packages/mf-from-google-sheet/src/util/fetchText.js","../packages/emdb/src/loadGoogleSheet.js","../packages/mf-from-google-sheet/src/index.js","../packages/emdb/src/loadKnapSack.js","../node_modules/spectrum-generator/lib-esm/util/addNoise.js","../node_modules/ml-spectra-processing/lib-esm/x/xAdd.js","../node_modules/spectrum-generator/lib-esm/SpectrumGenerator.js","../node_modules/spectrum-generator/lib-esm/util/addBaseline.js","../packages/isotopic-distribution/src/utils/multiply.js","../packages/isotopic-distribution/src/Distribution.js","../packages/isotopic-distribution/src/utils/power.js","../packages/isotopic-distribution/src/utils/joinX.js","../packages/isotopic-distribution/src/utils/closestPointX.js","../packages/isotopic-distribution/src/utils/getDerivedCompositionInfo.js","../packages/isotopic-distribution/src/IsotopicDistribution.js","../node_modules/median-quickselect/lib/median-quickselect.min.js","../node_modules/ml-array-median/lib-es6/index.js","../node_modules/ml-regression-theil-sen/src/index.js","../packages/emdb/src/massShifts.js","../packages/emdb/src/index.js","../packages/emdb/src/from/fromMonoisotopicMass.js","../packages/emdb/src/from/fromArray.js","../packages/emdb/src/from/fromRange.js","../packages/emdb/src/from/fromPeptidicSequence.js","../packages/emdb/src/append/appendFragmentsInfo.js","../packages/emdb/src/from/fromNucleicSequence.js","../packages/emdb/src/search.js","../packages/emdb/src/searchMSEM.js","../packages/emdb/src/searchSimilarity.js","../node_modules/ml-fcnnls/lib-esm/util/sortCollectionSet.js","../node_modules/ml-fcnnls/lib-esm/cssls.js","../node_modules/ml-fcnnls/lib-esm/util/setDifference.js","../node_modules/ml-fcnnls/lib-esm/optimality.js","../node_modules/ml-fcnnls/lib-esm/util/selection.js","../node_modules/ml-fcnnls/lib-esm/fcnnls.js","../node_modules/ml-fcnnls/lib-esm/initialisation.js","../packages/mfs-deconvolution/src/getPeakWidthFct.js","../packages/mfs-deconvolution/src/mfsDeconvolution.js","../node_modules/ml-fcnnls/lib-esm/fcnnlsVector.js","../packages/mfs-deconvolution/src/reconstruct.js","../packages/ms-report/src/appendInternals.js","../packages/ms-report/src/appendResidues.js","../node_modules/@svgdotjs/svg.js/dist/svg.esm.js","../packages/ms-report/src/getPaper.browser.js","../packages/ms-report/src/appendResiduesPosition.js","../packages/ms-report/src/appendResults.js","../packages/ms-report/src/draw/drawLabel.js","../packages/ms-report/src/draw/drawInternals.js","../packages/ms-report/src/draw/drawSequence.js","../packages/ms-report/src/draw/drawTerminals.js","../packages/ms-report/src/sequenceSVG.js","../packages/ms-report/src/appendRows.js","../packages/ms-report/src/appendRowsInformation.js","../packages/ms-report/src/draw/addCSS.js","../packages/ms-report/src/draw/addScript.js","../packages/ms-report/src/draw/drawReplacements.js","../packages/mf-from-ea/src/index.js","../packages/octochemdb/src/utils/appendAllDBRefs.js","../packages/octochemdb/src/utils/appendURLs.js","../packages/octochemdb/src/utils/fetchJSON.js","../packages/octochemdb/src/utils/postFetchJSON.js","../packages/octochemdb/src/utils/includeDBRefs.js","../packages/octochemdb/src/activeOrNaturalDetails.js","../packages/octochemdb/src/utils/normalizeActivities.js","../packages/octochemdb/src/utils/parseMasses.js","../packages/octochemdb/src/utils/searchWithIonizations.js","../packages/octochemdb/src/utils/getAllowedEMs.js","../packages/octochemdb/src/activesOrNaturals.js","../packages/octochemdb/src/compoundsFromMF.js","../packages/octochemdb/src/gnps.js","../packages/octochemdb/src/massBank.js","../packages/octochemdb/src/massSpectra.js","../node_modules/@orama/orama/dist/components/tokenizer/languages.js","../node_modules/@orama/orama/dist/utils.js","../node_modules/@orama/orama/dist/errors.js","../node_modules/@orama/orama/dist/components/defaults.js","../node_modules/@orama/orama/dist/components/internal-document-id-store.js","../node_modules/@orama/orama/dist/components/documents-store.js","../node_modules/@orama/orama/dist/components/hooks.js","../node_modules/@orama/orama/dist/trees/avl.js","../node_modules/@orama/orama/dist/trees/radix.js","../node_modules/@orama/orama/dist/components/levenshtein.js","../node_modules/@orama/orama/dist/components/algorithms.js","../node_modules/@orama/orama/dist/components/index.js","../node_modules/@orama/orama/dist/components/cosine-similarity.js","../node_modules/@orama/orama/dist/components/tokenizer/diacritics.js","../node_modules/@orama/orama/dist/components/tokenizer/english-stemmer.js","../node_modules/@orama/orama/dist/components/tokenizer/index.js","../node_modules/@orama/orama/dist/components/sorter.js","../node_modules/@orama/orama/dist/methods/create.js","../node_modules/@orama/orama/dist/types.js","../node_modules/@orama/orama/dist/components/sync-blocking-checker.js","../node_modules/@orama/orama/dist/methods/insert.js","../node_modules/@orama/orama/dist/components/facets.js","../node_modules/@orama/orama/dist/components/groups.js","../node_modules/@orama/orama/dist/methods/search.js","../node_modules/@orama/orama/dist/components/filters.js","../packages/octochemdb/src/summarizer/utils/searchActivitiesDB.js","../packages/octochemdb/src/summarizer/utils/searchPatentsDB.js","../packages/octochemdb/src/summarizer/utils/searchPubmedsDB.js","../packages/octochemdb/src/summarizer/utils/searchTaxonomiesDB.js","../packages/octochemdb/src/taxonomy/taxonomyRanks.js","../packages/octochemdb/src/taxonomy/createTaxonomyTree.js","../packages/mass-tools/src/index.js","../packages/octochemdb/src/summarizer/ActiveOrNaturalSummarizer.js","../packages/octochemdb/src/summarizer/utils/summarizeEmptyTerms.js","../packages/octochemdb/src/summarizer/utils/getPubmedsDB.js","../packages/octochemdb/src/summarizer/utils/getActivitiesDB.js","../packages/octochemdb/src/summarizer/utils/getPatentsDB.js","../packages/octochemdb/src/summarizer/utils/getTaxonomiesDB.js","../packages/octochemdb/src/OctoChemDB.js","../packages/octochemdb/src/mfsFromEMs.js","../packages/octochemdb/src/activesOrNaturalsByMF.js","../packages/octochemdb/src/pubmedCompounds.js","../packages/mf-utilities/src/getRangesForFragment.js","../packages/mf-from-ea/src/preprocessEARanges.js"],"sourcesContent":["// 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';\n/**\n * Calculates the median of an array\n *\n * @param input - Array containing values\n * @returns - median\n */\nexport function xMedian(input) {\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    const array = input.slice();\n    let low = 0;\n    let high = array.length - 1;\n    let middle = 0;\n    let currentLow = 0;\n    let currentHigh = 0;\n    let median = calcMiddle(low, high);\n    while (true) {\n        if (high <= low) {\n            return array[median];\n        }\n        if (high === low + 1) {\n            if (array[low] > array[high]) {\n                swap(array, low, high);\n            }\n            return array[median];\n        }\n        // Find median of low, middle and high items; swap into position low\n        middle = calcMiddle(low, high);\n        if (array[middle] > array[high])\n            swap(array, middle, high);\n        if (array[low] > array[high])\n            swap(array, low, high);\n        if (array[middle] > array[low])\n            swap(array, middle, low);\n        // Swap low item (now in position middle) into position (low+1)\n        swap(array, middle, low + 1);\n        // Nibble from each end towards middle, swapping items when stuck\n        currentLow = low + 1;\n        currentHigh = high;\n        while (true) {\n            do\n                currentLow++;\n            while (array[low] > array[currentLow]);\n            do\n                currentHigh--;\n            while (array[currentHigh] > array[low]);\n            if (currentHigh < currentLow) {\n                break;\n            }\n            swap(array, currentLow, currentHigh);\n        }\n        // Swap middle item (in position low) back into correct position\n        swap(array, low, currentHigh);\n        // Re-set active partition\n        if (currentHigh <= median) {\n            low = currentLow;\n        }\n        if (currentHigh >= median) {\n            high = currentHigh - 1;\n        }\n    }\n}\nfunction swap(array, i, j) {\n    const temp = array[j];\n    array[j] = array[i];\n    array[i] = temp;\n}\nfunction calcMiddle(i, j) {\n    return Math.floor((i + j) / 2);\n}\n//# sourceMappingURL=xMedian.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Checks if input is of type array\n *\n * @param input - input\n */\nexport function xCheck(input, options = {}) {\n    const { minLength } = options;\n    if (!isAnyArray(input)) {\n        throw new TypeError('input must be an array');\n    }\n    if (input.length === 0) {\n        throw new TypeError('input must not be empty');\n    }\n    if (minLength && input.length < minLength) {\n        throw new Error(`input must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xCheck.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  } else if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var output;\n\n  if (options.output !== undefined) {\n    if (!isAnyArray(options.output)) {\n      throw new TypeError('output option must be an array if specified');\n    }\n\n    output = options.output;\n  } else {\n    output = new Array(input.length);\n  }\n\n  var currentMin = min(input);\n  var currentMax = max(input);\n\n  if (currentMin === currentMax) {\n    throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n  }\n\n  var _options$min = options.min,\n      minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n      _options$max = options.max,\n      maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n  if (minValue >= maxValue) {\n    throw new RangeError('min option must be smaller than max option');\n  }\n\n  var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n  for (var i = 0; i < input.length; i++) {\n    output[i] = (input[i] - currentMin) * factor + minValue;\n  }\n\n  return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var minValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] < minValue) minValue = input[i];\n  }\n\n  return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isAnyArray(input)) {\n    throw new TypeError('input must be an array');\n  }\n\n  if (input.length === 0) {\n    throw new TypeError('input must not be empty');\n  }\n\n  var _options$fromIndex = options.fromIndex,\n      fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n      _options$toIndex = options.toIndex,\n      toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n  if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n    throw new Error('fromIndex must be a positive integer smaller than length');\n  }\n\n  if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n    throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n  }\n\n  var maxValue = input[fromIndex];\n\n  for (var i = fromIndex + 1; i < toIndex; i++) {\n    if (input[i] > maxValue) maxValue = input[i];\n  }\n\n  return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n  return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n  const {\n    maxRows = 15,\n    maxColumns = 10,\n    maxNumSize = 8,\n    padMinus = 'auto',\n  } = options;\n  return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n  const { rows, columns } = matrix;\n  const maxI = Math.min(rows, maxRows);\n  const maxJ = Math.min(columns, maxColumns);\n  const result = [];\n\n  if (padMinus === 'auto') {\n    padMinus = false;\n    loop: for (let i = 0; i < maxI; i++) {\n      for (let j = 0; j < maxJ; j++) {\n        if (matrix.get(i, j) < 0) {\n          padMinus = true;\n          break loop;\n        }\n      }\n    }\n  }\n\n  for (let i = 0; i < maxI; i++) {\n    let line = [];\n    for (let j = 0; j < maxJ; j++) {\n      line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n    }\n    result.push(`${line.join(' ')}`);\n  }\n  if (maxJ !== columns) {\n    result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n  }\n  if (maxI !== rows) {\n    result.push(`... ${rows - maxRows} more rows`);\n  }\n  return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n  return (\n    num >= 0 && padMinus\n      ? ` ${formatNumber2(num, maxNumSize - 1)}`\n      : formatNumber2(num, maxNumSize)\n  ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n  // small.length numbers should be as is\n  let str = num.toString();\n  if (str.length <= len) return str;\n\n  // (7)'0.00123' is better then (7)'1.23e-2'\n  // (8)'0.000123' is worse then (7)'1.23e-3',\n  let fix = num.toFixed(len);\n  if (fix.length > len) {\n    fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n  }\n  if (\n    fix.length <= len &&\n    !fix.startsWith('0.000') &&\n    !fix.startsWith('-0.000')\n  ) {\n    return fix;\n  }\n\n  // well, if it's still too long the user should've used longer numbers\n  let exp = num.toExponential(len);\n  if (exp.length > len) {\n    exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n  }\n  return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n  let max = outer ? matrix.rows : matrix.rows - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Row index out of range');\n  }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n  let max = outer ? matrix.columns : matrix.columns - 1;\n  if (index < 0 || index > max) {\n    throw new RangeError('Column index out of range');\n  }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.columns) {\n    throw new RangeError(\n      'vector size must be the same as the number of columns',\n    );\n  }\n  return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n  if (vector.to1DArray) {\n    vector = vector.to1DArray();\n  }\n  if (vector.length !== matrix.rows) {\n    throw new RangeError('vector size must be the same as the number of rows');\n  }\n  return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n  if (!isAnyArray(rowIndices)) {\n    throw new TypeError('row indices must be an array');\n  }\n\n  for (let i = 0; i < rowIndices.length; i++) {\n    if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n      throw new RangeError('row indices are out of range');\n    }\n  }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n  if (!isAnyArray(columnIndices)) {\n    throw new TypeError('column indices must be an array');\n  }\n\n  for (let i = 0; i < columnIndices.length; i++) {\n    if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n      throw new RangeError('column indices are out of range');\n    }\n  }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n  if (arguments.length !== 5) {\n    throw new RangeError('expected 4 arguments');\n  }\n  checkNumber('startRow', startRow);\n  checkNumber('endRow', endRow);\n  checkNumber('startColumn', startColumn);\n  checkNumber('endColumn', endColumn);\n  if (\n    startRow > endRow ||\n    startColumn > endColumn ||\n    startRow < 0 ||\n    startRow >= matrix.rows ||\n    endRow < 0 ||\n    endRow >= matrix.rows ||\n    startColumn < 0 ||\n    startColumn >= matrix.columns ||\n    endColumn < 0 ||\n    endColumn >= matrix.columns\n  ) {\n    throw new RangeError('Submatrix indices are out of range');\n  }\n}\n\nexport function newArray(length, value = 0) {\n  let array = [];\n  for (let i = 0; i < length; i++) {\n    array.push(value);\n  }\n  return array;\n}\n\nfunction checkNumber(name, value) {\n  if (typeof value !== 'number') {\n    throw new TypeError(`${name} must be a number`);\n  }\n}\n\nexport function checkNonEmpty(matrix) {\n  if (matrix.isEmpty()) {\n    throw new Error('Empty matrix has no elements to index');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n  sumByRow,\n  sumByColumn,\n  sumAll,\n  productByRow,\n  productByColumn,\n  productAll,\n  varianceByRow,\n  varianceByColumn,\n  varianceAll,\n  centerByRow,\n  centerByColumn,\n  centerAll,\n  scaleByRow,\n  scaleByColumn,\n  scaleAll,\n  getScaleByRow,\n  getScaleByColumn,\n  getScaleAll,\n} from './stat';\nimport {\n  checkRowVector,\n  checkRowIndex,\n  checkColumnIndex,\n  checkColumnVector,\n  checkRange,\n  checkNonEmpty,\n  checkRowIndices,\n  checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n  static from1DArray(newRows, newColumns, newData) {\n    let length = newRows * newColumns;\n    if (length !== newData.length) {\n      throw new RangeError('data length does not match given dimensions');\n    }\n    let newMatrix = new Matrix(newRows, newColumns);\n    for (let row = 0; row < newRows; row++) {\n      for (let column = 0; column < newColumns; column++) {\n        newMatrix.set(row, column, newData[row * newColumns + column]);\n      }\n    }\n    return newMatrix;\n  }\n\n  static rowVector(newData) {\n    let vector = new Matrix(1, newData.length);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(0, i, newData[i]);\n    }\n    return vector;\n  }\n\n  static columnVector(newData) {\n    let vector = new Matrix(newData.length, 1);\n    for (let i = 0; i < newData.length; i++) {\n      vector.set(i, 0, newData[i]);\n    }\n    return vector;\n  }\n\n  static zeros(rows, columns) {\n    return new Matrix(rows, columns);\n  }\n\n  static ones(rows, columns) {\n    return new Matrix(rows, columns).fill(1);\n  }\n\n  static rand(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { random = Math.random } = options;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.set(i, j, random());\n      }\n    }\n    return matrix;\n  }\n\n  static randInt(rows, columns, options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1000, random = Math.random } = options;\n    if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n    if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let interval = max - min;\n    let matrix = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        let value = min + Math.round(random() * interval);\n        matrix.set(i, j, value);\n      }\n    }\n    return matrix;\n  }\n\n  static eye(rows, columns, value) {\n    if (columns === undefined) columns = rows;\n    if (value === undefined) value = 1;\n    let min = Math.min(rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, value);\n    }\n    return matrix;\n  }\n\n  static diag(data, rows, columns) {\n    let l = data.length;\n    if (rows === undefined) rows = l;\n    if (columns === undefined) columns = rows;\n    let min = Math.min(l, rows, columns);\n    let matrix = this.zeros(rows, columns);\n    for (let i = 0; i < min; i++) {\n      matrix.set(i, i, data[i]);\n    }\n    return matrix;\n  }\n\n  static min(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new Matrix(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static max(matrix1, matrix2) {\n    matrix1 = this.checkMatrix(matrix1);\n    matrix2 = this.checkMatrix(matrix2);\n    let rows = matrix1.rows;\n    let columns = matrix1.columns;\n    let result = new this(rows, columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n      }\n    }\n    return result;\n  }\n\n  static checkMatrix(value) {\n    return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n  }\n\n  static isMatrix(value) {\n    return value != null && value.klass === 'Matrix';\n  }\n\n  get size() {\n    return this.rows * this.columns;\n  }\n\n  apply(callback) {\n    if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        callback.call(this, i, j);\n      }\n    }\n    return this;\n  }\n\n  to1DArray() {\n    let array = [];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        array.push(this.get(i, j));\n      }\n    }\n    return array;\n  }\n\n  to2DArray() {\n    let copy = [];\n    for (let i = 0; i < this.rows; i++) {\n      copy.push([]);\n      for (let j = 0; j < this.columns; j++) {\n        copy[i].push(this.get(i, j));\n      }\n    }\n    return copy;\n  }\n\n  toJSON() {\n    return this.to2DArray();\n  }\n\n  isRowVector() {\n    return this.rows === 1;\n  }\n\n  isColumnVector() {\n    return this.columns === 1;\n  }\n\n  isVector() {\n    return this.rows === 1 || this.columns === 1;\n  }\n\n  isSquare() {\n    return this.rows === this.columns;\n  }\n\n  isEmpty() {\n    return this.rows === 0 || this.columns === 0;\n  }\n\n  isSymmetric() {\n    if (this.isSquare()) {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j <= i; j++) {\n          if (this.get(i, j) !== this.get(j, i)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  isEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isEchelonForm = false;\n          checked = true;\n        }\n      }\n      i++;\n    }\n    return isEchelonForm;\n  }\n\n  isReducedEchelonForm() {\n    let i = 0;\n    let j = 0;\n    let previousColumn = -1;\n    let isReducedEchelonForm = true;\n    let checked = false;\n    while (i < this.rows && isReducedEchelonForm) {\n      j = 0;\n      checked = false;\n      while (j < this.columns && checked === false) {\n        if (this.get(i, j) === 0) {\n          j++;\n        } else if (this.get(i, j) === 1 && j > previousColumn) {\n          checked = true;\n          previousColumn = j;\n        } else {\n          isReducedEchelonForm = false;\n          checked = true;\n        }\n      }\n      for (let k = j + 1; k < this.rows; k++) {\n        if (this.get(i, k) !== 0) {\n          isReducedEchelonForm = false;\n        }\n      }\n      i++;\n    }\n    return isReducedEchelonForm;\n  }\n\n  echelonForm() {\n    let result = this.clone();\n    let h = 0;\n    let k = 0;\n    while (h < result.rows && k < result.columns) {\n      let iMax = h;\n      for (let i = h; i < result.rows; i++) {\n        if (result.get(i, k) > result.get(iMax, k)) {\n          iMax = i;\n        }\n      }\n      if (result.get(iMax, k) === 0) {\n        k++;\n      } else {\n        result.swapRows(h, iMax);\n        let tmp = result.get(h, k);\n        for (let j = k; j < result.columns; j++) {\n          result.set(h, j, result.get(h, j) / tmp);\n        }\n        for (let i = h + 1; i < result.rows; i++) {\n          let factor = result.get(i, k) / result.get(h, k);\n          result.set(i, k, 0);\n          for (let j = k + 1; j < result.columns; j++) {\n            result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n          }\n        }\n        h++;\n        k++;\n      }\n    }\n    return result;\n  }\n\n  reducedEchelonForm() {\n    let result = this.echelonForm();\n    let m = result.columns;\n    let n = result.rows;\n    let h = n - 1;\n    while (h >= 0) {\n      if (result.maxRow(h) === 0) {\n        h--;\n      } else {\n        let p = 0;\n        let pivot = false;\n        while (p < n && pivot === false) {\n          if (result.get(h, p) === 1) {\n            pivot = true;\n          } else {\n            p++;\n          }\n        }\n        for (let i = 0; i < h; i++) {\n          let factor = result.get(i, p);\n          for (let j = p; j < m; j++) {\n            let tmp = result.get(i, j) - factor * result.get(h, j);\n            result.set(i, j, tmp);\n          }\n        }\n        h--;\n      }\n    }\n    return result;\n  }\n\n  set() {\n    throw new Error('set method is unimplemented');\n  }\n\n  get() {\n    throw new Error('get method is unimplemented');\n  }\n\n  repeat(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { rows = 1, columns = 1 } = options;\n    if (!Number.isInteger(rows) || rows <= 0) {\n      throw new TypeError('rows must be a positive integer');\n    }\n    if (!Number.isInteger(columns) || columns <= 0) {\n      throw new TypeError('columns must be a positive integer');\n    }\n    let matrix = new Matrix(this.rows * rows, this.columns * columns);\n    for (let i = 0; i < rows; i++) {\n      for (let j = 0; j < columns; j++) {\n        matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n      }\n    }\n    return matrix;\n  }\n\n  fill(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, value);\n      }\n    }\n    return this;\n  }\n\n  neg() {\n    return this.mulS(-1);\n  }\n\n  getRow(index) {\n    checkRowIndex(this, index);\n    let row = [];\n    for (let i = 0; i < this.columns; i++) {\n      row.push(this.get(index, i));\n    }\n    return row;\n  }\n\n  getRowVector(index) {\n    return Matrix.rowVector(this.getRow(index));\n  }\n\n  setRow(index, array) {\n    checkRowIndex(this, index);\n    array = checkRowVector(this, array);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, array[i]);\n    }\n    return this;\n  }\n\n  swapRows(row1, row2) {\n    checkRowIndex(this, row1);\n    checkRowIndex(this, row2);\n    for (let i = 0; i < this.columns; i++) {\n      let temp = this.get(row1, i);\n      this.set(row1, i, this.get(row2, i));\n      this.set(row2, i, temp);\n    }\n    return this;\n  }\n\n  getColumn(index) {\n    checkColumnIndex(this, index);\n    let column = [];\n    for (let i = 0; i < this.rows; i++) {\n      column.push(this.get(i, index));\n    }\n    return column;\n  }\n\n  getColumnVector(index) {\n    return Matrix.columnVector(this.getColumn(index));\n  }\n\n  setColumn(index, array) {\n    checkColumnIndex(this, index);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, array[i]);\n    }\n    return this;\n  }\n\n  swapColumns(column1, column2) {\n    checkColumnIndex(this, column1);\n    checkColumnIndex(this, column2);\n    for (let i = 0; i < this.rows; i++) {\n      let temp = this.get(i, column1);\n      this.set(i, column1, this.get(i, column2));\n      this.set(i, column2, temp);\n    }\n    return this;\n  }\n\n  addRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[j]);\n      }\n    }\n    return this;\n  }\n\n  subRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[j]);\n      }\n    }\n    return this;\n  }\n\n  mulRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[j]);\n      }\n    }\n    return this;\n  }\n\n  divRowVector(vector) {\n    vector = checkRowVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[j]);\n      }\n    }\n    return this;\n  }\n\n  addColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + vector[i]);\n      }\n    }\n    return this;\n  }\n\n  subColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * vector[i]);\n      }\n    }\n    return this;\n  }\n\n  divColumnVector(vector) {\n    vector = checkColumnVector(this, vector);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / vector[i]);\n      }\n    }\n    return this;\n  }\n\n  mulRow(index, value) {\n    checkRowIndex(this, index);\n    for (let i = 0; i < this.columns; i++) {\n      this.set(index, i, this.get(index, i) * value);\n    }\n    return this;\n  }\n\n  mulColumn(index, value) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      this.set(i, index, this.get(i, index) * value);\n    }\n    return this;\n  }\n\n  max(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    switch (by) {\n      case 'row': {\n        const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[row]) {\n              max[row] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case 'column': {\n        const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max[column]) {\n              max[column] = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      case undefined: {\n        let max = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) > max) {\n              max = this.get(row, column);\n            }\n          }\n        }\n        return max;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  maxIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) > v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  min(by) {\n    if (this.isEmpty()) {\n      return NaN;\n    }\n\n    switch (by) {\n      case 'row': {\n        const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[row]) {\n              min[row] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case 'column': {\n        const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min[column]) {\n              min[column] = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      case undefined: {\n        let min = this.get(0, 0);\n        for (let row = 0; row < this.rows; row++) {\n          for (let column = 0; column < this.columns; column++) {\n            if (this.get(row, column) < min) {\n              min = this.get(row, column);\n            }\n          }\n        }\n        return min;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  minIndex() {\n    checkNonEmpty(this);\n    let v = this.get(0, 0);\n    let idx = [0, 0];\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        if (this.get(i, j) < v) {\n          v = this.get(i, j);\n          idx[0] = i;\n          idx[1] = j;\n        }\n      }\n    }\n    return idx;\n  }\n\n  maxRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  maxRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) > v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  minRow(row) {\n    checkRowIndex(this, row);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(row, 0);\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n      }\n    }\n    return v;\n  }\n\n  minRowIndex(row) {\n    checkRowIndex(this, row);\n    checkNonEmpty(this);\n    let v = this.get(row, 0);\n    let idx = [row, 0];\n    for (let i = 1; i < this.columns; i++) {\n      if (this.get(row, i) < v) {\n        v = this.get(row, i);\n        idx[1] = i;\n      }\n    }\n    return idx;\n  }\n\n  maxColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  maxColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) > v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  minColumn(column) {\n    checkColumnIndex(this, column);\n    if (this.isEmpty()) {\n      return NaN;\n    }\n    let v = this.get(0, column);\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n      }\n    }\n    return v;\n  }\n\n  minColumnIndex(column) {\n    checkColumnIndex(this, column);\n    checkNonEmpty(this);\n    let v = this.get(0, column);\n    let idx = [0, column];\n    for (let i = 1; i < this.rows; i++) {\n      if (this.get(i, column) < v) {\n        v = this.get(i, column);\n        idx[0] = i;\n      }\n    }\n    return idx;\n  }\n\n  diag() {\n    let min = Math.min(this.rows, this.columns);\n    let diag = [];\n    for (let i = 0; i < min; i++) {\n      diag.push(this.get(i, i));\n    }\n    return diag;\n  }\n\n  norm(type = 'frobenius') {\n    let result = 0;\n    if (type === 'max') {\n      return this.max();\n    } else if (type === 'frobenius') {\n      for (let i = 0; i < this.rows; i++) {\n        for (let j = 0; j < this.columns; j++) {\n          result = result + this.get(i, j) * this.get(i, j);\n        }\n      }\n      return Math.sqrt(result);\n    } else {\n      throw new RangeError(`unknown norm type: ${type}`);\n    }\n  }\n\n  cumulativeSum() {\n    let sum = 0;\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        sum += this.get(i, j);\n        this.set(i, j, sum);\n      }\n    }\n    return this;\n  }\n\n  dot(vector2) {\n    if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n    let vector1 = this.to1DArray();\n    if (vector1.length !== vector2.length) {\n      throw new RangeError('vectors do not have the same size');\n    }\n    let dot = 0;\n    for (let i = 0; i < vector1.length; i++) {\n      dot += vector1[i] * vector2[i];\n    }\n    return dot;\n  }\n\n  mmul(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.columns;\n\n    let result = new Matrix(m, p);\n\n    let Bcolj = new Float64Array(n);\n    for (let j = 0; j < p; j++) {\n      for (let k = 0; k < n; k++) {\n        Bcolj[k] = other.get(k, j);\n      }\n\n      for (let i = 0; i < m; i++) {\n        let s = 0;\n        for (let k = 0; k < n; k++) {\n          s += this.get(i, k) * Bcolj[k];\n        }\n\n        result.set(i, j, s);\n      }\n    }\n    return result;\n  }\n\n  strassen2x2(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(2, 2);\n    const a11 = this.get(0, 0);\n    const b11 = other.get(0, 0);\n    const a12 = this.get(0, 1);\n    const b12 = other.get(0, 1);\n    const a21 = this.get(1, 0);\n    const b21 = other.get(1, 0);\n    const a22 = this.get(1, 1);\n    const b22 = other.get(1, 1);\n\n    // Compute intermediate values.\n    const m1 = (a11 + a22) * (b11 + b22);\n    const m2 = (a21 + a22) * b11;\n    const m3 = a11 * (b12 - b22);\n    const m4 = a22 * (b21 - b11);\n    const m5 = (a11 + a12) * b22;\n    const m6 = (a21 - a11) * (b11 + b12);\n    const m7 = (a12 - a22) * (b21 + b22);\n\n    // Combine intermediate values into the output.\n    const c00 = m1 + m4 - m5 + m7;\n    const c01 = m3 + m5;\n    const c10 = m2 + m4;\n    const c11 = m1 - m2 + m3 + m6;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    return result;\n  }\n\n  strassen3x3(other) {\n    other = Matrix.checkMatrix(other);\n    let result = new Matrix(3, 3);\n\n    const a00 = this.get(0, 0);\n    const a01 = this.get(0, 1);\n    const a02 = this.get(0, 2);\n    const a10 = this.get(1, 0);\n    const a11 = this.get(1, 1);\n    const a12 = this.get(1, 2);\n    const a20 = this.get(2, 0);\n    const a21 = this.get(2, 1);\n    const a22 = this.get(2, 2);\n\n    const b00 = other.get(0, 0);\n    const b01 = other.get(0, 1);\n    const b02 = other.get(0, 2);\n    const b10 = other.get(1, 0);\n    const b11 = other.get(1, 1);\n    const b12 = other.get(1, 2);\n    const b20 = other.get(2, 0);\n    const b21 = other.get(2, 1);\n    const b22 = other.get(2, 2);\n\n    const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n    const m2 = (a00 - a10) * (-b01 + b11);\n    const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n    const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n    const m5 = (a10 + a11) * (-b00 + b01);\n    const m6 = a00 * b00;\n    const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n    const m8 = (-a00 + a20) * (b02 - b12);\n    const m9 = (a20 + a21) * (-b00 + b02);\n    const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n    const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n    const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n    const m13 = (a02 - a22) * (b11 - b21);\n    const m14 = a02 * b20;\n    const m15 = (a21 + a22) * (-b20 + b21);\n    const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n    const m17 = (a02 - a12) * (b12 - b22);\n    const m18 = (a11 + a12) * (-b20 + b22);\n    const m19 = a01 * b10;\n    const m20 = a12 * b21;\n    const m21 = a10 * b02;\n    const m22 = a20 * b01;\n    const m23 = a22 * b22;\n\n    const c00 = m6 + m14 + m19;\n    const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n    const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n    const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n    const c11 = m2 + m4 + m5 + m6 + m20;\n    const c12 = m14 + m16 + m17 + m18 + m21;\n    const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n    const c21 = m12 + m13 + m14 + m15 + m22;\n    const c22 = m6 + m7 + m8 + m9 + m23;\n\n    result.set(0, 0, c00);\n    result.set(0, 1, c01);\n    result.set(0, 2, c02);\n    result.set(1, 0, c10);\n    result.set(1, 1, c11);\n    result.set(1, 2, c12);\n    result.set(2, 0, c20);\n    result.set(2, 1, c21);\n    result.set(2, 2, c22);\n    return result;\n  }\n\n  mmulStrassen(y) {\n    y = Matrix.checkMatrix(y);\n    let x = this.clone();\n    let r1 = x.rows;\n    let c1 = x.columns;\n    let r2 = y.rows;\n    let c2 = y.columns;\n    if (c1 !== r2) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n      );\n    }\n\n    // Put a matrix into the top left of a matrix of zeros.\n    // `rows` and `cols` are the dimensions of the output matrix.\n    function embed(mat, rows, cols) {\n      let r = mat.rows;\n      let c = mat.columns;\n      if (r === rows && c === cols) {\n        return mat;\n      } else {\n        let resultat = AbstractMatrix.zeros(rows, cols);\n        resultat = resultat.setSubMatrix(mat, 0, 0);\n        return resultat;\n      }\n    }\n\n    // Make sure both matrices are the same size.\n    // This is exclusively for simplicity:\n    // this algorithm can be implemented with matrices of different sizes.\n\n    let r = Math.max(r1, r2);\n    let c = Math.max(c1, c2);\n    x = embed(x, r, c);\n    y = embed(y, r, c);\n\n    // Our recursive multiplication function.\n    function blockMult(a, b, rows, cols) {\n      // For small matrices, resort to naive multiplication.\n      if (rows <= 512 || cols <= 512) {\n        return a.mmul(b); // a is equivalent to this\n      }\n\n      // Apply dynamic padding.\n      if (rows % 2 === 1 && cols % 2 === 1) {\n        a = embed(a, rows + 1, cols + 1);\n        b = embed(b, rows + 1, cols + 1);\n      } else if (rows % 2 === 1) {\n        a = embed(a, rows + 1, cols);\n        b = embed(b, rows + 1, cols);\n      } else if (cols % 2 === 1) {\n        a = embed(a, rows, cols + 1);\n        b = embed(b, rows, cols + 1);\n      }\n\n      let halfRows = parseInt(a.rows / 2, 10);\n      let halfCols = parseInt(a.columns / 2, 10);\n      // Subdivide input matrices.\n      let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n      let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n      let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n      let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n      let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n      let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n      let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n      let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n      // Compute intermediate values.\n      let m1 = blockMult(\n        AbstractMatrix.add(a11, a22),\n        AbstractMatrix.add(b11, b22),\n        halfRows,\n        halfCols,\n      );\n      let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n      let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n      let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n      let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n      let m6 = blockMult(\n        AbstractMatrix.sub(a21, a11),\n        AbstractMatrix.add(b11, b12),\n        halfRows,\n        halfCols,\n      );\n      let m7 = blockMult(\n        AbstractMatrix.sub(a12, a22),\n        AbstractMatrix.add(b21, b22),\n        halfRows,\n        halfCols,\n      );\n\n      // Combine intermediate values into the output.\n      let c11 = AbstractMatrix.add(m1, m4);\n      c11.sub(m5);\n      c11.add(m7);\n      let c12 = AbstractMatrix.add(m3, m5);\n      let c21 = AbstractMatrix.add(m2, m4);\n      let c22 = AbstractMatrix.sub(m1, m2);\n      c22.add(m3);\n      c22.add(m6);\n\n      // Crop output to the desired size (undo dynamic padding).\n      let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n      resultat = resultat.setSubMatrix(c11, 0, 0);\n      resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n      resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n      resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n      return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n    }\n\n    return blockMult(x, y, r, c);\n  }\n\n  scaleRows(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.rows; i++) {\n      const row = this.getRow(i);\n      if (row.length > 0) {\n        rescale(row, { min, max, output: row });\n      }\n      newMatrix.setRow(i, row);\n    }\n    return newMatrix;\n  }\n\n  scaleColumns(options = {}) {\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { min = 0, max = 1 } = options;\n    if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n    if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n    if (min >= max) throw new RangeError('min must be smaller than max');\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let i = 0; i < this.columns; i++) {\n      const column = this.getColumn(i);\n      if (column.length) {\n        rescale(column, {\n          min: min,\n          max: max,\n          output: column,\n        });\n      }\n      newMatrix.setColumn(i, column);\n    }\n    return newMatrix;\n  }\n\n  flipRows() {\n    const middle = Math.ceil(this.columns / 2);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < middle; j++) {\n        let first = this.get(i, j);\n        let last = this.get(i, this.columns - 1 - j);\n        this.set(i, j, last);\n        this.set(i, this.columns - 1 - j, first);\n      }\n    }\n    return this;\n  }\n\n  flipColumns() {\n    const middle = Math.ceil(this.rows / 2);\n    for (let j = 0; j < this.columns; j++) {\n      for (let i = 0; i < middle; i++) {\n        let first = this.get(i, j);\n        let last = this.get(this.rows - 1 - i, j);\n        this.set(i, j, last);\n        this.set(this.rows - 1 - i, j, first);\n      }\n    }\n    return this;\n  }\n\n  kroneckerProduct(other) {\n    other = Matrix.checkMatrix(other);\n\n    let m = this.rows;\n    let n = this.columns;\n    let p = other.rows;\n    let q = other.columns;\n\n    let result = new Matrix(m * p, n * q);\n    for (let i = 0; i < m; i++) {\n      for (let j = 0; j < n; j++) {\n        for (let k = 0; k < p; k++) {\n          for (let l = 0; l < q; l++) {\n            result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  kroneckerSum(other) {\n    other = Matrix.checkMatrix(other);\n    if (!this.isSquare() || !other.isSquare()) {\n      throw new Error('Kronecker Sum needs two Square Matrices');\n    }\n    let m = this.rows;\n    let n = other.rows;\n    let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n    let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n    return AxI.add(IxB);\n  }\n\n  transpose() {\n    let result = new Matrix(this.columns, this.rows);\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        result.set(j, i, this.get(i, j));\n      }\n    }\n    return result;\n  }\n\n  sortRows(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.rows; i++) {\n      this.setRow(i, this.getRow(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  sortColumns(compareFunction = compareNumbers) {\n    for (let i = 0; i < this.columns; i++) {\n      this.setColumn(i, this.getColumn(i).sort(compareFunction));\n    }\n    return this;\n  }\n\n  subMatrix(startRow, endRow, startColumn, endColumn) {\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    let newMatrix = new Matrix(\n      endRow - startRow + 1,\n      endColumn - startColumn + 1,\n    );\n    for (let i = startRow; i <= endRow; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixRow(indices, startColumn, endColumn) {\n    if (startColumn === undefined) startColumn = 0;\n    if (endColumn === undefined) endColumn = this.columns - 1;\n    if (\n      startColumn > endColumn ||\n      startColumn < 0 ||\n      startColumn >= this.columns ||\n      endColumn < 0 ||\n      endColumn >= this.columns\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startColumn; j <= endColumn; j++) {\n        if (indices[i] < 0 || indices[i] >= this.rows) {\n          throw new RangeError(`Row index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n      }\n    }\n    return newMatrix;\n  }\n\n  subMatrixColumn(indices, startRow, endRow) {\n    if (startRow === undefined) startRow = 0;\n    if (endRow === undefined) endRow = this.rows - 1;\n    if (\n      startRow > endRow ||\n      startRow < 0 ||\n      startRow >= this.rows ||\n      endRow < 0 ||\n      endRow >= this.rows\n    ) {\n      throw new RangeError('Argument out of range');\n    }\n\n    let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n    for (let i = 0; i < indices.length; i++) {\n      for (let j = startRow; j <= endRow; j++) {\n        if (indices[i] < 0 || indices[i] >= this.columns) {\n          throw new RangeError(`Column index out of range: ${indices[i]}`);\n        }\n        newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n      }\n    }\n    return newMatrix;\n  }\n\n  setSubMatrix(matrix, startRow, startColumn) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (matrix.isEmpty()) {\n      return this;\n    }\n    let endRow = startRow + matrix.rows - 1;\n    let endColumn = startColumn + matrix.columns - 1;\n    checkRange(this, startRow, endRow, startColumn, endColumn);\n    for (let i = 0; i < matrix.rows; i++) {\n      for (let j = 0; j < matrix.columns; j++) {\n        this.set(startRow + i, startColumn + j, matrix.get(i, j));\n      }\n    }\n    return this;\n  }\n\n  selection(rowIndices, columnIndices) {\n    checkRowIndices(this, rowIndices);\n    checkColumnIndices(this, columnIndices);\n    let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n    for (let i = 0; i < rowIndices.length; i++) {\n      let rowIndex = rowIndices[i];\n      for (let j = 0; j < columnIndices.length; j++) {\n        let columnIndex = columnIndices[j];\n        newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n      }\n    }\n    return newMatrix;\n  }\n\n  trace() {\n    let min = Math.min(this.rows, this.columns);\n    let trace = 0;\n    for (let i = 0; i < min; i++) {\n      trace += this.get(i, i);\n    }\n    return trace;\n  }\n\n  clone() {\n    let newMatrix = new Matrix(this.rows, this.columns);\n    for (let row = 0; row < this.rows; row++) {\n      for (let column = 0; column < this.columns; column++) {\n        newMatrix.set(row, column, this.get(row, column));\n      }\n    }\n    return newMatrix;\n  }\n\n  sum(by) {\n    switch (by) {\n      case 'row':\n        return sumByRow(this);\n      case 'column':\n        return sumByColumn(this);\n      case undefined:\n        return sumAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  product(by) {\n    switch (by) {\n      case 'row':\n        return productByRow(this);\n      case 'column':\n        return productByColumn(this);\n      case undefined:\n        return productAll(this);\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  mean(by) {\n    const sum = this.sum(by);\n    switch (by) {\n      case 'row': {\n        for (let i = 0; i < this.rows; i++) {\n          sum[i] /= this.columns;\n        }\n        return sum;\n      }\n      case 'column': {\n        for (let i = 0; i < this.columns; i++) {\n          sum[i] /= this.rows;\n        }\n        return sum;\n      }\n      case undefined:\n        return sum / this.size;\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  variance(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { unbiased = true, mean = this.mean(by) } = options;\n    if (typeof unbiased !== 'boolean') {\n      throw new TypeError('unbiased must be a boolean');\n    }\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByRow(this, unbiased, mean);\n      }\n      case 'column': {\n        if (!isAnyArray(mean)) {\n          throw new TypeError('mean must be an array');\n        }\n        return varianceByColumn(this, unbiased, mean);\n      }\n      case undefined: {\n        if (typeof mean !== 'number') {\n          throw new TypeError('mean must be a number');\n        }\n        return varianceAll(this, unbiased, mean);\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  standardDeviation(by, options) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    const variance = this.variance(by, options);\n    if (by === undefined) {\n      return Math.sqrt(variance);\n    } else {\n      for (let i = 0; i < variance.length; i++) {\n        variance[i] = Math.sqrt(variance[i]);\n      }\n      return variance;\n    }\n  }\n\n  center(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    const { center = this.mean(by) } = options;\n    switch (by) {\n      case 'row': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByRow(this, center);\n        return this;\n      }\n      case 'column': {\n        if (!isAnyArray(center)) {\n          throw new TypeError('center must be an array');\n        }\n        centerByColumn(this, center);\n        return this;\n      }\n      case undefined: {\n        if (typeof center !== 'number') {\n          throw new TypeError('center must be a number');\n        }\n        centerAll(this, center);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  scale(by, options = {}) {\n    if (typeof by === 'object') {\n      options = by;\n      by = undefined;\n    }\n    if (typeof options !== 'object') {\n      throw new TypeError('options must be an object');\n    }\n    let scale = options.scale;\n    switch (by) {\n      case 'row': {\n        if (scale === undefined) {\n          scale = getScaleByRow(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByRow(this, scale);\n        return this;\n      }\n      case 'column': {\n        if (scale === undefined) {\n          scale = getScaleByColumn(this);\n        } else if (!isAnyArray(scale)) {\n          throw new TypeError('scale must be an array');\n        }\n        scaleByColumn(this, scale);\n        return this;\n      }\n      case undefined: {\n        if (scale === undefined) {\n          scale = getScaleAll(this);\n        } else if (typeof scale !== 'number') {\n          throw new TypeError('scale must be a number');\n        }\n        scaleAll(this, scale);\n        return this;\n      }\n      default:\n        throw new Error(`invalid option: ${by}`);\n    }\n  }\n\n  toString(options) {\n    return inspectMatrixWithOptions(this, options);\n  }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n  AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n    inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n  return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n  return array.every((element) => {\n    return typeof element === 'number';\n  });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n  AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n  constructor(nRows, nColumns) {\n    super();\n    if (Matrix.isMatrix(nRows)) {\n      // eslint-disable-next-line no-constructor-return\n      return nRows.clone();\n    } else if (Number.isInteger(nRows) && nRows >= 0) {\n      // Create an empty matrix\n      this.data = [];\n      if (Number.isInteger(nColumns) && nColumns >= 0) {\n        for (let i = 0; i < nRows; i++) {\n          this.data.push(new Float64Array(nColumns));\n        }\n      } else {\n        throw new TypeError('nColumns must be a positive integer');\n      }\n    } else if (isAnyArray(nRows)) {\n      // Copy the values from the 2D array\n      const arrayData = nRows;\n      nRows = arrayData.length;\n      nColumns = nRows ? arrayData[0].length : 0;\n      if (typeof nColumns !== 'number') {\n        throw new TypeError(\n          'Data must be a 2D array with at least one element',\n        );\n      }\n      this.data = [];\n      for (let i = 0; i < nRows; i++) {\n        if (arrayData[i].length !== nColumns) {\n          throw new RangeError('Inconsistent array dimensions');\n        }\n        if (!isArrayOfNumbers(arrayData[i])) {\n          throw new TypeError('Input data contains non-numeric values');\n        }\n        this.data.push(Float64Array.from(arrayData[i]));\n      }\n    } else {\n      throw new TypeError(\n        'First argument must be a positive number or an array',\n      );\n    }\n    this.rows = nRows;\n    this.columns = nColumns;\n  }\n\n  set(rowIndex, columnIndex, value) {\n    this.data[rowIndex][columnIndex] = value;\n    return this;\n  }\n\n  get(rowIndex, columnIndex) {\n    return this.data[rowIndex][columnIndex];\n  }\n\n  removeRow(index) {\n    checkRowIndex(this, index);\n    this.data.splice(index, 1);\n    this.rows -= 1;\n    return this;\n  }\n\n  addRow(index, array) {\n    if (array === undefined) {\n      array = index;\n      index = this.rows;\n    }\n    checkRowIndex(this, index, true);\n    array = Float64Array.from(checkRowVector(this, array));\n    this.data.splice(index, 0, array);\n    this.rows += 1;\n    return this;\n  }\n\n  removeColumn(index) {\n    checkColumnIndex(this, index);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns - 1);\n      for (let j = 0; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      for (let j = index + 1; j < this.columns; j++) {\n        newRow[j - 1] = this.data[i][j];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns -= 1;\n    return this;\n  }\n\n  addColumn(index, array) {\n    if (typeof array === 'undefined') {\n      array = index;\n      index = this.columns;\n    }\n    checkColumnIndex(this, index, true);\n    array = checkColumnVector(this, array);\n    for (let i = 0; i < this.rows; i++) {\n      const newRow = new Float64Array(this.columns + 1);\n      let j = 0;\n      for (; j < index; j++) {\n        newRow[j] = this.data[i][j];\n      }\n      newRow[j++] = array[i];\n      for (; j < this.columns + 1; j++) {\n        newRow[j] = this.data[i][j - 1];\n      }\n      this.data[i] = newRow;\n    }\n    this.columns += 1;\n    return this;\n  }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n  let sum = newArray(matrix.rows);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumByColumn(matrix) {\n  let sum = newArray(matrix.columns);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] += matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function sumAll(matrix) {\n  let v = 0;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v += matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function productByRow(matrix) {\n  let sum = newArray(matrix.rows, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[i] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productByColumn(matrix) {\n  let sum = newArray(matrix.columns, 1);\n  for (let i = 0; i < matrix.rows; ++i) {\n    for (let j = 0; j < matrix.columns; ++j) {\n      sum[j] *= matrix.get(i, j);\n    }\n  }\n  return sum;\n}\n\nexport function productAll(matrix) {\n  let v = 1;\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      v *= matrix.get(i, j);\n    }\n  }\n  return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let i = 0; i < rows; i++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean[i];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n    }\n  }\n  return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const variance = [];\n\n  for (let j = 0; j < cols; j++) {\n    let sum1 = 0;\n    let sum2 = 0;\n    let x = 0;\n    for (let i = 0; i < rows; i++) {\n      x = matrix.get(i, j) - mean[j];\n      sum1 += x;\n      sum2 += x * x;\n    }\n    if (unbiased) {\n      variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n    } else {\n      variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n    }\n  }\n  return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n  const rows = matrix.rows;\n  const cols = matrix.columns;\n  const size = rows * cols;\n\n  let sum1 = 0;\n  let sum2 = 0;\n  let x = 0;\n  for (let i = 0; i < rows; i++) {\n    for (let j = 0; j < cols; j++) {\n      x = matrix.get(i, j) - mean;\n      sum1 += x;\n      sum2 += x * x;\n    }\n  }\n  if (unbiased) {\n    return (sum2 - (sum1 * sum1) / size) / (size - 1);\n  } else {\n    return (sum2 - (sum1 * sum1) / size) / size;\n  }\n}\n\nexport function centerByRow(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[i]);\n    }\n  }\n}\n\nexport function centerByColumn(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean[j]);\n    }\n  }\n}\n\nexport function centerAll(matrix, mean) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) - mean);\n    }\n  }\n}\n\nexport function getScaleByRow(matrix) {\n  const scale = [];\n  for (let i = 0; i < matrix.rows; i++) {\n    let sum = 0;\n    for (let j = 0; j < matrix.columns; j++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[i]);\n    }\n  }\n}\n\nexport function getScaleByColumn(matrix) {\n  const scale = [];\n  for (let j = 0; j < matrix.columns; j++) {\n    let sum = 0;\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n    }\n    scale.push(Math.sqrt(sum));\n  }\n  return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale[j]);\n    }\n  }\n}\n\nexport function getScaleAll(matrix) {\n  const divider = matrix.size - 1;\n  let sum = 0;\n  for (let j = 0; j < matrix.columns; j++) {\n    for (let i = 0; i < matrix.rows; i++) {\n      sum += Math.pow(matrix.get(i, j), 2) / divider;\n    }\n  }\n  return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n  for (let i = 0; i < matrix.rows; i++) {\n    for (let j = 0; j < matrix.columns; j++) {\n      matrix.set(i, j, matrix.get(i, j) / scale);\n    }\n  }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n  AbstractMatrix.prototype.add = function add(value) {\n    if (typeof value === 'number') return this.addS(value);\n    return this.addM(value);\n  };\n\n  AbstractMatrix.prototype.addS = function addS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.addM = function addM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) + matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.add = function add(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.add(value);\n  };\n\n  AbstractMatrix.prototype.sub = function sub(value) {\n    if (typeof value === 'number') return this.subS(value);\n    return this.subM(value);\n  };\n\n  AbstractMatrix.prototype.subS = function subS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.subM = function subM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) - matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sub = function sub(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sub(value);\n  };\n  AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n  AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n  AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n  AbstractMatrix.subtract = AbstractMatrix.sub;\n\n  AbstractMatrix.prototype.mul = function mul(value) {\n    if (typeof value === 'number') return this.mulS(value);\n    return this.mulM(value);\n  };\n\n  AbstractMatrix.prototype.mulS = function mulS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.mulM = function mulM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) * matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mul = function mul(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mul(value);\n  };\n  AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n  AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n  AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n  AbstractMatrix.multiply = AbstractMatrix.mul;\n\n  AbstractMatrix.prototype.div = function div(value) {\n    if (typeof value === 'number') return this.divS(value);\n    return this.divM(value);\n  };\n\n  AbstractMatrix.prototype.divS = function divS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.divM = function divM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) / matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.div = function div(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.div(value);\n  };\n  AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n  AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n  AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n  AbstractMatrix.divide = AbstractMatrix.div;\n\n  AbstractMatrix.prototype.mod = function mod(value) {\n    if (typeof value === 'number') return this.modS(value);\n    return this.modM(value);\n  };\n\n  AbstractMatrix.prototype.modS = function modS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.modM = function modM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) % matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.mod = function mod(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.mod(value);\n  };\n  AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n  AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n  AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n  AbstractMatrix.modulus = AbstractMatrix.mod;\n\n  AbstractMatrix.prototype.and = function and(value) {\n    if (typeof value === 'number') return this.andS(value);\n    return this.andM(value);\n  };\n\n  AbstractMatrix.prototype.andS = function andS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.andM = function andM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) & matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.and = function and(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.and(value);\n  };\n\n  AbstractMatrix.prototype.or = function or(value) {\n    if (typeof value === 'number') return this.orS(value);\n    return this.orM(value);\n  };\n\n  AbstractMatrix.prototype.orS = function orS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.orM = function orM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) | matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.or = function or(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.or(value);\n  };\n\n  AbstractMatrix.prototype.xor = function xor(value) {\n    if (typeof value === 'number') return this.xorS(value);\n    return this.xorM(value);\n  };\n\n  AbstractMatrix.prototype.xorS = function xorS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.xorM = function xorM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.xor = function xor(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.xor(value);\n  };\n\n  AbstractMatrix.prototype.leftShift = function leftShift(value) {\n    if (typeof value === 'number') return this.leftShiftS(value);\n    return this.leftShiftM(value);\n  };\n\n  AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) << matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.leftShift = function leftShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.leftShift(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n    if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n    return this.signPropagatingRightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.signPropagatingRightShift(value);\n  };\n\n  AbstractMatrix.prototype.rightShift = function rightShift(value) {\n    if (typeof value === 'number') return this.rightShiftS(value);\n    return this.rightShiftM(value);\n  };\n\n  AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> value);\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.rightShift = function rightShift(matrix, value) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.rightShift(value);\n  };\n  AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n  AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n  AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n  AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n  AbstractMatrix.prototype.not = function not() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, ~(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.not = function not(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.not();\n  };\n\n  AbstractMatrix.prototype.abs = function abs() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.abs(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.abs = function abs(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.abs();\n  };\n\n  AbstractMatrix.prototype.acos = function acos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acos = function acos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acos();\n  };\n\n  AbstractMatrix.prototype.acosh = function acosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.acosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.acosh = function acosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.acosh();\n  };\n\n  AbstractMatrix.prototype.asin = function asin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asin = function asin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asin();\n  };\n\n  AbstractMatrix.prototype.asinh = function asinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.asinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.asinh = function asinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.asinh();\n  };\n\n  AbstractMatrix.prototype.atan = function atan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atan = function atan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atan();\n  };\n\n  AbstractMatrix.prototype.atanh = function atanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.atanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.atanh = function atanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.atanh();\n  };\n\n  AbstractMatrix.prototype.cbrt = function cbrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cbrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cbrt = function cbrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cbrt();\n  };\n\n  AbstractMatrix.prototype.ceil = function ceil() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.ceil(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.ceil = function ceil(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.ceil();\n  };\n\n  AbstractMatrix.prototype.clz32 = function clz32() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.clz32(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.clz32 = function clz32(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.clz32();\n  };\n\n  AbstractMatrix.prototype.cos = function cos() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cos(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cos = function cos(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cos();\n  };\n\n  AbstractMatrix.prototype.cosh = function cosh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.cosh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.cosh = function cosh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.cosh();\n  };\n\n  AbstractMatrix.prototype.exp = function exp() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.exp(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.exp = function exp(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.exp();\n  };\n\n  AbstractMatrix.prototype.expm1 = function expm1() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.expm1(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.expm1 = function expm1(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.expm1();\n  };\n\n  AbstractMatrix.prototype.floor = function floor() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.floor(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.floor = function floor(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.floor();\n  };\n\n  AbstractMatrix.prototype.fround = function fround() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.fround(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.fround = function fround(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.fround();\n  };\n\n  AbstractMatrix.prototype.log = function log() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log = function log(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log();\n  };\n\n  AbstractMatrix.prototype.log1p = function log1p() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log1p(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log1p = function log1p(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log1p();\n  };\n\n  AbstractMatrix.prototype.log10 = function log10() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log10(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log10 = function log10(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log10();\n  };\n\n  AbstractMatrix.prototype.log2 = function log2() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.log2(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.log2 = function log2(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.log2();\n  };\n\n  AbstractMatrix.prototype.round = function round() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.round(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.round = function round(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.round();\n  };\n\n  AbstractMatrix.prototype.sign = function sign() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sign(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sign = function sign(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sign();\n  };\n\n  AbstractMatrix.prototype.sin = function sin() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sin(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sin = function sin(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sin();\n  };\n\n  AbstractMatrix.prototype.sinh = function sinh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sinh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sinh = function sinh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sinh();\n  };\n\n  AbstractMatrix.prototype.sqrt = function sqrt() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.sqrt(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.sqrt = function sqrt(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.sqrt();\n  };\n\n  AbstractMatrix.prototype.tan = function tan() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tan(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tan = function tan(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tan();\n  };\n\n  AbstractMatrix.prototype.tanh = function tanh() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.tanh(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.tanh = function tanh(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.tanh();\n  };\n\n  AbstractMatrix.prototype.trunc = function trunc() {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.trunc(this.get(i, j)));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.trunc = function trunc(matrix) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.trunc();\n  };\n\n  AbstractMatrix.pow = function pow(matrix, arg0) {\n    const newMatrix = new Matrix(matrix);\n    return newMatrix.pow(arg0);\n  };\n\n  AbstractMatrix.prototype.pow = function pow(value) {\n    if (typeof value === 'number') return this.powS(value);\n    return this.powM(value);\n  };\n\n  AbstractMatrix.prototype.powS = function powS(value) {\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), value));\n      }\n    }\n    return this;\n  };\n\n  AbstractMatrix.prototype.powM = function powM(matrix) {\n    matrix = Matrix.checkMatrix(matrix);\n    if (this.rows !== matrix.rows ||\n      this.columns !== matrix.columns) {\n      throw new RangeError('Matrices dimensions must be equal');\n    }\n    for (let i = 0; i < this.rows; i++) {\n      for (let j = 0; j < this.columns; j++) {\n        this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n      }\n    }\n    return this;\n  };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class 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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class 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","export function 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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class 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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class 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 iter = 0;\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          iter = iter + 1;\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          iter = 0;\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","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function 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\nexport function 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","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class 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 = Boolean(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","/**\n * Returns the closest index of a `target`\n *\n * @param array - array of numbers\n * @param target - target\n * @returns - closest index\n */\nexport function xFindClosestIndex(array, target, options = {}) {\n    const { sorted = true } = options;\n    if (sorted) {\n        let low = 0;\n        let high = array.length - 1;\n        let middle = 0;\n        while (high - low > 1) {\n            middle = low + ((high - low) >> 1);\n            if (array[middle] < target) {\n                low = middle;\n            }\n            else if (array[middle] > target) {\n                high = middle;\n            }\n            else {\n                return middle;\n            }\n        }\n        if (low < array.length - 1) {\n            if (Math.abs(target - array[low]) < Math.abs(array[low + 1] - target)) {\n                return low;\n            }\n            else {\n                return low + 1;\n            }\n        }\n        else {\n            return low;\n        }\n    }\n    else {\n        let index = 0;\n        let diff = Number.POSITIVE_INFINITY;\n        for (let i = 0; i < array.length; i++) {\n            const currentDiff = Math.abs(array[i] - target);\n            if (currentDiff < diff) {\n                diff = currentDiff;\n                index = i;\n            }\n        }\n        return index;\n    }\n}\n//# sourceMappingURL=xFindClosestIndex.js.map","import { xFindClosestIndex } from './xFindClosestIndex';\n/**\n * Returns an object with {fromIndex, toIndex} for a specific from / to\n *\n * @param x - array of numbers\n * @param options - Options\n */\nexport function xGetFromToIndex(x, options = {}) {\n    let { fromIndex, toIndex, from, to } = options;\n    if (fromIndex === undefined) {\n        if (from !== undefined) {\n            fromIndex = xFindClosestIndex(x, from);\n        }\n        else {\n            fromIndex = 0;\n        }\n    }\n    if (toIndex === undefined) {\n        if (to !== undefined) {\n            toIndex = xFindClosestIndex(x, to);\n        }\n        else {\n            toIndex = x.length - 1;\n        }\n    }\n    if (fromIndex < 0)\n        fromIndex = 0;\n    if (toIndex < 0)\n        toIndex = 0;\n    if (fromIndex >= x.length)\n        fromIndex = x.length - 1;\n    if (toIndex >= x.length)\n        toIndex = x.length - 1;\n    if (fromIndex > toIndex)\n        [fromIndex, toIndex] = [toIndex, fromIndex];\n    return { fromIndex, toIndex };\n}\n//# sourceMappingURL=xGetFromToIndex.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the maximal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMaxValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let maxValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] > maxValue) {\n            maxValue = array[i];\n        }\n    }\n    return maxValue;\n}\n//# sourceMappingURL=xMaxValue.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Computes the minimal value of an array of values\n *\n * @param array - array of numbers\n * @param options - options\n */\nexport function xMinValue(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let minValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        if (array[i] < minValue) {\n            minValue = array[i];\n        }\n    }\n    return minValue;\n}\n//# sourceMappingURL=xMinValue.js.map","/**\n * Returns true if x is monotone\n *\n * @param array - array of numbers\n */\nexport function xIsMonotonic(array) {\n    if (array.length <= 2) {\n        return 1;\n    }\n    if (array[0] === array[1]) {\n        // maybe a constant series\n        for (let i = 1; i < array.length - 1; i++) {\n            if (array[i] !== array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    if (array[0] < array[array.length - 1]) {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] >= array[i + 1])\n                return 0;\n        }\n        return 1;\n    }\n    else {\n        for (let i = 0; i < array.length - 1; i++) {\n            if (array[i] <= array[i + 1])\n                return 0;\n        }\n        return -1;\n    }\n}\n//# sourceMappingURL=xIsMonotonic.js.map","import { xCheck } from './xCheck';\n/**\n * Return min and max values of an array\n *\n * @param array - array of number\n * @returns - Object with 2 properties, min and max\n */\nexport function xMinMaxValues(array) {\n    xCheck(array);\n    let min = array[0];\n    let max = array[0];\n    for (let value of array) {\n        if (value < min)\n            min = value;\n        if (value > max)\n            max = value;\n    }\n    return { min, max };\n}\n//# sourceMappingURL=xMinMaxValues.js.map","import { xMedianAbsoluteDeviation } from '..';\n/**\n * Determine noise level using MAD https://en.wikipedia.org/wiki/Median_absolute_deviation\n * Constant to convert mad to sd calculated using https://www.wolframalpha.com/input?i=sqrt%282%29+inverse+erf%280.5%29\n * This assumes a gaussian distribution of the noise\n * @param array\n * @returns noise level corresponding to one standard deviation\n */\nexport function xNoiseStandardDeviation(array) {\n    const { mad, median } = xMedianAbsoluteDeviation(array);\n    return { sd: mad / 0.6744897501960817, mad, median };\n}\n//# sourceMappingURL=xNoiseStandardDeviation.js.map","import { xMedian } from './xMedian';\n/**\n * This function calculates the median absolute deviation (MAD)\n * https://en.wikipedia.org/wiki/Median_absolute_deviation\n * @param array\n */\nexport function xMedianAbsoluteDeviation(array) {\n    const median = xMedian(array);\n    const averageDeviations = new Float64Array(array.length);\n    for (let i = 0; i < array.length; i++) {\n        averageDeviations[i] = Math.abs(array[i] - median);\n    }\n    return {\n        median,\n        mad: xMedian(averageDeviations),\n    };\n}\n//# sourceMappingURL=xMedianAbsoluteDeviation.js.map","import { xCheck } from './xCheck';\nimport { xGetFromToIndex } from './xGetFromToIndex';\n/**\n * Calculate the sum of the values\n *\n * @param array - Object that contains property x (an ordered increasing array) and y (an array).\n * @param options - Options.\n * @returns XSum value on the specified range.\n */\nexport function xSum(array, options = {}) {\n    xCheck(array);\n    const { fromIndex, toIndex } = xGetFromToIndex(array, options);\n    let sumValue = array[fromIndex];\n    for (let i = fromIndex + 1; i <= toIndex; i++) {\n        sumValue += array[i];\n    }\n    return sumValue;\n}\n//# sourceMappingURL=xSum.js.map","import { getOutputArray } from './utils/getOutputArray';\nimport { xCheck } from './xCheck';\nimport { xMaxValue } from './xMaxValue';\nimport { xSum } from './xSum';\n/**\n * Divides the data with either the sum, the absolute sum or the maximum of the data\n * @param array - Array containing values\n * @param options - options\n * @returns - normalized data\n */\nexport function xNormed(input, options = {}) {\n    const { algorithm = 'absolute', value = 1 } = options;\n    xCheck(input);\n    const output = getOutputArray(options.output, input.length);\n    if (input.length === 0) {\n        throw new Error('input must not be empty');\n    }\n    switch (algorithm.toLowerCase()) {\n        case 'absolute': {\n            let absoluteSumValue = absoluteSum(input) / value;\n            if (absoluteSumValue === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] / absoluteSumValue;\n            }\n            return output;\n        }\n        case 'max': {\n            let currentMaxValue = xMaxValue(input);\n            if (currentMaxValue === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            const factor = value / currentMaxValue;\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] * factor;\n            }\n            return output;\n        }\n        case 'sum': {\n            let sumFactor = xSum(input) / value;\n            if (sumFactor === 0) {\n                throw new Error('xNormed: trying to divide by 0');\n            }\n            for (let i = 0; i < input.length; i++) {\n                output[i] = input[i] / sumFactor;\n            }\n            return output;\n        }\n        default:\n            throw new Error(`norm: unknown algorithm: ${algorithm}`);\n    }\n}\nfunction absoluteSum(input) {\n    let sumValue = 0;\n    for (let i = 0; i < input.length; i++) {\n        sumValue += Math.abs(input[i]);\n    }\n    return sumValue;\n}\n//# sourceMappingURL=xNormed.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * This function\n * @param output - undefined or a new array\n * @param length - length of the output array\n * @returns\n */\nexport function getOutputArray(output, length) {\n    if (output !== undefined) {\n        if (!isAnyArray(output)) {\n            throw new TypeError('output option must be an array if specified');\n        }\n        if (output.length !== length) {\n            throw new TypeError('the output array does not have the correct length');\n        }\n        return output;\n    }\n    else {\n        return new Float64Array(length);\n    }\n}\n//# sourceMappingURL=getOutputArray.js.map","import { isAnyArray } from 'is-any-array';\n/**\n * Throw an error in no an object of x,y arrays\n *\n * @param data - array of points {x,y,z}\n */\nexport function xyCheck(data, options = {}) {\n    const { minLength } = options;\n    if (typeof data !== 'object' || !isAnyArray(data.x) || !isAnyArray(data.y)) {\n        throw new Error('Data must be an object of x and y arrays');\n    }\n    if (data.x.length !== data.y.length) {\n        throw new Error('The x and y arrays must have the same length');\n    }\n    if (minLength && data.x.length < minLength) {\n        throw new Error(`data.x must have a length of at least ${minLength}`);\n    }\n}\n//# sourceMappingURL=xyCheck.js.map","import { xSortDescending } from '../x/xSort';\n/** Filter an array x/y based on various criteria x points are expected to be sorted\n *\n * @param data - object containing 2 properties x and y\n * @param options - options\n * @return filtered data\n */\nexport function xyFilterTopYValues(data, nbPeaks) {\n    if (nbPeaks === undefined)\n        return data;\n    if (nbPeaks > data.x.length)\n        return data;\n    const { x, y } = data;\n    const newX = [];\n    const newY = [];\n    const descending = xSortDescending(y.slice());\n    const threshold = descending[nbPeaks - 1];\n    let nbThreshold = 0;\n    for (let i = 0; i < nbPeaks; i++) {\n        if (descending[i] === threshold) {\n            nbThreshold++;\n        }\n    }\n    for (let i = 0; i < x.length; i++) {\n        if (y[i] > threshold) {\n            newX.push(x[i]);\n            newY.push(y[i]);\n        }\n        else if (y[i] === threshold) {\n            nbThreshold--;\n            if (nbThreshold >= 0) {\n                newX.push(x[i]);\n                newY.push(y[i]);\n            }\n        }\n    }\n    return {\n        x: newX,\n        y: newY,\n    };\n}\n//# sourceMappingURL=xyFilterTopYValues.js.map","/** Function that sorts arrays or Float64Arrays in ascending order\n *\n * @param array - array to sort\n * @returns sorted array\n */\nexport function xSortAscending(array) {\n    if (array instanceof Float64Array) {\n        return array.sort();\n    }\n    else if (Array.isArray(array)) {\n        return array.sort((a, b) => a - b);\n    }\n    throw new Error('Trying to sort non aray');\n}\n/** Function that sorts arrays or Float64Arrays in descending order\n *\n * @param array - array to sort\n * @returns sorted array\n */\nexport function xSortDescending(array) {\n    if (array instanceof Float64Array) {\n        return array.sort().reverse();\n    }\n    else if (Array.isArray(array)) {\n        return array.sort((a, b) => b - a);\n    }\n    throw new Error('Trying to sort non aray');\n}\n//# sourceMappingURL=xSort.js.map","import { xyCheck } from './xyCheck';\n/**\n * Join x / y values when difference in X is closer than delta.\n * When joining, y values are summed and x values are weighted average\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array)\n * @param options - Options\n * @returns - An object with the xyIntegration function\n */\nexport function xyJoinX(data, options = {}) {\n    xyCheck(data);\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    const x = Array.from(data.x);\n    const y = Array.from(data.y);\n    if (x.length < 2) {\n        return { x, y };\n    }\n    let position = 0;\n    for (let i = 1; i < x.length; i++) {\n        let difference = x[i] - x[i - 1];\n        let currentDelta = deltaIsFunction ? delta((x[i] + x[i - 1]) / 2) : delta;\n        if (difference <= currentDelta) {\n            // we join\n            if (y[position] !== 0 || y[i] !== 0) {\n                x[position] =\n                    (x[position] * y[position] + x[i] * y[i]) / (y[position] + y[i]);\n                y[position] += y[i];\n            }\n        }\n        else {\n            position++;\n            x[position] = x[i];\n            y[position] = y[i];\n        }\n    }\n    x.length = position + 1;\n    y.length = position + 1;\n    return { x, y };\n}\n//# sourceMappingURL=xyJoinX.js.map","import { xIsMonotonic } from '../x/xIsMonotonic';\n/**\n * This function performs a quick sort of the x array while transforming the y array to preserve the coordinates.\n *\n * @param data - Object that contains property x (Array) and y (Array)\n */\nexport function xySortX(data) {\n    const { x, y } = data;\n    if (xIsMonotonic(x) && x.length > 1) {\n        if (x[0] < x[1]) {\n            return {\n                x: Float64Array.from(x),\n                y: Float64Array.from(y),\n            };\n        }\n        else {\n            return {\n                x: Float64Array.from(x).reverse(),\n                y: Float64Array.from(y).reverse(),\n            };\n        }\n    }\n    let xyObject = x\n        .map((val, index) => ({\n        x: val,\n        y: y[index],\n    }))\n        .sort((a, b) => a.x - b.x);\n    let response = {\n        x: new Float64Array(x.length),\n        y: new Float64Array(y.length),\n    };\n    for (let i = 0; i < x.length; i++) {\n        response.x[i] = xyObject[i].x;\n        response.y[i] = xyObject[i].y;\n    }\n    return response;\n}\n//# sourceMappingURL=xySortX.js.map","import { xyJoinX } from '../xy/xyJoinX';\nimport { getSlots } from './utils/getSlots';\n/**\n * Aligns data, can be used for spectra\n *\n * @param data - data\n * @param options - Options\n */\nexport function xyArrayAlign(data, options = {}) {\n    const { delta = 1, requiredY = false } = options;\n    data = data.map((spectrum) => xyJoinX(spectrum, { delta }));\n    const slots = getSlots(data, options);\n    let x = Float64Array.from(slots.map((slot) => slot.average));\n    let ys = new Array(data.length).fill(0).map(() => new Float64Array(x.length));\n    let positions = new Uint32Array(data.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < data.length; j++) {\n            let spectrum = data[j];\n            while (positions[j] < spectrum.x.length &&\n                spectrum.x[positions[j]] <= slot.to) {\n                ys[j][i] += spectrum.y[positions[j]];\n                positions[j]++;\n            }\n        }\n    }\n    if (requiredY)\n        return filterRequiredY(x, ys);\n    return { x, ys };\n}\nfunction filterRequiredY(x, ys) {\n    const newX = [];\n    const newYs = new Array(ys.length).fill(0).map(() => []);\n    for (let i = 0; i < x.length; i++) {\n        if (ys.every((y) => y[i] !== 0)) {\n            newX.push(x[i]);\n            for (let j = 0; j < ys.length; j++) {\n                newYs[j].push(ys[j][i]);\n            }\n        }\n    }\n    return { x: newX, ys: newYs };\n}\n//# sourceMappingURL=xyArrayAlign.js.map","/**\n * GetSlots.\n *\n * @param data - data.\n * @param options - Options.\n */\nexport function getSlots(data, options = {}) {\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    let possibleXs = Float64Array.from([].concat(...data.map((spectrum) => spectrum.x))).sort();\n    if (possibleXs.length === 0) {\n        throw new Error('xyArrayMerge can not process empty arrays');\n    }\n    let currentSlot = {\n        from: possibleXs[0],\n        to: possibleXs[0],\n        average: possibleXs[0],\n        sum: possibleXs[0],\n        number: 1,\n    };\n    let slots = [currentSlot];\n    for (let i = 1; i < possibleXs.length; i++) {\n        let currentDelta = deltaIsFunction ? delta(possibleXs[i]) : delta;\n        if (possibleXs[i] - currentSlot.to <= currentDelta) {\n            currentSlot.to = possibleXs[i];\n            currentSlot.number++;\n            currentSlot.sum += possibleXs[i];\n            currentSlot.average = currentSlot.sum / currentSlot.number;\n        }\n        else {\n            currentSlot = {\n                from: possibleXs[i],\n                to: possibleXs[i],\n                average: possibleXs[i],\n                sum: possibleXs[i],\n                number: 1,\n            };\n            slots.push(currentSlot);\n        }\n    }\n    return slots;\n}\n//# sourceMappingURL=getSlots.js.map","/**\n * Merge DataXY\n * We have an array of DataXY and the goal is to merge all the values for which the deltaX is small or equal to delta.\n * X values are weighted average\n *\n * @param data - data\n * @param options - Options\n */\nexport function xyArrayWeightedMerge(data, options = {}) {\n    let { delta = 1 } = options;\n    if (typeof delta === 'number') {\n        let deltaNumber = delta;\n        delta = () => deltaNumber;\n    }\n    data = data.filter((spectrum) => spectrum.x.length > 0);\n    if (data.length === 0)\n        return { x: [], y: [] };\n    let x = [];\n    let y = [];\n    const positions = new Array(data.length).fill(0);\n    const point = { x: 0, y: 0 };\n    nextValue(data, positions, point);\n    let slot = {\n        maxX: point.x + delta(point.x),\n        sumY: point.y,\n        sumXY: point.y * point.x,\n    };\n    while (data.length > 0) {\n        nextValue(data, positions, point);\n        let sameSlot = point.x <= slot.maxX;\n        if (!sameSlot) {\n            if (slot.sumY > 0) {\n                x.push(slot.sumXY / slot.sumY);\n                y.push(slot.sumY);\n            }\n            slot.sumY = 0;\n            slot.sumXY = 0;\n        }\n        slot.sumY += point.y;\n        slot.sumXY += point.x * point.y;\n        slot.maxX = point.x + delta(point.x);\n        if (data.length === 0 && slot.sumY > 0) {\n            x.push(slot.sumXY / slot.sumY);\n            y.push(slot.sumY);\n        }\n    }\n    return { x, y };\n}\n/**\n * NextValue.\n *\n * @param data - data.\n * @param positions - Positions array.\n * @param point - Point.\n */\nfunction nextValue(data, positions, point) {\n    let minIndex = 0;\n    let minX = data[0].x[positions[0]];\n    for (let i = 1; i < data.length; i++) {\n        let currentX = data[i].x[positions[i]];\n        if (currentX < minX) {\n            minX = currentX;\n            minIndex = i;\n        }\n    }\n    point.x = minX;\n    point.y = data[minIndex].y[positions[minIndex]];\n    positions[minIndex]++;\n    if (positions[minIndex] === data[minIndex].x.length) {\n        positions.splice(minIndex, 1);\n        data.splice(minIndex, 1);\n    }\n}\n//# sourceMappingURL=xyArrayWeightedMerge.js.map","import { getSlotsToFirst } from './utils/getSlotsToFirst';\n/**\n * We align all the data/spectra to the first array of X.\n * The alignment is based on the X values of the first spectrum and the `delta` error allowed.\n * If some x values are missing in the first spectrum we will add them\n *\n * @param data data\n * @param options options\n */\nexport function xyArrayAlignToFirst(data, options = {}) {\n    const slots = getSlotsToFirst(data, options);\n    let x = Float64Array.from(slots.map((slot) => slot.value));\n    let ys = new Array(data.length).fill(0).map(() => new Float64Array(x.length));\n    let positions = new Uint32Array(data.length);\n    for (let i = 0; i < slots.length; i++) {\n        let slot = slots[i];\n        for (let j = 0; j < data.length; j++) {\n            let spectrum = data[j];\n            while (positions[j] < spectrum.x.length &&\n                spectrum.x[positions[j]] < slot.to) {\n                ys[j][i] += spectrum.y[positions[j]];\n                positions[j]++;\n            }\n        }\n    }\n    return { x, ys };\n}\n//# sourceMappingURL=xyArrayAlignToFirst.js.map","import { xyArrayWeightedMerge } from '../xyArrayWeightedMerge';\n/**\n * GetSlotsToFirst.\n *\n * @param data - data.\n * @param options - Options.\n */\nexport function getSlotsToFirst(data, options = {}) {\n    const { delta = 1 } = options;\n    const deltaIsFunction = typeof delta === 'function';\n    let firstXs = data[0].x;\n    let slots = [];\n    // we first create the slots based on the first spectrum\n    for (const element of firstXs) {\n        let currentDelta = deltaIsFunction ? delta(element) : delta;\n        slots.push({\n            from: element - currentDelta,\n            to: element + currentDelta,\n            value: element,\n        });\n    }\n    let otherXs = xyArrayWeightedMerge(data.slice(1), options).x;\n    let currentPosition = 0;\n    for (let slot of slots) {\n        while (otherXs[currentPosition] < slot.to &&\n            currentPosition < otherXs.length) {\n            if (otherXs[currentPosition] < slot.from) {\n                let currentDelta = deltaIsFunction\n                    ? delta(otherXs[currentPosition])\n                    : delta;\n                slots.push({\n                    from: otherXs[currentPosition] - currentDelta,\n                    to: otherXs[currentPosition] + currentDelta,\n                    value: otherXs[currentPosition],\n                });\n            }\n            currentPosition++;\n        }\n    }\n    for (let i = currentPosition; i < otherXs.length; i++) {\n        let currentDelta = deltaIsFunction ? delta(otherXs[i]) : delta;\n        slots.push({\n            from: otherXs[i] - currentDelta,\n            to: otherXs[i] + currentDelta,\n            value: otherXs[i],\n        });\n    }\n    slots.sort((a, b) => a.value - b.value);\n    // we prevent slots overlap in the first spectrum\n    for (let i = 0; i < slots.length - 1; i++) {\n        if (slots[i].to > slots[i + 1].from) {\n            let middle = (slots[i].value + slots[i + 1].value) / 2;\n            slots[i].to = middle;\n            slots[i + 1].from = middle;\n        }\n    }\n    return slots;\n}\n//# sourceMappingURL=getSlotsToFirst.js.map","/**\n * Throw an error in no an object of x,y arrays\n *\n * @param points - list of points\n */\nexport function xyObjectCheck(points = []) {\n    if (!Array.isArray(points)) {\n        throw new Error('ArrayPoints must be an array of {x,y} object');\n    }\n    if (points.length > 0 &&\n        (points[0].x === undefined || points[0].y === undefined)) {\n        throw new Error('ArrayPoints must be an array of {x,y} object');\n    }\n}\n//# sourceMappingURL=xyObjectCheck.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the max x value and return a {x,y,index} point\n *\n * @param points - Object that contains property x (an ordered increasing array) and y (an array)\n */\nexport function xyObjectMaxXPoint(points = []) {\n    xyObjectCheck(points);\n    if (points.length === 0)\n        return { x: 0, y: 0 };\n    let current = {\n        x: points[0].x,\n        y: points[0].y,\n        index: 0,\n    };\n    for (let i = 1; i < points.length; i++) {\n        if (points[i].x > current.x) {\n            current = {\n                x: points[i].x,\n                y: points[i].y,\n                index: i,\n            };\n        }\n    }\n    return current;\n}\n//# sourceMappingURL=xyObjectMaxXPoint.js.map","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Finds the min x value and return a {x,y,index} point\n *\n * @param points - Object that contains property x (an ordered increasing array) and y (an array)\n */\nexport function xyObjectMinXPoint(points = []) {\n    xyObjectCheck(points);\n    if (points.length === 0)\n        return { x: 0, y: 0 };\n    let current = {\n        x: points[0].x,\n        y: points[0].y,\n        index: 0,\n    };\n    for (let i = 1; i < points.length; i++) {\n        if (points[i].x < current.x) {\n            current = {\n                x: points[i].x,\n                y: points[i].y,\n                index: i,\n            };\n        }\n    }\n    return current;\n}\n//# sourceMappingURL=xyObjectMinXPoint.js.map","const LOOP = 8;\nconst FLOAT_MUL = 1 / 16777216;\nconst sh1 = 15;\nconst sh2 = 18;\nconst sh3 = 11;\nfunction multiply_uint32(n, m) {\n    n >>>= 0;\n    m >>>= 0;\n    const nlo = n & 0xffff;\n    const nhi = n - nlo;\n    return (((nhi * m) >>> 0) + nlo * m) >>> 0;\n}\nexport default class XSadd {\n    constructor(seed = Date.now()) {\n        this.state = new Uint32Array(4);\n        this.init(seed);\n        this.random = this.getFloat.bind(this);\n    }\n    /**\n     * Returns a 32-bit integer r (0 <= r < 2^32)\n     */\n    getUint32() {\n        this.nextState();\n        return (this.state[3] + this.state[2]) >>> 0;\n    }\n    /**\n     * Returns a floating point number r (0.0 <= r < 1.0)\n     */\n    getFloat() {\n        return (this.getUint32() >>> 8) * FLOAT_MUL;\n    }\n    init(seed) {\n        if (!Number.isInteger(seed)) {\n            throw new TypeError('seed must be an integer');\n        }\n        this.state[0] = seed;\n        this.state[1] = 0;\n        this.state[2] = 0;\n        this.state[3] = 0;\n        for (let i = 1; i < LOOP; i++) {\n            this.state[i & 3] ^=\n                (i +\n                    multiply_uint32(1812433253, this.state[(i - 1) & 3] ^ ((this.state[(i - 1) & 3] >>> 30) >>> 0))) >>>\n                    0;\n        }\n        this.periodCertification();\n        for (let i = 0; i < LOOP; i++) {\n            this.nextState();\n        }\n    }\n    periodCertification() {\n        if (this.state[0] === 0 &&\n            this.state[1] === 0 &&\n            this.state[2] === 0 &&\n            this.state[3] === 0) {\n            this.state[0] = 88; // X\n            this.state[1] = 83; // S\n            this.state[2] = 65; // A\n            this.state[3] = 68; // D\n        }\n    }\n    nextState() {\n        let t = this.state[0];\n        t ^= t << sh1;\n        t ^= t >>> sh2;\n        t ^= this.state[3] << sh3;\n        this.state[0] = this.state[1];\n        this.state[1] = this.state[2];\n        this.state[2] = this.state[3];\n        this.state[3] = t;\n    }\n}\n","import XSAdd from 'ml-xsadd';\n/**\n * Create a random array of numbers of a specific length\n *\n * @return - array of random floats normally distributed\n */\nlet spare;\nlet hasSpare = false;\nexport function createRandomArray(options = {}) {\n    const { mean = 0, standardDeviation = 1, length = 1000, range = 1, seed, distribution = 'normal', } = options;\n    const generator = new XSAdd(seed);\n    let returnArray = new Float64Array(length);\n    switch (distribution) {\n        case 'normal':\n            for (let i = 0; i < length; i++) {\n                returnArray[i] = generateGaussian(mean, standardDeviation, generator);\n            }\n            break;\n        case 'uniform':\n            for (let i = 0; i < length; i++) {\n                returnArray[i] = (generator.random() - 0.5) * range + mean;\n            }\n            break;\n        default:\n            // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n            throw new Error(`unknown distribution: ${distribution}`);\n    }\n    return returnArray;\n}\nfunction generateGaussian(mean, standardDeviation, generator) {\n    let val, u, v, s;\n    if (hasSpare) {\n        hasSpare = false;\n        val = spare * standardDeviation + mean;\n    }\n    else {\n        do {\n            u = generator.random() * 2 - 1;\n            v = generator.random() * 2 - 1;\n            s = u * u + v * v;\n        } while (s >= 1 || s === 0);\n        s = Math.sqrt((-2 * Math.log(s)) / s);\n        spare = v * s;\n        hasSpare = true;\n        val = mean + standardDeviation * u * s;\n    }\n    return val;\n}\n//# sourceMappingURL=createRandomArray.js.map","import { xyObjectMaxXPoint, xyObjectMinXPoint } from 'ml-spectra-processing';\n\n/**\n * Filter the array by taking the higher peaks and only\n * keep one per slot.\n * There are 2 different slots, the smallest one will have the\n * extra annotation `close` to true\n * @param {array} peaks - array of all the peaks\n * @param {object} [options={}]\n * @param {number} [options.from] - min X value of the window to consider\n * @param {number} [options.to] - max X value of the window to consider\n * @param {number} [options.searchMonoisotopicRatio=0] - search previous peaks with at least ratio height\n * @param {number} [options.limit=20] - max number of peaks\n * @param {number} [options.threshold=0.01] - minimal intensity compare to base peak\n * @param {number} [options.numberSlots=10] - define the number of slots and indirectly the slot width\n * @param {number} [options.numberCloseSlots=50]\n * @returns {array} - copy of peaks with 'close' annotation\n */\n\nexport function getBestPeaks(peaks, options = {}) {\n  const {\n    searchMonoisotopicRatio = 0,\n    from = xyObjectMinXPoint(peaks).x,\n    to = xyObjectMaxXPoint(peaks).x,\n    limit = 20,\n    threshold = 0.01,\n    numberCloseSlots = 50,\n    numberSlots = 10,\n  } = options;\n  let slot = (to - from) / numberSlots;\n  let closeSlot = (to - from) / numberCloseSlots;\n  let selected = peaks\n    .filter((peak) => peak.x >= from && peak.x <= to)\n    .map((peak) => {\n      return {\n        peak,\n        monoisotopic: false,\n      };\n    });\n\n  if (searchMonoisotopicRatio) {\n    selected = selected.sort((a, b) => b.peak.x - a.peak.x);\n\n    for (let i = 0; i < selected.length; i++) {\n      let item = selected[i];\n      for (let j = i + 1; j < selected.length; j++) {\n        let nextItem = selected[j];\n        if (item.peak.x - nextItem.peak.x < 0.09) continue;\n        if (item.peak.x - nextItem.peak.x > 1.1) break;\n        if (nextItem.peak.y > item.peak.y * searchMonoisotopicRatio) {\n          item.monoisotopic = false;\n          nextItem.monoisotopic = true;\n          break;\n        }\n      }\n    }\n  }\n\n  selected = selected.sort((a, b) => {\n    if (a.monoisotopic && !b.monoisotopic) return -1;\n    if (b.monoisotopic && !a.monoisotopic) return 1;\n    return b.peak.y - a.peak.y;\n  });\n\n  let toReturn = [];\n  if (selected.length === 0) return [];\n  let minY = selected[0].peak.y * threshold;\n  peakLoop: for (let item of selected) {\n    if (item.peak.y < minY) {\n      if (item.monoisotopic) {\n        continue;\n      } else {\n        break;\n      }\n    }\n    let close = false;\n    for (let existing of toReturn) {\n      if (Math.abs(existing.x - item.peak.x) < closeSlot) {\n        continue peakLoop;\n      }\n      if (Math.abs(existing.x - item.peak.x) < slot) {\n        close = true;\n      }\n    }\n    let newPeak = JSON.parse(JSON.stringify(item.peak));\n    newPeak.close = close;\n    toReturn.push(newPeak);\n    if (toReturn.length === limit) break;\n  }\n  return toReturn.sort((a, b) => a.x - b.x);\n}\n","/**\n * Define static variable corresponding to the various Kinds of a molecular formula part.\n */\n\nexport const Kind = {\n  BEGIN: 'begin',\n  ATOM: 'atom',\n  MULTIPLIER_RANGE: 'multiplierRange',\n  ISOTOPE: 'isotope',\n  ISOTOPE_RATIO: 'isotopeRatio',\n  CHARGE: 'charge',\n  SALT: 'salt',\n  OPENING_PARENTHESIS: 'openingParenthesis',\n  CLOSING_PARENTHESIS: 'closingParenthesis',\n  PRE_MULTIPLIER: 'preMultiplier',\n  MULTIPLIER: 'multiplier',\n  TEXT: 'text',\n  ANCHOR: 'anchor',\n  COMMENT: 'comment',\n};\n","/**\n * Parse a string to extract the charge\n * The charge may be in the form --, +++, +3, -2, 4+, 2-\n * @param {*} charge\n */\n\nexport function parseCharge(charge) {\n  charge = charge.replace(/[()]/g, '');\n  let chargeNumber = 0;\n  if (charge.match(/^[+-]+$/)) {\n    for (let i = 0; i < charge.length; i++) {\n      if (charge.charAt(i) === '+') chargeNumber++;\n      else chargeNumber--;\n    }\n  } else if (charge.match(/^[0-9]+[+-]$/)) {\n    chargeNumber = Number(\n      charge.charAt(charge.length - 1) + charge.substring(0, charge.length - 1),\n    );\n  } else {\n    chargeNumber = Number(charge);\n  }\n  return chargeNumber;\n}\n","import { Kind } from './Kind';\nimport { parseCharge } from './util/parseCharge';\n\n/**\n * Parse a mf to an array of kind / value\n * @param {String} mf\n */\n\nexport function parse(mf) {\n  return new MFParser().parse(mf);\n}\n\nclass MFParser {\n  parse(mf = '') {\n    this.mf = mf;\n    this.i = 0;\n    this.result = [];\n\n    let lastKind = Kind.BEGIN;\n    while (this.i < mf.length) {\n      if (\n        this.result.length > 0 &&\n        this.result[this.result.length - 1].kind !== Kind.TEXT\n      ) {\n        lastKind = this.result[this.result.length - 1].kind;\n      }\n      let char = mf.charAt(this.i);\n      let ascii = mf.charCodeAt(this.i);\n      let nextAscii = 0;\n      if (this.i + 1 < mf.length) nextAscii = mf.charCodeAt(this.i + 1);\n\n      if (\n        (ascii > 47 && ascii < 58) ||\n        (char === '-' && nextAscii > 47 && nextAscii < 58)\n      ) {\n        // a number\n        let value = this.getNumber(ascii);\n        if (\n          lastKind === Kind.SALT ||\n          lastKind === Kind.BEGIN ||\n          lastKind === Kind.OPENING_PARENTHESIS\n        ) {\n          if (value.to) {\n            throw new MFError(\n              this.mf,\n              this.i,\n              'Premultiplier may not contain a -',\n            );\n          }\n          this.result.push({ kind: Kind.PRE_MULTIPLIER, value: value.from });\n        } else if (lastKind === Kind.ANCHOR) {\n          if (value.to) {\n            throw new MFError(this.mf, this.i, 'Anchor ID may not contain -');\n          }\n          this.result[this.result.length - 1].value = value.from;\n        } else if (value.to) {\n          this.result.push({\n            kind: Kind.MULTIPLIER_RANGE,\n            value: {\n              from: Math.min(value.from, value.to),\n              to: Math.max(value.from, value.to),\n            },\n          });\n        } else {\n          this.result.push({ kind: Kind.MULTIPLIER, value: value.from });\n        }\n        continue;\n      } else if (char === '.') {\n        // a point\n        this.result.push({ kind: Kind.SALT, value: char });\n        // it is not in a number otherwise it would have been taken before\n        // it must be in a salt\n      } else if (char === '#') {\n        // an anchor\n        this.result.push({ kind: Kind.ANCHOR, value: 0 });\n        // it is not in a number otherwise it would have been taken before\n        // it must be in a salt\n      } else if (ascii > 64 && ascii < 91) {\n        // an uppercase = new atom\n        let value = this.getAtom(ascii);\n        this.result.push({ kind: Kind.ATOM, value });\n        continue;\n      } else if (ascii > 96 && ascii < 123) {\n        // a lowercase\n        throw new MFError(\n          this.mf,\n          this.i,\n          'found a lowercase not following an uppercase',\n        );\n      } else if (char === '(') {\n        let charge = this.getParenthesisCharge(ascii);\n        if (charge) {\n          this.result.push({ kind: Kind.CHARGE, value: charge });\n        } else {\n          this.result.push({ kind: Kind.OPENING_PARENTHESIS, value: '(' });\n        }\n      } else if (char === ')') {\n        this.result.push({ kind: Kind.CLOSING_PARENTHESIS, value: ')' });\n      } else if (char === '[') {\n        // defines an isotope\n        let isotope = this.getIsotope(ascii);\n        this.result.push({ kind: Kind.ISOTOPE, value: isotope });\n      } else if (char === ']') {\n        throw new MFError(\n          this.mf,\n          this.i,\n          'should never meet an closing bracket not in isotopes',\n        );\n      } else if (char === '{') {\n        // can define an exotic isotopic ratio or mixtures of groups\n        let isotopeRatio = this.getCurlyBracketIsotopeRatio(ascii);\n        if (lastKind === Kind.ATOM) {\n          let lastResult = this.result[this.result.length - 1];\n          lastResult.kind = Kind.ISOTOPE_RATIO;\n          lastResult.value = {\n            atom: lastResult.value,\n            ratio: isotopeRatio,\n          };\n        } else {\n          throw new MFError(\n            this.mf,\n            this.i,\n            'isotopic composition has to follow an atom',\n          );\n        }\n      } else if (char === '}') {\n        throw new MFError(\n          this.mf,\n          this.i,\n          'found a unexpected closing curly bracket',\n        );\n      } else if (char === '+') {\n        // charge not in parenthesis\n        let charge = this.getNonParenthesisCharge(ascii);\n        this.result.push({ kind: Kind.CHARGE, value: charge });\n      } else if (char === '-') {\n        // charge not in parenthesis\n        let charge = this.getNonParenthesisCharge(ascii);\n        this.result.push({ kind: Kind.CHARGE, value: charge });\n      } else if (char === '$') {\n        // it is a comment after\n        this.result.push({\n          kind: Kind.COMMENT,\n          value: this.mf.substring(this.i + 1),\n        });\n        break;\n      } else {\n        this.result.push({ kind: Kind.TEXT, value: char });\n      }\n      this.i++;\n    }\n\n    this.checkParenthesis();\n    return this.result;\n  }\n\n  checkParenthesis() {\n    let counter = 0;\n    for (let line of this.result) {\n      if (line.kind === Kind.OPENING_PARENTHESIS) counter++;\n      if (line.kind === Kind.CLOSING_PARENTHESIS) counter--;\n    }\n    if (counter !== 0) {\n      throw new MFError(\n        this.mf,\n        this.i,\n        'number of opening and closing parenthesis not equal',\n      );\n    }\n  }\n\n  getNumber(ascii) {\n    let number = '';\n    let previous;\n    do {\n      previous = ascii;\n      number += String.fromCharCode(ascii);\n      this.i++;\n      ascii = this.mf.charCodeAt(this.i);\n    } while (\n      (ascii > 47 && ascii < 58) ||\n      ascii === 46 ||\n      ascii === 45 ||\n      ascii === 47\n    ); // number . - /\n    // we need to deal with the case there is a from / to\n    if (previous === 46) this.i--;\n    let indexOfDash = number.indexOf('-', 1);\n\n    if (indexOfDash > -1) {\n      return {\n        from: parseNumberWithDivision(number.substr(0, indexOfDash)),\n        to: parseNumberWithDivision(number.substr(indexOfDash + 1)),\n      };\n    }\n    return { from: parseNumberWithDivision(number) };\n  }\n\n  getAtom(ascii) {\n    let atom = '';\n    do {\n      atom += String.fromCharCode(ascii);\n      this.i++;\n      ascii = this.mf.charCodeAt(this.i);\n    } while (ascii > 96 && ascii < 123);\n    return atom;\n  }\n\n  getIsotope(ascii) {\n    // [13C]\n    let substring = '';\n    do {\n      substring += String.fromCharCode(ascii);\n      this.i++;\n      ascii = this.mf.charCodeAt(this.i);\n    } while (ascii !== 93 && this.i <= this.mf.length);\n\n    let atom = substring.replace(/[^a-zA-Z]/g, '');\n    let isotope = Number(substring.replace(/[^0-9]/g, ''));\n    return { atom, isotope };\n  }\n\n  getCurlyBracketIsotopeRatio(ascii) {\n    let substring = '';\n    let first = true;\n    do {\n      if (!first) {\n        substring += String.fromCharCode(ascii);\n      } else {\n        first = false;\n      }\n      this.i++;\n      ascii = this.mf.charCodeAt(this.i);\n    } while (ascii !== 125 && this.i <= this.mf.length); // closing curly bracket\n    if (substring.match(/^[0-9,]+$/)) {\n      return substring.split(',').map((a) => Number(a));\n    }\n    throw new MFError(\n      this.mf,\n      this.i,\n      'Curly brackets should contain only number and comma',\n    );\n  }\n\n  getParenthesisCharge(ascii) {\n    let substring = '';\n    let begin = this.i;\n    do {\n      substring += String.fromCharCode(ascii);\n      this.i++;\n      ascii = this.mf.charCodeAt(this.i);\n    } while (ascii !== 41 && this.i <= this.mf.length); // closing parenthesis\n    if (substring.match(/^\\([0-9+-]+$/)) {\n      return parseCharge(substring.substring(1));\n    } else {\n      this.i = begin;\n      return undefined;\n    }\n  }\n\n  getNonParenthesisCharge(ascii) {\n    let substring = '';\n    do {\n      substring += String.fromCharCode(ascii);\n      this.i++;\n      ascii = this.mf.charCodeAt(this.i);\n    } while (ascii === 43 || ascii === 45 || (ascii > 47 && ascii < 58));\n    this.i--;\n    return parseCharge(substring);\n  }\n}\nclass MFError extends SyntaxError {\n  constructor(mf, i, message) {\n    let text = `${message}\\n\\n${mf}\\n${' '.repeat(i)}^`;\n    super(text);\n  }\n}\n\nfunction parseNumberWithDivision(string) {\n  if (string.includes('/')) {\n    let parts = string.split('/');\n    if (parts.length !== 2) {\n      throw new TypeError('Can not parse MF with number like: ', string);\n    }\n    return Number(parts[0]) / Number(parts[1]);\n  } else {\n    return Number(string);\n  }\n}\n","export const superscript = {\n  0: '⁰',\n  1: '¹',\n  2: '²',\n  3: '³',\n  4: '⁴',\n  5: '⁵',\n  6: '⁶',\n  7: '⁷',\n  8: '⁸',\n  9: '⁹',\n  '+': '⁺',\n  '-': '⁻',\n  '(': '⁽',\n  ')': '⁾',\n  '{': '⁽',\n  '}': '⁾',\n  '.': '˙',\n  ',': '˙',\n};\n\nexport const subscript = {\n  0: '₀',\n  1: '₁',\n  2: '₂',\n  3: '₃',\n  4: '₄',\n  5: '₅',\n  6: '₆',\n  7: '₇',\n  8: '₈',\n  9: '₉',\n  '(': '₍',\n  ')': '₎',\n  '{': '₍',\n  '}': '₎',\n  '.': ' ',\n  ',': ' ',\n};\n","/**\n * Defines static variables corresponding to the various formatting possibilities\n */\n\nexport const Format = {\n  SUBSCRIPT: 'subscript',\n  SUPERSCRIPT: 'superscript',\n  SUPERIMPOSE: 'superimpose',\n  TEXT: 'text',\n};\n","export function formatCharge(charge) {\n  if (charge === 1) return '+';\n  if (charge > 1) return `+${charge}`;\n  if (charge < 0) return String(charge);\n  return '';\n}\n","import { Format } from '../Format';\nimport { Kind } from '../Kind';\n\nimport { formatCharge } from './formatCharge.js';\n\n/**\n * Converts an array of mf elements to an array of formatting information\n * @param {object[]} lines of the parse method\n */\n\nexport function toDisplay(lines) {\n  let results = [];\n  let result = {};\n  for (let line of lines) {\n    switch (line.kind) {\n      case Kind.MULTIPLIER:\n        if (line.value !== 1) {\n          result = {\n            kind: Format.SUBSCRIPT,\n            value: String(line.value),\n          };\n          results.push(result);\n        }\n        break;\n      case Kind.MULTIPLIER_RANGE:\n        result = {\n          kind: Format.SUBSCRIPT,\n          value: `${String(line.value.from)}-${line.value.to}`,\n        };\n        results.push(result);\n        break;\n      case Kind.CHARGE:\n        if (result.kind === Format.SUBSCRIPT) {\n          result.kind = Format.SUPERIMPOSE;\n          result.over = formatCharge(line.value);\n          result.under = result.value;\n          result.value = undefined;\n        } else {\n          result = {\n            kind: Format.SUPERSCRIPT,\n            value: formatCharge(line.value),\n          };\n          results.push(result);\n        }\n\n        break;\n\n      case Kind.ISOTOPE:\n        result = {\n          kind: Format.SUPERSCRIPT,\n          value: line.value.isotope,\n        };\n        results.push(result);\n        result = {\n          kind: Format.TEXT,\n          value: line.value.atom,\n        };\n        results.push(result);\n        break;\n\n      case Kind.ISOTOPE_RATIO:\n        if (result.kind === Format.TEXT) {\n          result.value += line.value.atom;\n        } else {\n          result = {\n            kind: Format.TEXT,\n            value: line.value.atom,\n          };\n          results.push(result);\n        }\n        result = {\n          kind: Format.SUPERSCRIPT,\n          value: `{${line.value.ratio.join(',')}}`,\n        };\n        results.push(result);\n        break;\n      case Kind.SALT:\n        if (result.kind === Format.TEXT) {\n          result.value += ' • ';\n        } else {\n          result = {\n            kind: Format.TEXT,\n            value: ' • ',\n          };\n          results.push(result);\n        }\n        break;\n      default:\n        if (result.kind === Format.TEXT) {\n          result.value += line.value;\n        } else {\n          result = {\n            kind: Format.TEXT,\n            value: line.value,\n          };\n          results.push(result);\n        }\n    }\n  }\n  return results;\n}\n","export const Style = {\n  SUPERIMPOSE:\n    'flex-direction: column;display: inline-flex;justify-content: center;text-align: left;vertical-align: middle;',\n  SUPERIMPOSE_SUP_SUB: 'line-height: 1; font-size: 70%',\n};\n","export const ELECTRON_MASS = 5.4857990907e-4;\n","export const elementsAndIsotopes = [\n  {\n    number: 1,\n    isotopes: [\n      { nominal: 1, mass: 1.00782503223, abundance: 0.999885 },\n      { nominal: 2, mass: 2.01410177812, abundance: 0.000115 },\n      { nominal: 3, mass: 3.0160492779 },\n      { nominal: 4, mass: 4.02643 },\n      { nominal: 5, mass: 5.035311 },\n      { nominal: 6, mass: 6.04496 },\n      { nominal: 7, mass: 7.0527 },\n    ],\n    symbol: 'H',\n    mass: 1.0079407540557772,\n    name: 'Hydrogen',\n    monoisotopicMass: 1.00782503223,\n  },\n  {\n    number: 2,\n    isotopes: [\n      { nominal: 3, mass: 3.0160293201, abundance: 0.00000134 },\n      { nominal: 4, mass: 4.00260325413, abundance: 0.99999866 },\n      { nominal: 5, mass: 5.012057 },\n      { nominal: 6, mass: 6.018885891 },\n      { nominal: 7, mass: 7.0279907 },\n      { nominal: 8, mass: 8.03393439 },\n      { nominal: 9, mass: 9.043946 },\n      { nominal: 10, mass: 10.05279 },\n    ],\n    symbol: 'He',\n    mass: 4.002601932120929,\n    name: 'Helium',\n    monoisotopicMass: 4.00260325413,\n  },\n  {\n    number: 3,\n    isotopes: [\n      { nominal: 3, mass: 3.0308 },\n      { nominal: 4, mass: 4.02719 },\n      { nominal: 5, mass: 5.012538 },\n      { nominal: 6, mass: 6.0151228874, abundance: 0.0759 },\n      { nominal: 7, mass: 7.0160034366, abundance: 0.9241 },\n      { nominal: 8, mass: 8.022486246 },\n      { nominal: 9, mass: 9.02679019 },\n      { nominal: 10, mass: 10.035483 },\n      { nominal: 11, mass: 11.04372358 },\n      { nominal: 12, mass: 12.052517 },\n      { nominal: 13, mass: 13.06263 },\n    ],\n    symbol: 'Li',\n    mass: 6.94003660291572,\n    name: 'Lithium',\n    monoisotopicMass: 7.0160034366,\n  },\n  {\n    number: 4,\n    isotopes: [\n      { nominal: 5, mass: 5.0399 },\n      { nominal: 6, mass: 6.0197264 },\n      { nominal: 7, mass: 7.016928717 },\n      { nominal: 8, mass: 8.005305102 },\n      { nominal: 9, mass: 9.012183065, abundance: 1 },\n      { nominal: 10, mass: 10.013534695 },\n      { nominal: 11, mass: 11.02166108 },\n      { nominal: 12, mass: 12.0269221 },\n      { nominal: 13, mass: 13.036135 },\n      { nominal: 14, mass: 14.04289 },\n      { nominal: 15, mass: 15.05342 },\n      { nominal: 16, mass: 16.06167 },\n    ],\n    symbol: 'Be',\n    mass: 9.012183065,\n    name: 'Beryllium',\n    monoisotopicMass: 9.012183065,\n  },\n  {\n    number: 5,\n    isotopes: [\n      { nominal: 6, mass: 6.0508 },\n      { nominal: 7, mass: 7.029712 },\n      { nominal: 8, mass: 8.0246073 },\n      { nominal: 9, mass: 9.01332965 },\n      { nominal: 10, mass: 10.01293695, abundance: 0.199 },\n      { nominal: 11, mass: 11.00930536, abundance: 0.801 },\n      { nominal: 12, mass: 12.0143527 },\n      { nominal: 13, mass: 13.0177802 },\n      { nominal: 14, mass: 14.025404 },\n      { nominal: 15, mass: 15.031088 },\n      { nominal: 16, mass: 16.039842 },\n      { nominal: 17, mass: 17.04699 },\n      { nominal: 18, mass: 18.05566 },\n      { nominal: 19, mass: 19.0631 },\n      { nominal: 20, mass: 20.07207 },\n      { nominal: 21, mass: 21.08129 },\n    ],\n    symbol: 'B',\n    mass: 10.811028046410001,\n    name: 'Boron',\n    monoisotopicMass: 11.00930536,\n  },\n  {\n    number: 6,\n    isotopes: [\n      { nominal: 8, mass: 8.037643 },\n      { nominal: 9, mass: 9.0310372 },\n      { nominal: 10, mass: 10.01685331 },\n      { nominal: 11, mass: 11.0114336 },\n      { nominal: 12, mass: 12, abundance: 0.9893 },\n      { nominal: 13, mass: 13.00335483507, abundance: 0.0107 },\n      { nominal: 14, mass: 14.0032419884 },\n      { nominal: 15, mass: 15.01059926 },\n      { nominal: 16, mass: 16.0147013 },\n      { nominal: 17, mass: 17.022577 },\n      { nominal: 18, mass: 18.026751 },\n      { nominal: 19, mass: 19.0348 },\n      { nominal: 20, mass: 20.04032 },\n      { nominal: 21, mass: 21.049 },\n      { nominal: 22, mass: 22.05753 },\n      { nominal: 23, mass: 23.0689 },\n    ],\n    symbol: 'C',\n    mass: 12.010735896735248,\n    name: 'Carbon',\n    monoisotopicMass: 12,\n  },\n  {\n    number: 7,\n    isotopes: [\n      { nominal: 10, mass: 10.04165 },\n      { nominal: 11, mass: 11.026091 },\n      { nominal: 12, mass: 12.0186132 },\n      { nominal: 13, mass: 13.00573861 },\n      { nominal: 14, mass: 14.00307400443, abundance: 0.99636 },\n      { nominal: 15, mass: 15.00010889888, abundance: 0.00364 },\n      { nominal: 16, mass: 16.0061019 },\n      { nominal: 17, mass: 17.008449 },\n      { nominal: 18, mass: 18.014078 },\n      { nominal: 19, mass: 19.017022 },\n      { nominal: 20, mass: 20.023366 },\n      { nominal: 21, mass: 21.02711 },\n      { nominal: 22, mass: 22.03439 },\n      { nominal: 23, mass: 23.04114 },\n      { nominal: 24, mass: 24.05039 },\n      { nominal: 25, mass: 25.0601 },\n    ],\n    symbol: 'N',\n    mass: 14.006703211445798,\n    name: 'Nitrogen',\n    monoisotopicMass: 14.00307400443,\n  },\n  {\n    number: 8,\n    isotopes: [\n      { nominal: 12, mass: 12.034262 },\n      { nominal: 13, mass: 13.024815 },\n      { nominal: 14, mass: 14.00859636 },\n      { nominal: 15, mass: 15.00306562 },\n      { nominal: 16, mass: 15.99491461957, abundance: 0.99757 },\n      { nominal: 17, mass: 16.9991317565, abundance: 0.00038 },\n      { nominal: 18, mass: 17.99915961286, abundance: 0.00205 },\n      { nominal: 19, mass: 19.003578 },\n      { nominal: 20, mass: 20.00407535 },\n      { nominal: 21, mass: 21.008655 },\n      { nominal: 22, mass: 22.009966 },\n      { nominal: 23, mass: 23.015696 },\n      { nominal: 24, mass: 24.01986 },\n      { nominal: 25, mass: 25.02936 },\n      { nominal: 26, mass: 26.03729 },\n      { nominal: 27, mass: 27.04772 },\n      { nominal: 28, mass: 28.05591 },\n    ],\n    symbol: 'O',\n    mass: 15.999404924318277,\n    name: 'Oxygen',\n    monoisotopicMass: 15.99491461957,\n  },\n  {\n    number: 9,\n    isotopes: [\n      { nominal: 14, mass: 14.034315 },\n      { nominal: 15, mass: 15.018043 },\n      { nominal: 16, mass: 16.0114657 },\n      { nominal: 17, mass: 17.00209524 },\n      { nominal: 18, mass: 18.00093733 },\n      { nominal: 19, mass: 18.99840316273, abundance: 1 },\n      { nominal: 20, mass: 19.999981252 },\n      { nominal: 21, mass: 20.9999489 },\n      { nominal: 22, mass: 22.002999 },\n      { nominal: 23, mass: 23.003557 },\n      { nominal: 24, mass: 24.008115 },\n      { nominal: 25, mass: 25.012199 },\n      { nominal: 26, mass: 26.020038 },\n      { nominal: 27, mass: 27.02644 },\n      { nominal: 28, mass: 28.03534 },\n      { nominal: 29, mass: 29.04254 },\n      { nominal: 30, mass: 30.05165 },\n      { nominal: 31, mass: 31.05971 },\n    ],\n    symbol: 'F',\n    mass: 18.99840316273,\n    name: 'Fluorine',\n    monoisotopicMass: 18.99840316273,\n  },\n  {\n    number: 10,\n    isotopes: [\n      { nominal: 16, mass: 16.02575 },\n      { nominal: 17, mass: 17.01771396 },\n      { nominal: 18, mass: 18.0057087 },\n      { nominal: 19, mass: 19.00188091 },\n      { nominal: 20, mass: 19.9924401762, abundance: 0.9048 },\n      { nominal: 21, mass: 20.993846685, abundance: 0.0027 },\n      { nominal: 22, mass: 21.991385114, abundance: 0.0925 },\n      { nominal: 23, mass: 22.99446691 },\n      { nominal: 24, mass: 23.99361065 },\n      { nominal: 25, mass: 24.997789 },\n      { nominal: 26, mass: 26.000515 },\n      { nominal: 27, mass: 27.007553 },\n      { nominal: 28, mass: 28.01212 },\n      { nominal: 29, mass: 29.01975 },\n      { nominal: 30, mass: 30.02473 },\n      { nominal: 31, mass: 31.0331 },\n      { nominal: 32, mass: 32.03972 },\n      { nominal: 33, mass: 33.04938 },\n      { nominal: 34, mass: 34.05673 },\n    ],\n    symbol: 'Ne',\n    mass: 20.18004638052026,\n    name: 'Neon',\n    monoisotopicMass: 19.9924401762,\n  },\n  {\n    number: 11,\n    isotopes: [\n      { nominal: 18, mass: 18.02688 },\n      { nominal: 19, mass: 19.01388 },\n      { nominal: 20, mass: 20.0073544 },\n      { nominal: 21, mass: 20.99765469 },\n      { nominal: 22, mass: 21.99443741 },\n      { nominal: 23, mass: 22.989769282, abundance: 1 },\n      { nominal: 24, mass: 23.99096295 },\n      { nominal: 25, mass: 24.989954 },\n      { nominal: 26, mass: 25.9926346 },\n      { nominal: 27, mass: 26.9940765 },\n      { nominal: 28, mass: 27.998939 },\n      { nominal: 29, mass: 29.0028771 },\n      { nominal: 30, mass: 30.0090979 },\n      { nominal: 31, mass: 31.013163 },\n      { nominal: 32, mass: 32.02019 },\n      { nominal: 33, mass: 33.02573 },\n      { nominal: 34, mass: 34.03359 },\n      { nominal: 35, mass: 35.04062 },\n      { nominal: 36, mass: 36.04929 },\n      { nominal: 37, mass: 37.05705 },\n    ],\n    symbol: 'Na',\n    mass: 22.989769282,\n    name: 'Sodium',\n    monoisotopicMass: 22.989769282,\n  },\n  {\n    number: 12,\n    isotopes: [\n      { nominal: 19, mass: 19.034169 },\n      { nominal: 20, mass: 20.01885 },\n      { nominal: 21, mass: 21.011716 },\n      { nominal: 22, mass: 21.99957065 },\n      { nominal: 23, mass: 22.99412421 },\n      { nominal: 24, mass: 23.985041697, abundance: 0.7899 },\n      { nominal: 25, mass: 24.985836976, abundance: 0.1 },\n      { nominal: 26, mass: 25.982592968, abundance: 0.1101 },\n      { nominal: 27, mass: 26.984340624 },\n      { nominal: 28, mass: 27.9838767 },\n      { nominal: 29, mass: 28.988617 },\n      { nominal: 30, mass: 29.9904629 },\n      { nominal: 31, mass: 30.996648 },\n      { nominal: 32, mass: 31.9991102 },\n      { nominal: 33, mass: 33.0053271 },\n      { nominal: 34, mass: 34.008935 },\n      { nominal: 35, mass: 35.01679 },\n      { nominal: 36, mass: 36.02188 },\n      { nominal: 37, mass: 37.03037 },\n      { nominal: 38, mass: 38.03658 },\n      { nominal: 39, mass: 39.04538 },\n      { nominal: 40, mass: 40.05218 },\n    ],\n    symbol: 'Mg',\n    mass: 24.3050516198371,\n    name: 'Magnesium',\n    monoisotopicMass: 23.985041697,\n  },\n  {\n    number: 13,\n    isotopes: [\n      { nominal: 21, mass: 21.02897 },\n      { nominal: 22, mass: 22.01954 },\n      { nominal: 23, mass: 23.00724435 },\n      { nominal: 24, mass: 23.9999489 },\n      { nominal: 25, mass: 24.9904281 },\n      { nominal: 26, mass: 25.986891904 },\n      { nominal: 27, mass: 26.98153853, abundance: 1 },\n      { nominal: 28, mass: 27.98191021 },\n      { nominal: 29, mass: 28.9804565 },\n      { nominal: 30, mass: 29.98296 },\n      { nominal: 31, mass: 30.983945 },\n      { nominal: 32, mass: 31.988085 },\n      { nominal: 33, mass: 32.990909 },\n      { nominal: 34, mass: 33.996705 },\n      { nominal: 35, mass: 34.999764 },\n      { nominal: 36, mass: 36.00639 },\n      { nominal: 37, mass: 37.01053 },\n      { nominal: 38, mass: 38.0174 },\n      { nominal: 39, mass: 39.02254 },\n      { nominal: 40, mass: 40.03003 },\n      { nominal: 41, mass: 41.03638 },\n      { nominal: 42, mass: 42.04384 },\n      { nominal: 43, mass: 43.05147 },\n    ],\n    symbol: 'Al',\n    mass: 26.98153853,\n    name: 'Aluminium',\n    monoisotopicMass: 26.98153853,\n  },\n  {\n    number: 14,\n    isotopes: [\n      { nominal: 22, mass: 22.03579 },\n      { nominal: 23, mass: 23.02544 },\n      { nominal: 24, mass: 24.011535 },\n      { nominal: 25, mass: 25.004109 },\n      { nominal: 26, mass: 25.99233384 },\n      { nominal: 27, mass: 26.98670481 },\n      { nominal: 28, mass: 27.97692653465, abundance: 0.92223 },\n      { nominal: 29, mass: 28.9764946649, abundance: 0.04685 },\n      { nominal: 30, mass: 29.973770136, abundance: 0.03092 },\n      { nominal: 31, mass: 30.975363194 },\n      { nominal: 32, mass: 31.97415154 },\n      { nominal: 33, mass: 32.97797696 },\n      { nominal: 34, mass: 33.978576 },\n      { nominal: 35, mass: 34.984583 },\n      { nominal: 36, mass: 35.986695 },\n      { nominal: 37, mass: 36.992921 },\n      { nominal: 38, mass: 37.995523 },\n      { nominal: 39, mass: 39.002491 },\n      { nominal: 40, mass: 40.00583 },\n      { nominal: 41, mass: 41.01301 },\n      { nominal: 42, mass: 42.01778 },\n      { nominal: 43, mass: 43.0248 },\n      { nominal: 44, mass: 44.03061 },\n      { nominal: 45, mass: 45.03995 },\n    ],\n    symbol: 'Si',\n    mass: 28.085498705705955,\n    name: 'Silicon',\n    monoisotopicMass: 27.97692653465,\n  },\n  {\n    number: 15,\n    isotopes: [\n      { nominal: 24, mass: 24.03577 },\n      { nominal: 25, mass: 25.02119 },\n      { nominal: 26, mass: 26.01178 },\n      { nominal: 27, mass: 26.999224 },\n      { nominal: 28, mass: 27.9923266 },\n      { nominal: 29, mass: 28.98180079 },\n      { nominal: 30, mass: 29.97831375 },\n      { nominal: 31, mass: 30.97376199842, abundance: 1 },\n      { nominal: 32, mass: 31.973907643 },\n      { nominal: 33, mass: 32.9717257 },\n      { nominal: 34, mass: 33.97364589 },\n      { nominal: 35, mass: 34.9733141 },\n      { nominal: 36, mass: 35.97826 },\n      { nominal: 37, mass: 36.979607 },\n      { nominal: 38, mass: 37.984252 },\n      { nominal: 39, mass: 38.986227 },\n      { nominal: 40, mass: 39.99133 },\n      { nominal: 41, mass: 40.994654 },\n      { nominal: 42, mass: 42.00108 },\n      { nominal: 43, mass: 43.00502 },\n      { nominal: 44, mass: 44.01121 },\n      { nominal: 45, mass: 45.01645 },\n      { nominal: 46, mass: 46.02446 },\n      { nominal: 47, mass: 47.03139 },\n    ],\n    symbol: 'P',\n    mass: 30.97376199842,\n    name: 'Phosphorus',\n    monoisotopicMass: 30.97376199842,\n  },\n  {\n    number: 16,\n    isotopes: [\n      { nominal: 26, mass: 26.02907 },\n      { nominal: 27, mass: 27.01828 },\n      { nominal: 28, mass: 28.00437 },\n      { nominal: 29, mass: 28.996611 },\n      { nominal: 30, mass: 29.98490703 },\n      { nominal: 31, mass: 30.97955701 },\n      { nominal: 32, mass: 31.9720711744, abundance: 0.9499 },\n      { nominal: 33, mass: 32.9714589098, abundance: 0.0075 },\n      { nominal: 34, mass: 33.967867004, abundance: 0.0425 },\n      { nominal: 35, mass: 34.96903231 },\n      { nominal: 36, mass: 35.96708071, abundance: 0.0001 },\n      { nominal: 37, mass: 36.97112551 },\n      { nominal: 38, mass: 37.9711633 },\n      { nominal: 39, mass: 38.975134 },\n      { nominal: 40, mass: 39.9754826 },\n      { nominal: 41, mass: 40.9795935 },\n      { nominal: 42, mass: 41.9810651 },\n      { nominal: 43, mass: 42.9869076 },\n      { nominal: 44, mass: 43.9901188 },\n      { nominal: 45, mass: 44.99572 },\n      { nominal: 46, mass: 46.00004 },\n      { nominal: 47, mass: 47.00795 },\n      { nominal: 48, mass: 48.0137 },\n      { nominal: 49, mass: 49.02276 },\n    ],\n    symbol: 'S',\n    mass: 32.06478740612706,\n    name: 'Sulfur',\n    monoisotopicMass: 31.9720711744,\n  },\n  {\n    number: 17,\n    isotopes: [\n      { nominal: 28, mass: 28.02954 },\n      { nominal: 29, mass: 29.01478 },\n      { nominal: 30, mass: 30.00477 },\n      { nominal: 31, mass: 30.992414 },\n      { nominal: 32, mass: 31.98568464 },\n      { nominal: 33, mass: 32.97745199 },\n      { nominal: 34, mass: 33.973762485 },\n      { nominal: 35, mass: 34.968852682, abundance: 0.7576 },\n      { nominal: 36, mass: 35.968306809 },\n      { nominal: 37, mass: 36.965902602, abundance: 0.2424 },\n      { nominal: 38, mass: 37.96801044 },\n      { nominal: 39, mass: 38.9680082 },\n      { nominal: 40, mass: 39.970415 },\n      { nominal: 41, mass: 40.970685 },\n      { nominal: 42, mass: 41.97325 },\n      { nominal: 43, mass: 42.97389 },\n      { nominal: 44, mass: 43.97787 },\n      { nominal: 45, mass: 44.98029 },\n      { nominal: 46, mass: 45.98517 },\n      { nominal: 47, mass: 46.98916 },\n      { nominal: 48, mass: 47.99564 },\n      { nominal: 49, mass: 49.00123 },\n      { nominal: 50, mass: 50.00905 },\n      { nominal: 51, mass: 51.01554 },\n    ],\n    symbol: 'Cl',\n    mass: 35.452937582608,\n    name: 'Chlorine',\n    monoisotopicMass: 34.968852682,\n  },\n  {\n    number: 18,\n    isotopes: [\n      { nominal: 30, mass: 30.02307 },\n      { nominal: 31, mass: 31.01212 },\n      { nominal: 32, mass: 31.9976378 },\n      { nominal: 33, mass: 32.98992555 },\n      { nominal: 34, mass: 33.98027009 },\n      { nominal: 35, mass: 34.97525759 },\n      { nominal: 36, mass: 35.967545105, abundance: 0.003336 },\n      { nominal: 37, mass: 36.96677633 },\n      { nominal: 38, mass: 37.96273211, abundance: 0.000629 },\n      { nominal: 39, mass: 38.964313 },\n      { nominal: 40, mass: 39.9623831237, abundance: 0.996035 },\n      { nominal: 41, mass: 40.96450057 },\n      { nominal: 42, mass: 41.9630457 },\n      { nominal: 43, mass: 42.9656361 },\n      { nominal: 44, mass: 43.9649238 },\n      { nominal: 45, mass: 44.96803973 },\n      { nominal: 46, mass: 45.968083 },\n      { nominal: 47, mass: 46.972935 },\n      { nominal: 48, mass: 47.97591 },\n      { nominal: 49, mass: 48.9819 },\n      { nominal: 50, mass: 49.98613 },\n      { nominal: 51, mass: 50.9937 },\n      { nominal: 52, mass: 51.99896 },\n      { nominal: 53, mass: 53.00729 },\n    ],\n    symbol: 'Ar',\n    mass: 39.947798563582005,\n    name: 'Argon',\n    monoisotopicMass: 39.9623831237,\n  },\n  {\n    number: 19,\n    isotopes: [\n      { nominal: 32, mass: 32.02265 },\n      { nominal: 33, mass: 33.00756 },\n      { nominal: 34, mass: 33.99869 },\n      { nominal: 35, mass: 34.98800541 },\n      { nominal: 36, mass: 35.98130201 },\n      { nominal: 37, mass: 36.97337589 },\n      { nominal: 38, mass: 37.96908112 },\n      { nominal: 39, mass: 38.9637064864, abundance: 0.932581 },\n      { nominal: 40, mass: 39.963998166, abundance: 0.000117 },\n      { nominal: 41, mass: 40.9618252579, abundance: 0.067302 },\n      { nominal: 42, mass: 41.96240231 },\n      { nominal: 43, mass: 42.9607347 },\n      { nominal: 44, mass: 43.96158699 },\n      { nominal: 45, mass: 44.96069149 },\n      { nominal: 46, mass: 45.96198159 },\n      { nominal: 47, mass: 46.9616616 },\n      { nominal: 48, mass: 47.96534119 },\n      { nominal: 49, mass: 48.96821075 },\n      { nominal: 50, mass: 49.97238 },\n      { nominal: 51, mass: 50.975828 },\n      { nominal: 52, mass: 51.98224 },\n      { nominal: 53, mass: 52.98746 },\n      { nominal: 54, mass: 53.99463 },\n      { nominal: 55, mass: 55.00076 },\n      { nominal: 56, mass: 56.00851 },\n    ],\n    symbol: 'K',\n    mass: 39.098300910086,\n    name: 'Potassium',\n    monoisotopicMass: 38.9637064864,\n  },\n  {\n    number: 20,\n    isotopes: [\n      { nominal: 34, mass: 34.01487 },\n      { nominal: 35, mass: 35.00514 },\n      { nominal: 36, mass: 35.993074 },\n      { nominal: 37, mass: 36.98589785 },\n      { nominal: 38, mass: 37.97631922 },\n      { nominal: 39, mass: 38.97071081 },\n      { nominal: 40, mass: 39.962590863, abundance: 0.96941 },\n      { nominal: 41, mass: 40.96227792 },\n      { nominal: 42, mass: 41.95861783, abundance: 0.00647 },\n      { nominal: 43, mass: 42.95876644, abundance: 0.00135 },\n      { nominal: 44, mass: 43.95548156, abundance: 0.02086 },\n      { nominal: 45, mass: 44.95618635 },\n      { nominal: 46, mass: 45.953689, abundance: 0.00004 },\n      { nominal: 47, mass: 46.9545424 },\n      { nominal: 48, mass: 47.95252276, abundance: 0.00187 },\n      { nominal: 49, mass: 48.95566274 },\n      { nominal: 50, mass: 49.9574992 },\n      { nominal: 51, mass: 50.960989 },\n      { nominal: 52, mass: 51.963217 },\n      { nominal: 53, mass: 52.96945 },\n      { nominal: 54, mass: 53.9734 },\n      { nominal: 55, mass: 54.9803 },\n      { nominal: 56, mass: 55.98508 },\n      { nominal: 57, mass: 56.99262 },\n      { nominal: 58, mass: 57.99794 },\n    ],\n    symbol: 'Ca',\n    mass: 40.078022511017735,\n    name: 'Calcium',\n    monoisotopicMass: 39.962590863,\n  },\n  {\n    number: 21,\n    isotopes: [\n      { nominal: 36, mass: 36.01648 },\n      { nominal: 37, mass: 37.00374 },\n      { nominal: 38, mass: 37.99512 },\n      { nominal: 39, mass: 38.984785 },\n      { nominal: 40, mass: 39.9779673 },\n      { nominal: 41, mass: 40.969251105 },\n      { nominal: 42, mass: 41.96551653 },\n      { nominal: 43, mass: 42.9611505 },\n      { nominal: 44, mass: 43.9594029 },\n      { nominal: 45, mass: 44.95590828, abundance: 1 },\n      { nominal: 46, mass: 45.95516826 },\n      { nominal: 47, mass: 46.9524037 },\n      { nominal: 48, mass: 47.9522236 },\n      { nominal: 49, mass: 48.9500146 },\n      { nominal: 50, mass: 49.952176 },\n      { nominal: 51, mass: 50.953592 },\n      { nominal: 52, mass: 51.95688 },\n      { nominal: 53, mass: 52.95909 },\n      { nominal: 54, mass: 53.96393 },\n      { nominal: 55, mass: 54.96782 },\n      { nominal: 56, mass: 55.97345 },\n      { nominal: 57, mass: 56.97777 },\n      { nominal: 58, mass: 57.98403 },\n      { nominal: 59, mass: 58.98894 },\n      { nominal: 60, mass: 59.99565 },\n      { nominal: 61, mass: 61.001 },\n    ],\n    symbol: 'Sc',\n    mass: 44.95590828,\n    name: 'Scandium',\n    monoisotopicMass: 44.95590828,\n  },\n  {\n    number: 22,\n    isotopes: [\n      { nominal: 38, mass: 38.01145 },\n      { nominal: 39, mass: 39.00236 },\n      { nominal: 40, mass: 39.9905 },\n      { nominal: 41, mass: 40.983148 },\n      { nominal: 42, mass: 41.97304903 },\n      { nominal: 43, mass: 42.9685225 },\n      { nominal: 44, mass: 43.95968995 },\n      { nominal: 45, mass: 44.95812198 },\n      { nominal: 46, mass: 45.95262772, abundance: 0.0825 },\n      { nominal: 47, mass: 46.95175879, abundance: 0.0744 },\n      { nominal: 48, mass: 47.94794198, abundance: 0.7372 },\n      { nominal: 49, mass: 48.94786568, abundance: 0.0541 },\n      { nominal: 50, mass: 49.94478689, abundance: 0.0518 },\n      { nominal: 51, mass: 50.94661065 },\n      { nominal: 52, mass: 51.946893 },\n      { nominal: 53, mass: 52.94973 },\n      { nominal: 54, mass: 53.95105 },\n      { nominal: 55, mass: 54.95527 },\n      { nominal: 56, mass: 55.95791 },\n      { nominal: 57, mass: 56.96364 },\n      { nominal: 58, mass: 57.9666 },\n      { nominal: 59, mass: 58.97247 },\n      { nominal: 60, mass: 59.97603 },\n      { nominal: 61, mass: 60.98245 },\n      { nominal: 62, mass: 61.98651 },\n      { nominal: 63, mass: 62.99375 },\n    ],\n    symbol: 'Ti',\n    mass: 47.866744962721995,\n    name: 'Titanium',\n    monoisotopicMass: 47.94794198,\n  },\n  {\n    number: 23,\n    isotopes: [\n      { nominal: 40, mass: 40.01276 },\n      { nominal: 41, mass: 41.00021 },\n      { nominal: 42, mass: 41.99182 },\n      { nominal: 43, mass: 42.980766 },\n      { nominal: 44, mass: 43.97411 },\n      { nominal: 45, mass: 44.9657748 },\n      { nominal: 46, mass: 45.96019878 },\n      { nominal: 47, mass: 46.95490491 },\n      { nominal: 48, mass: 47.9522522 },\n      { nominal: 49, mass: 48.9485118 },\n      { nominal: 50, mass: 49.94715601, abundance: 0.0025 },\n      { nominal: 51, mass: 50.94395704, abundance: 0.9975 },\n      { nominal: 52, mass: 51.94477301 },\n      { nominal: 53, mass: 52.9443367 },\n      { nominal: 54, mass: 53.946439 },\n      { nominal: 55, mass: 54.94724 },\n      { nominal: 56, mass: 55.95048 },\n      { nominal: 57, mass: 56.95252 },\n      { nominal: 58, mass: 57.95672 },\n      { nominal: 59, mass: 58.95939 },\n      { nominal: 60, mass: 59.96431 },\n      { nominal: 61, mass: 60.96725 },\n      { nominal: 62, mass: 61.97265 },\n      { nominal: 63, mass: 62.97639 },\n      { nominal: 64, mass: 63.98264 },\n      { nominal: 65, mass: 64.9875 },\n      { nominal: 66, mass: 65.99398 },\n    ],\n    symbol: 'V',\n    mass: 50.941465037425004,\n    name: 'Vanadium',\n    monoisotopicMass: 50.94395704,\n  },\n  {\n    number: 24,\n    isotopes: [\n      { nominal: 42, mass: 42.0067 },\n      { nominal: 43, mass: 42.99753 },\n      { nominal: 44, mass: 43.98536 },\n      { nominal: 45, mass: 44.97905 },\n      { nominal: 46, mass: 45.968359 },\n      { nominal: 47, mass: 46.9628974 },\n      { nominal: 48, mass: 47.9540291 },\n      { nominal: 49, mass: 48.9513333 },\n      { nominal: 50, mass: 49.94604183, abundance: 0.04345 },\n      { nominal: 51, mass: 50.94476502 },\n      { nominal: 52, mass: 51.94050623, abundance: 0.83789 },\n      { nominal: 53, mass: 52.94064815, abundance: 0.09501 },\n      { nominal: 54, mass: 53.93887916, abundance: 0.02365 },\n      { nominal: 55, mass: 54.94083843 },\n      { nominal: 56, mass: 55.9406531 },\n      { nominal: 57, mass: 56.943613 },\n      { nominal: 58, mass: 57.94435 },\n      { nominal: 59, mass: 58.94859 },\n      { nominal: 60, mass: 59.95008 },\n      { nominal: 61, mass: 60.95442 },\n      { nominal: 62, mass: 61.9561 },\n      { nominal: 63, mass: 62.96165 },\n      { nominal: 64, mass: 63.96408 },\n      { nominal: 65, mass: 64.96996 },\n      { nominal: 66, mass: 65.97366 },\n      { nominal: 67, mass: 66.98016 },\n      { nominal: 68, mass: 67.98403 },\n    ],\n    symbol: 'Cr',\n    mass: 51.9961317554337,\n    name: 'Chromium',\n    monoisotopicMass: 51.94050623,\n  },\n  {\n    number: 25,\n    isotopes: [\n      { nominal: 44, mass: 44.00715 },\n      { nominal: 45, mass: 44.99449 },\n      { nominal: 46, mass: 45.98609 },\n      { nominal: 47, mass: 46.975775 },\n      { nominal: 48, mass: 47.96852 },\n      { nominal: 49, mass: 48.959595 },\n      { nominal: 50, mass: 49.95423778 },\n      { nominal: 51, mass: 50.94820847 },\n      { nominal: 52, mass: 51.9455639 },\n      { nominal: 53, mass: 52.94128889 },\n      { nominal: 54, mass: 53.9403576 },\n      { nominal: 55, mass: 54.93804391, abundance: 1 },\n      { nominal: 56, mass: 55.93890369 },\n      { nominal: 57, mass: 56.9382861 },\n      { nominal: 58, mass: 57.9400666 },\n      { nominal: 59, mass: 58.9403911 },\n      { nominal: 60, mass: 59.9431366 },\n      { nominal: 61, mass: 60.9444525 },\n      { nominal: 62, mass: 61.94795 },\n      { nominal: 63, mass: 62.9496647 },\n      { nominal: 64, mass: 63.9538494 },\n      { nominal: 65, mass: 64.9560198 },\n      { nominal: 66, mass: 65.960547 },\n      { nominal: 67, mass: 66.96424 },\n      { nominal: 68, mass: 67.96962 },\n      { nominal: 69, mass: 68.97366 },\n      { nominal: 70, mass: 69.97937 },\n      { nominal: 71, mass: 70.98368 },\n    ],\n    symbol: 'Mn',\n    mass: 54.93804391,\n    name: 'Manganese',\n    monoisotopicMass: 54.93804391,\n  },\n  {\n    number: 26,\n    isotopes: [\n      { nominal: 45, mass: 45.01442 },\n      { nominal: 46, mass: 46.00063 },\n      { nominal: 47, mass: 46.99185 },\n      { nominal: 48, mass: 47.98023 },\n      { nominal: 49, mass: 48.973429 },\n      { nominal: 50, mass: 49.962975 },\n      { nominal: 51, mass: 50.956841 },\n      { nominal: 52, mass: 51.9481131 },\n      { nominal: 53, mass: 52.9453064 },\n      { nominal: 54, mass: 53.93960899, abundance: 0.05845 },\n      { nominal: 55, mass: 54.93829199 },\n      { nominal: 56, mass: 55.93493633, abundance: 0.91754 },\n      { nominal: 57, mass: 56.93539284, abundance: 0.02119 },\n      { nominal: 58, mass: 57.93327443, abundance: 0.00282 },\n      { nominal: 59, mass: 58.93487434 },\n      { nominal: 60, mass: 59.9340711 },\n      { nominal: 61, mass: 60.9367462 },\n      { nominal: 62, mass: 61.9367918 },\n      { nominal: 63, mass: 62.9402727 },\n      { nominal: 64, mass: 63.9409878 },\n      { nominal: 65, mass: 64.9450115 },\n      { nominal: 66, mass: 65.94625 },\n      { nominal: 67, mass: 66.95054 },\n      { nominal: 68, mass: 67.95295 },\n      { nominal: 69, mass: 68.95807 },\n      { nominal: 70, mass: 69.96102 },\n      { nominal: 71, mass: 70.96672 },\n      { nominal: 72, mass: 71.96983 },\n      { nominal: 73, mass: 72.97572 },\n      { nominal: 74, mass: 73.97935 },\n    ],\n    symbol: 'Fe',\n    mass: 55.845144433865904,\n    name: 'Iron',\n    monoisotopicMass: 55.93493633,\n  },\n  {\n    number: 27,\n    isotopes: [\n      { nominal: 47, mass: 47.01057 },\n      { nominal: 48, mass: 48.00093 },\n      { nominal: 49, mass: 48.98891 },\n      { nominal: 50, mass: 49.98091 },\n      { nominal: 51, mass: 50.970647 },\n      { nominal: 52, mass: 51.96351 },\n      { nominal: 53, mass: 52.9542041 },\n      { nominal: 54, mass: 53.94845987 },\n      { nominal: 55, mass: 54.9419972 },\n      { nominal: 56, mass: 55.9398388 },\n      { nominal: 57, mass: 56.93629057 },\n      { nominal: 58, mass: 57.9357521 },\n      { nominal: 59, mass: 58.93319429, abundance: 1 },\n      { nominal: 60, mass: 59.9338163 },\n      { nominal: 61, mass: 60.93247662 },\n      { nominal: 62, mass: 61.934059 },\n      { nominal: 63, mass: 62.9336 },\n      { nominal: 64, mass: 63.935811 },\n      { nominal: 65, mass: 64.9364621 },\n      { nominal: 66, mass: 65.939443 },\n      { nominal: 67, mass: 66.9406096 },\n      { nominal: 68, mass: 67.94426 },\n      { nominal: 69, mass: 68.94614 },\n      { nominal: 70, mass: 69.94963 },\n      { nominal: 71, mass: 70.95237 },\n      { nominal: 72, mass: 71.95729 },\n      { nominal: 73, mass: 72.96039 },\n      { nominal: 74, mass: 73.96515 },\n      { nominal: 75, mass: 74.96876 },\n      { nominal: 76, mass: 75.97413 },\n    ],\n    symbol: 'Co',\n    mass: 58.93319429,\n    name: 'Cobalt',\n    monoisotopicMass: 58.93319429,\n  },\n  {\n    number: 28,\n    isotopes: [\n      { nominal: 48, mass: 48.01769 },\n      { nominal: 49, mass: 49.0077 },\n      { nominal: 50, mass: 49.99474 },\n      { nominal: 51, mass: 50.98611 },\n      { nominal: 52, mass: 51.9748 },\n      { nominal: 53, mass: 52.96819 },\n      { nominal: 54, mass: 53.957892 },\n      { nominal: 55, mass: 54.95133063 },\n      { nominal: 56, mass: 55.94212855 },\n      { nominal: 57, mass: 56.93979218 },\n      { nominal: 58, mass: 57.93534241, abundance: 0.68077 },\n      { nominal: 59, mass: 58.9343462 },\n      { nominal: 60, mass: 59.93078588, abundance: 0.26223 },\n      { nominal: 61, mass: 60.93105557, abundance: 0.011399 },\n      { nominal: 62, mass: 61.92834537, abundance: 0.036346 },\n      { nominal: 63, mass: 62.92966963 },\n      { nominal: 64, mass: 63.92796682, abundance: 0.009255 },\n      { nominal: 65, mass: 64.93008517 },\n      { nominal: 66, mass: 65.9291393 },\n      { nominal: 67, mass: 66.9315694 },\n      { nominal: 68, mass: 67.9318688 },\n      { nominal: 69, mass: 68.9356103 },\n      { nominal: 70, mass: 69.9364313 },\n      { nominal: 71, mass: 70.940519 },\n      { nominal: 72, mass: 71.9417859 },\n      { nominal: 73, mass: 72.9462067 },\n      { nominal: 74, mass: 73.94798 },\n      { nominal: 75, mass: 74.9525 },\n      { nominal: 76, mass: 75.95533 },\n      { nominal: 77, mass: 76.96055 },\n      { nominal: 78, mass: 77.96336 },\n      { nominal: 79, mass: 78.97025 },\n    ],\n    symbol: 'Ni',\n    mass: 58.69334710994765,\n    name: 'Nickel',\n    monoisotopicMass: 57.93534241,\n  },\n  {\n    number: 29,\n    isotopes: [\n      { nominal: 52, mass: 51.99671 },\n      { nominal: 53, mass: 52.98459 },\n      { nominal: 54, mass: 53.97666 },\n      { nominal: 55, mass: 54.96604 },\n      { nominal: 56, mass: 55.95895 },\n      { nominal: 57, mass: 56.9492125 },\n      { nominal: 58, mass: 57.94453305 },\n      { nominal: 59, mass: 58.93949748 },\n      { nominal: 60, mass: 59.9373645 },\n      { nominal: 61, mass: 60.9334576 },\n      { nominal: 62, mass: 61.93259541 },\n      { nominal: 63, mass: 62.92959772, abundance: 0.6915 },\n      { nominal: 64, mass: 63.92976434 },\n      { nominal: 65, mass: 64.9277897, abundance: 0.3085 },\n      { nominal: 66, mass: 65.92886903 },\n      { nominal: 67, mass: 66.9277303 },\n      { nominal: 68, mass: 67.9296109 },\n      { nominal: 69, mass: 68.9294293 },\n      { nominal: 70, mass: 69.9323921 },\n      { nominal: 71, mass: 70.9326768 },\n      { nominal: 72, mass: 71.9358203 },\n      { nominal: 73, mass: 72.9366744 },\n      { nominal: 74, mass: 73.9398749 },\n      { nominal: 75, mass: 74.9415226 },\n      { nominal: 76, mass: 75.945275 },\n      { nominal: 77, mass: 76.94792 },\n      { nominal: 78, mass: 77.95223 },\n      { nominal: 79, mass: 78.95502 },\n      { nominal: 80, mass: 79.96089 },\n      { nominal: 81, mass: 80.96587 },\n      { nominal: 82, mass: 81.97244 },\n    ],\n    symbol: 'Cu',\n    mass: 63.54603994583,\n    name: 'Copper',\n    monoisotopicMass: 62.92959772,\n  },\n  {\n    number: 30,\n    isotopes: [\n      { nominal: 54, mass: 53.99204 },\n      { nominal: 55, mass: 54.98398 },\n      { nominal: 56, mass: 55.97254 },\n      { nominal: 57, mass: 56.96506 },\n      { nominal: 58, mass: 57.954591 },\n      { nominal: 59, mass: 58.94931266 },\n      { nominal: 60, mass: 59.9418421 },\n      { nominal: 61, mass: 60.939507 },\n      { nominal: 62, mass: 61.93433397 },\n      { nominal: 63, mass: 62.9332115 },\n      { nominal: 64, mass: 63.92914201, abundance: 0.4917 },\n      { nominal: 65, mass: 64.92924077 },\n      { nominal: 66, mass: 65.92603381, abundance: 0.2773 },\n      { nominal: 67, mass: 66.92712775, abundance: 0.0404 },\n      { nominal: 68, mass: 67.92484455, abundance: 0.1845 },\n      { nominal: 69, mass: 68.9265507 },\n      { nominal: 70, mass: 69.9253192, abundance: 0.0061 },\n      { nominal: 71, mass: 70.9277196 },\n      { nominal: 72, mass: 71.9268428 },\n      { nominal: 73, mass: 72.9295826 },\n      { nominal: 74, mass: 73.9294073 },\n      { nominal: 75, mass: 74.9328402 },\n      { nominal: 76, mass: 75.933115 },\n      { nominal: 77, mass: 76.9368872 },\n      { nominal: 78, mass: 77.9382892 },\n      { nominal: 79, mass: 78.9426381 },\n      { nominal: 80, mass: 79.9445529 },\n      { nominal: 81, mass: 80.9504026 },\n      { nominal: 82, mass: 81.95426 },\n      { nominal: 83, mass: 82.96056 },\n      { nominal: 84, mass: 83.96521 },\n      { nominal: 85, mass: 84.97226 },\n    ],\n    symbol: 'Zn',\n    mass: 65.37778252952499,\n    name: 'Zinc',\n    monoisotopicMass: 63.92914201,\n  },\n  {\n    number: 31,\n    isotopes: [\n      { nominal: 56, mass: 55.99536 },\n      { nominal: 57, mass: 56.9832 },\n      { nominal: 58, mass: 57.97478 },\n      { nominal: 59, mass: 58.96353 },\n      { nominal: 60, mass: 59.95729 },\n      { nominal: 61, mass: 60.949399 },\n      { nominal: 62, mass: 61.94419025 },\n      { nominal: 63, mass: 62.9392942 },\n      { nominal: 64, mass: 63.9368404 },\n      { nominal: 65, mass: 64.93273459 },\n      { nominal: 66, mass: 65.9315894 },\n      { nominal: 67, mass: 66.9282025 },\n      { nominal: 68, mass: 67.9279805 },\n      { nominal: 69, mass: 68.9255735, abundance: 0.60108 },\n      { nominal: 70, mass: 69.9260219 },\n      { nominal: 71, mass: 70.92470258, abundance: 0.39892 },\n      { nominal: 72, mass: 71.92636747 },\n      { nominal: 73, mass: 72.9251747 },\n      { nominal: 74, mass: 73.9269457 },\n      { nominal: 75, mass: 74.9265002 },\n      { nominal: 76, mass: 75.9288276 },\n      { nominal: 77, mass: 76.9291543 },\n      { nominal: 78, mass: 77.9316088 },\n      { nominal: 79, mass: 78.9328523 },\n      { nominal: 80, mass: 79.9364208 },\n      { nominal: 81, mass: 80.9381338 },\n      { nominal: 82, mass: 81.9431765 },\n      { nominal: 83, mass: 82.9471203 },\n      { nominal: 84, mass: 83.95246 },\n      { nominal: 85, mass: 84.95699 },\n      { nominal: 86, mass: 85.96301 },\n      { nominal: 87, mass: 86.96824 },\n    ],\n    symbol: 'Ga',\n    mass: 69.7230660725936,\n    name: 'Gallium',\n    monoisotopicMass: 68.9255735,\n  },\n  {\n    number: 32,\n    isotopes: [\n      { nominal: 58, mass: 57.99172 },\n      { nominal: 59, mass: 58.98249 },\n      { nominal: 60, mass: 59.97036 },\n      { nominal: 61, mass: 60.96379 },\n      { nominal: 62, mass: 61.95502 },\n      { nominal: 63, mass: 62.949628 },\n      { nominal: 64, mass: 63.9416899 },\n      { nominal: 65, mass: 64.9393681 },\n      { nominal: 66, mass: 65.9338621 },\n      { nominal: 67, mass: 66.9327339 },\n      { nominal: 68, mass: 67.9280953 },\n      { nominal: 69, mass: 68.9279645 },\n      { nominal: 70, mass: 69.92424875, abundance: 0.2057 },\n      { nominal: 71, mass: 70.92495233 },\n      { nominal: 72, mass: 71.922075826, abundance: 0.2745 },\n      { nominal: 73, mass: 72.923458956, abundance: 0.0775 },\n      { nominal: 74, mass: 73.921177761, abundance: 0.365 },\n      { nominal: 75, mass: 74.92285837 },\n      { nominal: 76, mass: 75.921402726, abundance: 0.0773 },\n      { nominal: 77, mass: 76.923549843 },\n      { nominal: 78, mass: 77.9228529 },\n      { nominal: 79, mass: 78.92536 },\n      { nominal: 80, mass: 79.9253508 },\n      { nominal: 81, mass: 80.9288329 },\n      { nominal: 82, mass: 81.929774 },\n      { nominal: 83, mass: 82.9345391 },\n      { nominal: 84, mass: 83.9375751 },\n      { nominal: 85, mass: 84.9429697 },\n      { nominal: 86, mass: 85.94658 },\n      { nominal: 87, mass: 86.95268 },\n      { nominal: 88, mass: 87.95691 },\n      { nominal: 89, mass: 88.96379 },\n      { nominal: 90, mass: 89.96863 },\n    ],\n    symbol: 'Ge',\n    mass: 72.6275501646868,\n    name: 'Germanium',\n    monoisotopicMass: 73.921177761,\n  },\n  {\n    number: 33,\n    isotopes: [\n      { nominal: 60, mass: 59.99388 },\n      { nominal: 61, mass: 60.98112 },\n      { nominal: 62, mass: 61.97361 },\n      { nominal: 63, mass: 62.9639 },\n      { nominal: 64, mass: 63.95743 },\n      { nominal: 65, mass: 64.949611 },\n      { nominal: 66, mass: 65.9441488 },\n      { nominal: 67, mass: 66.93925111 },\n      { nominal: 68, mass: 67.9367741 },\n      { nominal: 69, mass: 68.932246 },\n      { nominal: 70, mass: 69.930926 },\n      { nominal: 71, mass: 70.9271138 },\n      { nominal: 72, mass: 71.9267523 },\n      { nominal: 73, mass: 72.9238291 },\n      { nominal: 74, mass: 73.9239286 },\n      { nominal: 75, mass: 74.92159457, abundance: 1 },\n      { nominal: 76, mass: 75.92239202 },\n      { nominal: 77, mass: 76.9206476 },\n      { nominal: 78, mass: 77.921828 },\n      { nominal: 79, mass: 78.9209484 },\n      { nominal: 80, mass: 79.9224746 },\n      { nominal: 81, mass: 80.9221323 },\n      { nominal: 82, mass: 81.9247412 },\n      { nominal: 83, mass: 82.9252069 },\n      { nominal: 84, mass: 83.9293033 },\n      { nominal: 85, mass: 84.9321637 },\n      { nominal: 86, mass: 85.9367015 },\n      { nominal: 87, mass: 86.9402917 },\n      { nominal: 88, mass: 87.94555 },\n      { nominal: 89, mass: 88.94976 },\n      { nominal: 90, mass: 89.95563 },\n      { nominal: 91, mass: 90.96039 },\n      { nominal: 92, mass: 91.96674 },\n    ],\n    symbol: 'As',\n    mass: 74.92159457,\n    name: 'Arsenic',\n    monoisotopicMass: 74.92159457,\n  },\n  {\n    number: 34,\n    isotopes: [\n      { nominal: 64, mass: 63.97109 },\n      { nominal: 65, mass: 64.9644 },\n      { nominal: 66, mass: 65.95559 },\n      { nominal: 67, mass: 66.949994 },\n      { nominal: 68, mass: 67.94182524 },\n      { nominal: 69, mass: 68.9394148 },\n      { nominal: 70, mass: 69.9335155 },\n      { nominal: 71, mass: 70.9322094 },\n      { nominal: 72, mass: 71.9271405 },\n      { nominal: 73, mass: 72.9267549 },\n      { nominal: 74, mass: 73.922475934, abundance: 0.0089 },\n      { nominal: 75, mass: 74.92252287 },\n      { nominal: 76, mass: 75.919213704, abundance: 0.0937 },\n      { nominal: 77, mass: 76.919914154, abundance: 0.0763 },\n      { nominal: 78, mass: 77.91730928, abundance: 0.2377 },\n      { nominal: 79, mass: 78.91849929 },\n      { nominal: 80, mass: 79.9165218, abundance: 0.4961 },\n      { nominal: 81, mass: 80.917993 },\n      { nominal: 82, mass: 81.9166995, abundance: 0.0873 },\n      { nominal: 83, mass: 82.9191186 },\n      { nominal: 84, mass: 83.9184668 },\n      { nominal: 85, mass: 84.9222608 },\n      { nominal: 86, mass: 85.9243117 },\n      { nominal: 87, mass: 86.9286886 },\n      { nominal: 88, mass: 87.9314175 },\n      { nominal: 89, mass: 88.9366691 },\n      { nominal: 90, mass: 89.9401 },\n      { nominal: 91, mass: 90.94596 },\n      { nominal: 92, mass: 91.94984 },\n      { nominal: 93, mass: 92.95629 },\n      { nominal: 94, mass: 93.96049 },\n      { nominal: 95, mass: 94.9673 },\n    ],\n    symbol: 'Se',\n    mass: 78.95938855701361,\n    name: 'Selenium',\n    monoisotopicMass: 79.9165218,\n  },\n  {\n    number: 35,\n    isotopes: [\n      { nominal: 67, mass: 66.96465 },\n      { nominal: 68, mass: 67.95873 },\n      { nominal: 69, mass: 68.950497 },\n      { nominal: 70, mass: 69.944792 },\n      { nominal: 71, mass: 70.9393422 },\n      { nominal: 72, mass: 71.9365886 },\n      { nominal: 73, mass: 72.9316715 },\n      { nominal: 74, mass: 73.9299102 },\n      { nominal: 75, mass: 74.9258105 },\n      { nominal: 76, mass: 75.924542 },\n      { nominal: 77, mass: 76.9213792 },\n      { nominal: 78, mass: 77.9211459 },\n      { nominal: 79, mass: 78.9183376, abundance: 0.5069 },\n      { nominal: 80, mass: 79.9185298 },\n      { nominal: 81, mass: 80.9162897, abundance: 0.4931 },\n      { nominal: 82, mass: 81.9168032 },\n      { nominal: 83, mass: 82.9151756 },\n      { nominal: 84, mass: 83.916496 },\n      { nominal: 85, mass: 84.9156458 },\n      { nominal: 86, mass: 85.9188054 },\n      { nominal: 87, mass: 86.920674 },\n      { nominal: 88, mass: 87.9240833 },\n      { nominal: 89, mass: 88.9267046 },\n      { nominal: 90, mass: 89.9312928 },\n      { nominal: 91, mass: 90.9343986 },\n      { nominal: 92, mass: 91.9396316 },\n      { nominal: 93, mass: 92.94313 },\n      { nominal: 94, mass: 93.9489 },\n      { nominal: 95, mass: 94.95301 },\n      { nominal: 96, mass: 95.95903 },\n      { nominal: 97, mass: 96.96344 },\n      { nominal: 98, mass: 97.96946 },\n    ],\n    symbol: 'Br',\n    mass: 79.90352778050999,\n    name: 'Bromine',\n    monoisotopicMass: 78.9183376,\n  },\n  {\n    number: 36,\n    isotopes: [\n      { nominal: 69, mass: 68.96518 },\n      { nominal: 70, mass: 69.95604 },\n      { nominal: 71, mass: 70.95027 },\n      { nominal: 72, mass: 71.9420924 },\n      { nominal: 73, mass: 72.9392892 },\n      { nominal: 74, mass: 73.933084 },\n      { nominal: 75, mass: 74.9309457 },\n      { nominal: 76, mass: 75.9259103 },\n      { nominal: 77, mass: 76.92467 },\n      { nominal: 78, mass: 77.92036494, abundance: 0.00355 },\n      { nominal: 79, mass: 78.9200829 },\n      { nominal: 80, mass: 79.91637808, abundance: 0.02286 },\n      { nominal: 81, mass: 80.9165912 },\n      { nominal: 82, mass: 81.91348273, abundance: 0.11593 },\n      { nominal: 83, mass: 82.91412716, abundance: 0.115 },\n      { nominal: 84, mass: 83.9114977282, abundance: 0.56987 },\n      { nominal: 85, mass: 84.9125273 },\n      { nominal: 86, mass: 85.9106106269, abundance: 0.17279 },\n      { nominal: 87, mass: 86.91335476 },\n      { nominal: 88, mass: 87.9144479 },\n      { nominal: 89, mass: 88.9178355 },\n      { nominal: 90, mass: 89.9195279 },\n      { nominal: 91, mass: 90.9238063 },\n      { nominal: 92, mass: 91.9261731 },\n      { nominal: 93, mass: 92.9311472 },\n      { nominal: 94, mass: 93.93414 },\n      { nominal: 95, mass: 94.939711 },\n      { nominal: 96, mass: 95.943017 },\n      { nominal: 97, mass: 96.94909 },\n      { nominal: 98, mass: 97.95243 },\n      { nominal: 99, mass: 98.95839 },\n      { nominal: 100, mass: 99.96237 },\n      { nominal: 101, mass: 100.96873 },\n    ],\n    symbol: 'Kr',\n    mass: 83.7979999953261,\n    name: 'Krypton',\n    monoisotopicMass: 83.9114977282,\n  },\n  {\n    number: 37,\n    isotopes: [\n      { nominal: 71, mass: 70.96532 },\n      { nominal: 72, mass: 71.95908 },\n      { nominal: 73, mass: 72.95053 },\n      { nominal: 74, mass: 73.9442659 },\n      { nominal: 75, mass: 74.9385732 },\n      { nominal: 76, mass: 75.935073 },\n      { nominal: 77, mass: 76.9304016 },\n      { nominal: 78, mass: 77.9281419 },\n      { nominal: 79, mass: 78.9239899 },\n      { nominal: 80, mass: 79.9225164 },\n      { nominal: 81, mass: 80.9189939 },\n      { nominal: 82, mass: 81.918209 },\n      { nominal: 83, mass: 82.9151142 },\n      { nominal: 84, mass: 83.9143752 },\n      { nominal: 85, mass: 84.9117897379, abundance: 0.7217 },\n      { nominal: 86, mass: 85.91116743 },\n      { nominal: 87, mass: 86.909180531, abundance: 0.2783 },\n      { nominal: 88, mass: 87.91131559 },\n      { nominal: 89, mass: 88.9122783 },\n      { nominal: 90, mass: 89.9147985 },\n      { nominal: 91, mass: 90.9165372 },\n      { nominal: 92, mass: 91.9197284 },\n      { nominal: 93, mass: 92.9220393 },\n      { nominal: 94, mass: 93.9263948 },\n      { nominal: 95, mass: 94.92926 },\n      { nominal: 96, mass: 95.9341334 },\n      { nominal: 97, mass: 96.9371771 },\n      { nominal: 98, mass: 97.9416869 },\n      { nominal: 99, mass: 98.94503 },\n      { nominal: 100, mass: 99.95003 },\n      { nominal: 101, mass: 100.95404 },\n      { nominal: 102, mass: 101.95952 },\n      { nominal: 103, mass: 102.96392 },\n    ],\n    symbol: 'Rb',\n    mass: 85.46766359561973,\n    name: 'Rubidium',\n    monoisotopicMass: 84.9117897379,\n  },\n  {\n    number: 38,\n    isotopes: [\n      { nominal: 73, mass: 72.9657 },\n      { nominal: 74, mass: 73.95617 },\n      { nominal: 75, mass: 74.94995 },\n      { nominal: 76, mass: 75.941763 },\n      { nominal: 77, mass: 76.9379455 },\n      { nominal: 78, mass: 77.93218 },\n      { nominal: 79, mass: 78.9297077 },\n      { nominal: 80, mass: 79.9245175 },\n      { nominal: 81, mass: 80.9232114 },\n      { nominal: 82, mass: 81.9183999 },\n      { nominal: 83, mass: 82.9175544 },\n      { nominal: 84, mass: 83.9134191, abundance: 0.0056 },\n      { nominal: 85, mass: 84.912932 },\n      { nominal: 86, mass: 85.9092606, abundance: 0.0986 },\n      { nominal: 87, mass: 86.9088775, abundance: 0.07 },\n      { nominal: 88, mass: 87.9056125, abundance: 0.8258 },\n      { nominal: 89, mass: 88.9074511 },\n      { nominal: 90, mass: 89.90773 },\n      { nominal: 91, mass: 90.9101954 },\n      { nominal: 92, mass: 91.9110382 },\n      { nominal: 93, mass: 92.9140242 },\n      { nominal: 94, mass: 93.9153556 },\n      { nominal: 95, mass: 94.9193529 },\n      { nominal: 96, mass: 95.9217066 },\n      { nominal: 97, mass: 96.926374 },\n      { nominal: 98, mass: 97.9286888 },\n      { nominal: 99, mass: 98.9328907 },\n      { nominal: 100, mass: 99.93577 },\n      { nominal: 101, mass: 100.940352 },\n      { nominal: 102, mass: 101.943791 },\n      { nominal: 103, mass: 102.94909 },\n      { nominal: 104, mass: 103.95265 },\n      { nominal: 105, mass: 104.95855 },\n      { nominal: 106, mass: 105.96265 },\n      { nominal: 107, mass: 106.96897 },\n    ],\n    symbol: 'Sr',\n    mass: 87.61664446962,\n    name: 'Strontium',\n    monoisotopicMass: 87.9056125,\n  },\n  {\n    number: 39,\n    isotopes: [\n      { nominal: 76, mass: 75.95856 },\n      { nominal: 77, mass: 76.949781 },\n      { nominal: 78, mass: 77.94361 },\n      { nominal: 79, mass: 78.93735 },\n      { nominal: 80, mass: 79.9343561 },\n      { nominal: 81, mass: 80.9294556 },\n      { nominal: 82, mass: 81.9269314 },\n      { nominal: 83, mass: 82.922485 },\n      { nominal: 84, mass: 83.9206721 },\n      { nominal: 85, mass: 84.916433 },\n      { nominal: 86, mass: 85.914886 },\n      { nominal: 87, mass: 86.9108761 },\n      { nominal: 88, mass: 87.9095016 },\n      { nominal: 89, mass: 88.9058403, abundance: 1 },\n      { nominal: 90, mass: 89.9071439 },\n      { nominal: 91, mass: 90.9072974 },\n      { nominal: 92, mass: 91.9089451 },\n      { nominal: 93, mass: 92.909578 },\n      { nominal: 94, mass: 93.9115906 },\n      { nominal: 95, mass: 94.9128161 },\n      { nominal: 96, mass: 95.9158968 },\n      { nominal: 97, mass: 96.9182741 },\n      { nominal: 98, mass: 97.9223821 },\n      { nominal: 99, mass: 98.924148 },\n      { nominal: 100, mass: 99.927715 },\n      { nominal: 101, mass: 100.9301477 },\n      { nominal: 102, mass: 101.9343277 },\n      { nominal: 103, mass: 102.937243 },\n      { nominal: 104, mass: 103.94196 },\n      { nominal: 105, mass: 104.94544 },\n      { nominal: 106, mass: 105.95056 },\n      { nominal: 107, mass: 106.95452 },\n      { nominal: 108, mass: 107.95996 },\n      { nominal: 109, mass: 108.96436 },\n    ],\n    symbol: 'Y',\n    mass: 88.9058403,\n    name: 'Yttrium',\n    monoisotopicMass: 88.9058403,\n  },\n  {\n    number: 40,\n    isotopes: [\n      { nominal: 78, mass: 77.95566 },\n      { nominal: 79, mass: 78.94948 },\n      { nominal: 80, mass: 79.9404 },\n      { nominal: 81, mass: 80.93731 },\n      { nominal: 82, mass: 81.93135 },\n      { nominal: 83, mass: 82.9292421 },\n      { nominal: 84, mass: 83.9233269 },\n      { nominal: 85, mass: 84.9214444 },\n      { nominal: 86, mass: 85.9162972 },\n      { nominal: 87, mass: 86.914818 },\n      { nominal: 88, mass: 87.9102213 },\n      { nominal: 89, mass: 88.9088814 },\n      { nominal: 90, mass: 89.9046977, abundance: 0.5145 },\n      { nominal: 91, mass: 90.9056396, abundance: 0.1122 },\n      { nominal: 92, mass: 91.9050347, abundance: 0.1715 },\n      { nominal: 93, mass: 92.9064699 },\n      { nominal: 94, mass: 93.9063108, abundance: 0.1738 },\n      { nominal: 95, mass: 94.9080385 },\n      { nominal: 96, mass: 95.9082714, abundance: 0.028 },\n      { nominal: 97, mass: 96.9109512 },\n      { nominal: 98, mass: 97.9127289 },\n      { nominal: 99, mass: 98.916667 },\n      { nominal: 100, mass: 99.9180006 },\n      { nominal: 101, mass: 100.921448 },\n      { nominal: 102, mass: 101.9231409 },\n      { nominal: 103, mass: 102.927191 },\n      { nominal: 104, mass: 103.929436 },\n      { nominal: 105, mass: 104.934008 },\n      { nominal: 106, mass: 105.93676 },\n      { nominal: 107, mass: 106.94174 },\n      { nominal: 108, mass: 107.94487 },\n      { nominal: 109, mass: 108.95041 },\n      { nominal: 110, mass: 109.95396 },\n      { nominal: 111, mass: 110.95968 },\n      { nominal: 112, mass: 111.9637 },\n    ],\n    symbol: 'Zr',\n    mass: 91.22364159706,\n    name: 'Zirconium',\n    monoisotopicMass: 89.9046977,\n  },\n  {\n    number: 41,\n    isotopes: [\n      { nominal: 81, mass: 80.9496 },\n      { nominal: 82, mass: 81.94396 },\n      { nominal: 83, mass: 82.93729 },\n      { nominal: 84, mass: 83.93449 },\n      { nominal: 85, mass: 84.9288458 },\n      { nominal: 86, mass: 85.9257828 },\n      { nominal: 87, mass: 86.9206937 },\n      { nominal: 88, mass: 87.918222 },\n      { nominal: 89, mass: 88.913445 },\n      { nominal: 90, mass: 89.9112584 },\n      { nominal: 91, mass: 90.9069897 },\n      { nominal: 92, mass: 91.9071881 },\n      { nominal: 93, mass: 92.906373, abundance: 1 },\n      { nominal: 94, mass: 93.9072788 },\n      { nominal: 95, mass: 94.9068324 },\n      { nominal: 96, mass: 95.9080973 },\n      { nominal: 97, mass: 96.9080959 },\n      { nominal: 98, mass: 97.9103265 },\n      { nominal: 99, mass: 98.911613 },\n      { nominal: 100, mass: 99.9143276 },\n      { nominal: 101, mass: 100.9153103 },\n      { nominal: 102, mass: 101.9180772 },\n      { nominal: 103, mass: 102.9194572 },\n      { nominal: 104, mass: 103.9228925 },\n      { nominal: 105, mass: 104.9249465 },\n      { nominal: 106, mass: 105.9289317 },\n      { nominal: 107, mass: 106.9315937 },\n      { nominal: 108, mass: 107.9360748 },\n      { nominal: 109, mass: 108.93922 },\n      { nominal: 110, mass: 109.94403 },\n      { nominal: 111, mass: 110.94753 },\n      { nominal: 112, mass: 111.95247 },\n      { nominal: 113, mass: 112.95651 },\n      { nominal: 114, mass: 113.96201 },\n      { nominal: 115, mass: 114.96634 },\n    ],\n    symbol: 'Nb',\n    mass: 92.906373,\n    name: 'Niobium',\n    monoisotopicMass: 92.906373,\n  },\n  {\n    number: 42,\n    isotopes: [\n      { nominal: 83, mass: 82.94988 },\n      { nominal: 84, mass: 83.94149 },\n      { nominal: 85, mass: 84.938261 },\n      { nominal: 86, mass: 85.9311748 },\n      { nominal: 87, mass: 86.9281962 },\n      { nominal: 88, mass: 87.9219678 },\n      { nominal: 89, mass: 88.9194682 },\n      { nominal: 90, mass: 89.9139309 },\n      { nominal: 91, mass: 90.9117453 },\n      { nominal: 92, mass: 91.90680796, abundance: 0.1453 },\n      { nominal: 93, mass: 92.90680958 },\n      { nominal: 94, mass: 93.9050849, abundance: 0.0915 },\n      { nominal: 95, mass: 94.90583877, abundance: 0.1584 },\n      { nominal: 96, mass: 95.90467612, abundance: 0.1667 },\n      { nominal: 97, mass: 96.90601812, abundance: 0.096 },\n      { nominal: 98, mass: 97.90540482, abundance: 0.2439 },\n      { nominal: 99, mass: 98.90770851 },\n      { nominal: 100, mass: 99.9074718, abundance: 0.0982 },\n      { nominal: 101, mass: 100.9103414 },\n      { nominal: 102, mass: 101.9102834 },\n      { nominal: 103, mass: 102.913079 },\n      { nominal: 104, mass: 103.9137344 },\n      { nominal: 105, mass: 104.916969 },\n      { nominal: 106, mass: 105.918259 },\n      { nominal: 107, mass: 106.922106 },\n      { nominal: 108, mass: 107.924033 },\n      { nominal: 109, mass: 108.928424 },\n      { nominal: 110, mass: 109.930704 },\n      { nominal: 111, mass: 110.935654 },\n      { nominal: 112, mass: 111.93831 },\n      { nominal: 113, mass: 112.94335 },\n      { nominal: 114, mass: 113.94653 },\n      { nominal: 115, mass: 114.95196 },\n      { nominal: 116, mass: 115.95545 },\n      { nominal: 117, mass: 116.96117 },\n    ],\n    symbol: 'Mo',\n    mass: 95.959788541188,\n    name: 'Molybdenum',\n    monoisotopicMass: 97.90540482,\n  },\n  {\n    number: 43,\n    isotopes: [\n      { nominal: 85, mass: 84.95058 },\n      { nominal: 86, mass: 85.94493 },\n      { nominal: 87, mass: 86.9380672 },\n      { nominal: 88, mass: 87.93378 },\n      { nominal: 89, mass: 88.9276487 },\n      { nominal: 90, mass: 89.9240739 },\n      { nominal: 91, mass: 90.9184254 },\n      { nominal: 92, mass: 91.9152698 },\n      { nominal: 93, mass: 92.910246 },\n      { nominal: 94, mass: 93.9096536 },\n      { nominal: 95, mass: 94.9076536 },\n      { nominal: 96, mass: 95.907868 },\n      { nominal: 97, mass: 96.9063667 },\n      { nominal: 98, mass: 97.9072124 },\n      { nominal: 99, mass: 98.9062508 },\n      { nominal: 100, mass: 99.9076539 },\n      { nominal: 101, mass: 100.907309 },\n      { nominal: 102, mass: 101.9092097 },\n      { nominal: 103, mass: 102.909176 },\n      { nominal: 104, mass: 103.911425 },\n      { nominal: 105, mass: 104.911655 },\n      { nominal: 106, mass: 105.914358 },\n      { nominal: 107, mass: 106.9154606 },\n      { nominal: 108, mass: 107.9184957 },\n      { nominal: 109, mass: 108.920256 },\n      { nominal: 110, mass: 109.923744 },\n      { nominal: 111, mass: 110.925901 },\n      { nominal: 112, mass: 111.9299458 },\n      { nominal: 113, mass: 112.932569 },\n      { nominal: 114, mass: 113.93691 },\n      { nominal: 115, mass: 114.93998 },\n      { nominal: 116, mass: 115.94476 },\n      { nominal: 117, mass: 116.94806 },\n      { nominal: 118, mass: 117.95299 },\n      { nominal: 119, mass: 118.95666 },\n      { nominal: 120, mass: 119.96187 },\n    ],\n    symbol: 'Tc',\n    mass: null,\n    name: 'Technetium',\n  },\n  {\n    number: 44,\n    isotopes: [\n      { nominal: 87, mass: 86.95069 },\n      { nominal: 88, mass: 87.9416 },\n      { nominal: 89, mass: 88.93762 },\n      { nominal: 90, mass: 89.9303444 },\n      { nominal: 91, mass: 90.9267419 },\n      { nominal: 92, mass: 91.9202344 },\n      { nominal: 93, mass: 92.9171044 },\n      { nominal: 94, mass: 93.9113429 },\n      { nominal: 95, mass: 94.910406 },\n      { nominal: 96, mass: 95.90759025, abundance: 0.0554 },\n      { nominal: 97, mass: 96.9075471 },\n      { nominal: 98, mass: 97.9052868, abundance: 0.0187 },\n      { nominal: 99, mass: 98.9059341, abundance: 0.1276 },\n      { nominal: 100, mass: 99.9042143, abundance: 0.126 },\n      { nominal: 101, mass: 100.9055769, abundance: 0.1706 },\n      { nominal: 102, mass: 101.9043441, abundance: 0.3155 },\n      { nominal: 103, mass: 102.9063186 },\n      { nominal: 104, mass: 103.9054275, abundance: 0.1862 },\n      { nominal: 105, mass: 104.9077476 },\n      { nominal: 106, mass: 105.9073291 },\n      { nominal: 107, mass: 106.909972 },\n      { nominal: 108, mass: 107.910188 },\n      { nominal: 109, mass: 108.913326 },\n      { nominal: 110, mass: 109.9140407 },\n      { nominal: 111, mass: 110.91757 },\n      { nominal: 112, mass: 111.918809 },\n      { nominal: 113, mass: 112.922844 },\n      { nominal: 114, mass: 113.9246136 },\n      { nominal: 115, mass: 114.92882 },\n      { nominal: 116, mass: 115.9312192 },\n      { nominal: 117, mass: 116.9361 },\n      { nominal: 118, mass: 117.93853 },\n      { nominal: 119, mass: 118.94357 },\n      { nominal: 120, mass: 119.94631 },\n      { nominal: 121, mass: 120.95164 },\n      { nominal: 122, mass: 121.95447 },\n      { nominal: 123, mass: 122.95989 },\n      { nominal: 124, mass: 123.96305 },\n    ],\n    symbol: 'Ru',\n    mass: 101.06494013916,\n    name: 'Ruthenium',\n    monoisotopicMass: 101.9043441,\n  },\n  {\n    number: 45,\n    isotopes: [\n      { nominal: 89, mass: 88.95058 },\n      { nominal: 90, mass: 89.94422 },\n      { nominal: 91, mass: 90.93688 },\n      { nominal: 92, mass: 91.9323677 },\n      { nominal: 93, mass: 92.9259128 },\n      { nominal: 94, mass: 93.9217305 },\n      { nominal: 95, mass: 94.9158979 },\n      { nominal: 96, mass: 95.914453 },\n      { nominal: 97, mass: 96.911329 },\n      { nominal: 98, mass: 97.910708 },\n      { nominal: 99, mass: 98.9081282 },\n      { nominal: 100, mass: 99.908117 },\n      { nominal: 101, mass: 100.9061606 },\n      { nominal: 102, mass: 101.9068374 },\n      { nominal: 103, mass: 102.905498, abundance: 1 },\n      { nominal: 104, mass: 103.9066492 },\n      { nominal: 105, mass: 104.9056885 },\n      { nominal: 106, mass: 105.9072868 },\n      { nominal: 107, mass: 106.906748 },\n      { nominal: 108, mass: 107.908714 },\n      { nominal: 109, mass: 108.9087488 },\n      { nominal: 110, mass: 109.911079 },\n      { nominal: 111, mass: 110.9116423 },\n      { nominal: 112, mass: 111.914403 },\n      { nominal: 113, mass: 112.9154393 },\n      { nominal: 114, mass: 113.918718 },\n      { nominal: 115, mass: 114.9203116 },\n      { nominal: 116, mass: 115.924059 },\n      { nominal: 117, mass: 116.9260354 },\n      { nominal: 118, mass: 117.93034 },\n      { nominal: 119, mass: 118.932557 },\n      { nominal: 120, mass: 119.93686 },\n      { nominal: 121, mass: 120.93942 },\n      { nominal: 122, mass: 121.94399 },\n      { nominal: 123, mass: 122.94685 },\n      { nominal: 124, mass: 123.95151 },\n      { nominal: 125, mass: 124.95469 },\n      { nominal: 126, mass: 125.95946 },\n    ],\n    symbol: 'Rh',\n    mass: 102.905498,\n    name: 'Rhodium',\n    monoisotopicMass: 102.905498,\n  },\n  {\n    number: 46,\n    isotopes: [\n      { nominal: 91, mass: 90.95032 },\n      { nominal: 92, mass: 91.94088 },\n      { nominal: 93, mass: 92.93651 },\n      { nominal: 94, mass: 93.9290376 },\n      { nominal: 95, mass: 94.9248898 },\n      { nominal: 96, mass: 95.9182151 },\n      { nominal: 97, mass: 96.916472 },\n      { nominal: 98, mass: 97.9126983 },\n      { nominal: 99, mass: 98.9117748 },\n      { nominal: 100, mass: 99.908505 },\n      { nominal: 101, mass: 100.9082864 },\n      { nominal: 102, mass: 101.9056022, abundance: 0.0102 },\n      { nominal: 103, mass: 102.9060809 },\n      { nominal: 104, mass: 103.9040305, abundance: 0.1114 },\n      { nominal: 105, mass: 104.9050796, abundance: 0.2233 },\n      { nominal: 106, mass: 105.9034804, abundance: 0.2733 },\n      { nominal: 107, mass: 106.9051282 },\n      { nominal: 108, mass: 107.9038916, abundance: 0.2646 },\n      { nominal: 109, mass: 108.9059504 },\n      { nominal: 110, mass: 109.9051722, abundance: 0.1172 },\n      { nominal: 111, mass: 110.90768968 },\n      { nominal: 112, mass: 111.9073297 },\n      { nominal: 113, mass: 112.910261 },\n      { nominal: 114, mass: 113.9103686 },\n      { nominal: 115, mass: 114.913659 },\n      { nominal: 116, mass: 115.914297 },\n      { nominal: 117, mass: 116.9179547 },\n      { nominal: 118, mass: 117.9190667 },\n      { nominal: 119, mass: 118.9233402 },\n      { nominal: 120, mass: 119.9245511 },\n      { nominal: 121, mass: 120.9289503 },\n      { nominal: 122, mass: 121.930632 },\n      { nominal: 123, mass: 122.93514 },\n      { nominal: 124, mass: 123.93714 },\n      { nominal: 125, mass: 124.94179 },\n      { nominal: 126, mass: 125.94416 },\n      { nominal: 127, mass: 126.94907 },\n      { nominal: 128, mass: 127.95183 },\n    ],\n    symbol: 'Pd',\n    mass: 106.41532750734,\n    name: 'Palladium',\n    monoisotopicMass: 105.9034804,\n  },\n  {\n    number: 47,\n    isotopes: [\n      { nominal: 93, mass: 92.95033 },\n      { nominal: 94, mass: 93.94373 },\n      { nominal: 95, mass: 94.93602 },\n      { nominal: 96, mass: 95.930744 },\n      { nominal: 97, mass: 96.92397 },\n      { nominal: 98, mass: 97.92156 },\n      { nominal: 99, mass: 98.9176458 },\n      { nominal: 100, mass: 99.9161154 },\n      { nominal: 101, mass: 100.912684 },\n      { nominal: 102, mass: 101.9117047 },\n      { nominal: 103, mass: 102.9089631 },\n      { nominal: 104, mass: 103.9086239 },\n      { nominal: 105, mass: 104.9065256 },\n      { nominal: 106, mass: 105.9066636 },\n      { nominal: 107, mass: 106.9050916, abundance: 0.51839 },\n      { nominal: 108, mass: 107.9059503 },\n      { nominal: 109, mass: 108.9047553, abundance: 0.48161 },\n      { nominal: 110, mass: 109.9061102 },\n      { nominal: 111, mass: 110.9052959 },\n      { nominal: 112, mass: 111.9070486 },\n      { nominal: 113, mass: 112.906573 },\n      { nominal: 114, mass: 113.908823 },\n      { nominal: 115, mass: 114.908767 },\n      { nominal: 116, mass: 115.9113868 },\n      { nominal: 117, mass: 116.911774 },\n      { nominal: 118, mass: 117.9145955 },\n      { nominal: 119, mass: 118.91557 },\n      { nominal: 120, mass: 119.9187848 },\n      { nominal: 121, mass: 120.920125 },\n      { nominal: 122, mass: 121.923664 },\n      { nominal: 123, mass: 122.925337 },\n      { nominal: 124, mass: 123.92893 },\n      { nominal: 125, mass: 124.93105 },\n      { nominal: 126, mass: 125.93475 },\n      { nominal: 127, mass: 126.93711 },\n      { nominal: 128, mass: 127.94106 },\n      { nominal: 129, mass: 128.94395 },\n      { nominal: 130, mass: 129.9507 },\n    ],\n    symbol: 'Ag',\n    mass: 107.868149634557,\n    name: 'Silver',\n    monoisotopicMass: 106.9050916,\n  },\n  {\n    number: 48,\n    isotopes: [\n      { nominal: 95, mass: 94.94994 },\n      { nominal: 96, mass: 95.94034 },\n      { nominal: 97, mass: 96.9351 },\n      { nominal: 98, mass: 97.927389 },\n      { nominal: 99, mass: 98.9249258 },\n      { nominal: 100, mass: 99.9203488 },\n      { nominal: 101, mass: 100.9185862 },\n      { nominal: 102, mass: 101.914482 },\n      { nominal: 103, mass: 102.9134165 },\n      { nominal: 104, mass: 103.9098564 },\n      { nominal: 105, mass: 104.9094639 },\n      { nominal: 106, mass: 105.9064599, abundance: 0.0125 },\n      { nominal: 107, mass: 106.9066121 },\n      { nominal: 108, mass: 107.9041834, abundance: 0.0089 },\n      { nominal: 109, mass: 108.9049867 },\n      { nominal: 110, mass: 109.90300661, abundance: 0.1249 },\n      { nominal: 111, mass: 110.90418287, abundance: 0.128 },\n      { nominal: 112, mass: 111.90276287, abundance: 0.2413 },\n      { nominal: 113, mass: 112.90440813, abundance: 0.1222 },\n      { nominal: 114, mass: 113.90336509, abundance: 0.2873 },\n      { nominal: 115, mass: 114.90543751 },\n      { nominal: 116, mass: 115.90476315, abundance: 0.0749 },\n      { nominal: 117, mass: 116.907226 },\n      { nominal: 118, mass: 117.906922 },\n      { nominal: 119, mass: 118.909847 },\n      { nominal: 120, mass: 119.9098681 },\n      { nominal: 121, mass: 120.9129637 },\n      { nominal: 122, mass: 121.9134591 },\n      { nominal: 123, mass: 122.9168925 },\n      { nominal: 124, mass: 123.9176574 },\n      { nominal: 125, mass: 124.9212576 },\n      { nominal: 126, mass: 125.9224291 },\n      { nominal: 127, mass: 126.926472 },\n      { nominal: 128, mass: 127.9278129 },\n      { nominal: 129, mass: 128.93182 },\n      { nominal: 130, mass: 129.93394 },\n      { nominal: 131, mass: 130.9406 },\n      { nominal: 132, mass: 131.94604 },\n      { nominal: 133, mass: 132.95285 },\n    ],\n    symbol: 'Cd',\n    mass: 112.411557818268,\n    name: 'Cadmium',\n    monoisotopicMass: 113.90336509,\n  },\n  {\n    number: 49,\n    isotopes: [\n      { nominal: 97, mass: 96.94934 },\n      { nominal: 98, mass: 97.94214 },\n      { nominal: 99, mass: 98.93411 },\n      { nominal: 100, mass: 99.93096 },\n      { nominal: 101, mass: 100.92634 },\n      { nominal: 102, mass: 101.9241071 },\n      { nominal: 103, mass: 102.9198819 },\n      { nominal: 104, mass: 103.9182145 },\n      { nominal: 105, mass: 104.914502 },\n      { nominal: 106, mass: 105.913464 },\n      { nominal: 107, mass: 106.91029 },\n      { nominal: 108, mass: 107.9096935 },\n      { nominal: 109, mass: 108.9071514 },\n      { nominal: 110, mass: 109.90717 },\n      { nominal: 111, mass: 110.9051085 },\n      { nominal: 112, mass: 111.9055377 },\n      { nominal: 113, mass: 112.90406184, abundance: 0.0429 },\n      { nominal: 114, mass: 113.90491791 },\n      { nominal: 115, mass: 114.903878776, abundance: 0.9571 },\n      { nominal: 116, mass: 115.90525999 },\n      { nominal: 117, mass: 116.9045157 },\n      { nominal: 118, mass: 117.9063566 },\n      { nominal: 119, mass: 118.9058507 },\n      { nominal: 120, mass: 119.907967 },\n      { nominal: 121, mass: 120.907851 },\n      { nominal: 122, mass: 121.910281 },\n      { nominal: 123, mass: 122.910434 },\n      { nominal: 124, mass: 123.913182 },\n      { nominal: 125, mass: 124.913605 },\n      { nominal: 126, mass: 125.916507 },\n      { nominal: 127, mass: 126.917446 },\n      { nominal: 128, mass: 127.9204 },\n      { nominal: 129, mass: 128.9218053 },\n      { nominal: 130, mass: 129.924977 },\n      { nominal: 131, mass: 130.9269715 },\n      { nominal: 132, mass: 131.933001 },\n      { nominal: 133, mass: 132.93831 },\n      { nominal: 134, mass: 133.94454 },\n      { nominal: 135, mass: 134.95005 },\n    ],\n    symbol: 'In',\n    mass: 114.81808662944559,\n    name: 'Indium',\n    monoisotopicMass: 114.903878776,\n  },\n  {\n    number: 50,\n    isotopes: [\n      { nominal: 99, mass: 98.94853 },\n      { nominal: 100, mass: 99.9385 },\n      { nominal: 101, mass: 100.93526 },\n      { nominal: 102, mass: 101.93029 },\n      { nominal: 103, mass: 102.928105 },\n      { nominal: 104, mass: 103.9231052 },\n      { nominal: 105, mass: 104.9212684 },\n      { nominal: 106, mass: 105.9169574 },\n      { nominal: 107, mass: 106.9157137 },\n      { nominal: 108, mass: 107.9118943 },\n      { nominal: 109, mass: 108.9112921 },\n      { nominal: 110, mass: 109.907845 },\n      { nominal: 111, mass: 110.9077401 },\n      { nominal: 112, mass: 111.90482387, abundance: 0.0097 },\n      { nominal: 113, mass: 112.9051757 },\n      { nominal: 114, mass: 113.9027827, abundance: 0.0066 },\n      { nominal: 115, mass: 114.903344699, abundance: 0.0034 },\n      { nominal: 116, mass: 115.9017428, abundance: 0.1454 },\n      { nominal: 117, mass: 116.90295398, abundance: 0.0768 },\n      { nominal: 118, mass: 117.90160657, abundance: 0.2422 },\n      { nominal: 119, mass: 118.90331117, abundance: 0.0859 },\n      { nominal: 120, mass: 119.90220163, abundance: 0.3258 },\n      { nominal: 121, mass: 120.9042426 },\n      { nominal: 122, mass: 121.9034438, abundance: 0.0463 },\n      { nominal: 123, mass: 122.9057252 },\n      { nominal: 124, mass: 123.9052766, abundance: 0.0579 },\n      { nominal: 125, mass: 124.9077864 },\n      { nominal: 126, mass: 125.907659 },\n      { nominal: 127, mass: 126.91039 },\n      { nominal: 128, mass: 127.910507 },\n      { nominal: 129, mass: 128.913465 },\n      { nominal: 130, mass: 129.9139738 },\n      { nominal: 131, mass: 130.917045 },\n      { nominal: 132, mass: 131.9178267 },\n      { nominal: 133, mass: 132.9239134 },\n      { nominal: 134, mass: 133.9286821 },\n      { nominal: 135, mass: 134.9349086 },\n      { nominal: 136, mass: 135.93999 },\n      { nominal: 137, mass: 136.94655 },\n      { nominal: 138, mass: 137.95184 },\n    ],\n    symbol: 'Sn',\n    mass: 118.71011259301059,\n    name: 'Tin',\n    monoisotopicMass: 119.90220163,\n  },\n  {\n    number: 51,\n    isotopes: [\n      { nominal: 103, mass: 102.93969 },\n      { nominal: 104, mass: 103.93648 },\n      { nominal: 105, mass: 104.931276 },\n      { nominal: 106, mass: 105.928638 },\n      { nominal: 107, mass: 106.9241506 },\n      { nominal: 108, mass: 107.9222267 },\n      { nominal: 109, mass: 108.9181411 },\n      { nominal: 110, mass: 109.9168543 },\n      { nominal: 111, mass: 110.9132182 },\n      { nominal: 112, mass: 111.9124 },\n      { nominal: 113, mass: 112.909375 },\n      { nominal: 114, mass: 113.90929 },\n      { nominal: 115, mass: 114.906598 },\n      { nominal: 116, mass: 115.9067931 },\n      { nominal: 117, mass: 116.9048415 },\n      { nominal: 118, mass: 117.9055321 },\n      { nominal: 119, mass: 118.9039455 },\n      { nominal: 120, mass: 119.9050794 },\n      { nominal: 121, mass: 120.903812, abundance: 0.5721 },\n      { nominal: 122, mass: 121.9051699 },\n      { nominal: 123, mass: 122.9042132, abundance: 0.4279 },\n      { nominal: 124, mass: 123.905935 },\n      { nominal: 125, mass: 124.905253 },\n      { nominal: 126, mass: 125.907253 },\n      { nominal: 127, mass: 126.9069243 },\n      { nominal: 128, mass: 127.909146 },\n      { nominal: 129, mass: 128.909147 },\n      { nominal: 130, mass: 129.911662 },\n      { nominal: 131, mass: 130.9119888 },\n      { nominal: 132, mass: 131.9145077 },\n      { nominal: 133, mass: 132.9152732 },\n      { nominal: 134, mass: 133.9205357 },\n      { nominal: 135, mass: 134.9251851 },\n      { nominal: 136, mass: 135.9307459 },\n      { nominal: 137, mass: 136.93555 },\n      { nominal: 138, mass: 137.94145 },\n      { nominal: 139, mass: 138.94655 },\n      { nominal: 140, mass: 139.95283 },\n    ],\n    symbol: 'Sb',\n    mass: 121.75978367348,\n    name: 'Antimony',\n    monoisotopicMass: 120.903812,\n  },\n  {\n    number: 52,\n    isotopes: [\n      { nominal: 105, mass: 104.9433 },\n      { nominal: 106, mass: 105.9375 },\n      { nominal: 107, mass: 106.935012 },\n      { nominal: 108, mass: 107.9293805 },\n      { nominal: 109, mass: 108.9273045 },\n      { nominal: 110, mass: 109.9224581 },\n      { nominal: 111, mass: 110.9210006 },\n      { nominal: 112, mass: 111.9167279 },\n      { nominal: 113, mass: 112.915891 },\n      { nominal: 114, mass: 113.912089 },\n      { nominal: 115, mass: 114.911902 },\n      { nominal: 116, mass: 115.90846 },\n      { nominal: 117, mass: 116.908646 },\n      { nominal: 118, mass: 117.905854 },\n      { nominal: 119, mass: 118.9064071 },\n      { nominal: 120, mass: 119.9040593, abundance: 0.0009 },\n      { nominal: 121, mass: 120.904944 },\n      { nominal: 122, mass: 121.9030435, abundance: 0.0255 },\n      { nominal: 123, mass: 122.9042698, abundance: 0.0089 },\n      { nominal: 124, mass: 123.9028171, abundance: 0.0474 },\n      { nominal: 125, mass: 124.9044299, abundance: 0.0707 },\n      { nominal: 126, mass: 125.9033109, abundance: 0.1884 },\n      { nominal: 127, mass: 126.9052257 },\n      { nominal: 128, mass: 127.90446128, abundance: 0.3174 },\n      { nominal: 129, mass: 128.90659646 },\n      { nominal: 130, mass: 129.906222748, abundance: 0.3408 },\n      { nominal: 131, mass: 130.908522213 },\n      { nominal: 132, mass: 131.9085467 },\n      { nominal: 133, mass: 132.9109688 },\n      { nominal: 134, mass: 133.911394 },\n      { nominal: 135, mass: 134.9165557 },\n      { nominal: 136, mass: 135.9201006 },\n      { nominal: 137, mass: 136.9255989 },\n      { nominal: 138, mass: 137.9294722 },\n      { nominal: 139, mass: 138.9353672 },\n      { nominal: 140, mass: 139.939499 },\n      { nominal: 141, mass: 140.9458 },\n      { nominal: 142, mass: 141.95022 },\n      { nominal: 143, mass: 142.95676 },\n    ],\n    symbol: 'Te',\n    mass: 127.6031264846604,\n    name: 'Tellurium',\n    monoisotopicMass: 129.906222748,\n  },\n  {\n    number: 53,\n    isotopes: [\n      { nominal: 107, mass: 106.94678 },\n      { nominal: 108, mass: 107.94348 },\n      { nominal: 109, mass: 108.9380853 },\n      { nominal: 110, mass: 109.935089 },\n      { nominal: 111, mass: 110.9302692 },\n      { nominal: 112, mass: 111.928005 },\n      { nominal: 113, mass: 112.9236501 },\n      { nominal: 114, mass: 113.92185 },\n      { nominal: 115, mass: 114.918048 },\n      { nominal: 116, mass: 115.91681 },\n      { nominal: 117, mass: 116.913648 },\n      { nominal: 118, mass: 117.913074 },\n      { nominal: 119, mass: 118.910074 },\n      { nominal: 120, mass: 119.910087 },\n      { nominal: 121, mass: 120.9074051 },\n      { nominal: 122, mass: 121.9075888 },\n      { nominal: 123, mass: 122.9055885 },\n      { nominal: 124, mass: 123.906209 },\n      { nominal: 125, mass: 124.9046294 },\n      { nominal: 126, mass: 125.9056233 },\n      { nominal: 127, mass: 126.9044719, abundance: 1 },\n      { nominal: 128, mass: 127.9058086 },\n      { nominal: 129, mass: 128.9049837 },\n      { nominal: 130, mass: 129.9066702 },\n      { nominal: 131, mass: 130.9061263 },\n      { nominal: 132, mass: 131.9079935 },\n      { nominal: 133, mass: 132.907797 },\n      { nominal: 134, mass: 133.9097588 },\n      { nominal: 135, mass: 134.9100488 },\n      { nominal: 136, mass: 135.914604 },\n      { nominal: 137, mass: 136.9180282 },\n      { nominal: 138, mass: 137.9227264 },\n      { nominal: 139, mass: 138.926506 },\n      { nominal: 140, mass: 139.93173 },\n      { nominal: 141, mass: 140.93569 },\n      { nominal: 142, mass: 141.9412 },\n      { nominal: 143, mass: 142.94565 },\n      { nominal: 144, mass: 143.95139 },\n      { nominal: 145, mass: 144.95605 },\n    ],\n    symbol: 'I',\n    mass: 126.9044719,\n    name: 'Iodine',\n    monoisotopicMass: 126.9044719,\n  },\n  {\n    number: 54,\n    isotopes: [\n      { nominal: 109, mass: 108.95043 },\n      { nominal: 110, mass: 109.94426 },\n      { nominal: 111, mass: 110.941607 },\n      { nominal: 112, mass: 111.935559 },\n      { nominal: 113, mass: 112.9332217 },\n      { nominal: 114, mass: 113.92798 },\n      { nominal: 115, mass: 114.926294 },\n      { nominal: 116, mass: 115.921581 },\n      { nominal: 117, mass: 116.920359 },\n      { nominal: 118, mass: 117.916179 },\n      { nominal: 119, mass: 118.915411 },\n      { nominal: 120, mass: 119.911784 },\n      { nominal: 121, mass: 120.911453 },\n      { nominal: 122, mass: 121.908368 },\n      { nominal: 123, mass: 122.908482 },\n      { nominal: 124, mass: 123.905892, abundance: 0.000952 },\n      { nominal: 125, mass: 124.9063944 },\n      { nominal: 126, mass: 125.9042983, abundance: 0.00089 },\n      { nominal: 127, mass: 126.9051829 },\n      { nominal: 128, mass: 127.903531, abundance: 0.019102 },\n      { nominal: 129, mass: 128.9047808611, abundance: 0.264006 },\n      { nominal: 130, mass: 129.903509349, abundance: 0.04071 },\n      { nominal: 131, mass: 130.90508406, abundance: 0.212324 },\n      { nominal: 132, mass: 131.9041550856, abundance: 0.269086 },\n      { nominal: 133, mass: 132.9059108 },\n      { nominal: 134, mass: 133.90539466, abundance: 0.104357 },\n      { nominal: 135, mass: 134.9072278 },\n      { nominal: 136, mass: 135.907214484, abundance: 0.088573 },\n      { nominal: 137, mass: 136.91155778 },\n      { nominal: 138, mass: 137.9141463 },\n      { nominal: 139, mass: 138.9187922 },\n      { nominal: 140, mass: 139.9216458 },\n      { nominal: 141, mass: 140.9267872 },\n      { nominal: 142, mass: 141.9299731 },\n      { nominal: 143, mass: 142.9353696 },\n      { nominal: 144, mass: 143.9389451 },\n      { nominal: 145, mass: 144.94472 },\n      { nominal: 146, mass: 145.948518 },\n      { nominal: 147, mass: 146.95426 },\n      { nominal: 148, mass: 147.95813 },\n    ],\n    symbol: 'Xe',\n    mass: 131.29276144779053,\n    name: 'Xenon',\n    monoisotopicMass: 131.9041550856,\n  },\n  {\n    number: 55,\n    isotopes: [\n      { nominal: 112, mass: 111.950309 },\n      { nominal: 113, mass: 112.9444291 },\n      { nominal: 114, mass: 113.941296 },\n      { nominal: 115, mass: 114.93591 },\n      { nominal: 116, mass: 115.93337 },\n      { nominal: 117, mass: 116.928617 },\n      { nominal: 118, mass: 117.92656 },\n      { nominal: 119, mass: 118.922377 },\n      { nominal: 120, mass: 119.920677 },\n      { nominal: 121, mass: 120.917227 },\n      { nominal: 122, mass: 121.916108 },\n      { nominal: 123, mass: 122.912996 },\n      { nominal: 124, mass: 123.9122578 },\n      { nominal: 125, mass: 124.909728 },\n      { nominal: 126, mass: 125.909446 },\n      { nominal: 127, mass: 126.9074174 },\n      { nominal: 128, mass: 127.9077487 },\n      { nominal: 129, mass: 128.9060657 },\n      { nominal: 130, mass: 129.9067093 },\n      { nominal: 131, mass: 130.9054649 },\n      { nominal: 132, mass: 131.9064339 },\n      { nominal: 133, mass: 132.905451961, abundance: 1 },\n      { nominal: 134, mass: 133.906718503 },\n      { nominal: 135, mass: 134.905977 },\n      { nominal: 136, mass: 135.9073114 },\n      { nominal: 137, mass: 136.90708923 },\n      { nominal: 138, mass: 137.9110171 },\n      { nominal: 139, mass: 138.9133638 },\n      { nominal: 140, mass: 139.9172831 },\n      { nominal: 141, mass: 140.9200455 },\n      { nominal: 142, mass: 141.924296 },\n      { nominal: 143, mass: 142.927349 },\n      { nominal: 144, mass: 143.932076 },\n      { nominal: 145, mass: 144.935527 },\n      { nominal: 146, mass: 145.940344 },\n      { nominal: 147, mass: 146.944156 },\n      { nominal: 148, mass: 147.94923 },\n      { nominal: 149, mass: 148.95302 },\n      { nominal: 150, mass: 149.95833 },\n      { nominal: 151, mass: 150.96258 },\n    ],\n    symbol: 'Cs',\n    mass: 132.905451961,\n    name: 'Caesium',\n    monoisotopicMass: 132.905451961,\n  },\n  {\n    number: 56,\n    isotopes: [\n      { nominal: 114, mass: 113.95066 },\n      { nominal: 115, mass: 114.94737 },\n      { nominal: 116, mass: 115.94128 },\n      { nominal: 117, mass: 116.93814 },\n      { nominal: 118, mass: 117.93306 },\n      { nominal: 119, mass: 118.93066 },\n      { nominal: 120, mass: 119.92605 },\n      { nominal: 121, mass: 120.92405 },\n      { nominal: 122, mass: 121.919904 },\n      { nominal: 123, mass: 122.918781 },\n      { nominal: 124, mass: 123.915094 },\n      { nominal: 125, mass: 124.914472 },\n      { nominal: 126, mass: 125.91125 },\n      { nominal: 127, mass: 126.911091 },\n      { nominal: 128, mass: 127.908342 },\n      { nominal: 129, mass: 128.908681 },\n      { nominal: 130, mass: 129.9063207, abundance: 0.00106 },\n      { nominal: 131, mass: 130.906941 },\n      { nominal: 132, mass: 131.9050611, abundance: 0.00101 },\n      { nominal: 133, mass: 132.9060074 },\n      { nominal: 134, mass: 133.90450818, abundance: 0.02417 },\n      { nominal: 135, mass: 134.90568838, abundance: 0.06592 },\n      { nominal: 136, mass: 135.90457573, abundance: 0.07854 },\n      { nominal: 137, mass: 136.90582714, abundance: 0.11232 },\n      { nominal: 138, mass: 137.905247, abundance: 0.71698 },\n      { nominal: 139, mass: 138.9088411 },\n      { nominal: 140, mass: 139.9106057 },\n      { nominal: 141, mass: 140.9144033 },\n      { nominal: 142, mass: 141.9164324 },\n      { nominal: 143, mass: 142.9206253 },\n      { nominal: 144, mass: 143.9229549 },\n      { nominal: 145, mass: 144.9275184 },\n      { nominal: 146, mass: 145.930284 },\n      { nominal: 147, mass: 146.935304 },\n      { nominal: 148, mass: 147.938171 },\n      { nominal: 149, mass: 148.94308 },\n      { nominal: 150, mass: 149.94605 },\n      { nominal: 151, mass: 150.95127 },\n      { nominal: 152, mass: 151.95481 },\n      { nominal: 153, mass: 152.96036 },\n    ],\n    symbol: 'Ba',\n    mass: 137.3268916286322,\n    name: 'Barium',\n    monoisotopicMass: 137.905247,\n  },\n  {\n    number: 57,\n    isotopes: [\n      { nominal: 116, mass: 115.9563 },\n      { nominal: 117, mass: 116.94999 },\n      { nominal: 118, mass: 117.94673 },\n      { nominal: 119, mass: 118.94099 },\n      { nominal: 120, mass: 119.93807 },\n      { nominal: 121, mass: 120.93315 },\n      { nominal: 122, mass: 121.93071 },\n      { nominal: 123, mass: 122.9263 },\n      { nominal: 124, mass: 123.924574 },\n      { nominal: 125, mass: 124.920816 },\n      { nominal: 126, mass: 125.919513 },\n      { nominal: 127, mass: 126.916375 },\n      { nominal: 128, mass: 127.915592 },\n      { nominal: 129, mass: 128.912694 },\n      { nominal: 130, mass: 129.912369 },\n      { nominal: 131, mass: 130.91007 },\n      { nominal: 132, mass: 131.910119 },\n      { nominal: 133, mass: 132.908218 },\n      { nominal: 134, mass: 133.908514 },\n      { nominal: 135, mass: 134.906984 },\n      { nominal: 136, mass: 135.907635 },\n      { nominal: 137, mass: 136.9064504 },\n      { nominal: 138, mass: 137.9071149, abundance: 0.0008881 },\n      { nominal: 139, mass: 138.9063563, abundance: 0.9991119 },\n      { nominal: 140, mass: 139.9094806 },\n      { nominal: 141, mass: 140.910966 },\n      { nominal: 142, mass: 141.9140909 },\n      { nominal: 143, mass: 142.9160795 },\n      { nominal: 144, mass: 143.919646 },\n      { nominal: 145, mass: 144.921808 },\n      { nominal: 146, mass: 145.925875 },\n      { nominal: 147, mass: 146.928418 },\n      { nominal: 148, mass: 147.932679 },\n      { nominal: 149, mass: 148.93535 },\n      { nominal: 150, mass: 149.93947 },\n      { nominal: 151, mass: 150.94232 },\n      { nominal: 152, mass: 151.94682 },\n      { nominal: 153, mass: 152.95036 },\n      { nominal: 154, mass: 153.95517 },\n      { nominal: 155, mass: 154.95901 },\n    ],\n    symbol: 'La',\n    mass: 138.90546887371266,\n    name: 'Lanthanum',\n    monoisotopicMass: 138.9063563,\n  },\n  {\n    number: 58,\n    isotopes: [\n      { nominal: 119, mass: 118.95271 },\n      { nominal: 120, mass: 119.94654 },\n      { nominal: 121, mass: 120.94335 },\n      { nominal: 122, mass: 121.93787 },\n      { nominal: 123, mass: 122.93528 },\n      { nominal: 124, mass: 123.93031 },\n      { nominal: 125, mass: 124.92844 },\n      { nominal: 126, mass: 125.923971 },\n      { nominal: 127, mass: 126.922727 },\n      { nominal: 128, mass: 127.918911 },\n      { nominal: 129, mass: 128.918102 },\n      { nominal: 130, mass: 129.914736 },\n      { nominal: 131, mass: 130.914429 },\n      { nominal: 132, mass: 131.911464 },\n      { nominal: 133, mass: 132.91152 },\n      { nominal: 134, mass: 133.908928 },\n      { nominal: 135, mass: 134.909161 },\n      { nominal: 136, mass: 135.90712921, abundance: 0.00185 },\n      { nominal: 137, mass: 136.90776236 },\n      { nominal: 138, mass: 137.905991, abundance: 0.00251 },\n      { nominal: 139, mass: 138.9066551 },\n      { nominal: 140, mass: 139.9054431, abundance: 0.8845 },\n      { nominal: 141, mass: 140.9082807 },\n      { nominal: 142, mass: 141.9092504, abundance: 0.11114 },\n      { nominal: 143, mass: 142.9123921 },\n      { nominal: 144, mass: 143.9136529 },\n      { nominal: 145, mass: 144.917265 },\n      { nominal: 146, mass: 145.918802 },\n      { nominal: 147, mass: 146.9226899 },\n      { nominal: 148, mass: 147.924424 },\n      { nominal: 149, mass: 148.928427 },\n      { nominal: 150, mass: 149.930384 },\n      { nominal: 151, mass: 150.934272 },\n      { nominal: 152, mass: 151.9366 },\n      { nominal: 153, mass: 152.94093 },\n      { nominal: 154, mass: 153.9438 },\n      { nominal: 155, mass: 154.94855 },\n      { nominal: 156, mass: 155.95183 },\n      { nominal: 157, mass: 156.95705 },\n    ],\n    symbol: 'Ce',\n    mass: 140.1157307378545,\n    name: 'Cerium',\n    monoisotopicMass: 139.9054431,\n  },\n  {\n    number: 59,\n    isotopes: [\n      { nominal: 121, mass: 120.95532 },\n      { nominal: 122, mass: 121.95175 },\n      { nominal: 123, mass: 122.94596 },\n      { nominal: 124, mass: 123.94294 },\n      { nominal: 125, mass: 124.9377 },\n      { nominal: 126, mass: 125.93524 },\n      { nominal: 127, mass: 126.93071 },\n      { nominal: 128, mass: 127.928791 },\n      { nominal: 129, mass: 128.925095 },\n      { nominal: 130, mass: 129.92359 },\n      { nominal: 131, mass: 130.920235 },\n      { nominal: 132, mass: 131.919255 },\n      { nominal: 133, mass: 132.916331 },\n      { nominal: 134, mass: 133.915697 },\n      { nominal: 135, mass: 134.913112 },\n      { nominal: 136, mass: 135.912677 },\n      { nominal: 137, mass: 136.9106792 },\n      { nominal: 138, mass: 137.910754 },\n      { nominal: 139, mass: 138.9089408 },\n      { nominal: 140, mass: 139.9090803 },\n      { nominal: 141, mass: 140.9076576, abundance: 1 },\n      { nominal: 142, mass: 141.9100496 },\n      { nominal: 143, mass: 142.9108228 },\n      { nominal: 144, mass: 143.9133109 },\n      { nominal: 145, mass: 144.9145182 },\n      { nominal: 146, mass: 145.91768 },\n      { nominal: 147, mass: 146.919008 },\n      { nominal: 148, mass: 147.92213 },\n      { nominal: 149, mass: 148.923736 },\n      { nominal: 150, mass: 149.9266765 },\n      { nominal: 151, mass: 150.928309 },\n      { nominal: 152, mass: 151.931553 },\n      { nominal: 153, mass: 152.933904 },\n      { nominal: 154, mass: 153.93753 },\n      { nominal: 155, mass: 154.940509 },\n      { nominal: 156, mass: 155.94464 },\n      { nominal: 157, mass: 156.94789 },\n      { nominal: 158, mass: 157.95241 },\n      { nominal: 159, mass: 158.95589 },\n    ],\n    symbol: 'Pr',\n    mass: 140.9076576,\n    name: 'Praseodymium',\n    monoisotopicMass: 140.9076576,\n  },\n  {\n    number: 60,\n    isotopes: [\n      { nominal: 124, mass: 123.9522 },\n      { nominal: 125, mass: 124.9489 },\n      { nominal: 126, mass: 125.94311 },\n      { nominal: 127, mass: 126.94038 },\n      { nominal: 128, mass: 127.93525 },\n      { nominal: 129, mass: 128.9331 },\n      { nominal: 130, mass: 129.928506 },\n      { nominal: 131, mass: 130.927248 },\n      { nominal: 132, mass: 131.923321 },\n      { nominal: 133, mass: 132.922348 },\n      { nominal: 134, mass: 133.91879 },\n      { nominal: 135, mass: 134.918181 },\n      { nominal: 136, mass: 135.914976 },\n      { nominal: 137, mass: 136.914562 },\n      { nominal: 138, mass: 137.91195 },\n      { nominal: 139, mass: 138.911954 },\n      { nominal: 140, mass: 139.90955 },\n      { nominal: 141, mass: 140.9096147 },\n      { nominal: 142, mass: 141.907729, abundance: 0.27152 },\n      { nominal: 143, mass: 142.90982, abundance: 0.12174 },\n      { nominal: 144, mass: 143.910093, abundance: 0.23798 },\n      { nominal: 145, mass: 144.9125793, abundance: 0.08293 },\n      { nominal: 146, mass: 145.9131226, abundance: 0.17189 },\n      { nominal: 147, mass: 146.9161061 },\n      { nominal: 148, mass: 147.9168993, abundance: 0.05756 },\n      { nominal: 149, mass: 148.9201548 },\n      { nominal: 150, mass: 149.9209022, abundance: 0.05638 },\n      { nominal: 151, mass: 150.9238403 },\n      { nominal: 152, mass: 151.924692 },\n      { nominal: 153, mass: 152.927718 },\n      { nominal: 154, mass: 153.92948 },\n      { nominal: 155, mass: 154.9331357 },\n      { nominal: 156, mass: 155.93508 },\n      { nominal: 157, mass: 156.939386 },\n      { nominal: 158, mass: 157.94197 },\n      { nominal: 159, mass: 158.94653 },\n      { nominal: 160, mass: 159.9494 },\n      { nominal: 161, mass: 160.95428 },\n    ],\n    symbol: 'Nd',\n    mass: 144.241596031827,\n    name: 'Neodymium',\n    monoisotopicMass: 141.907729,\n  },\n  {\n    number: 61,\n    isotopes: [\n      { nominal: 126, mass: 125.95792 },\n      { nominal: 127, mass: 126.95192 },\n      { nominal: 128, mass: 127.9487 },\n      { nominal: 129, mass: 128.94323 },\n      { nominal: 130, mass: 129.94053 },\n      { nominal: 131, mass: 130.93567 },\n      { nominal: 132, mass: 131.93384 },\n      { nominal: 133, mass: 132.929782 },\n      { nominal: 134, mass: 133.928353 },\n      { nominal: 135, mass: 134.924823 },\n      { nominal: 136, mass: 135.923585 },\n      { nominal: 137, mass: 136.92048 },\n      { nominal: 138, mass: 137.919548 },\n      { nominal: 139, mass: 138.9168 },\n      { nominal: 140, mass: 139.91604 },\n      { nominal: 141, mass: 140.913555 },\n      { nominal: 142, mass: 141.91289 },\n      { nominal: 143, mass: 142.9109383 },\n      { nominal: 144, mass: 143.9125964 },\n      { nominal: 145, mass: 144.9127559 },\n      { nominal: 146, mass: 145.9147024 },\n      { nominal: 147, mass: 146.915145 },\n      { nominal: 148, mass: 147.9174819 },\n      { nominal: 149, mass: 148.9183423 },\n      { nominal: 150, mass: 149.920991 },\n      { nominal: 151, mass: 150.9212175 },\n      { nominal: 152, mass: 151.923506 },\n      { nominal: 153, mass: 152.9241567 },\n      { nominal: 154, mass: 153.926472 },\n      { nominal: 155, mass: 154.928137 },\n      { nominal: 156, mass: 155.9311175 },\n      { nominal: 157, mass: 156.9331214 },\n      { nominal: 158, mass: 157.936565 },\n      { nominal: 159, mass: 158.939287 },\n      { nominal: 160, mass: 159.9431 },\n      { nominal: 161, mass: 160.94607 },\n      { nominal: 162, mass: 161.95022 },\n      { nominal: 163, mass: 162.95357 },\n    ],\n    symbol: 'Pm',\n    mass: null,\n    name: 'Promethium',\n  },\n  {\n    number: 62,\n    isotopes: [\n      { nominal: 128, mass: 127.95842 },\n      { nominal: 129, mass: 128.95476 },\n      { nominal: 130, mass: 129.949 },\n      { nominal: 131, mass: 130.94618 },\n      { nominal: 132, mass: 131.94087 },\n      { nominal: 133, mass: 132.93856 },\n      { nominal: 134, mass: 133.93411 },\n      { nominal: 135, mass: 134.93252 },\n      { nominal: 136, mass: 135.928276 },\n      { nominal: 137, mass: 136.926971 },\n      { nominal: 138, mass: 137.923244 },\n      { nominal: 139, mass: 138.922297 },\n      { nominal: 140, mass: 139.918995 },\n      { nominal: 141, mass: 140.9184816 },\n      { nominal: 142, mass: 141.9152044 },\n      { nominal: 143, mass: 142.9146353 },\n      { nominal: 144, mass: 143.9120065, abundance: 0.0307 },\n      { nominal: 145, mass: 144.9134173 },\n      { nominal: 146, mass: 145.913047 },\n      { nominal: 147, mass: 146.9149044, abundance: 0.1499 },\n      { nominal: 148, mass: 147.9148292, abundance: 0.1124 },\n      { nominal: 149, mass: 148.9171921, abundance: 0.1382 },\n      { nominal: 150, mass: 149.9172829, abundance: 0.0738 },\n      { nominal: 151, mass: 150.9199398 },\n      { nominal: 152, mass: 151.9197397, abundance: 0.2675 },\n      { nominal: 153, mass: 152.9221047 },\n      { nominal: 154, mass: 153.9222169, abundance: 0.2275 },\n      { nominal: 155, mass: 154.9246477 },\n      { nominal: 156, mass: 155.925536 },\n      { nominal: 157, mass: 156.9284187 },\n      { nominal: 158, mass: 157.929951 },\n      { nominal: 159, mass: 158.9332172 },\n      { nominal: 160, mass: 159.9353353 },\n      { nominal: 161, mass: 160.9391602 },\n      { nominal: 162, mass: 161.94146 },\n      { nominal: 163, mass: 162.94555 },\n      { nominal: 164, mass: 163.94836 },\n      { nominal: 165, mass: 164.95297 },\n    ],\n    symbol: 'Sm',\n    mass: 150.36635571193,\n    name: 'Samarium',\n    monoisotopicMass: 151.9197397,\n  },\n  {\n    number: 63,\n    isotopes: [\n      { nominal: 130, mass: 129.96369 },\n      { nominal: 131, mass: 130.95784 },\n      { nominal: 132, mass: 131.95467 },\n      { nominal: 133, mass: 132.94929 },\n      { nominal: 134, mass: 133.9464 },\n      { nominal: 135, mass: 134.94187 },\n      { nominal: 136, mass: 135.93962 },\n      { nominal: 137, mass: 136.93546 },\n      { nominal: 138, mass: 137.933709 },\n      { nominal: 139, mass: 138.929792 },\n      { nominal: 140, mass: 139.928088 },\n      { nominal: 141, mass: 140.924932 },\n      { nominal: 142, mass: 141.923442 },\n      { nominal: 143, mass: 142.920299 },\n      { nominal: 144, mass: 143.91882 },\n      { nominal: 145, mass: 144.9162726 },\n      { nominal: 146, mass: 145.917211 },\n      { nominal: 147, mass: 146.9167527 },\n      { nominal: 148, mass: 147.918089 },\n      { nominal: 149, mass: 148.9179378 },\n      { nominal: 150, mass: 149.9197077 },\n      { nominal: 151, mass: 150.9198578, abundance: 0.4781 },\n      { nominal: 152, mass: 151.9217522 },\n      { nominal: 153, mass: 152.921238, abundance: 0.5219 },\n      { nominal: 154, mass: 153.922987 },\n      { nominal: 155, mass: 154.9229011 },\n      { nominal: 156, mass: 155.9247605 },\n      { nominal: 157, mass: 156.9254334 },\n      { nominal: 158, mass: 157.927799 },\n      { nominal: 159, mass: 158.9291001 },\n      { nominal: 160, mass: 159.931851 },\n      { nominal: 161, mass: 160.933664 },\n      { nominal: 162, mass: 161.936989 },\n      { nominal: 163, mass: 162.939196 },\n      { nominal: 164, mass: 163.94274 },\n      { nominal: 165, mass: 164.94559 },\n      { nominal: 166, mass: 165.94962 },\n      { nominal: 167, mass: 166.95289 },\n    ],\n    symbol: 'Eu',\n    mass: 151.96437812637998,\n    name: 'Europium',\n    monoisotopicMass: 152.921238,\n  },\n  {\n    number: 64,\n    isotopes: [\n      { nominal: 133, mass: 132.96133 },\n      { nominal: 134, mass: 133.95566 },\n      { nominal: 135, mass: 134.95245 },\n      { nominal: 136, mass: 135.9473 },\n      { nominal: 137, mass: 136.94502 },\n      { nominal: 138, mass: 137.94025 },\n      { nominal: 139, mass: 138.93813 },\n      { nominal: 140, mass: 139.933674 },\n      { nominal: 141, mass: 140.932126 },\n      { nominal: 142, mass: 141.928116 },\n      { nominal: 143, mass: 142.92675 },\n      { nominal: 144, mass: 143.922963 },\n      { nominal: 145, mass: 144.921713 },\n      { nominal: 146, mass: 145.9183188 },\n      { nominal: 147, mass: 146.9191014 },\n      { nominal: 148, mass: 147.9181215 },\n      { nominal: 149, mass: 148.9193481 },\n      { nominal: 150, mass: 149.9186644 },\n      { nominal: 151, mass: 150.920356 },\n      { nominal: 152, mass: 151.9197995, abundance: 0.002 },\n      { nominal: 153, mass: 152.921758 },\n      { nominal: 154, mass: 153.9208741, abundance: 0.0218 },\n      { nominal: 155, mass: 154.9226305, abundance: 0.148 },\n      { nominal: 156, mass: 155.9221312, abundance: 0.2047 },\n      { nominal: 157, mass: 156.9239686, abundance: 0.1565 },\n      { nominal: 158, mass: 157.9241123, abundance: 0.2484 },\n      { nominal: 159, mass: 158.926397 },\n      { nominal: 160, mass: 159.9270624, abundance: 0.2186 },\n      { nominal: 161, mass: 160.9296775 },\n      { nominal: 162, mass: 161.930993 },\n      { nominal: 163, mass: 162.9341769 },\n      { nominal: 164, mass: 163.93583 },\n      { nominal: 165, mass: 164.93936 },\n      { nominal: 166, mass: 165.94146 },\n      { nominal: 167, mass: 166.94545 },\n      { nominal: 168, mass: 167.94808 },\n      { nominal: 169, mass: 168.9526 },\n    ],\n    symbol: 'Gd',\n    mass: 157.25213064687998,\n    name: 'Gadolinium',\n    monoisotopicMass: 157.9241123,\n  },\n  {\n    number: 65,\n    isotopes: [\n      { nominal: 135, mass: 134.96476 },\n      { nominal: 136, mass: 135.96129 },\n      { nominal: 137, mass: 136.95602 },\n      { nominal: 138, mass: 137.95312 },\n      { nominal: 139, mass: 138.94833 },\n      { nominal: 140, mass: 139.94581 },\n      { nominal: 141, mass: 140.94145 },\n      { nominal: 142, mass: 141.93928 },\n      { nominal: 143, mass: 142.935137 },\n      { nominal: 144, mass: 143.933045 },\n      { nominal: 145, mass: 144.92882 },\n      { nominal: 146, mass: 145.927253 },\n      { nominal: 147, mass: 146.9240548 },\n      { nominal: 148, mass: 147.924282 },\n      { nominal: 149, mass: 148.9232535 },\n      { nominal: 150, mass: 149.9236649 },\n      { nominal: 151, mass: 150.9231096 },\n      { nominal: 152, mass: 151.924083 },\n      { nominal: 153, mass: 152.9234424 },\n      { nominal: 154, mass: 153.924685 },\n      { nominal: 155, mass: 154.923511 },\n      { nominal: 156, mass: 155.9247552 },\n      { nominal: 157, mass: 156.924033 },\n      { nominal: 158, mass: 157.9254209 },\n      { nominal: 159, mass: 158.9253547, abundance: 1 },\n      { nominal: 160, mass: 159.9271756 },\n      { nominal: 161, mass: 160.9275778 },\n      { nominal: 162, mass: 161.929495 },\n      { nominal: 163, mass: 162.9306547 },\n      { nominal: 164, mass: 163.93336 },\n      { nominal: 165, mass: 164.93498 },\n      { nominal: 166, mass: 165.93786 },\n      { nominal: 167, mass: 166.93996 },\n      { nominal: 168, mass: 167.9434 },\n      { nominal: 169, mass: 168.94597 },\n      { nominal: 170, mass: 169.94984 },\n      { nominal: 171, mass: 170.95273 },\n    ],\n    symbol: 'Tb',\n    mass: 158.9253547,\n    name: 'Terbium',\n    monoisotopicMass: 158.9253547,\n  },\n  {\n    number: 66,\n    isotopes: [\n      { nominal: 138, mass: 137.9625 },\n      { nominal: 139, mass: 138.95959 },\n      { nominal: 140, mass: 139.95402 },\n      { nominal: 141, mass: 140.95128 },\n      { nominal: 142, mass: 141.94619 },\n      { nominal: 143, mass: 142.943994 },\n      { nominal: 144, mass: 143.9392695 },\n      { nominal: 145, mass: 144.937474 },\n      { nominal: 146, mass: 145.9328445 },\n      { nominal: 147, mass: 146.9310827 },\n      { nominal: 148, mass: 147.927157 },\n      { nominal: 149, mass: 148.927322 },\n      { nominal: 150, mass: 149.9255933 },\n      { nominal: 151, mass: 150.9261916 },\n      { nominal: 152, mass: 151.9247253 },\n      { nominal: 153, mass: 152.9257724 },\n      { nominal: 154, mass: 153.9244293 },\n      { nominal: 155, mass: 154.925759 },\n      { nominal: 156, mass: 155.9242847, abundance: 0.00056 },\n      { nominal: 157, mass: 156.9254707 },\n      { nominal: 158, mass: 157.9244159, abundance: 0.00095 },\n      { nominal: 159, mass: 158.925747 },\n      { nominal: 160, mass: 159.9252046, abundance: 0.02329 },\n      { nominal: 161, mass: 160.9269405, abundance: 0.18889 },\n      { nominal: 162, mass: 161.9268056, abundance: 0.25475 },\n      { nominal: 163, mass: 162.9287383, abundance: 0.24896 },\n      { nominal: 164, mass: 163.9291819, abundance: 0.2826 },\n      { nominal: 165, mass: 164.9317105 },\n      { nominal: 166, mass: 165.9328139 },\n      { nominal: 167, mass: 166.935661 },\n      { nominal: 168, mass: 167.93713 },\n      { nominal: 169, mass: 168.94031 },\n      { nominal: 170, mass: 169.94239 },\n      { nominal: 171, mass: 170.94612 },\n      { nominal: 172, mass: 171.94846 },\n      { nominal: 173, mass: 172.95283 },\n    ],\n    symbol: 'Dy',\n    mass: 162.499472819424,\n    name: 'Dysprosium',\n    monoisotopicMass: 163.9291819,\n  },\n  {\n    number: 67,\n    isotopes: [\n      { nominal: 140, mass: 139.96859 },\n      { nominal: 141, mass: 140.96311 },\n      { nominal: 142, mass: 141.96001 },\n      { nominal: 143, mass: 142.95486 },\n      { nominal: 144, mass: 143.9521097 },\n      { nominal: 145, mass: 144.9472674 },\n      { nominal: 146, mass: 145.9449935 },\n      { nominal: 147, mass: 146.9401423 },\n      { nominal: 148, mass: 147.937744 },\n      { nominal: 149, mass: 148.933803 },\n      { nominal: 150, mass: 149.933498 },\n      { nominal: 151, mass: 150.9316983 },\n      { nominal: 152, mass: 151.931724 },\n      { nominal: 153, mass: 152.9302064 },\n      { nominal: 154, mass: 153.9306068 },\n      { nominal: 155, mass: 154.929104 },\n      { nominal: 156, mass: 155.929706 },\n      { nominal: 157, mass: 156.928254 },\n      { nominal: 158, mass: 157.928946 },\n      { nominal: 159, mass: 158.9277197 },\n      { nominal: 160, mass: 159.928737 },\n      { nominal: 161, mass: 160.9278615 },\n      { nominal: 162, mass: 161.9291023 },\n      { nominal: 163, mass: 162.928741 },\n      { nominal: 164, mass: 163.9302403 },\n      { nominal: 165, mass: 164.9303288, abundance: 1 },\n      { nominal: 166, mass: 165.9322909 },\n      { nominal: 167, mass: 166.9331385 },\n      { nominal: 168, mass: 167.935522 },\n      { nominal: 169, mass: 168.936878 },\n      { nominal: 170, mass: 169.939625 },\n      { nominal: 171, mass: 170.94147 },\n      { nominal: 172, mass: 171.94473 },\n      { nominal: 173, mass: 172.94702 },\n      { nominal: 174, mass: 173.95095 },\n      { nominal: 175, mass: 174.95362 },\n    ],\n    symbol: 'Ho',\n    mass: 164.9303288,\n    name: 'Holmium',\n    monoisotopicMass: 164.9303288,\n  },\n  {\n    number: 68,\n    isotopes: [\n      { nominal: 142, mass: 141.9701 },\n      { nominal: 143, mass: 142.96662 },\n      { nominal: 144, mass: 143.9607 },\n      { nominal: 145, mass: 144.95805 },\n      { nominal: 146, mass: 145.9524184 },\n      { nominal: 147, mass: 146.949964 },\n      { nominal: 148, mass: 147.944735 },\n      { nominal: 149, mass: 148.942306 },\n      { nominal: 150, mass: 149.937916 },\n      { nominal: 151, mass: 150.937449 },\n      { nominal: 152, mass: 151.935057 },\n      { nominal: 153, mass: 152.93508 },\n      { nominal: 154, mass: 153.9327908 },\n      { nominal: 155, mass: 154.9332159 },\n      { nominal: 156, mass: 155.931067 },\n      { nominal: 157, mass: 156.931949 },\n      { nominal: 158, mass: 157.929893 },\n      { nominal: 159, mass: 158.9306918 },\n      { nominal: 160, mass: 159.929077 },\n      { nominal: 161, mass: 160.9300046 },\n      { nominal: 162, mass: 161.9287884, abundance: 0.00139 },\n      { nominal: 163, mass: 162.9300408 },\n      { nominal: 164, mass: 163.9292088, abundance: 0.01601 },\n      { nominal: 165, mass: 164.9307345 },\n      { nominal: 166, mass: 165.9302995, abundance: 0.33503 },\n      { nominal: 167, mass: 166.9320546, abundance: 0.22869 },\n      { nominal: 168, mass: 167.9323767, abundance: 0.26978 },\n      { nominal: 169, mass: 168.9345968 },\n      { nominal: 170, mass: 169.9354702, abundance: 0.1491 },\n      { nominal: 171, mass: 170.9380357 },\n      { nominal: 172, mass: 171.9393619 },\n      { nominal: 173, mass: 172.9424 },\n      { nominal: 174, mass: 173.94423 },\n      { nominal: 175, mass: 174.94777 },\n      { nominal: 176, mass: 175.94994 },\n      { nominal: 177, mass: 176.95399 },\n    ],\n    symbol: 'Er',\n    mass: 167.259082649669,\n    name: 'Erbium',\n    monoisotopicMass: 165.9302995,\n  },\n  {\n    number: 69,\n    isotopes: [\n      { nominal: 144, mass: 143.97628 },\n      { nominal: 145, mass: 144.97039 },\n      { nominal: 146, mass: 145.96684 },\n      { nominal: 147, mass: 146.9613799 },\n      { nominal: 148, mass: 147.958384 },\n      { nominal: 149, mass: 148.95289 },\n      { nominal: 150, mass: 149.95009 },\n      { nominal: 151, mass: 150.945488 },\n      { nominal: 152, mass: 151.944422 },\n      { nominal: 153, mass: 152.94204 },\n      { nominal: 154, mass: 153.94157 },\n      { nominal: 155, mass: 154.93921 },\n      { nominal: 156, mass: 155.938992 },\n      { nominal: 157, mass: 156.936944 },\n      { nominal: 158, mass: 157.93698 },\n      { nominal: 159, mass: 158.934975 },\n      { nominal: 160, mass: 159.935263 },\n      { nominal: 161, mass: 160.933549 },\n      { nominal: 162, mass: 161.934002 },\n      { nominal: 163, mass: 162.9326592 },\n      { nominal: 164, mass: 163.933544 },\n      { nominal: 165, mass: 164.9324431 },\n      { nominal: 166, mass: 165.933561 },\n      { nominal: 167, mass: 166.9328562 },\n      { nominal: 168, mass: 167.9341774 },\n      { nominal: 169, mass: 168.9342179, abundance: 1 },\n      { nominal: 170, mass: 169.935806 },\n      { nominal: 171, mass: 170.9364339 },\n      { nominal: 172, mass: 171.9384055 },\n      { nominal: 173, mass: 172.9396084 },\n      { nominal: 174, mass: 173.942173 },\n      { nominal: 175, mass: 174.943841 },\n      { nominal: 176, mass: 175.947 },\n      { nominal: 177, mass: 176.94904 },\n      { nominal: 178, mass: 177.95264 },\n      { nominal: 179, mass: 178.95534 },\n    ],\n    symbol: 'Tm',\n    mass: 168.9342179,\n    name: 'Thulium',\n    monoisotopicMass: 168.9342179,\n  },\n  {\n    number: 70,\n    isotopes: [\n      { nominal: 148, mass: 147.96758 },\n      { nominal: 149, mass: 148.96436 },\n      { nominal: 150, mass: 149.95852 },\n      { nominal: 151, mass: 150.9554 },\n      { nominal: 152, mass: 151.95027 },\n      { nominal: 153, mass: 152.94932 },\n      { nominal: 154, mass: 153.946396 },\n      { nominal: 155, mass: 154.945783 },\n      { nominal: 156, mass: 155.942825 },\n      { nominal: 157, mass: 156.942645 },\n      { nominal: 158, mass: 157.9398705 },\n      { nominal: 159, mass: 158.940055 },\n      { nominal: 160, mass: 159.937557 },\n      { nominal: 161, mass: 160.937907 },\n      { nominal: 162, mass: 161.935774 },\n      { nominal: 163, mass: 162.93634 },\n      { nominal: 164, mass: 163.934495 },\n      { nominal: 165, mass: 164.93527 },\n      { nominal: 166, mass: 165.9338747 },\n      { nominal: 167, mass: 166.934953 },\n      { nominal: 168, mass: 167.9338896, abundance: 0.00123 },\n      { nominal: 169, mass: 168.9351825 },\n      { nominal: 170, mass: 169.9347664, abundance: 0.02982 },\n      { nominal: 171, mass: 170.9363302, abundance: 0.1409 },\n      { nominal: 172, mass: 171.9363859, abundance: 0.2168 },\n      { nominal: 173, mass: 172.9382151, abundance: 0.16103 },\n      { nominal: 174, mass: 173.9388664, abundance: 0.32026 },\n      { nominal: 175, mass: 174.9412808 },\n      { nominal: 176, mass: 175.9425764, abundance: 0.12996 },\n      { nominal: 177, mass: 176.9452656 },\n      { nominal: 178, mass: 177.946651 },\n      { nominal: 179, mass: 178.95004 },\n      { nominal: 180, mass: 179.95212 },\n      { nominal: 181, mass: 180.95589 },\n    ],\n    symbol: 'Yb',\n    mass: 173.05415016631702,\n    name: 'Ytterbium',\n    monoisotopicMass: 173.9388664,\n  },\n  {\n    number: 71,\n    isotopes: [\n      { nominal: 150, mass: 149.97355 },\n      { nominal: 151, mass: 150.96768 },\n      { nominal: 152, mass: 151.96412 },\n      { nominal: 153, mass: 152.95875 },\n      { nominal: 154, mass: 153.95736 },\n      { nominal: 155, mass: 154.954321 },\n      { nominal: 156, mass: 155.953033 },\n      { nominal: 157, mass: 156.950127 },\n      { nominal: 158, mass: 157.949316 },\n      { nominal: 159, mass: 158.946636 },\n      { nominal: 160, mass: 159.946033 },\n      { nominal: 161, mass: 160.943572 },\n      { nominal: 162, mass: 161.943283 },\n      { nominal: 163, mass: 162.941179 },\n      { nominal: 164, mass: 163.941339 },\n      { nominal: 165, mass: 164.939407 },\n      { nominal: 166, mass: 165.939859 },\n      { nominal: 167, mass: 166.93827 },\n      { nominal: 168, mass: 167.938736 },\n      { nominal: 169, mass: 168.9376441 },\n      { nominal: 170, mass: 169.938478 },\n      { nominal: 171, mass: 170.937917 },\n      { nominal: 172, mass: 171.9390891 },\n      { nominal: 173, mass: 172.938934 },\n      { nominal: 174, mass: 173.9403409 },\n      { nominal: 175, mass: 174.9407752, abundance: 0.97401 },\n      { nominal: 176, mass: 175.9426897, abundance: 0.02599 },\n      { nominal: 177, mass: 176.9437615 },\n      { nominal: 178, mass: 177.945958 },\n      { nominal: 179, mass: 178.9473309 },\n      { nominal: 180, mass: 179.949888 },\n      { nominal: 181, mass: 180.95191 },\n      { nominal: 182, mass: 181.95504 },\n      { nominal: 183, mass: 182.957363 },\n      { nominal: 184, mass: 183.96091 },\n      { nominal: 185, mass: 184.96362 },\n    ],\n    symbol: 'Lu',\n    mass: 174.96681495785498,\n    name: 'Lutetium',\n    monoisotopicMass: 174.9407752,\n  },\n  {\n    number: 72,\n    isotopes: [\n      { nominal: 153, mass: 152.97069 },\n      { nominal: 154, mass: 153.96486 },\n      { nominal: 155, mass: 154.96311 },\n      { nominal: 156, mass: 155.95935 },\n      { nominal: 157, mass: 156.95824 },\n      { nominal: 158, mass: 157.954801 },\n      { nominal: 159, mass: 158.953996 },\n      { nominal: 160, mass: 159.950691 },\n      { nominal: 161, mass: 160.950278 },\n      { nominal: 162, mass: 161.9472148 },\n      { nominal: 163, mass: 162.947113 },\n      { nominal: 164, mass: 163.944371 },\n      { nominal: 165, mass: 164.944567 },\n      { nominal: 166, mass: 165.94218 },\n      { nominal: 167, mass: 166.9426 },\n      { nominal: 168, mass: 167.940568 },\n      { nominal: 169, mass: 168.941259 },\n      { nominal: 170, mass: 169.939609 },\n      { nominal: 171, mass: 170.940492 },\n      { nominal: 172, mass: 171.93945 },\n      { nominal: 173, mass: 172.940513 },\n      { nominal: 174, mass: 173.9400461, abundance: 0.0016 },\n      { nominal: 175, mass: 174.9415092 },\n      { nominal: 176, mass: 175.9414076, abundance: 0.0526 },\n      { nominal: 177, mass: 176.9432277, abundance: 0.186 },\n      { nominal: 178, mass: 177.9437058, abundance: 0.2728 },\n      { nominal: 179, mass: 178.9458232, abundance: 0.1362 },\n      { nominal: 180, mass: 179.946557, abundance: 0.3508 },\n      { nominal: 181, mass: 180.9491083 },\n      { nominal: 182, mass: 181.9505612 },\n      { nominal: 183, mass: 182.95353 },\n      { nominal: 184, mass: 183.955446 },\n      { nominal: 185, mass: 184.958862 },\n      { nominal: 186, mass: 185.960897 },\n      { nominal: 187, mass: 186.96477 },\n      { nominal: 188, mass: 187.96685 },\n      { nominal: 189, mass: 188.97084 },\n    ],\n    symbol: 'Hf',\n    mass: 178.4849787234,\n    name: 'Hafnium',\n    monoisotopicMass: 179.946557,\n  },\n  {\n    number: 73,\n    isotopes: [\n      { nominal: 155, mass: 154.97424 },\n      { nominal: 156, mass: 155.97203 },\n      { nominal: 157, mass: 156.96818 },\n      { nominal: 158, mass: 157.96654 },\n      { nominal: 159, mass: 158.963023 },\n      { nominal: 160, mass: 159.961488 },\n      { nominal: 161, mass: 160.958452 },\n      { nominal: 162, mass: 161.957294 },\n      { nominal: 163, mass: 162.954337 },\n      { nominal: 164, mass: 163.953534 },\n      { nominal: 165, mass: 164.950781 },\n      { nominal: 166, mass: 165.950512 },\n      { nominal: 167, mass: 166.948093 },\n      { nominal: 168, mass: 167.948047 },\n      { nominal: 169, mass: 168.946011 },\n      { nominal: 170, mass: 169.946175 },\n      { nominal: 171, mass: 170.944476 },\n      { nominal: 172, mass: 171.944895 },\n      { nominal: 173, mass: 172.94375 },\n      { nominal: 174, mass: 173.944454 },\n      { nominal: 175, mass: 174.943737 },\n      { nominal: 176, mass: 175.944857 },\n      { nominal: 177, mass: 176.9444795 },\n      { nominal: 178, mass: 177.945678 },\n      { nominal: 179, mass: 178.9459366 },\n      { nominal: 180, mass: 179.9474648, abundance: 0.0001201 },\n      { nominal: 181, mass: 180.9479958, abundance: 0.9998799 },\n      { nominal: 182, mass: 181.9501519 },\n      { nominal: 183, mass: 182.9513726 },\n      { nominal: 184, mass: 183.954008 },\n      { nominal: 185, mass: 184.955559 },\n      { nominal: 186, mass: 185.958551 },\n      { nominal: 187, mass: 186.960386 },\n      { nominal: 188, mass: 187.963916 },\n      { nominal: 189, mass: 188.96583 },\n      { nominal: 190, mass: 189.96939 },\n      { nominal: 191, mass: 190.97156 },\n      { nominal: 192, mass: 191.97514 },\n    ],\n    symbol: 'Ta',\n    mass: 180.9478756362269,\n    name: 'Tantalum',\n    monoisotopicMass: 180.9479958,\n  },\n  {\n    number: 74,\n    isotopes: [\n      { nominal: 157, mass: 156.97884 },\n      { nominal: 158, mass: 157.97456 },\n      { nominal: 159, mass: 158.97264 },\n      { nominal: 160, mass: 159.96846 },\n      { nominal: 161, mass: 160.9672 },\n      { nominal: 162, mass: 161.963499 },\n      { nominal: 163, mass: 162.962524 },\n      { nominal: 164, mass: 163.958961 },\n      { nominal: 165, mass: 164.958281 },\n      { nominal: 166, mass: 165.955031 },\n      { nominal: 167, mass: 166.954805 },\n      { nominal: 168, mass: 167.951806 },\n      { nominal: 169, mass: 168.951779 },\n      { nominal: 170, mass: 169.949232 },\n      { nominal: 171, mass: 170.949451 },\n      { nominal: 172, mass: 171.947292 },\n      { nominal: 173, mass: 172.947689 },\n      { nominal: 174, mass: 173.946079 },\n      { nominal: 175, mass: 174.946717 },\n      { nominal: 176, mass: 175.945634 },\n      { nominal: 177, mass: 176.946643 },\n      { nominal: 178, mass: 177.945883 },\n      { nominal: 179, mass: 178.947077 },\n      { nominal: 180, mass: 179.9467108, abundance: 0.0012 },\n      { nominal: 181, mass: 180.9481978 },\n      { nominal: 182, mass: 181.94820394, abundance: 0.265 },\n      { nominal: 183, mass: 182.95022275, abundance: 0.1431 },\n      { nominal: 184, mass: 183.95093092, abundance: 0.3064 },\n      { nominal: 185, mass: 184.95341897 },\n      { nominal: 186, mass: 185.9543628, abundance: 0.2843 },\n      { nominal: 187, mass: 186.9571588 },\n      { nominal: 188, mass: 187.9584862 },\n      { nominal: 189, mass: 188.961763 },\n      { nominal: 190, mass: 189.963091 },\n      { nominal: 191, mass: 190.966531 },\n      { nominal: 192, mass: 191.96817 },\n      { nominal: 193, mass: 192.97178 },\n      { nominal: 194, mass: 193.97367 },\n    ],\n    symbol: 'W',\n    mass: 183.841777550513,\n    name: 'Tungsten',\n    monoisotopicMass: 183.95093092,\n  },\n  {\n    number: 75,\n    isotopes: [\n      { nominal: 159, mass: 158.98418 },\n      { nominal: 160, mass: 159.98182 },\n      { nominal: 161, mass: 160.97757 },\n      { nominal: 162, mass: 161.97584 },\n      { nominal: 163, mass: 162.97208 },\n      { nominal: 164, mass: 163.970453 },\n      { nominal: 165, mass: 164.967103 },\n      { nominal: 166, mass: 165.965761 },\n      { nominal: 167, mass: 166.962595 },\n      { nominal: 168, mass: 167.961573 },\n      { nominal: 169, mass: 168.958766 },\n      { nominal: 170, mass: 169.95822 },\n      { nominal: 171, mass: 170.955716 },\n      { nominal: 172, mass: 171.95542 },\n      { nominal: 173, mass: 172.953243 },\n      { nominal: 174, mass: 173.953115 },\n      { nominal: 175, mass: 174.951381 },\n      { nominal: 176, mass: 175.951623 },\n      { nominal: 177, mass: 176.950328 },\n      { nominal: 178, mass: 177.950989 },\n      { nominal: 179, mass: 178.949989 },\n      { nominal: 180, mass: 179.950792 },\n      { nominal: 181, mass: 180.950058 },\n      { nominal: 182, mass: 181.95121 },\n      { nominal: 183, mass: 182.9508196 },\n      { nominal: 184, mass: 183.9525228 },\n      { nominal: 185, mass: 184.9529545, abundance: 0.374 },\n      { nominal: 186, mass: 185.9549856 },\n      { nominal: 187, mass: 186.9557501, abundance: 0.626 },\n      { nominal: 188, mass: 187.9581115 },\n      { nominal: 189, mass: 188.959226 },\n      { nominal: 190, mass: 189.961744 },\n      { nominal: 191, mass: 190.963122 },\n      { nominal: 192, mass: 191.966088 },\n      { nominal: 193, mass: 192.967541 },\n      { nominal: 194, mass: 193.97076 },\n      { nominal: 195, mass: 194.97254 },\n      { nominal: 196, mass: 195.9758 },\n      { nominal: 197, mass: 196.97799 },\n      { nominal: 198, mass: 197.9816 },\n    ],\n    symbol: 'Re',\n    mass: 186.20670454560002,\n    name: 'Rhenium',\n    monoisotopicMass: 186.9557501,\n  },\n  {\n    number: 76,\n    isotopes: [\n      { nominal: 161, mass: 160.98903 },\n      { nominal: 162, mass: 161.98443 },\n      { nominal: 163, mass: 162.98241 },\n      { nominal: 164, mass: 163.97802 },\n      { nominal: 165, mass: 164.9766 },\n      { nominal: 166, mass: 165.972692 },\n      { nominal: 167, mass: 166.971549 },\n      { nominal: 168, mass: 167.967808 },\n      { nominal: 169, mass: 168.967018 },\n      { nominal: 170, mass: 169.963578 },\n      { nominal: 171, mass: 170.963174 },\n      { nominal: 172, mass: 171.960017 },\n      { nominal: 173, mass: 172.959808 },\n      { nominal: 174, mass: 173.957064 },\n      { nominal: 175, mass: 174.956945 },\n      { nominal: 176, mass: 175.954806 },\n      { nominal: 177, mass: 176.954966 },\n      { nominal: 178, mass: 177.953254 },\n      { nominal: 179, mass: 178.953817 },\n      { nominal: 180, mass: 179.952375 },\n      { nominal: 181, mass: 180.953247 },\n      { nominal: 182, mass: 181.95211 },\n      { nominal: 183, mass: 182.953125 },\n      { nominal: 184, mass: 183.9524885, abundance: 0.0002 },\n      { nominal: 185, mass: 184.9540417 },\n      { nominal: 186, mass: 185.953835, abundance: 0.0159 },\n      { nominal: 187, mass: 186.9557474, abundance: 0.0196 },\n      { nominal: 188, mass: 187.9558352, abundance: 0.1324 },\n      { nominal: 189, mass: 188.9581442, abundance: 0.1615 },\n      { nominal: 190, mass: 189.9584437, abundance: 0.2626 },\n      { nominal: 191, mass: 190.9609264 },\n      { nominal: 192, mass: 191.961477, abundance: 0.4078 },\n      { nominal: 193, mass: 192.9641479 },\n      { nominal: 194, mass: 193.9651772 },\n      { nominal: 195, mass: 194.968318 },\n      { nominal: 196, mass: 195.969641 },\n      { nominal: 197, mass: 196.97283 },\n      { nominal: 198, mass: 197.97441 },\n      { nominal: 199, mass: 198.97801 },\n      { nominal: 200, mass: 199.97984 },\n      { nominal: 201, mass: 200.98364 },\n      { nominal: 202, mass: 201.98595 },\n    ],\n    symbol: 'Os',\n    mass: 190.22485962823998,\n    name: 'Osmium',\n    monoisotopicMass: 191.961477,\n  },\n  {\n    number: 77,\n    isotopes: [\n      { nominal: 164, mass: 163.99191 },\n      { nominal: 165, mass: 164.9875 },\n      { nominal: 166, mass: 165.98566 },\n      { nominal: 167, mass: 166.981666 },\n      { nominal: 168, mass: 167.979907 },\n      { nominal: 169, mass: 168.976298 },\n      { nominal: 170, mass: 169.974922 },\n      { nominal: 171, mass: 170.97164 },\n      { nominal: 172, mass: 171.970607 },\n      { nominal: 173, mass: 172.967506 },\n      { nominal: 174, mass: 173.966861 },\n      { nominal: 175, mass: 174.96415 },\n      { nominal: 176, mass: 175.96365 },\n      { nominal: 177, mass: 176.961301 },\n      { nominal: 178, mass: 177.961082 },\n      { nominal: 179, mass: 178.95912 },\n      { nominal: 180, mass: 179.959229 },\n      { nominal: 181, mass: 180.957625 },\n      { nominal: 182, mass: 181.958076 },\n      { nominal: 183, mass: 182.95684 },\n      { nominal: 184, mass: 183.957476 },\n      { nominal: 185, mass: 184.956698 },\n      { nominal: 186, mass: 185.957944 },\n      { nominal: 187, mass: 186.957542 },\n      { nominal: 188, mass: 187.958828 },\n      { nominal: 189, mass: 188.958715 },\n      { nominal: 190, mass: 189.9605412 },\n      { nominal: 191, mass: 190.9605893, abundance: 0.373 },\n      { nominal: 192, mass: 191.9626002 },\n      { nominal: 193, mass: 192.9629216, abundance: 0.627 },\n      { nominal: 194, mass: 193.9650735 },\n      { nominal: 195, mass: 194.9659747 },\n      { nominal: 196, mass: 195.968397 },\n      { nominal: 197, mass: 196.969655 },\n      { nominal: 198, mass: 197.97228 },\n      { nominal: 199, mass: 198.973805 },\n      { nominal: 200, mass: 199.9768 },\n      { nominal: 201, mass: 200.97864 },\n      { nominal: 202, mass: 201.98199 },\n      { nominal: 203, mass: 202.98423 },\n      { nominal: 204, mass: 203.9896 },\n    ],\n    symbol: 'Ir',\n    mass: 192.2160516521,\n    name: 'Iridium',\n    monoisotopicMass: 192.9629216,\n  },\n  {\n    number: 78,\n    isotopes: [\n      { nominal: 166, mass: 165.99486 },\n      { nominal: 167, mass: 166.99269 },\n      { nominal: 168, mass: 167.98813 },\n      { nominal: 169, mass: 168.98657 },\n      { nominal: 170, mass: 169.982496 },\n      { nominal: 171, mass: 170.981245 },\n      { nominal: 172, mass: 171.977351 },\n      { nominal: 173, mass: 172.976443 },\n      { nominal: 174, mass: 173.97282 },\n      { nominal: 175, mass: 174.97241 },\n      { nominal: 176, mass: 175.968938 },\n      { nominal: 177, mass: 176.96847 },\n      { nominal: 178, mass: 177.96565 },\n      { nominal: 179, mass: 178.965359 },\n      { nominal: 180, mass: 179.963032 },\n      { nominal: 181, mass: 180.963098 },\n      { nominal: 182, mass: 181.961172 },\n      { nominal: 183, mass: 182.961597 },\n      { nominal: 184, mass: 183.959915 },\n      { nominal: 185, mass: 184.960614 },\n      { nominal: 186, mass: 185.959351 },\n      { nominal: 187, mass: 186.960617 },\n      { nominal: 188, mass: 187.9593889 },\n      { nominal: 189, mass: 188.960831 },\n      { nominal: 190, mass: 189.9599297, abundance: 0.00012 },\n      { nominal: 191, mass: 190.9616729 },\n      { nominal: 192, mass: 191.9610387, abundance: 0.00782 },\n      { nominal: 193, mass: 192.9629824 },\n      { nominal: 194, mass: 193.9626809, abundance: 0.3286 },\n      { nominal: 195, mass: 194.9647917, abundance: 0.3378 },\n      { nominal: 196, mass: 195.96495209, abundance: 0.2521 },\n      { nominal: 197, mass: 196.96734069 },\n      { nominal: 198, mass: 197.9678949, abundance: 0.07356 },\n      { nominal: 199, mass: 198.9705952 },\n      { nominal: 200, mass: 199.971443 },\n      { nominal: 201, mass: 200.974513 },\n      { nominal: 202, mass: 201.975639 },\n      { nominal: 203, mass: 202.97893 },\n      { nominal: 204, mass: 203.98076 },\n      { nominal: 205, mass: 204.98608 },\n      { nominal: 206, mass: 205.98966 },\n    ],\n    symbol: 'Pt',\n    mass: 195.084456864931,\n    name: 'Platinum',\n    monoisotopicMass: 194.9647917,\n  },\n  {\n    number: 79,\n    isotopes: [\n      { nominal: 169, mass: 168.99808 },\n      { nominal: 170, mass: 169.99597 },\n      { nominal: 171, mass: 170.991876 },\n      { nominal: 172, mass: 171.989942 },\n      { nominal: 173, mass: 172.986241 },\n      { nominal: 174, mass: 173.984717 },\n      { nominal: 175, mass: 174.981304 },\n      { nominal: 176, mass: 175.98025 },\n      { nominal: 177, mass: 176.97687 },\n      { nominal: 178, mass: 177.976032 },\n      { nominal: 179, mass: 178.973174 },\n      { nominal: 180, mass: 179.972523 },\n      { nominal: 181, mass: 180.970079 },\n      { nominal: 182, mass: 181.969618 },\n      { nominal: 183, mass: 182.967591 },\n      { nominal: 184, mass: 183.967452 },\n      { nominal: 185, mass: 184.96579 },\n      { nominal: 186, mass: 185.965953 },\n      { nominal: 187, mass: 186.964543 },\n      { nominal: 188, mass: 187.965349 },\n      { nominal: 189, mass: 188.963948 },\n      { nominal: 190, mass: 189.964698 },\n      { nominal: 191, mass: 190.963702 },\n      { nominal: 192, mass: 191.964814 },\n      { nominal: 193, mass: 192.9641373 },\n      { nominal: 194, mass: 193.9654178 },\n      { nominal: 195, mass: 194.9650352 },\n      { nominal: 196, mass: 195.9665699 },\n      { nominal: 197, mass: 196.96656879, abundance: 1 },\n      { nominal: 198, mass: 197.96824242 },\n      { nominal: 199, mass: 198.96876528 },\n      { nominal: 200, mass: 199.970756 },\n      { nominal: 201, mass: 200.9716575 },\n      { nominal: 202, mass: 201.973856 },\n      { nominal: 203, mass: 202.9751544 },\n      { nominal: 204, mass: 203.97783 },\n      { nominal: 205, mass: 204.97985 },\n      { nominal: 206, mass: 205.98474 },\n      { nominal: 207, mass: 206.9884 },\n      { nominal: 208, mass: 207.99345 },\n      { nominal: 209, mass: 208.99735 },\n      { nominal: 210, mass: 210.0025 },\n    ],\n    symbol: 'Au',\n    mass: 196.96656879,\n    name: 'Gold',\n    monoisotopicMass: 196.96656879,\n  },\n  {\n    number: 80,\n    isotopes: [\n      { nominal: 171, mass: 171.00353 },\n      { nominal: 172, mass: 171.99881 },\n      { nominal: 173, mass: 172.99709 },\n      { nominal: 174, mass: 173.992865 },\n      { nominal: 175, mass: 174.991441 },\n      { nominal: 176, mass: 175.987361 },\n      { nominal: 177, mass: 176.986277 },\n      { nominal: 178, mass: 177.982484 },\n      { nominal: 179, mass: 178.981831 },\n      { nominal: 180, mass: 179.97826 },\n      { nominal: 181, mass: 180.977819 },\n      { nominal: 182, mass: 181.974689 },\n      { nominal: 183, mass: 182.9744448 },\n      { nominal: 184, mass: 183.971714 },\n      { nominal: 185, mass: 184.971899 },\n      { nominal: 186, mass: 185.969362 },\n      { nominal: 187, mass: 186.969814 },\n      { nominal: 188, mass: 187.967567 },\n      { nominal: 189, mass: 188.968195 },\n      { nominal: 190, mass: 189.966323 },\n      { nominal: 191, mass: 190.967157 },\n      { nominal: 192, mass: 191.965635 },\n      { nominal: 193, mass: 192.966653 },\n      { nominal: 194, mass: 193.9654491 },\n      { nominal: 195, mass: 194.966721 },\n      { nominal: 196, mass: 195.9658326, abundance: 0.0015 },\n      { nominal: 197, mass: 196.9672128 },\n      { nominal: 198, mass: 197.9667686, abundance: 0.0997 },\n      { nominal: 199, mass: 198.96828064, abundance: 0.1687 },\n      { nominal: 200, mass: 199.96832659, abundance: 0.231 },\n      { nominal: 201, mass: 200.97030284, abundance: 0.1318 },\n      { nominal: 202, mass: 201.9706434, abundance: 0.2986 },\n      { nominal: 203, mass: 202.9728728 },\n      { nominal: 204, mass: 203.97349398, abundance: 0.0687 },\n      { nominal: 205, mass: 204.9760734 },\n      { nominal: 206, mass: 205.977514 },\n      { nominal: 207, mass: 206.9823 },\n      { nominal: 208, mass: 207.985759 },\n      { nominal: 209, mass: 208.99072 },\n      { nominal: 210, mass: 209.99424 },\n      { nominal: 211, mass: 210.99933 },\n      { nominal: 212, mass: 212.00296 },\n      { nominal: 213, mass: 213.00823 },\n      { nominal: 214, mass: 214.012 },\n      { nominal: 215, mass: 215.0174 },\n      { nominal: 216, mass: 216.02132 },\n    ],\n    symbol: 'Hg',\n    mass: 200.59916703455602,\n    name: 'Mercury',\n    monoisotopicMass: 201.9706434,\n  },\n  {\n    number: 81,\n    isotopes: [\n      { nominal: 176, mass: 176.000624 },\n      { nominal: 177, mass: 176.996431 },\n      { nominal: 178, mass: 177.99485 },\n      { nominal: 179, mass: 178.991111 },\n      { nominal: 180, mass: 179.990057 },\n      { nominal: 181, mass: 180.98626 },\n      { nominal: 182, mass: 181.985713 },\n      { nominal: 183, mass: 182.982193 },\n      { nominal: 184, mass: 183.981886 },\n      { nominal: 185, mass: 184.978789 },\n      { nominal: 186, mass: 185.978651 },\n      { nominal: 187, mass: 186.9759063 },\n      { nominal: 188, mass: 187.976021 },\n      { nominal: 189, mass: 188.973588 },\n      { nominal: 190, mass: 189.973828 },\n      { nominal: 191, mass: 190.9717842 },\n      { nominal: 192, mass: 191.972225 },\n      { nominal: 193, mass: 192.970502 },\n      { nominal: 194, mass: 193.971081 },\n      { nominal: 195, mass: 194.969774 },\n      { nominal: 196, mass: 195.970481 },\n      { nominal: 197, mass: 196.969576 },\n      { nominal: 198, mass: 197.970483 },\n      { nominal: 199, mass: 198.969877 },\n      { nominal: 200, mass: 199.9709633 },\n      { nominal: 201, mass: 200.970822 },\n      { nominal: 202, mass: 201.972102 },\n      { nominal: 203, mass: 202.9723446, abundance: 0.2952 },\n      { nominal: 204, mass: 203.9738639 },\n      { nominal: 205, mass: 204.9744278, abundance: 0.7048 },\n      { nominal: 206, mass: 205.9761106 },\n      { nominal: 207, mass: 206.9774197 },\n      { nominal: 208, mass: 207.982019 },\n      { nominal: 209, mass: 208.9853594 },\n      { nominal: 210, mass: 209.990074 },\n      { nominal: 211, mass: 210.993475 },\n      { nominal: 212, mass: 211.99834 },\n      { nominal: 213, mass: 213.001915 },\n      { nominal: 214, mass: 214.00694 },\n      { nominal: 215, mass: 215.01064 },\n      { nominal: 216, mass: 216.0158 },\n      { nominal: 217, mass: 217.01966 },\n      { nominal: 218, mass: 218.02479 },\n    ],\n    symbol: 'Tl',\n    mass: 204.38341283936,\n    name: 'Thallium',\n    monoisotopicMass: 204.9744278,\n  },\n  {\n    number: 82,\n    isotopes: [\n      { nominal: 178, mass: 178.003831 },\n      { nominal: 179, mass: 179.002201 },\n      { nominal: 180, mass: 179.997928 },\n      { nominal: 181, mass: 180.996653 },\n      { nominal: 182, mass: 181.992672 },\n      { nominal: 183, mass: 182.991872 },\n      { nominal: 184, mass: 183.988136 },\n      { nominal: 185, mass: 184.98761 },\n      { nominal: 186, mass: 185.984238 },\n      { nominal: 187, mass: 186.9839109 },\n      { nominal: 188, mass: 187.980875 },\n      { nominal: 189, mass: 188.980807 },\n      { nominal: 190, mass: 189.978082 },\n      { nominal: 191, mass: 190.978276 },\n      { nominal: 192, mass: 191.975775 },\n      { nominal: 193, mass: 192.976173 },\n      { nominal: 194, mass: 193.974012 },\n      { nominal: 195, mass: 194.974543 },\n      { nominal: 196, mass: 195.972774 },\n      { nominal: 197, mass: 196.9734312 },\n      { nominal: 198, mass: 197.972034 },\n      { nominal: 199, mass: 198.972913 },\n      { nominal: 200, mass: 199.971819 },\n      { nominal: 201, mass: 200.972883 },\n      { nominal: 202, mass: 201.972152 },\n      { nominal: 203, mass: 202.9733911 },\n      { nominal: 204, mass: 203.973044, abundance: 0.014 },\n      { nominal: 205, mass: 204.9744822 },\n      { nominal: 206, mass: 205.9744657, abundance: 0.241 },\n      { nominal: 207, mass: 206.9758973, abundance: 0.221 },\n      { nominal: 208, mass: 207.9766525, abundance: 0.524 },\n      { nominal: 209, mass: 208.9810905 },\n      { nominal: 210, mass: 209.9841889 },\n      { nominal: 211, mass: 210.9887371 },\n      { nominal: 212, mass: 211.9918977 },\n      { nominal: 213, mass: 212.9965629 },\n      { nominal: 214, mass: 213.9998059 },\n      { nominal: 215, mass: 215.00474 },\n      { nominal: 216, mass: 216.00803 },\n      { nominal: 217, mass: 217.01314 },\n      { nominal: 218, mass: 218.01659 },\n      { nominal: 219, mass: 219.02177 },\n      { nominal: 220, mass: 220.02541 },\n    ],\n    symbol: 'Pb',\n    mass: 207.216908063,\n    name: 'Lead',\n    monoisotopicMass: 207.9766525,\n  },\n  {\n    number: 83,\n    isotopes: [\n      { nominal: 184, mass: 184.001275 },\n      { nominal: 185, mass: 184.9976 },\n      { nominal: 186, mass: 185.996644 },\n      { nominal: 187, mass: 186.993147 },\n      { nominal: 188, mass: 187.992287 },\n      { nominal: 189, mass: 188.989195 },\n      { nominal: 190, mass: 189.988622 },\n      { nominal: 191, mass: 190.9857866 },\n      { nominal: 192, mass: 191.985469 },\n      { nominal: 193, mass: 192.98296 },\n      { nominal: 194, mass: 193.982785 },\n      { nominal: 195, mass: 194.9806488 },\n      { nominal: 196, mass: 195.980667 },\n      { nominal: 197, mass: 196.9788651 },\n      { nominal: 198, mass: 197.979206 },\n      { nominal: 199, mass: 198.977673 },\n      { nominal: 200, mass: 199.978131 },\n      { nominal: 201, mass: 200.97701 },\n      { nominal: 202, mass: 201.977734 },\n      { nominal: 203, mass: 202.976893 },\n      { nominal: 204, mass: 203.9778361 },\n      { nominal: 205, mass: 204.9773867 },\n      { nominal: 206, mass: 205.9784993 },\n      { nominal: 207, mass: 206.978471 },\n      { nominal: 208, mass: 207.9797425 },\n      { nominal: 209, mass: 208.9803991, abundance: 1 },\n      { nominal: 210, mass: 209.9841207 },\n      { nominal: 211, mass: 210.9872697 },\n      { nominal: 212, mass: 211.991286 },\n      { nominal: 213, mass: 212.9943851 },\n      { nominal: 214, mass: 213.998712 },\n      { nominal: 215, mass: 215.00177 },\n      { nominal: 216, mass: 216.006306 },\n      { nominal: 217, mass: 217.009372 },\n      { nominal: 218, mass: 218.014188 },\n      { nominal: 219, mass: 219.01748 },\n      { nominal: 220, mass: 220.02235 },\n      { nominal: 221, mass: 221.02587 },\n      { nominal: 222, mass: 222.03078 },\n      { nominal: 223, mass: 223.0345 },\n      { nominal: 224, mass: 224.03947 },\n    ],\n    symbol: 'Bi',\n    mass: 208.9803991,\n    name: 'Bismuth',\n    monoisotopicMass: 208.9803991,\n  },\n  {\n    number: 84,\n    isotopes: [\n      { nominal: 186, mass: 186.004393 },\n      { nominal: 187, mass: 187.003041 },\n      { nominal: 188, mass: 187.999416 },\n      { nominal: 189, mass: 188.998473 },\n      { nominal: 190, mass: 189.995101 },\n      { nominal: 191, mass: 190.9945585 },\n      { nominal: 192, mass: 191.991336 },\n      { nominal: 193, mass: 192.991026 },\n      { nominal: 194, mass: 193.988186 },\n      { nominal: 195, mass: 194.988126 },\n      { nominal: 196, mass: 195.985526 },\n      { nominal: 197, mass: 196.98566 },\n      { nominal: 198, mass: 197.983389 },\n      { nominal: 199, mass: 198.983667 },\n      { nominal: 200, mass: 199.981799 },\n      { nominal: 201, mass: 200.9822598 },\n      { nominal: 202, mass: 201.980758 },\n      { nominal: 203, mass: 202.9814161 },\n      { nominal: 204, mass: 203.98031 },\n      { nominal: 205, mass: 204.981203 },\n      { nominal: 206, mass: 205.980474 },\n      { nominal: 207, mass: 206.9815938 },\n      { nominal: 208, mass: 207.9812461 },\n      { nominal: 209, mass: 208.9824308 },\n      { nominal: 210, mass: 209.9828741 },\n      { nominal: 211, mass: 210.9866536 },\n      { nominal: 212, mass: 211.9888684 },\n      { nominal: 213, mass: 212.9928576 },\n      { nominal: 214, mass: 213.9952017 },\n      { nominal: 215, mass: 214.9994201 },\n      { nominal: 216, mass: 216.0019152 },\n      { nominal: 217, mass: 217.0063182 },\n      { nominal: 218, mass: 218.0089735 },\n      { nominal: 219, mass: 219.013614 },\n      { nominal: 220, mass: 220.016386 },\n      { nominal: 221, mass: 221.021228 },\n      { nominal: 222, mass: 222.02414 },\n      { nominal: 223, mass: 223.02907 },\n      { nominal: 224, mass: 224.03211 },\n      { nominal: 225, mass: 225.03707 },\n      { nominal: 226, mass: 226.04031 },\n      { nominal: 227, mass: 227.04539 },\n    ],\n    symbol: 'Po',\n    mass: null,\n    name: 'Polonium',\n  },\n  {\n    number: 85,\n    isotopes: [\n      { nominal: 191, mass: 191.004148 },\n      { nominal: 192, mass: 192.003152 },\n      { nominal: 193, mass: 192.999927 },\n      { nominal: 194, mass: 193.999236 },\n      { nominal: 195, mass: 194.9962685 },\n      { nominal: 196, mass: 195.9958 },\n      { nominal: 197, mass: 196.993189 },\n      { nominal: 198, mass: 197.992784 },\n      { nominal: 199, mass: 198.9905277 },\n      { nominal: 200, mass: 199.990351 },\n      { nominal: 201, mass: 200.9884171 },\n      { nominal: 202, mass: 201.98863 },\n      { nominal: 203, mass: 202.986943 },\n      { nominal: 204, mass: 203.987251 },\n      { nominal: 205, mass: 204.986076 },\n      { nominal: 206, mass: 205.986657 },\n      { nominal: 207, mass: 206.9858 },\n      { nominal: 208, mass: 207.9866133 },\n      { nominal: 209, mass: 208.9861702 },\n      { nominal: 210, mass: 209.9871479 },\n      { nominal: 211, mass: 210.9874966 },\n      { nominal: 212, mass: 211.9907377 },\n      { nominal: 213, mass: 212.992937 },\n      { nominal: 214, mass: 213.9963721 },\n      { nominal: 215, mass: 214.9986528 },\n      { nominal: 216, mass: 216.0024236 },\n      { nominal: 217, mass: 217.0047192 },\n      { nominal: 218, mass: 218.008695 },\n      { nominal: 219, mass: 219.0111618 },\n      { nominal: 220, mass: 220.015433 },\n      { nominal: 221, mass: 221.018017 },\n      { nominal: 222, mass: 222.022494 },\n      { nominal: 223, mass: 223.025151 },\n      { nominal: 224, mass: 224.029749 },\n      { nominal: 225, mass: 225.03263 },\n      { nominal: 226, mass: 226.03716 },\n      { nominal: 227, mass: 227.04024 },\n      { nominal: 228, mass: 228.04475 },\n      { nominal: 229, mass: 229.04812 },\n    ],\n    symbol: 'At',\n    mass: null,\n    name: 'Astatine',\n  },\n  {\n    number: 86,\n    isotopes: [\n      { nominal: 193, mass: 193.009708 },\n      { nominal: 194, mass: 194.006144 },\n      { nominal: 195, mass: 195.005422 },\n      { nominal: 196, mass: 196.002116 },\n      { nominal: 197, mass: 197.001585 },\n      { nominal: 198, mass: 197.998679 },\n      { nominal: 199, mass: 198.99839 },\n      { nominal: 200, mass: 199.99569 },\n      { nominal: 201, mass: 200.995628 },\n      { nominal: 202, mass: 201.993264 },\n      { nominal: 203, mass: 202.993388 },\n      { nominal: 204, mass: 203.99143 },\n      { nominal: 205, mass: 204.991719 },\n      { nominal: 206, mass: 205.990214 },\n      { nominal: 207, mass: 206.9907303 },\n      { nominal: 208, mass: 207.989635 },\n      { nominal: 209, mass: 208.990415 },\n      { nominal: 210, mass: 209.9896891 },\n      { nominal: 211, mass: 210.9906011 },\n      { nominal: 212, mass: 211.9907039 },\n      { nominal: 213, mass: 212.9938831 },\n      { nominal: 214, mass: 213.995363 },\n      { nominal: 215, mass: 214.9987459 },\n      { nominal: 216, mass: 216.0002719 },\n      { nominal: 217, mass: 217.003928 },\n      { nominal: 218, mass: 218.0056016 },\n      { nominal: 219, mass: 219.0094804 },\n      { nominal: 220, mass: 220.0113941 },\n      { nominal: 221, mass: 221.0155371 },\n      { nominal: 222, mass: 222.0175782 },\n      { nominal: 223, mass: 223.0218893 },\n      { nominal: 224, mass: 224.024096 },\n      { nominal: 225, mass: 225.028486 },\n      { nominal: 226, mass: 226.030861 },\n      { nominal: 227, mass: 227.035304 },\n      { nominal: 228, mass: 228.037835 },\n      { nominal: 229, mass: 229.042257 },\n      { nominal: 230, mass: 230.04514 },\n      { nominal: 231, mass: 231.04987 },\n    ],\n    symbol: 'Rn',\n    mass: null,\n    name: 'Radon',\n  },\n  {\n    number: 87,\n    isotopes: [\n      { nominal: 199, mass: 199.007259 },\n      { nominal: 200, mass: 200.006586 },\n      { nominal: 201, mass: 201.003867 },\n      { nominal: 202, mass: 202.00332 },\n      { nominal: 203, mass: 203.0009407 },\n      { nominal: 204, mass: 204.000652 },\n      { nominal: 205, mass: 204.9985939 },\n      { nominal: 206, mass: 205.998666 },\n      { nominal: 207, mass: 206.996946 },\n      { nominal: 208, mass: 207.997138 },\n      { nominal: 209, mass: 208.995955 },\n      { nominal: 210, mass: 209.996422 },\n      { nominal: 211, mass: 210.995556 },\n      { nominal: 212, mass: 211.9962257 },\n      { nominal: 213, mass: 212.996186 },\n      { nominal: 214, mass: 213.9989713 },\n      { nominal: 215, mass: 215.0003418 },\n      { nominal: 216, mass: 216.0031899 },\n      { nominal: 217, mass: 217.0046323 },\n      { nominal: 218, mass: 218.0075787 },\n      { nominal: 219, mass: 219.0092524 },\n      { nominal: 220, mass: 220.0123277 },\n      { nominal: 221, mass: 221.0142552 },\n      { nominal: 222, mass: 222.017552 },\n      { nominal: 223, mass: 223.019736 },\n      { nominal: 224, mass: 224.023398 },\n      { nominal: 225, mass: 225.025573 },\n      { nominal: 226, mass: 226.029566 },\n      { nominal: 227, mass: 227.031869 },\n      { nominal: 228, mass: 228.035823 },\n      { nominal: 229, mass: 229.038298 },\n      { nominal: 230, mass: 230.042416 },\n      { nominal: 231, mass: 231.045158 },\n      { nominal: 232, mass: 232.04937 },\n      { nominal: 233, mass: 233.05264 },\n    ],\n    symbol: 'Fr',\n    mass: null,\n    name: 'Francium',\n  },\n  {\n    number: 88,\n    isotopes: [\n      { nominal: 201, mass: 201.01271 },\n      { nominal: 202, mass: 202.00976 },\n      { nominal: 203, mass: 203.009304 },\n      { nominal: 204, mass: 204.006492 },\n      { nominal: 205, mass: 205.006268 },\n      { nominal: 206, mass: 206.003828 },\n      { nominal: 207, mass: 207.003799 },\n      { nominal: 208, mass: 208.001841 },\n      { nominal: 209, mass: 209.00199 },\n      { nominal: 210, mass: 210.000494 },\n      { nominal: 211, mass: 211.0008932 },\n      { nominal: 212, mass: 211.999787 },\n      { nominal: 213, mass: 213.000384 },\n      { nominal: 214, mass: 214.0000997 },\n      { nominal: 215, mass: 215.0027204 },\n      { nominal: 216, mass: 216.0035334 },\n      { nominal: 217, mass: 217.0063207 },\n      { nominal: 218, mass: 218.007141 },\n      { nominal: 219, mass: 219.0100855 },\n      { nominal: 220, mass: 220.0110259 },\n      { nominal: 221, mass: 221.0139177 },\n      { nominal: 222, mass: 222.0153748 },\n      { nominal: 223, mass: 223.0185023 },\n      { nominal: 224, mass: 224.020212 },\n      { nominal: 225, mass: 225.0236119 },\n      { nominal: 226, mass: 226.0254103 },\n      { nominal: 227, mass: 227.0291783 },\n      { nominal: 228, mass: 228.0310707 },\n      { nominal: 229, mass: 229.034942 },\n      { nominal: 230, mass: 230.037055 },\n      { nominal: 231, mass: 231.041027 },\n      { nominal: 232, mass: 232.0434753 },\n      { nominal: 233, mass: 233.047582 },\n      { nominal: 234, mass: 234.050342 },\n      { nominal: 235, mass: 235.05497 },\n    ],\n    symbol: 'Ra',\n    mass: null,\n    name: 'Radium',\n  },\n  {\n    number: 89,\n    isotopes: [\n      { nominal: 206, mass: 206.014452 },\n      { nominal: 207, mass: 207.011966 },\n      { nominal: 208, mass: 208.01155 },\n      { nominal: 209, mass: 209.009495 },\n      { nominal: 210, mass: 210.009436 },\n      { nominal: 211, mass: 211.007732 },\n      { nominal: 212, mass: 212.007813 },\n      { nominal: 213, mass: 213.006609 },\n      { nominal: 214, mass: 214.006918 },\n      { nominal: 215, mass: 215.006475 },\n      { nominal: 216, mass: 216.008743 },\n      { nominal: 217, mass: 217.009344 },\n      { nominal: 218, mass: 218.011642 },\n      { nominal: 219, mass: 219.012421 },\n      { nominal: 220, mass: 220.0147549 },\n      { nominal: 221, mass: 221.015592 },\n      { nominal: 222, mass: 222.0178442 },\n      { nominal: 223, mass: 223.0191377 },\n      { nominal: 224, mass: 224.0217232 },\n      { nominal: 225, mass: 225.02323 },\n      { nominal: 226, mass: 226.0260984 },\n      { nominal: 227, mass: 227.0277523 },\n      { nominal: 228, mass: 228.0310215 },\n      { nominal: 229, mass: 229.032956 },\n      { nominal: 230, mass: 230.036327 },\n      { nominal: 231, mass: 231.038393 },\n      { nominal: 232, mass: 232.042034 },\n      { nominal: 233, mass: 233.044346 },\n      { nominal: 234, mass: 234.048139 },\n      { nominal: 235, mass: 235.05084 },\n      { nominal: 236, mass: 236.054988 },\n      { nominal: 237, mass: 237.05827 },\n    ],\n    symbol: 'Ac',\n    mass: null,\n    name: 'Actinium',\n  },\n  {\n    number: 90,\n    isotopes: [\n      { nominal: 208, mass: 208.0179 },\n      { nominal: 209, mass: 209.017753 },\n      { nominal: 210, mass: 210.015094 },\n      { nominal: 211, mass: 211.014929 },\n      { nominal: 212, mass: 212.012988 },\n      { nominal: 213, mass: 213.013009 },\n      { nominal: 214, mass: 214.0115 },\n      { nominal: 215, mass: 215.0117248 },\n      { nominal: 216, mass: 216.011056 },\n      { nominal: 217, mass: 217.013117 },\n      { nominal: 218, mass: 218.013276 },\n      { nominal: 219, mass: 219.015537 },\n      { nominal: 220, mass: 220.015748 },\n      { nominal: 221, mass: 221.018184 },\n      { nominal: 222, mass: 222.018469 },\n      { nominal: 223, mass: 223.0208119 },\n      { nominal: 224, mass: 224.021464 },\n      { nominal: 225, mass: 225.0239514 },\n      { nominal: 226, mass: 226.0249034 },\n      { nominal: 227, mass: 227.0277042 },\n      { nominal: 228, mass: 228.0287413 },\n      { nominal: 229, mass: 229.0317627 },\n      { nominal: 230, mass: 230.0331341 },\n      { nominal: 231, mass: 231.0363046 },\n      { nominal: 232, mass: 232.0380558, abundance: 1 },\n      { nominal: 233, mass: 233.0415823 },\n      { nominal: 234, mass: 234.0436014 },\n      { nominal: 235, mass: 235.047255 },\n      { nominal: 236, mass: 236.049657 },\n      { nominal: 237, mass: 237.053629 },\n      { nominal: 238, mass: 238.0565 },\n      { nominal: 239, mass: 239.06077 },\n    ],\n    symbol: 'Th',\n    mass: 232.0380558,\n    name: 'Thorium',\n    monoisotopicMass: 232.0380558,\n  },\n  {\n    number: 91,\n    isotopes: [\n      { nominal: 212, mass: 212.023203 },\n      { nominal: 213, mass: 213.021109 },\n      { nominal: 214, mass: 214.020918 },\n      { nominal: 215, mass: 215.019183 },\n      { nominal: 216, mass: 216.019109 },\n      { nominal: 217, mass: 217.018325 },\n      { nominal: 218, mass: 218.020059 },\n      { nominal: 219, mass: 219.019904 },\n      { nominal: 220, mass: 220.021705 },\n      { nominal: 221, mass: 221.021875 },\n      { nominal: 222, mass: 222.023784 },\n      { nominal: 223, mass: 223.023963 },\n      { nominal: 224, mass: 224.0256176 },\n      { nominal: 225, mass: 225.026131 },\n      { nominal: 226, mass: 226.027948 },\n      { nominal: 227, mass: 227.0288054 },\n      { nominal: 228, mass: 228.0310517 },\n      { nominal: 229, mass: 229.0320972 },\n      { nominal: 230, mass: 230.034541 },\n      { nominal: 231, mass: 231.0358842, abundance: 1 },\n      { nominal: 232, mass: 232.0385917 },\n      { nominal: 233, mass: 233.0402472 },\n      { nominal: 234, mass: 234.0433072 },\n      { nominal: 235, mass: 235.045399 },\n      { nominal: 236, mass: 236.048668 },\n      { nominal: 237, mass: 237.051023 },\n      { nominal: 238, mass: 238.054637 },\n      { nominal: 239, mass: 239.05726 },\n      { nominal: 240, mass: 240.06098 },\n      { nominal: 241, mass: 241.06408 },\n    ],\n    symbol: 'Pa',\n    mass: 231.0358842,\n    name: 'Protactinium',\n    monoisotopicMass: 231.0358842,\n  },\n  {\n    number: 92,\n    isotopes: [\n      { nominal: 217, mass: 217.02466 },\n      { nominal: 218, mass: 218.023523 },\n      { nominal: 219, mass: 219.024999 },\n      { nominal: 220, mass: 220.02462 },\n      { nominal: 221, mass: 221.02628 },\n      { nominal: 222, mass: 222.026 },\n      { nominal: 223, mass: 223.027739 },\n      { nominal: 224, mass: 224.027605 },\n      { nominal: 225, mass: 225.029391 },\n      { nominal: 226, mass: 226.029339 },\n      { nominal: 227, mass: 227.031157 },\n      { nominal: 228, mass: 228.031371 },\n      { nominal: 229, mass: 229.0335063 },\n      { nominal: 230, mass: 230.0339401 },\n      { nominal: 231, mass: 231.0362939 },\n      { nominal: 232, mass: 232.0371563 },\n      { nominal: 233, mass: 233.0396355 },\n      { nominal: 234, mass: 234.0409523, abundance: 0.000054 },\n      { nominal: 235, mass: 235.0439301, abundance: 0.007204 },\n      { nominal: 236, mass: 236.0455682 },\n      { nominal: 237, mass: 237.0487304 },\n      { nominal: 238, mass: 238.0507884, abundance: 0.992742 },\n      { nominal: 239, mass: 239.0542935 },\n      { nominal: 240, mass: 240.0565934 },\n      { nominal: 241, mass: 241.06033 },\n      { nominal: 242, mass: 242.06293 },\n      { nominal: 243, mass: 243.06699 },\n    ],\n    symbol: 'U',\n    mass: 238.0289104616574,\n    name: 'Uranium',\n    monoisotopicMass: 238.0507884,\n  },\n  {\n    number: 93,\n    isotopes: [\n      { nominal: 219, mass: 219.03143 },\n      { nominal: 220, mass: 220.03254 },\n      { nominal: 221, mass: 221.03204 },\n      { nominal: 222, mass: 222.0333 },\n      { nominal: 223, mass: 223.03285 },\n      { nominal: 224, mass: 224.03422 },\n      { nominal: 225, mass: 225.033911 },\n      { nominal: 226, mass: 226.035188 },\n      { nominal: 227, mass: 227.034957 },\n      { nominal: 228, mass: 228.036067 },\n      { nominal: 229, mass: 229.036264 },\n      { nominal: 230, mass: 230.037828 },\n      { nominal: 231, mass: 231.038245 },\n      { nominal: 232, mass: 232.04011 },\n      { nominal: 233, mass: 233.040741 },\n      { nominal: 234, mass: 234.0428953 },\n      { nominal: 235, mass: 235.0440635 },\n      { nominal: 236, mass: 236.04657 },\n      { nominal: 237, mass: 237.0481736 },\n      { nominal: 238, mass: 238.0509466 },\n      { nominal: 239, mass: 239.0529392 },\n      { nominal: 240, mass: 240.056165 },\n      { nominal: 241, mass: 241.058253 },\n      { nominal: 242, mass: 242.06164 },\n      { nominal: 243, mass: 243.06428 },\n      { nominal: 244, mass: 244.06785 },\n      { nominal: 245, mass: 245.0708 },\n    ],\n    symbol: 'Np',\n    mass: null,\n    name: 'Neptunium',\n  },\n  {\n    number: 94,\n    isotopes: [\n      { nominal: 228, mass: 228.038732 },\n      { nominal: 229, mass: 229.040144 },\n      { nominal: 230, mass: 230.03965 },\n      { nominal: 231, mass: 231.041102 },\n      { nominal: 232, mass: 232.041185 },\n      { nominal: 233, mass: 233.042998 },\n      { nominal: 234, mass: 234.0433174 },\n      { nominal: 235, mass: 235.045286 },\n      { nominal: 236, mass: 236.0460581 },\n      { nominal: 237, mass: 237.0484098 },\n      { nominal: 238, mass: 238.0495601 },\n      { nominal: 239, mass: 239.0521636 },\n      { nominal: 240, mass: 240.0538138 },\n      { nominal: 241, mass: 241.0568517 },\n      { nominal: 242, mass: 242.0587428 },\n      { nominal: 243, mass: 243.0620036 },\n      { nominal: 244, mass: 244.0642053 },\n      { nominal: 245, mass: 245.067826 },\n      { nominal: 246, mass: 246.070205 },\n      { nominal: 247, mass: 247.07419 },\n    ],\n    symbol: 'Pu',\n    mass: null,\n    name: 'Plutonium',\n  },\n  {\n    number: 95,\n    isotopes: [\n      { nominal: 230, mass: 230.04609 },\n      { nominal: 231, mass: 231.04556 },\n      { nominal: 232, mass: 232.04645 },\n      { nominal: 233, mass: 233.04644 },\n      { nominal: 234, mass: 234.04773 },\n      { nominal: 235, mass: 235.047908 },\n      { nominal: 236, mass: 236.04943 },\n      { nominal: 237, mass: 237.049996 },\n      { nominal: 238, mass: 238.051985 },\n      { nominal: 239, mass: 239.0530247 },\n      { nominal: 240, mass: 240.0553 },\n      { nominal: 241, mass: 241.0568293 },\n      { nominal: 242, mass: 242.0595494 },\n      { nominal: 243, mass: 243.0613813 },\n      { nominal: 244, mass: 244.0642851 },\n      { nominal: 245, mass: 245.0664548 },\n      { nominal: 246, mass: 246.069775 },\n      { nominal: 247, mass: 247.07209 },\n      { nominal: 248, mass: 248.07575 },\n      { nominal: 249, mass: 249.07848 },\n    ],\n    symbol: 'Am',\n    name: 'Americium',\n    mass: null,\n  },\n  {\n    number: 96,\n    isotopes: [\n      { nominal: 232, mass: 232.04982 },\n      { nominal: 233, mass: 233.05077 },\n      { nominal: 234, mass: 234.05016 },\n      { nominal: 235, mass: 235.05154 },\n      { nominal: 236, mass: 236.051374 },\n      { nominal: 237, mass: 237.052869 },\n      { nominal: 238, mass: 238.053081 },\n      { nominal: 239, mass: 239.05491 },\n      { nominal: 240, mass: 240.0555297 },\n      { nominal: 241, mass: 241.0576532 },\n      { nominal: 242, mass: 242.058836 },\n      { nominal: 243, mass: 243.0613893 },\n      { nominal: 244, mass: 244.0627528 },\n      { nominal: 245, mass: 245.0654915 },\n      { nominal: 246, mass: 246.0672238 },\n      { nominal: 247, mass: 247.0703541 },\n      { nominal: 248, mass: 248.0723499 },\n      { nominal: 249, mass: 249.0759548 },\n      { nominal: 250, mass: 250.078358 },\n      { nominal: 251, mass: 251.082286 },\n      { nominal: 252, mass: 252.08487 },\n    ],\n    symbol: 'Cm',\n    name: 'Curium',\n    mass: null,\n  },\n  {\n    number: 97,\n    isotopes: [\n      { nominal: 234, mass: 234.05727 },\n      { nominal: 235, mass: 235.05658 },\n      { nominal: 236, mass: 236.05748 },\n      { nominal: 237, mass: 237.0571 },\n      { nominal: 238, mass: 238.0582 },\n      { nominal: 239, mass: 239.05824 },\n      { nominal: 240, mass: 240.05976 },\n      { nominal: 241, mass: 241.06016 },\n      { nominal: 242, mass: 242.06198 },\n      { nominal: 243, mass: 243.0630078 },\n      { nominal: 244, mass: 244.065181 },\n      { nominal: 245, mass: 245.0663618 },\n      { nominal: 246, mass: 246.068673 },\n      { nominal: 247, mass: 247.0703073 },\n      { nominal: 248, mass: 248.073088 },\n      { nominal: 249, mass: 249.0749877 },\n      { nominal: 250, mass: 250.0783167 },\n      { nominal: 251, mass: 251.080762 },\n      { nominal: 252, mass: 252.08431 },\n      { nominal: 253, mass: 253.08688 },\n      { nominal: 254, mass: 254.0906 },\n    ],\n    symbol: 'Bk',\n    name: 'Berkelium',\n    mass: null,\n  },\n  {\n    number: 98,\n    isotopes: [\n      { nominal: 237, mass: 237.062198 },\n      { nominal: 238, mass: 238.06149 },\n      { nominal: 239, mass: 239.06253 },\n      { nominal: 240, mass: 240.062256 },\n      { nominal: 241, mass: 241.06369 },\n      { nominal: 242, mass: 242.063754 },\n      { nominal: 243, mass: 243.06548 },\n      { nominal: 244, mass: 244.0660008 },\n      { nominal: 245, mass: 245.0680487 },\n      { nominal: 246, mass: 246.0688055 },\n      { nominal: 247, mass: 247.070965 },\n      { nominal: 248, mass: 248.0721851 },\n      { nominal: 249, mass: 249.0748539 },\n      { nominal: 250, mass: 250.0764062 },\n      { nominal: 251, mass: 251.0795886 },\n      { nominal: 252, mass: 252.0816272 },\n      { nominal: 253, mass: 253.0851345 },\n      { nominal: 254, mass: 254.087324 },\n      { nominal: 255, mass: 255.09105 },\n      { nominal: 256, mass: 256.09344 },\n    ],\n    symbol: 'Cf',\n    name: 'Californium',\n    mass: null,\n  },\n  {\n    number: 99,\n    isotopes: [\n      { nominal: 239, mass: 239.06823 },\n      { nominal: 240, mass: 240.06892 },\n      { nominal: 241, mass: 241.06856 },\n      { nominal: 242, mass: 242.06957 },\n      { nominal: 243, mass: 243.06951 },\n      { nominal: 244, mass: 244.07088 },\n      { nominal: 245, mass: 245.07125 },\n      { nominal: 246, mass: 246.0729 },\n      { nominal: 247, mass: 247.073622 },\n      { nominal: 248, mass: 248.075471 },\n      { nominal: 249, mass: 249.076411 },\n      { nominal: 250, mass: 250.07861 },\n      { nominal: 251, mass: 251.0799936 },\n      { nominal: 252, mass: 252.08298 },\n      { nominal: 253, mass: 253.0848257 },\n      { nominal: 254, mass: 254.0880222 },\n      { nominal: 255, mass: 255.090275 },\n      { nominal: 256, mass: 256.0936 },\n      { nominal: 257, mass: 257.09598 },\n      { nominal: 258, mass: 258.09952 },\n    ],\n    symbol: 'Es',\n    name: 'Einsteinium',\n    mass: null,\n  },\n  {\n    number: 100,\n    isotopes: [\n      { nominal: 241, mass: 241.07421 },\n      { nominal: 242, mass: 242.07343 },\n      { nominal: 243, mass: 243.07446 },\n      { nominal: 244, mass: 244.07404 },\n      { nominal: 245, mass: 245.07535 },\n      { nominal: 246, mass: 246.07535 },\n      { nominal: 247, mass: 247.07694 },\n      { nominal: 248, mass: 248.0771865 },\n      { nominal: 249, mass: 249.0789275 },\n      { nominal: 250, mass: 250.079521 },\n      { nominal: 251, mass: 251.08154 },\n      { nominal: 252, mass: 252.0824671 },\n      { nominal: 253, mass: 253.0851846 },\n      { nominal: 254, mass: 254.0868544 },\n      { nominal: 255, mass: 255.089964 },\n      { nominal: 256, mass: 256.0917745 },\n      { nominal: 257, mass: 257.0951061 },\n      { nominal: 258, mass: 258.09708 },\n      { nominal: 259, mass: 259.1006 },\n      { nominal: 260, mass: 260.10281 },\n    ],\n    symbol: 'Fm',\n    name: 'Fermium',\n    mass: null,\n  },\n  {\n    number: 101,\n    isotopes: [\n      { nominal: 245, mass: 245.08081 },\n      { nominal: 246, mass: 246.08171 },\n      { nominal: 247, mass: 247.08152 },\n      { nominal: 248, mass: 248.08282 },\n      { nominal: 249, mass: 249.08291 },\n      { nominal: 250, mass: 250.08441 },\n      { nominal: 251, mass: 251.084774 },\n      { nominal: 252, mass: 252.08643 },\n      { nominal: 253, mass: 253.087144 },\n      { nominal: 254, mass: 254.08959 },\n      { nominal: 255, mass: 255.0910841 },\n      { nominal: 256, mass: 256.09389 },\n      { nominal: 257, mass: 257.0955424 },\n      { nominal: 258, mass: 258.0984315 },\n      { nominal: 259, mass: 259.10051 },\n      { nominal: 260, mass: 260.10365 },\n      { nominal: 261, mass: 261.10583 },\n      { nominal: 262, mass: 262.1091 },\n    ],\n    symbol: 'Md',\n    name: 'Mendelevium',\n    mass: null,\n  },\n  {\n    number: 102,\n    isotopes: [\n      { nominal: 248, mass: 248.08655 },\n      { nominal: 249, mass: 249.0878 },\n      { nominal: 250, mass: 250.08756 },\n      { nominal: 251, mass: 251.08894 },\n      { nominal: 252, mass: 252.088967 },\n      { nominal: 253, mass: 253.0905641 },\n      { nominal: 254, mass: 254.090956 },\n      { nominal: 255, mass: 255.093191 },\n      { nominal: 256, mass: 256.0942829 },\n      { nominal: 257, mass: 257.0968878 },\n      { nominal: 258, mass: 258.09821 },\n      { nominal: 259, mass: 259.10103 },\n      { nominal: 260, mass: 260.10264 },\n      { nominal: 261, mass: 261.1057 },\n      { nominal: 262, mass: 262.10746 },\n      { nominal: 263, mass: 263.11071 },\n      { nominal: 264, mass: 264.11273 },\n    ],\n    symbol: 'No',\n    name: 'Nobelium',\n    mass: null,\n  },\n  {\n    number: 103,\n    isotopes: [\n      { nominal: 251, mass: 251.09418 },\n      { nominal: 252, mass: 252.09526 },\n      { nominal: 253, mass: 253.09509 },\n      { nominal: 254, mass: 254.09648 },\n      { nominal: 255, mass: 255.096562 },\n      { nominal: 256, mass: 256.098494 },\n      { nominal: 257, mass: 257.099418 },\n      { nominal: 258, mass: 258.10176 },\n      { nominal: 259, mass: 259.102902 },\n      { nominal: 260, mass: 260.1055 },\n      { nominal: 261, mass: 261.10688 },\n      { nominal: 262, mass: 262.10961 },\n      { nominal: 263, mass: 263.11136 },\n      { nominal: 264, mass: 264.1142 },\n      { nominal: 265, mass: 265.11619 },\n      { nominal: 266, mass: 266.11983 },\n    ],\n    symbol: 'Lr',\n    name: 'Lawrencium',\n    mass: null,\n  },\n  {\n    number: 104,\n    isotopes: [\n      { nominal: 253, mass: 253.10044 },\n      { nominal: 254, mass: 254.10005 },\n      { nominal: 255, mass: 255.10127 },\n      { nominal: 256, mass: 256.101152 },\n      { nominal: 257, mass: 257.102918 },\n      { nominal: 258, mass: 258.103428 },\n      { nominal: 259, mass: 259.105596 },\n      { nominal: 260, mass: 260.10644 },\n      { nominal: 261, mass: 261.108773 },\n      { nominal: 262, mass: 262.10992 },\n      { nominal: 263, mass: 263.11249 },\n      { nominal: 264, mass: 264.11388 },\n      { nominal: 265, mass: 265.11668 },\n      { nominal: 266, mass: 266.11817 },\n      { nominal: 267, mass: 267.12179 },\n      { nominal: 268, mass: 268.12397 },\n    ],\n    symbol: 'Rf',\n    name: 'Rutherfordium',\n    mass: null,\n  },\n  {\n    number: 105,\n    isotopes: [\n      { nominal: 255, mass: 255.10707 },\n      { nominal: 256, mass: 256.10789 },\n      { nominal: 257, mass: 257.10758 },\n      { nominal: 258, mass: 258.10928 },\n      { nominal: 259, mass: 259.109492 },\n      { nominal: 260, mass: 260.1113 },\n      { nominal: 261, mass: 261.11192 },\n      { nominal: 262, mass: 262.11407 },\n      { nominal: 263, mass: 263.11499 },\n      { nominal: 264, mass: 264.11741 },\n      { nominal: 265, mass: 265.11861 },\n      { nominal: 266, mass: 266.12103 },\n      { nominal: 267, mass: 267.12247 },\n      { nominal: 268, mass: 268.12567 },\n      { nominal: 269, mass: 269.12791 },\n      { nominal: 270, mass: 270.13136 },\n    ],\n    symbol: 'Db',\n    name: 'Dubnium',\n    mass: null,\n  },\n  {\n    number: 106,\n    isotopes: [\n      { nominal: 258, mass: 258.11298 },\n      { nominal: 259, mass: 259.1144 },\n      { nominal: 260, mass: 260.114384 },\n      { nominal: 261, mass: 261.115949 },\n      { nominal: 262, mass: 262.116337 },\n      { nominal: 263, mass: 263.11829 },\n      { nominal: 264, mass: 264.11893 },\n      { nominal: 265, mass: 265.12109 },\n      { nominal: 266, mass: 266.12198 },\n      { nominal: 267, mass: 267.12436 },\n      { nominal: 268, mass: 268.12539 },\n      { nominal: 269, mass: 269.12863 },\n      { nominal: 270, mass: 270.13043 },\n      { nominal: 271, mass: 271.13393 },\n      { nominal: 272, mass: 272.13589 },\n      { nominal: 273, mass: 273.13958 },\n    ],\n    symbol: 'Sg',\n    name: 'Seaborgium',\n    mass: null,\n  },\n  {\n    number: 107,\n    isotopes: [\n      { nominal: 260, mass: 260.12166 },\n      { nominal: 261, mass: 261.12145 },\n      { nominal: 262, mass: 262.12297 },\n      { nominal: 263, mass: 263.12292 },\n      { nominal: 264, mass: 264.12459 },\n      { nominal: 265, mass: 265.12491 },\n      { nominal: 266, mass: 266.12679 },\n      { nominal: 267, mass: 267.1275 },\n      { nominal: 268, mass: 268.12969 },\n      { nominal: 269, mass: 269.13042 },\n      { nominal: 270, mass: 270.13336 },\n      { nominal: 271, mass: 271.13526 },\n      { nominal: 272, mass: 272.13826 },\n      { nominal: 273, mass: 273.14024 },\n      { nominal: 274, mass: 274.14355 },\n      { nominal: 275, mass: 275.14567 },\n    ],\n    symbol: 'Bh',\n    name: 'Bohrium',\n    mass: null,\n  },\n  {\n    number: 108,\n    isotopes: [\n      { nominal: 263, mass: 263.12852 },\n      { nominal: 264, mass: 264.128357 },\n      { nominal: 265, mass: 265.129793 },\n      { nominal: 266, mass: 266.130046 },\n      { nominal: 267, mass: 267.13167 },\n      { nominal: 268, mass: 268.13186 },\n      { nominal: 269, mass: 269.13375 },\n      { nominal: 270, mass: 270.13429 },\n      { nominal: 271, mass: 271.13717 },\n      { nominal: 272, mass: 272.1385 },\n      { nominal: 273, mass: 273.14168 },\n      { nominal: 274, mass: 274.1433 },\n      { nominal: 275, mass: 275.14667 },\n      { nominal: 276, mass: 276.14846 },\n      { nominal: 277, mass: 277.1519 },\n    ],\n    symbol: 'Hs',\n    name: 'Hassium',\n    mass: null,\n  },\n  {\n    number: 109,\n    isotopes: [\n      { nominal: 265, mass: 265.136 },\n      { nominal: 266, mass: 266.13737 },\n      { nominal: 267, mass: 267.13719 },\n      { nominal: 268, mass: 268.13865 },\n      { nominal: 269, mass: 269.13882 },\n      { nominal: 270, mass: 270.14033 },\n      { nominal: 271, mass: 271.14074 },\n      { nominal: 272, mass: 272.14341 },\n      { nominal: 273, mass: 273.1444 },\n      { nominal: 274, mass: 274.14724 },\n      { nominal: 275, mass: 275.14882 },\n      { nominal: 276, mass: 276.15159 },\n      { nominal: 277, mass: 277.15327 },\n      { nominal: 278, mass: 278.15631 },\n      { nominal: 279, mass: 279.15808 },\n    ],\n    symbol: 'Mt',\n    name: 'Meitnerium',\n    mass: null,\n  },\n  {\n    number: 110,\n    isotopes: [\n      { nominal: 267, mass: 267.14377 },\n      { nominal: 268, mass: 268.14348 },\n      { nominal: 269, mass: 269.144752 },\n      { nominal: 270, mass: 270.144584 },\n      { nominal: 271, mass: 271.14595 },\n      { nominal: 272, mass: 272.14602 },\n      { nominal: 273, mass: 273.14856 },\n      { nominal: 274, mass: 274.14941 },\n      { nominal: 275, mass: 275.15203 },\n      { nominal: 276, mass: 276.15303 },\n      { nominal: 277, mass: 277.15591 },\n      { nominal: 278, mass: 278.15704 },\n      { nominal: 279, mass: 279.1601 },\n      { nominal: 280, mass: 280.16131 },\n      { nominal: 281, mass: 281.16451 },\n    ],\n    symbol: 'Ds',\n    name: 'Darmstadtium',\n    mass: null,\n  },\n  {\n    number: 111,\n    isotopes: [\n      { nominal: 272, mass: 272.15327 },\n      { nominal: 273, mass: 273.15313 },\n      { nominal: 274, mass: 274.15525 },\n      { nominal: 275, mass: 275.15594 },\n      { nominal: 276, mass: 276.15833 },\n      { nominal: 277, mass: 277.15907 },\n      { nominal: 278, mass: 278.16149 },\n      { nominal: 279, mass: 279.16272 },\n      { nominal: 280, mass: 280.16514 },\n      { nominal: 281, mass: 281.16636 },\n      { nominal: 282, mass: 282.16912 },\n      { nominal: 283, mass: 283.17054 },\n    ],\n    symbol: 'Rg',\n    name: 'Roentgenium',\n    mass: null,\n  },\n  {\n    number: 112,\n    isotopes: [\n      { nominal: 276, mass: 276.16141 },\n      { nominal: 277, mass: 277.16364 },\n      { nominal: 278, mass: 278.16416 },\n      { nominal: 279, mass: 279.16654 },\n      { nominal: 280, mass: 280.16715 },\n      { nominal: 281, mass: 281.16975 },\n      { nominal: 282, mass: 282.1705 },\n      { nominal: 283, mass: 283.17327 },\n      { nominal: 284, mass: 284.17416 },\n      { nominal: 285, mass: 285.17712 },\n    ],\n    symbol: 'Cn',\n    name: 'Copernicium',\n    mass: null,\n  },\n  {\n    number: 113,\n    isotopes: [\n      { nominal: 278, mass: 278.17058 },\n      { nominal: 279, mass: 279.17095 },\n      { nominal: 280, mass: 280.17293 },\n      { nominal: 281, mass: 281.17348 },\n      { nominal: 282, mass: 282.17567 },\n      { nominal: 283, mass: 283.17657 },\n      { nominal: 284, mass: 284.17873 },\n      { nominal: 285, mass: 285.17973 },\n      { nominal: 286, mass: 286.18221 },\n      { nominal: 287, mass: 287.18339 },\n    ],\n    symbol: 'Nh',\n    name: 'Nihonium',\n    mass: null,\n  },\n  {\n    number: 114,\n    isotopes: [\n      { nominal: 285, mass: 285.18364 },\n      { nominal: 286, mass: 286.18423 },\n      { nominal: 287, mass: 287.18678 },\n      { nominal: 288, mass: 288.18757 },\n      { nominal: 289, mass: 289.19042 },\n    ],\n    symbol: 'Fl',\n    name: 'Flerovium',\n    mass: null,\n  },\n  {\n    number: 115,\n    isotopes: [\n      { nominal: 287, mass: 287.1907 },\n      { nominal: 288, mass: 288.19274 },\n      { nominal: 289, mass: 289.19363 },\n      { nominal: 290, mass: 290.19598 },\n      { nominal: 291, mass: 291.19707 },\n    ],\n    symbol: 'Mc',\n    name: 'Moscovium',\n    mass: null,\n  },\n  {\n    number: 116,\n    isotopes: [\n      { nominal: 289, mass: 289.19816 },\n      { nominal: 290, mass: 290.19864 },\n      { nominal: 291, mass: 291.20108 },\n      { nominal: 292, mass: 292.20174 },\n      { nominal: 293, mass: 293.20449 },\n    ],\n    symbol: 'Lv',\n    name: 'Livermorium',\n    mass: null,\n  },\n  {\n    number: 117,\n    isotopes: [\n      { nominal: 291, mass: 291.20553 },\n      { nominal: 292, mass: 292.20746 },\n      { nominal: 293, mass: 293.20824 },\n      { nominal: 294, mass: 294.21046 },\n    ],\n    symbol: 'Ts',\n    name: 'Teennessine',\n    mass: null,\n  },\n  {\n    number: 118,\n    isotopes: [\n      { nominal: 293, mass: 293.21356 },\n      { nominal: 294, mass: 294.21392 },\n      { nominal: 295, mass: 295.21624 },\n    ],\n    symbol: 'Og',\n    name: 'Oganesson',\n    mass: null,\n  },\n];\n","import { elementsAndIsotopes } from './elementsAndIsotopes.js';\n\nexport const elements = elementsAndIsotopes.map((element) => ({\n  number: element.number,\n  symbol: element.symbol,\n  mass: element.mass,\n  name: element.name,\n  monoisotopicMass: element.monoisotopicMass,\n}));\n","import { elementsAndIsotopes } from './elementsAndIsotopes.js';\n\nexport const elementsAndIsotopesObject = {};\nelementsAndIsotopes.forEach((element) => {\n  elementsAndIsotopesObject[element.symbol] = element;\n});\n","import { elementsAndIsotopes } from './elementsAndIsotopes.js';\n\nexport const elementsAndStableIsotopes = JSON.parse(\n  JSON.stringify(elementsAndIsotopes),\n);\n\nelementsAndStableIsotopes.forEach((element) => {\n  element.isotopes = element.isotopes.filter((i) => i.abundance > 0);\n});\n","import { elementsAndStableIsotopes } from './elementsAndStableIsotopes.js';\n\nexport const elementsAndStableIsotopesObject = {};\nelementsAndStableIsotopes.forEach((element) => {\n  elementsAndStableIsotopesObject[element.symbol] = element;\n});\n","import { elements } from './elements.js';\n\nexport const elementsObject = {};\nelements.forEach((element) => {\n  elementsObject[element.symbol] = element;\n});\n","import { elementsAndIsotopes } from './elementsAndIsotopes.js';\n\nexport const stableIsotopesObject = {};\nfor (const element of elementsAndIsotopes) {\n  let abundance = 0;\n  let mostAbundant = 0;\n  for (const isotope of element.isotopes) {\n    if (isotope.abundance > abundance) {\n      abundance = isotope.abundance;\n      mostAbundant = isotope.nominal;\n    }\n  }\n\n  for (const isotope of element.isotopes) {\n    if (isotope.abundance === 0) continue;\n\n    const entry = {\n      name: element.name,\n      mass: isotope.mass,\n      symbol: element.symbol,\n    };\n    if (isotope.nominal === mostAbundant) {\n      entry.mostAbundant = true;\n    }\n    stableIsotopesObject[isotope.nominal + element.symbol] = entry;\n  }\n}\n","import { elementsAndIsotopesObject as elements } from './elementsAndIsotopesObject';\n\nexport const isotopesObject = {};\nObject.keys(elements).forEach((key) => {\n  let e = elements[key];\n  e.isotopes.forEach((i) => {\n    isotopesObject[i.nominal + key] = {\n      abundance: i.abundance,\n      mass: i.mass,\n    };\n  });\n});\n","export const unsaturationsObject = {\n  O: 0,\n  N: 1,\n  H: -1,\n  Na: -1,\n  K: -1,\n  Li: -1,\n  Ca: -2,\n  C: 2,\n  F: -1,\n  Si: 2,\n  Cl: -1,\n  Br: -1,\n  I: -1,\n  S: 0,\n  P: 1,\n};\n","import { elementsObject } from 'chemical-elements';\n\nconst elements = Object.keys(elementsObject).sort(\n  (a, b) => b.length - a.length,\n);\n\n/**\n * Ensure that the mf has been entered with capital letters and not only lowercase\n * If there is only lowercase we try to capitalize the mf\n * @param {string} mf\n */\n\nexport function ensureCase(mf) {\n  for (let i = 0; i < mf.length; i++) {\n    if (mf.charCodeAt(i) > 64 && mf.charCodeAt(i) < 91) {\n      return mf;\n    }\n  }\n  let parts = mf.replace(/([a-z]*)([^a-z]*)/g, '$1 $2 ').split(/ +/);\n  for (let i = 0; i < parts.length; i++) {\n    if (parts[i].match(/^[a-z]$/)) {\n      parts[i] = parts[i].toUpperCase();\n    } else if (parts[i].match(/^[a-z]+$/)) {\n      let newPart = '';\n      for (let j = 0; j < parts[i].length; j++) {\n        let two = parts[i].substr(j, 2);\n        let one = parts[i].charAt(j).toUpperCase();\n        if (\n          ['c', 'h', 'o', 'n'].includes(two.charAt(0)) &&\n          ['h', 'o', 'n'].includes(two.charAt(1))\n        ) {\n          newPart += two.toUpperCase();\n          j++;\n        } else {\n          two = two.charAt(0).toUpperCase() + two.charAt(1);\n          if (elements.includes(two)) {\n            newPart += two;\n            j++;\n          } else if (elements.includes(one)) {\n            newPart += one;\n          } else {\n            return mf;\n          }\n        }\n      }\n      parts[i] = newPart;\n    }\n  }\n  return parts.join('');\n}\n","export const groups = [{\"symbol\":\"Abu\",\"name\":\"2-Aminobutyric acid diradical\",\"mf\":\"C4H7NO\",\"ocl\":{\"value\":\"dazHPBPOEgEInVZjcH@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGt\"},\"mass\":85.10463700109551,\"monoisotopicMass\":85.05276384961,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Acet\",\"name\":\"Acetyl\",\"mf\":\"C2H3O\",\"ocl\":{\"value\":\"gCaHDEeIi`@\",\"coordinates\":\"!BbOq~@Ha}\"},\"mass\":43.04469897995611,\"monoisotopicMass\":43.01838971626,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":2},{\"symbol\":\"H\",\"number\":3},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Acm\",\"name\":\"Acetamidomethyl\",\"mf\":\"C3H6NO\",\"ocl\":{\"value\":\"gGYHDPliJuS@@\",\"coordinates\":\"!BbOrH_Xc|_`BH_P\"},\"mass\":72.08596035030448,\"monoisotopicMass\":72.04493881738,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Adao\",\"name\":\"Adamantyloxy\",\"mf\":\"C10H15O\",\"ocl\":{\"value\":\"dc\\\\H`HAYRVeV^dUGZjjjj@@\",\"coordinates\":\"!B]BOXN`EP}CdB\\\\tbZ@Ijh~hRELdOBBp\"},\"mass\":151.2258752025074,\"monoisotopicMass\":151.11229010302,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Aib\",\"name\":\"alpha-Aminoisobutyric acid diradical\",\"mf\":\"C4H7NO\",\"ocl\":{\"value\":\"dazHPBPOGgEInfZj@@\",\"coordinates\":\"!Bb@I~@Ha}b@K|uwwWbGt\"},\"mass\":85.10463700109551,\"monoisotopicMass\":85.05276384961,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Ala\",\"name\":\"Alanine diradical\",\"mf\":\"C3H5NO\",\"kind\":\"aa\",\"oneLetter\":\"A\",\"alternativeOneLetter\":\"α\",\"ocl\":{\"value\":\"gNyDBaxmqR[fZjZ@\",\"coordinates\":\"!BbOr~@H`}bOr~Wxb}\"},\"mass\":71.07801959624871,\"monoisotopicMass\":71.03711378515,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Arg\",\"name\":\"Arginine diradical\",\"mf\":\"C6H12N4O\",\"kind\":\"aa\",\"oneLetter\":\"R\",\"alternativeOneLetter\":\"ρ\",\"ocl\":{\"value\":\"dkLhPBgSPOEgEInWUijjihr@@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHHa}b@I~@Ha}\"},\"mass\":156.18592219918227,\"monoisotopicMass\":156.10111102405,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":4},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Argp\",\"name\":\"Arginine triradical\",\"mf\":\"C6H11N4O\",\"ocl\":{\"value\":\"dglhpHpil@gWDEI[UYZfjji`T@\",\"coordinates\":\"!BbGvHGx@bGvH@ha}bOrH_Wxb@KW_Wx@bGt\"},\"mass\":155.1779814451265,\"monoisotopicMass\":155.09328599182,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":4},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Asn\",\"name\":\"Asparagine diradical\",\"mf\":\"C4H6N2O2\",\"kind\":\"aa\",\"oneLetter\":\"N\",\"alternativeOneLetter\":\"η\",\"ocl\":{\"value\":\"deeDPBeACqYqR[ezZjZL`@\",\"coordinates\":\"!BbGu~Ox`B_`BH_X`Bb@I~@Ha}\"},\"mass\":114.10280438280381,\"monoisotopicMass\":114.04292744137999,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Asnp\",\"name\":\"Asparagine triradical\",\"mf\":\"C4H5N2O2\",\"ocl\":{\"value\":\"dmUDpH[E@IEqgqRVvVijjXi@@\",\"coordinates\":\"!Bb@JH_Wxb@JH_Wxb@KW_Wx@bGt\"},\"mass\":113.09486362874803,\"monoisotopicMass\":113.03510240915,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Asp\",\"name\":\"Aspartic acid diradical\",\"mf\":\"C4H5NO3\",\"kind\":\"aa\",\"oneLetter\":\"D\",\"alternativeOneLetter\":\"δ\",\"ocl\":{\"value\":\"defLPBPYCqYqR[ezZjZL`@\",\"coordinates\":\"!BbGu~Ox`B_`BH_X`Bb@I~@Ha}\"},\"mass\":115.08756534162052,\"monoisotopicMass\":115.02694302429,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Aspp\",\"name\":\"Aspartic acid triradical\",\"mf\":\"C4H4NO3\",\"ocl\":{\"value\":\"dmVLpFcE@IEqgqRVvVijjXi@@\",\"coordinates\":\"!Bb@JH_Wxb@JH_Wxb@KW_Wx@bGt\"},\"mass\":114.07962458756472,\"monoisotopicMass\":114.01911799206,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":4},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Asu\",\"name\":\"alpha-Aminosuberic acid diradical\",\"mf\":\"C8H13NO3\",\"ocl\":{\"value\":\"dgnLPBP{CqYqR[euVfjjihr@@\",\"coordinates\":\"!BbGu~Ox`B_`BH_Xc|bOrH_X`BbGvHGx@bGt\"},\"mass\":171.19403496100773,\"monoisotopicMass\":171.08954328213002,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Asup\",\"name\":\"alpha-Aminosuberic acid triradical\",\"mf\":\"C8H12NO3\",\"ocl\":{\"value\":\"do^LpEcG@IMqoqRVuUejZjjibT@\",\"coordinates\":\"!BbOrH_Wxb@JH_Xc|bGvHHa}_c~H@m]}_`BH_P\"},\"mass\":170.18609420695194,\"monoisotopicMass\":170.0817182499,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Boc\",\"name\":\"t-Butoxycarbonyl\",\"mf\":\"C5H9O2\",\"ocl\":{\"value\":\"daxD`DpEeImjZj@@\",\"coordinates\":\"!B|Ou~_A||Ow}mC}_O@\"},\"mass\":101.12395611881479,\"monoisotopicMass\":101.06025452921,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Bom\",\"name\":\"Benzyloxymethyl\",\"mf\":\"C8H9O\",\"ocl\":{\"value\":\"deTH`DAYRUYTYj`@@@\",\"coordinates\":\"!B|Gsp__A||Owp_Gy|Gwp_Wy\"},\"mass\":121.15675888470227,\"monoisotopicMass\":121.06533990964,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Brz\",\"name\":\"2-Bromobenzyloxycarbonyl\",\"mf\":\"C8H6BrO2\",\"ocl\":{\"value\":\"dcLDPDpEd\\\\QImYgWYjB@@@\",\"coordinates\":\"!Bb@I~@Hb}b@JH_X`B_c}~@Hb}bGu~Op\"},\"mass\":214.03586932736317,\"monoisotopicMass\":212.95511703252,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"Br\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Bu\",\"name\":\"Butyl\",\"mf\":\"C4H9\",\"ocl\":{\"value\":\"gJPH@liJuP@\",\"coordinates\":\"!B@Fp@XpAl@FL\"},\"mass\":57.114410373442986,\"monoisotopicMass\":57.07042529007,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":9}]},{\"symbol\":\"Bum\",\"name\":\"t-Butoxymethyl\",\"mf\":\"C5H11O\",\"ocl\":{\"value\":\"gNqHDEeIVjj`@\",\"coordinates\":\"!B@FL@[@AcXs|@Xvp@\"},\"mass\":87.14043270260808,\"monoisotopicMass\":87.08098997409999,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Bz\",\"name\":\"Benzoyl\",\"mf\":\"C7H5O\",\"ocl\":{\"value\":\"didH`DAYR[e^FX@@@@\",\"coordinates\":\"!BbOq~@Ha}b@I~Oxa}bGu~Op\"},\"mass\":105.1142599717439,\"monoisotopicMass\":105.03403978072,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Bzl\",\"name\":\"Benzyl\",\"mf\":\"C7H7\",\"ocl\":{\"value\":\"daD@`@VTeeVz`@@@\",\"coordinates\":\"!B|Gsp_A|_gp_A}_g|\"},\"mass\":91.13073655553718,\"monoisotopicMass\":91.05477522561,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":7}]},{\"symbol\":\"Bn\",\"name\":\"Benzyl\",\"mf\":\"C7H7\",\"ocl\":{\"value\":\"daD@`@VTeeVz`@@@\",\"coordinates\":\"!B|Gsp_A|_gp_A}_g|\"},\"mass\":91.13073655553718,\"monoisotopicMass\":91.05477522561,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":7}]},{\"symbol\":\"Bzlo\",\"name\":\"Benzyloxy\",\"mf\":\"C7H7O\",\"ocl\":{\"value\":\"didH`HAYRUe^Fh@@@@\",\"coordinates\":\"!B|Gwp_OC}|Gq~_A}|Gu~_p\"},\"mass\":107.13014147985547,\"monoisotopicMass\":107.04968984518,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Cha\",\"name\":\"beta-Cyclohexylalanine diradical\",\"mf\":\"C9H15NO\",\"ocl\":{\"value\":\"dknHPBPOEgEInWe]NZjjjcH@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvH@gxbGvH_Wx\"},\"mass\":153.22184251721796,\"monoisotopicMass\":153.11536410745,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Chxo\",\"name\":\"Cyclohexyloxy\",\"mf\":\"C6H11O\",\"ocl\":{\"value\":\"daDH`HAYRVU[jjj@@\",\"coordinates\":\"!B|Gsp_A|_gp_A}_g|\"},\"mass\":99.15116859934332,\"monoisotopicMass\":99.08098997409999,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Cit\",\"name\":\"Citrulline diradical\",\"mf\":\"C6H11N3O2\",\"ocl\":{\"value\":\"dkODPBdttOEgEInWUijjihr@@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHHa}b@I~@Ha}\"},\"mass\":157.170683157999,\"monoisotopicMass\":157.08512660696,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Citp\",\"name\":\"Citrulline triradical\",\"mf\":\"C6H10N3O2\",\"ocl\":{\"value\":\"dgoDpHJ\\\\l@gWDEI[UYZfjji`T@\",\"coordinates\":\"!BbGvHGx@bGvH@ha}bOrH_Wxb@KW_Wx@bGt\"},\"mass\":156.16274240394318,\"monoisotopicMass\":156.07730157473,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":10},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Clz\",\"name\":\"2-Chlorobenzyloxycarbonyl\",\"mf\":\"C8H6ClO2\",\"ocl\":{\"value\":\"dcLDPDpEdXaImYgWYjB@@@\",\"coordinates\":\"!Bb@I~@Hb}b@JH_X`B_c}~@Hb}bGu~Op\"},\"mass\":169.58527912946118,\"monoisotopicMass\":169.00563211451998,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"Cl\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Cp\",\"name\":\"Cyclopentadienyl\",\"mf\":\"C5H5\",\"ocl\":{\"value\":\"gFpH@liLimRp@\",\"coordinates\":\"!B\\\\OtPThyEGl@fP\"},\"mass\":65.09338325395512,\"monoisotopicMass\":65.03912516115,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":5}]},{\"symbol\":\"Cys\",\"name\":\"Cysteine diradical\",\"mf\":\"C3H5NOS\",\"kind\":\"aa\",\"oneLetter\":\"C\",\"alternativeOneLetter\":\"ς\",\"ocl\":{\"value\":\"dazHpBPOEgG`aInVZjcH@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGt\"},\"mass\":103.14280700237578,\"monoisotopicMass\":103.00918495955,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Cysp\",\"name\":\"Cysteine triradical\",\"mf\":\"C3H4NOS\",\"ocl\":{\"value\":\"diFHHBD@f@agGoEIVVjjfLP@\",\"coordinates\":\"!BbGvHHa}_c~HM]}_`BH_P\"},\"mass\":102.13486624831998,\"monoisotopicMass\":102.00135992732,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":4},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"D\",\"name\":\"Deuterium\",\"mf\":\"[2H]\",\"ocl\":{\"value\":\"eFAAYhBLCEH@\",\"coordinates\":\"!B@BL\"},\"mass\":2.01410177812,\"monoisotopicMass\":2.01410177812,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"H\",\"number\":1,\"isotope\":2}]},{\"symbol\":\"Dde\",\"name\":\"Dde\",\"mf\":\"C10H13O2\",\"ocl\":{\"value\":\"dklD`FDEgHhihicIVZfZj@@\",\"coordinates\":\"!Bb@I~@Ha}upJH@m]}_`BH_Wx@b@I}bOrH\"},\"mass\":165.20939861871415,\"monoisotopicMass\":165.09155465812998,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Dnp\",\"name\":\"2,4-Dinitrophenyl\",\"mf\":\"C6H3N2O4\",\"ocl\":{\"value\":\"dkmB`bWatpVRd^VS{HhheEUFfBAbX@@\",\"coordinates\":\"!B_c~H_]]}b@I~Owx_`BH_]]}_c~H_]]}\"},\"mass\":167.09926376274353,\"monoisotopicMass\":167.00928158383,\"unsaturation\":11,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":3},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":4}]},{\"symbol\":\"Et\",\"name\":\"Ethyl\",\"mf\":\"C2H5\",\"ocl\":{\"value\":\"eMBAYRZ@\",\"coordinates\":\"!B@Fp@Xp\"},\"mass\":29.061175563749384,\"monoisotopicMass\":29.03912516115,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":2},{\"symbol\":\"H\",\"number\":5}]},{\"symbol\":\"Fmoc\",\"name\":\"Fluorenylmethoxycarbonyl\",\"mf\":\"C15H11O2\",\"ocl\":{\"value\":\"fde@b@DX@liMkLrjxeVCzLuT@@@P@@@\",\"coordinates\":\"!BbOq~@Ha}bOrH_]ARcm}Tv~i`pAeKv|@fpB[j[~iozfAKvp\"},\"mass\":223.24719659427882,\"monoisotopicMass\":223.07590459367,\"unsaturation\":19,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"For\",\"name\":\"Formyl\",\"mf\":\"CHO\",\"ocl\":{\"value\":\"eMJDVTfP@\",\"coordinates\":\"!B@Fp@Xp\"},\"mass\":29.018081575109303,\"monoisotopicMass\":29.0027396518,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":1},{\"symbol\":\"H\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Gln\",\"name\":\"Glutamine diradical\",\"mf\":\"C5H8N2O2\",\"kind\":\"aa\",\"oneLetter\":\"Q\",\"alternativeOneLetter\":\"ξ\",\"ocl\":{\"value\":\"dmUDPBUICqYqR[evfjihr@@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHGx@bGt\"},\"mass\":128.12942178765059,\"monoisotopicMass\":128.05857750584,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":8},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Glnp\",\"name\":\"Glutamine triradical\",\"mf\":\"C5H7N2O2\",\"ocl\":{\"value\":\"dcuDpH{MAYeqWqRVuejZjiad@\",\"coordinates\":\"!BbGvHGx@bGvH@ha}_c~HM]}_`BH_P\"},\"mass\":127.12148103359483,\"monoisotopicMass\":127.05075247361,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Glp\",\"name\":\"Pyroglutamine\",\"mf\":\"C5H5NO2\",\"ocl\":{\"value\":\"deVDPBRP|V\\\\TfygxYjjZL`@\",\"coordinates\":\"!Bb@I~@Ha}tEJNwr[@UMo@FXBN\"},\"mass\":111.09889631403748,\"monoisotopicMass\":111.03202840472,\"unsaturation\":6,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Glu\",\"name\":\"Glutamic acid diradical\",\"mf\":\"C5H7NO3\",\"kind\":\"aa\",\"oneLetter\":\"E\",\"alternativeOneLetter\":\"ε\",\"ocl\":{\"value\":\"dmVLPBRUCqYqR[evfjihr@@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHGx@bGt\"},\"mass\":129.11418274646732,\"monoisotopicMass\":129.04259308875,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Glup\",\"name\":\"Glutamic acid triradical\",\"mf\":\"C5H6NO3\",\"ocl\":{\"value\":\"dcvLpNcM@IeqWqRVuejZjiad@\",\"coordinates\":\"!BbGvHGx@bGvH@ha}_c~HM]}_`BH_P\"},\"mass\":128.10624199241153,\"monoisotopicMass\":128.03476805652002,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Gly\",\"name\":\"Glycine diradical\",\"mf\":\"C2H3NO\",\"kind\":\"aa\",\"oneLetter\":\"G\",\"alternativeOneLetter\":\"γ\",\"ocl\":{\"value\":\"gGYDBaxuqR[Yj@@\",\"coordinates\":\"!BbOq~@Ha}bOrH_P\"},\"mass\":57.051402191401905,\"monoisotopicMass\":57.021463720689994,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":2},{\"symbol\":\"H\",\"number\":3},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Hci\",\"name\":\"Homocitrulline diradical\",\"mf\":\"C7H13N3O2\",\"ocl\":{\"value\":\"dgoDPBVtLOEgEInWUZZjjfcH@\",\"coordinates\":\"!BbGu~Ox`B_`BH_Xc|bOrH_X`BbGvHGx@bGt\"},\"mass\":171.19730056284578,\"monoisotopicMass\":171.10077667142,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Hcip\",\"name\":\"Homocitrulline triradical\",\"mf\":\"C7H12N3O2\",\"ocl\":{\"value\":\"do_DpHI\\\\\\\\EdwFEI[UVVijjjfIP@\",\"coordinates\":\"!BbOrH_Wxb@JH_Xc|bGvHHa}_c~H@m]}_`BH_P\"},\"mass\":170.18935980879002,\"monoisotopicMass\":170.09295163918998,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"His\",\"name\":\"Histidine diradical\",\"mf\":\"C6H7N3O\",\"kind\":\"aa\",\"oneLetter\":\"H\",\"alternativeOneLetter\":\"ζ\",\"ocl\":{\"value\":\"dcOHPBGTCqYqR[eyUvZjejL`@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGwPTh{_UMo@FP\"},\"mass\":137.13951521745759,\"monoisotopicMass\":137.05891185847,\"unsaturation\":8,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Hisp\",\"name\":\"Histidine triradical\",\"mf\":\"C6H6N3O\",\"ocl\":{\"value\":\"dkoHpHHSAYUqwqRY]YXjjVjihy@@\",\"coordinates\":\"!BTmA}bL@fUHRN`H`BbGu~Ox`Buwu~@Ha}\"},\"mass\":136.13157446340182,\"monoisotopicMass\":136.05108682624,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Hser\",\"name\":\"Homoserine diradical\",\"mf\":\"C4H7NO2\",\"ocl\":{\"value\":\"diFDPBPP|V\\\\Tfy^Zjhr@@\",\"coordinates\":\"!BbGu~Ox`B_`BH_X`Bb@JH_P\"},\"mass\":101.10404192541378,\"monoisotopicMass\":101.04767846918,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Hserp\",\"name\":\"Homoserine triradical\",\"mf\":\"C4H6NO2\",\"ocl\":{\"value\":\"defDpJbPV^\\\\Q|TeVVjji`d@\",\"coordinates\":\"!Bb@JH_X`BbGu~Oxc|uwu~@Ha}\"},\"mass\":100.09610117135801,\"monoisotopicMass\":100.03985343695001,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Hyp\",\"name\":\"Hydroxyproline diradical\",\"mf\":\"C5H7NO2\",\"ocl\":{\"value\":\"deVDPBRP|V\\\\\\\\bfbbOCMUUIdE@@\",\"coordinates\":\"!Bb@I~@Ha}tEJNwr[@UMo@FUJO\"},\"mass\":113.11477782214904,\"monoisotopicMass\":113.04767846918,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Hypp\",\"name\":\"Hydroxyproline triradical\",\"mf\":\"C5H6NO2\",\"ocl\":{\"value\":\"dmvDpJaPB^\\\\Y|TeeWjZjjidRL`@\",\"coordinates\":\"!BBOpH_UARcc}TNtBY@HyRSpCQDr\\\\\"},\"mass\":112.10683706809326,\"monoisotopicMass\":112.03985343695001,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Ile\",\"name\":\"Isoleucine diradical\",\"mf\":\"C6H11NO\",\"kind\":\"aa\",\"oneLetter\":\"I\",\"alternativeOneLetter\":\"ι\",\"ocl\":{\"value\":\"defHPBPOEgEInVyjjdrT`@\",\"coordinates\":\"!BbGu~Oxc|_`BH_Xc|b@I~Oxa}\"},\"mass\":113.15787181078912,\"monoisotopicMass\":113.08406397853,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Ivdde\",\"name\":\"1-[4,4-dimethyl-2,6-dioxocyclohexylidene)-3-methylbutyl\",\"mf\":\"C13H19O2\",\"ocl\":{\"value\":\"f`a@b@NR@lyEEDhhigEVfjYjj`@@\",\"coordinates\":\"!BbOq~@Ha}urHGxuwu~@Ha}_`CW_Xa}bOq}b@JH\"},\"mass\":207.28925083325453,\"monoisotopicMass\":207.13850485151,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":19},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Leu\",\"name\":\"Leucine diradical\",\"mf\":\"C6H11NO\",\"kind\":\"aa\",\"oneLetter\":\"L\",\"alternativeOneLetter\":\"λ\",\"ocl\":{\"value\":\"defHPBPOEgEInWijjhr@@\",\"coordinates\":\"!BbGu~Ox`B_`BH_X`Bb@I~@Ha}\"},\"mass\":113.15787181078912,\"monoisotopicMass\":113.08406397853,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Lys\",\"name\":\"Lysine diradical\",\"mf\":\"C6H12N2O\",\"kind\":\"aa\",\"oneLetter\":\"K\",\"alternativeOneLetter\":\"κ\",\"ocl\":{\"value\":\"dmUHPBU@|V\\\\Tfy]YjjjL`@\",\"coordinates\":\"!BbGu~Ox`B_`BHoX`Bb@JH_X`BbKt\"},\"mass\":128.17251577629068,\"monoisotopicMass\":128.09496301519,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Lysp\",\"name\":\"Lysine triradical\",\"mf\":\"C6H11N2O\",\"ocl\":{\"value\":\"dcuHpH{PVY\\\\U|TeUYZjjjXY@@\",\"coordinates\":\"!Bb@JH_X`BbGvH@ha}_c~H@m]}_`BH_P\"},\"mass\":127.16457502223491,\"monoisotopicMass\":127.08713798295999,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Mbh\",\"name\":\"4,4'-Dimethoxybenzhydryl\",\"mf\":\"C15H15O2\",\"ocl\":{\"value\":\"fdy@b@G^@liLsJkzlcZmT@@@UP@@@\",\"coordinates\":\"!BbGvHGx_`BH_Xa}uwvHHc|_c}~Oxa}uwvHGxbGwW_P\"},\"mass\":227.27895961050194,\"monoisotopicMass\":227.10720472258998,\"unsaturation\":15,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Me\",\"name\":\"Methyl\",\"mf\":\"CH3\",\"ocl\":{\"value\":\"eFBAYc@@\",\"coordinates\":\"!B@FL\"},\"mass\":15.03455815890258,\"monoisotopicMass\":15.02347509669,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":1},{\"symbol\":\"H\",\"number\":3}]},{\"symbol\":\"Mebzl\",\"name\":\"4-Methylbenzyl\",\"mf\":\"C8H9\",\"ocl\":{\"value\":\"did@`@VTee]nh@H@@\",\"coordinates\":\"!B|Gsp__A|_gp_C}_gp_P\"},\"mass\":105.15735396038399,\"monoisotopicMass\":105.07042529007,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":9}]},{\"symbol\":\"Meobzl\",\"name\":\"4-Methoxybenzyl\",\"mf\":\"C8H9O\",\"ocl\":{\"value\":\"deTH`AAYRVUunh@J@@\",\"coordinates\":\"!B|Gsp__A|_gp_A}_gp_Wy\"},\"mass\":121.15675888470227,\"monoisotopicMass\":121.06533990964,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Met\",\"name\":\"Methionine diradical\",\"mf\":\"C5H9NOS\",\"kind\":\"aa\",\"oneLetter\":\"M\",\"alternativeOneLetter\":\"μ\",\"ocl\":{\"value\":\"defHpBPOEgDPaInWYjjhr@@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHHa}\"},\"mass\":131.19604181206938,\"monoisotopicMass\":131.04048508847,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mmt\",\"name\":\"4-Methoxytrityl\",\"mf\":\"C20H17O\",\"ocl\":{\"value\":\"ffcAB@B`V\\\\bdTTTRRRVvIhnRGMT@@@@AP@@@\",\"coordinates\":\"!BbKvHM^}_c}~@Hb}dXWHb}j|nHHc|AqOWoWxJV^Ho]\\\\BuwvHHb}\"},\"mass\":273.3491156779715,\"monoisotopicMass\":273.12794016748,\"unsaturation\":23,\"elements\":[{\"symbol\":\"C\",\"number\":20},{\"symbol\":\"H\",\"number\":17},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Mtc\",\"name\":\"2,2,5,7,8-pentamethylchroman-6-sulphonyl\",\"mf\":\"C14H19O3S\",\"ocl\":{\"value\":\"fleAa@DX\\\\AY`DYEHXhhilmiKW`rpDQUUD@@\",\"coordinates\":\"!BbGtBbGwWbGvHGxbGu~@Ha}uwu~Ox`B_c~H_Xa}b@H@_osW\"},\"mass\":267.36417906043516,\"monoisotopicMass\":267.10549064548,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":14},{\"symbol\":\"H\",\"number\":19},{\"symbol\":\"O\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mtr\",\"name\":\"4-Methoxy-2,3,6-trimethylbenzenesulphonyl\",\"mf\":\"C10H13O3S\",\"ocl\":{\"value\":\"do|LPDrpVXBLbdLTTTngYXBHj@@\",\"coordinates\":\"!BbOq}b@KWb@I~@Ha}bOsWHc|_c~H_Wx@b@JH_P\"},\"mass\":213.27359094915948,\"monoisotopicMass\":213.05854045209998,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"O\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mts\",\"name\":\"Mesitylene-2-sulphonyl\",\"mf\":\"C9H11O2S\",\"ocl\":{\"value\":\"d@\"},\"mass\":183.24756861999438,\"monoisotopicMass\":183.04797576807,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"O\",\"number\":2},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mtt\",\"name\":\"4-Methyltrityl\",\"mf\":\"C20H17\",\"ocl\":{\"value\":\"d@\"},\"mass\":257.3497107536532,\"monoisotopicMass\":257.13302554791,\"unsaturation\":23,\"elements\":[{\"symbol\":\"C\",\"number\":20},{\"symbol\":\"H\",\"number\":17}]},{\"symbol\":\"Nle\",\"name\":\"Norleucine diradical\",\"mf\":\"C6H11NO\",\"ocl\":{\"value\":\"defHPBPOEgEInWYjjhr@@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHHa}\"},\"mass\":113.15787181078912,\"monoisotopicMass\":113.08406397853,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Npys\",\"name\":\"3-Nitro-2-pyridinesulphenyl\",\"mf\":\"C5H3N2O2S\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":155.1545054234988,\"monoisotopicMass\":154.99152351908998,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":3},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":2},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Nva\",\"name\":\"Norvaline diradical\",\"mf\":\"C5H9NO\",\"ocl\":{\"value\":\"diFHPBPOEgEInWfjjL`@\",\"coordinates\":\"!BbGu~Ox`B_`BH_X`Bb@JH_P\"},\"mass\":99.13125440594231,\"monoisotopicMass\":99.06841391407,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Odmab\",\"name\":\"Odmab\",\"mf\":\"C20H26NO3\",\"ocl\":{\"value\":\"d@\"},\"mass\":328.4260955245558,\"monoisotopicMass\":328.19126870111995,\"unsaturation\":15,\"elements\":[{\"symbol\":\"C\",\"number\":20},{\"symbol\":\"H\",\"number\":26},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Orn\",\"name\":\"Ornithine diradical\",\"mf\":\"C5H10N2O\",\"ocl\":{\"value\":\"deeHPBe@|V\\\\Tfy]fjjcH@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvHHa}\"},\"mass\":114.14589837144388,\"monoisotopicMass\":114.07931295072999,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":10},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Ornp\",\"name\":\"Ornithine triradical\",\"mf\":\"C5H9N2O\",\"ocl\":{\"value\":\"dmUHpHYPBQ\\\\Y|TeUejjjfJP@\",\"coordinates\":\"!BbGvHHa}b@JH_Wxb@KW_Wx@bGt\"},\"mass\":113.13795761738811,\"monoisotopicMass\":113.0714879185,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Pbf\",\"name\":\"2,2,4,6,7-pentamethyldihydrobenzofurane-5-sulfonyl\",\"mf\":\"C13H17O3S\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":253.33756165558833,\"monoisotopicMass\":253.08984058101998,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":17},{\"symbol\":\"O\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Pen\",\"name\":\"Penicillamine diradical\",\"mf\":\"C5H9NOS\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":131.19604181206938,\"monoisotopicMass\":131.04048508847,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Penp\",\"name\":\"Penicillamine triradical\",\"mf\":\"C5H8NOS\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":130.1881010580136,\"monoisotopicMass\":130.03266005624,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":8},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Ph\",\"name\":\"Phenyl\",\"mf\":\"C6H5\",\"ocl\":{\"value\":\"gOpH@liLkW@@@@\",\"coordinates\":\"!B|Owp_Gy|OwpWy\"},\"mass\":77.10411915069038,\"monoisotopicMass\":77.03912516115,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":5}]},{\"symbol\":\"Phe\",\"name\":\"Phenylalanine diradical\",\"mf\":\"C9H9NO\",\"kind\":\"aa\",\"oneLetter\":\"F\",\"alternativeOneLetter\":\"φ\",\"ocl\":{\"value\":\"dknHPBPOEgEInWe]NZj@@cH@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGvH@gxbGvH_Wx\"},\"mass\":147.1741979928833,\"monoisotopicMass\":147.06841391407002,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Phepcl\",\"name\":\"4-Chlorophenylalanine diradical\",\"mf\":\"C9H8ClNO\",\"ocl\":{\"value\":\"dg^HpBPOEgFxaInWe_Sfj`@bL`@\",\"coordinates\":\"!BbOq~@Ha}_c~H@m]}bGvH@gxbGvH_WxbGt\"},\"mass\":181.6191948214355,\"monoisotopicMass\":181.02944156384,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":8},{\"symbol\":\"Cl\",\"number\":1},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Pmc\",\"name\":\"2,2,5,7,8-Pentamethylchroman-6-sulphonyl\",\"mf\":\"C14H19O3S\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":267.36417906043516,\"monoisotopicMass\":267.10549064548,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":14},{\"symbol\":\"H\",\"number\":19},{\"symbol\":\"O\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Pro\",\"name\":\"Proline diradical\",\"mf\":\"C5H7NO\",\"kind\":\"aa\",\"oneLetter\":\"P\",\"alternativeOneLetter\":\"π\",\"ocl\":{\"value\":\"difHPBPOEgEInYxYjjhr@@\",\"coordinates\":\"!Bb@I~@Ha}tEJNwr[@UMo@FP\"},\"mass\":97.11537289783075,\"monoisotopicMass\":97.05276384961,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Pyr\",\"name\":\"Pyroglutamine\",\"mf\":\"C5H5NO2\",\"ocl\":{\"value\":\"deVDPBRP|V\\\\TfygxYjjZL`@\",\"coordinates\":\"!Bb@I~@Ha}tEJNwr[@UMo@FXBN\"},\"mass\":111.09889631403748,\"monoisotopicMass\":111.03202840472,\"unsaturation\":6,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Sar\",\"name\":\"Sarcosine diradical\",\"mf\":\"C3H5NO\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":71.07801959624871,\"monoisotopicMass\":71.03711378515,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Ser\",\"name\":\"Serine diradical\",\"mf\":\"C3H5NO2\",\"kind\":\"aa\",\"oneLetter\":\"S\",\"alternativeOneLetter\":\"σ\",\"ocl\":{\"value\":\"dazDPBS`|V\\\\TfyYjjL`@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}bGt\"},\"mass\":87.07742452056698,\"monoisotopicMass\":87.03202840472,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Serp\",\"name\":\"Serine triradical\",\"mf\":\"C3H4NO2\",\"ocl\":{\"value\":\"diFDpB`PBV\\\\^|TeYZjjXq@@\",\"coordinates\":\"!BbGvHHa}_c~HM]}_`BH_P\"},\"mass\":86.06948376651121,\"monoisotopicMass\":86.02420337249,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":4},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Sta\",\"name\":\"Statine diradical\",\"mf\":\"C8H15NO2\",\"ocl\":{\"value\":\"d@\"},\"mass\":157.210511544801,\"monoisotopicMass\":157.11027872702002,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Stap\",\"name\":\"Statine triradical\",\"mf\":\"C8H14NO2\",\"ocl\":{\"value\":\"d@\"},\"mass\":156.2025707907452,\"monoisotopicMass\":156.10245369479,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Tacm\",\"name\":\"Trimethylacetamidomethyl\",\"mf\":\"C6H12NO\",\"ocl\":{\"value\":\"d@\"},\"mass\":114.16581256484488,\"monoisotopicMass\":114.09188901076,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Tbdms\",\"name\":\"t-Butyldimethylsilyl\",\"mf\":\"C6H15Si\",\"ocl\":{\"value\":\"d@\"},\"mass\":115.2690253969541,\"monoisotopicMass\":115.09430201810001,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"Si\",\"number\":1}]},{\"symbol\":\"Tbu\",\"name\":\"t-Butyl\",\"mf\":\"C4H9\",\"ocl\":{\"value\":\"d@\"},\"mass\":57.114410373442986,\"monoisotopicMass\":57.07042529007,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":9}]},{\"symbol\":\"Tbuo\",\"name\":\"t-Butoxy\",\"mf\":\"C4H9O\",\"ocl\":{\"value\":\"d@\"},\"mass\":73.11381529776126,\"monoisotopicMass\":73.06533990964,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Tbuthio\",\"name\":\"t-Butylthio\",\"mf\":\"C4H9S\",\"ocl\":{\"value\":\"d@\"},\"mass\":89.17919777957005,\"monoisotopicMass\":89.04249646446999,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Tfa\",\"name\":\"Trifluoroacetyl\",\"mf\":\"C2F3O\",\"ocl\":{\"value\":\"d@\"},\"mass\":97.01608620597878,\"monoisotopicMass\":96.99012410776,\"unsaturation\":1,\"elements\":[{\"symbol\":\"C\",\"number\":2},{\"symbol\":\"F\",\"number\":3},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Thr\",\"name\":\"Threonine diradical\",\"mf\":\"C4H7NO2\",\"kind\":\"aa\",\"oneLetter\":\"T\",\"alternativeOneLetter\":\"τ\",\"ocl\":{\"value\":\"d@\"},\"mass\":101.10404192541378,\"monoisotopicMass\":101.04767846918,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Thrp\",\"name\":\"Threonine triradical\",\"mf\":\"C4H6NO2\",\"ocl\":{\"value\":\"d@\"},\"mass\":100.09610117135801,\"monoisotopicMass\":100.03985343695001,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":4},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Tfsi\",\"name\":\"(Bis)(trifluoromethanesulfonyl)imide\",\"mf\":\"C2F6NO4S2\",\"ocl\":{\"value\":\"d@\"},\"mass\":280.1457884908235,\"monoisotopicMass\":279.91729380789,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":2},{\"symbol\":\"F\",\"number\":6},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":4},{\"symbol\":\"S\",\"number\":2}]},{\"symbol\":\"Tips\",\"name\":\"Triisopropylsilyl\",\"mf\":\"C9H21Si\",\"ocl\":{\"value\":\"dmT@P@VX\\\\DffYjjjh@@\",\"coordinates\":\"!B_a@gHb\\\\]FBIuWxP^zi~KwxPFAt\"},\"mass\":157.34887761149452,\"monoisotopicMass\":157.14125221148,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":21},{\"symbol\":\"Si\",\"number\":1}]},{\"symbol\":\"Tms\",\"name\":\"Trimethylsilyl\",\"mf\":\"C3H9Si\",\"ocl\":{\"value\":\"gJPD@lqpRZj`@\",\"coordinates\":\"!BbOq~@GxbGt\"},\"mass\":73.1891731824137,\"monoisotopicMass\":73.04735182472,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"C\",\"number\":3},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"Si\",\"number\":1}]},{\"symbol\":\"Tos\",\"name\":\"Tosyl\",\"mf\":\"C7H7O2S\",\"ocl\":{\"value\":\"dmtDPDpEf@cHiCDeafV@B@@\",\"coordinates\":\"!B|Ou||Ovw|Gwp_Gy|GwpWy|Gt\"},\"mass\":155.1943338103008,\"monoisotopicMass\":155.01667563914998,\"unsaturation\":7,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"O\",\"number\":2},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Trp\",\"name\":\"Tryptophan diradical\",\"mf\":\"C11H10N2O\",\"kind\":\"aa\",\"oneLetter\":\"W\",\"alternativeOneLetter\":\"ω\",\"ocl\":{\"value\":\"f`qQA@BFPCqXxiMr|rnhsoSUTa@QCD@@\",\"coordinates\":\"!BbOq~@Ha}_c~H@m]}bGwPTh{_UMojXL@YpB[@Ini`\"},\"mass\":186.21031375185538,\"monoisotopicMass\":186.07931295073,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":10},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Trpp\",\"name\":\"Tryptophan triradical\",\"mf\":\"C11H9N2O\",\"ocl\":{\"value\":\"fhiQC@HFB@I\\\\x~|TfYU_ebLDjhDHjibFd@\",\"coordinates\":\"!BTmA}bL@fUHR_Ihz@iVBeXHc|grZH_WxbOsW_Wx@bGt\"},\"mass\":185.20237299779959,\"monoisotopicMass\":185.07148791850003,\"unsaturation\":15,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Trt\",\"name\":\"Trityl\",\"mf\":\"C19H15\",\"ocl\":{\"value\":\"fbm@B@@KJSSLrjkyhnRGMT@@@@@@@@\",\"coordinates\":\"!BrHI~PGy_rMvW@l`BQCvWw\\\\bBAg}~PGy@]i}~W|c]cNwH`i_]_e|\"},\"mass\":243.32309334880637,\"monoisotopicMass\":243.11737548345,\"unsaturation\":23,\"elements\":[{\"symbol\":\"C\",\"number\":19},{\"symbol\":\"H\",\"number\":15}]},{\"symbol\":\"Tyr\",\"name\":\"Tyrosine diradical\",\"mf\":\"C9H9NO2\",\"kind\":\"aa\",\"oneLetter\":\"Y\",\"alternativeOneLetter\":\"ψ\",\"ocl\":{\"value\":\"dg^DPBRp|V\\\\Tfy^U}NZj@BHr@@\",\"coordinates\":\"!BbOq~@Ha}_c~H@m]}bGvH@gxbGvH_WxbGt\"},\"mass\":163.1736029172016,\"monoisotopicMass\":163.06332853364,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Tyrp\",\"name\":\"Tyrosine triradical\",\"mf\":\"C9H8NO2\",\"ocl\":{\"value\":\"do~DpEapBS\\\\[|Tee]YYnh@JjdbT@\",\"coordinates\":\"!B_`BHGx@bGvH@h`BbKvH@ha}_c~H@m]}_`BHoP\"},\"mass\":162.16566216314578,\"monoisotopicMass\":162.05550350141,\"unsaturation\":11,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":8},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Val\",\"name\":\"Valine\",\"mf\":\"C5H9NO\",\"kind\":\"aa\",\"oneLetter\":\"V\",\"alternativeOneLetter\":\"ν\",\"ocl\":{\"value\":\"diFHPBPOEgEInVfjjL`@\",\"coordinates\":\"!Bb@I~@Ha}_c~H@m]}_`BH_P\"},\"mass\":99.13125440594231,\"monoisotopicMass\":99.06841391407,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Valoh\",\"name\":\"beta-Hydroxyvaline diradical\",\"mf\":\"C5H9NO2\",\"ocl\":{\"value\":\"defDPBS`|V\\\\TfyZfjjcH@\",\"coordinates\":\"!Bb@I~@Ha}b@I~Oxa}Owy~OpA~\"},\"mass\":115.13065933026058,\"monoisotopicMass\":115.06332853364,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Valohp\",\"name\":\"beta-Hydroxyvaline triradical\",\"mf\":\"C5H8NO2\",\"ocl\":{\"value\":\"dmVDpFaPBQ\\\\Y|\\\\bTbaTjjjXq@@\",\"coordinates\":\"!BbGvHHa}_Xc|bGxb@KW_Wx@bGt\"},\"mass\":114.1227185762048,\"monoisotopicMass\":114.05550350141002,\"unsaturation\":3,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":8},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Xan\",\"name\":\"Xanthyl\",\"mf\":\"C13H9O\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":181.21043836837848,\"monoisotopicMass\":181.06533990964002,\"unsaturation\":17,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Xle\",\"name\":\"Leucine or Isoleucine diradical\",\"mf\":\"C6H11NO\",\"kind\":\"aa\",\"oneLetter\":\"J\",\"mass\":113.15787181078912,\"monoisotopicMass\":113.08406397853,\"unsaturation\":2,\"elements\":[{\"symbol\":\"C\",\"number\":6},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Z\",\"name\":\"Benzyloxycarbonyl\",\"mf\":\"C8H7O2\",\"ocl\":{\"value\":\"dmtD`DpEeImYVUfh@@@@\",\"coordinates\":\"!Bb@I~@Ha}b@JH_Xc|_c~H_Xa}_c|\"},\"mass\":135.14028230090898,\"monoisotopicMass\":135.04460446475,\"unsaturation\":9,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Damp\",\"name\":\"Desoxyadenosine monophosphate diradical\",\"mf\":\"C10H12N5O5P\",\"kind\":\"DNAp\",\"oneLetter\":\"A\",\"alternativeOneLetter\":\"α\",\"ocl\":{\"value\":\"fnsiS@IASUlJB]xGbkplxyDhhldhiEEUeSdTekUUUULBATXPlKd@@\",\"coordinates\":\"!Bqc}{JxyO|XoSWC}W]poGQ\\\\Ou}]rmx\\\\Ou}]{qpza|qb}MJwlk^sFO|X\"},\"mass\":313.2069506932622,\"monoisotopicMass\":313.05760550518,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":5},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dcmp\",\"name\":\"Desoxycytidine monophosphate diradical\",\"mf\":\"C9H12N3O6P\",\"kind\":\"DNAp\",\"oneLetter\":\"C\",\"alternativeOneLetter\":\"ς\",\"ocl\":{\"value\":\"fjmps@IQKB`g^BCqUxV\\\\\\\\bTTVRTTbb^iqNZjjjifVkBEa\\\\`@\",\"coordinates\":\"!Bqc}{JxyO|XoSWA}_W]poGQ\\\\GuMKuMh\\\\Gu}]{qpSF]tWQTvatP\"},\"mass\":289.18221329795364,\"monoisotopicMass\":289.04637211589,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dgmp\",\"name\":\"Desoxyguanosine monophosphate diradical\",\"mf\":\"C10H12N5O6P\",\"kind\":\"DNAp\",\"oneLetter\":\"G\",\"alternativeOneLetter\":\"γ\",\"ocl\":{\"value\":\"fakhs@IASUlJB]{hOEWaYqrIQQYIQRJJkQTyEIZuUUUSRtsUaBpnP@\",\"coordinates\":\"!Bqc}{JxyO|XoSWA}W]poGQ\\\\Gu}]rmx\\\\Ou}]{qpza|qb}MJwlk^sFza|q`\"},\"mass\":329.20635561758047,\"monoisotopicMass\":329.05252012475,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dtmp\",\"name\":\"Desoxythymidine monophosphate diradical\",\"mf\":\"C10H13N2O7P\",\"kind\":\"DNAp\",\"oneLetter\":\"T\",\"alternativeOneLetter\":\"τ\",\"ocl\":{\"value\":\"ff}Qs@IQaPSoAjCqUxV\\\\\\\\bTTVRTTbbZUNIsUUUULsSVDKBy@@\",\"coordinates\":\"!Bqc}{JxyO|XoSWC}_W]poGQ\\\\GuMKuMh\\\\Gu}]{qpSF]tWQTvaSZGQ\"},\"mass\":304.1935916616171,\"monoisotopicMass\":304.04603776326,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dump\",\"name\":\"Desoxyuridine monophosphate diradical\",\"mf\":\"C9H11N2O7P\",\"kind\":\"DNAp\",\"oneLetter\":\"U\",\"alternativeOneLetter\":\"υ\",\"ocl\":{\"value\":\"fjmQs@IQaPSoAJCqUxV\\\\\\\\bTTVRTTbb^iqNZjjjifYkBEa\\\\`@\",\"coordinates\":\"!Bqc}{JxyO|XoSWA}_W]poGQ\\\\GuMKuMh\\\\Gu}]{qpSF]tWQTvatP\"},\"mass\":290.1669742567703,\"monoisotopicMass\":290.0303876988,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Drmp\",\"name\":\"Desoxyribose monophosphate diradical\",\"mf\":\"C5H7O5P\",\"kind\":\"DNAp\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":178.08005138207807,\"monoisotopicMass\":178.00311032188,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"O\",\"number\":5},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dadp\",\"name\":\"Desoxyadenosine diphosphate diradical\",\"mf\":\"C10H13N5O8P2\",\"kind\":\"DNApp\",\"oneLetter\":\"A\",\"ocl\":{\"value\":\"fmwhH`IASM\\\\JBl{wQ`|U^F_AkbdlsjsSOoRtyEMYuUUUM@pSEQaBpnP@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGu}utnDM^HGwWzf~_Ih}M_`AKvto[_`@_`A~grZ_I`\"},\"mass\":393.1868682186928,\"monoisotopicMass\":393.02393639454,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Dcdp\",\"name\":\"Desoxycytidine diphosphate diradical\",\"mf\":\"C9H13N3O9P2\",\"kind\":\"DNApp\",\"oneLetter\":\"C\",\"ocl\":{\"value\":\"fikqH`IQGB`kN|EoP^JoCOaUqrIQQYIQRJKGRJgDejjjjZYfZkBEa\\\\`@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGuMcqLX@m^H@gwWKB__t]Q_`@SFGx@Owx@_mQ\"},\"mass\":369.16213082338425,\"monoisotopicMass\":369.01270300525005,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Dgdp\",\"name\":\"Desoxyguanosine diphosphate diradical\",\"mf\":\"C10H13N5O9P2\",\"kind\":\"DNApp\",\"oneLetter\":\"G\",\"ocl\":{\"value\":\"fcoiH`IASM\\\\JBl{wQ{Axj|L~CWEIYgUff_^fZ\\\\bflzjjjfiZifZlHVEr@@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGu}utnD@m^H@gwWzf~_Ih}M_`AKvto[_`@_`A~gr[j[y|f\"},\"mass\":409.186273143011,\"monoisotopicMass\":409.01885101411,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Dtdp\",\"name\":\"Desoxythymidine diphosphate diradical\",\"mf\":\"C10H14N2O10P2\",\"kind\":\"DNApp\",\"oneLetter\":\"T\",\"ocl\":{\"value\":\"fe{Ph`IQaPUg^Ct\\\\p^JoCO`uqrIQQYIQRJKEJQTxdmUUUSSMTsVDKBy@@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^HMQbGuMcqLX@m^H@gwWKB__t]Q_`@SFALX_`@_`A~w}D\"},\"mass\":384.1735091870477,\"monoisotopicMass\":384.01236865262,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Dudp\",\"name\":\"Desoxyuridine diphosphate diradical\",\"mf\":\"C9H12N2O10P2\",\"kind\":\"DNApp\",\"oneLetter\":\"U\",\"ocl\":{\"value\":\"fikPh`IQaPUg^Bwhp^JoCOaUqrIQQYIQRJKGRJgDejjjjZYjYkBEa\\\\`@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGuMcqLX@m^H@gwWKB__t]Q_`@SFGx@Owx@_mQ\"},\"mass\":370.1468917822009,\"monoisotopicMass\":369.99671858816,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Datp\",\"name\":\"Desoxyadenosine triphosphate diradical\",\"mf\":\"C10H14N5O11P3\",\"kind\":\"DNAppp\",\"oneLetter\":\"A\",\"ocl\":{\"value\":\"eohZMJ@I@diehJAKGOFnakg`OESpr|Mo@yqrIQQYIQRJKYZQKVRcbIJjZjjjihFAhjZcAAXKb@@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGu}utnDM^H@gwWzf~_Ih}M_`AKvto[@hcW@`A~grZ_Igx@_`@@_c}~\"},\"mass\":473.16678574412344,\"monoisotopicMass\":472.9902672839,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Dctp\",\"name\":\"Desoxycytidine triphosphate diradical\",\"mf\":\"C9H14N3O12P3\",\"kind\":\"DNAppp\",\"oneLetter\":\"C\",\"ocl\":{\"value\":\"fkopZ`IQGB`kN|Fk^{NCqUxY|I~BwGHeEEdeEHhl]HlYJ\\\\RVjjjiifVjfkBEa\\\\`@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGuMcqLX@m^H@gwWKB__t]Q_`@SFOrHupH@_mQ_`A~@@A~Owx\"},\"mass\":449.14204834881485,\"monoisotopicMass\":448.97903389461004,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":12},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Dgtp\",\"name\":\"Desoxyguanosine triphosphate diradical\",\"mf\":\"C10H14N5O12P3\",\"kind\":\"DNAppp\",\"oneLetter\":\"G\",\"ocl\":{\"value\":\"e`TZCJ@I@diehJAKGOFnamgo`OESpr|CoByqrIQQYIQRJKYZQQYrT\\\\QIUSUUUUMRuMLtuVBBpWD@@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGu}utnD@m^H@gwWzf~_Ih}M_`AKvto[@hcW@`A~gr[j[y|f_`A~@@A~Owx\"},\"mass\":489.16619066844174,\"monoisotopicMass\":488.98518190347005,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":12},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Dttp\",\"name\":\"Desoxythymidine triphosphate diradical\",\"mf\":\"C10H15N2O13P3\",\"kind\":\"DNAppp\",\"oneLetter\":\"T\",\"ocl\":{\"value\":\"fgQZ`IQaPUg^BwhygnCqUxY|E~FwGHeEEdeEHhlTiDSISbRuUUUMLuMMMVDKBy@@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGuMcqLX@m^H@gwWKB__t]Q_`@SFALXHcW@`A~w}E~@Gx@@Gx_`\"},\"mass\":464.15342671247834,\"monoisotopicMass\":463.97869954198,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":13},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Dutp\",\"name\":\"Desoxyuridine triphosphate diradical\",\"mf\":\"C9H13N2O13P3\",\"kind\":\"DNAppp\",\"oneLetter\":\"U\",\"ocl\":{\"value\":\"fkoQZ`IQaPUg^CUoQ{NCqUxY|I~BwGHeEEdeEHhl]HlYJ\\\\RVjjjiiffffkBEa\\\\`@\",\"coordinates\":\"!BIi[Rx{_grZOSXa}_]^H@mQbGuMcqLX@m^H@gwWKB__t]Q_`@SFOrHupH@_mQ_`A~@@A~Owx\"},\"mass\":450.1268093076315,\"monoisotopicMass\":449.96304947752,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":13},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Dade\",\"name\":\"Desoxyadenosine diradical\",\"mf\":\"C10H11N5O2\",\"kind\":\"DNA\",\"oneLetter\":\"A\",\"ocl\":{\"value\":\"fluha@IF]ELJ@|QNJRsN|rntyYpXuUUTBATXPlKd@@\",\"coordinates\":\"!B\\\\KqpQARcg|T^|X@@Id`zeHo@Ie}]vaLcg|T^qAMDDvN_xy\"},\"mass\":233.22703316783156,\"monoisotopicMass\":233.09127461582,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Dcyt\",\"name\":\"Desoxycytidine diradical\",\"mf\":\"C9H11N3O3\",\"kind\":\"DNA\",\"oneLetter\":\"C\",\"ocl\":{\"value\":\"fhiqa@IVCBa`^HgEIYg^Y~gG^jjjiejpaXWH@\",\"coordinates\":\"!BBOpH_UARcc}TN|Y@PIe`zeIO@MDSIrpXTd}RSqLgTd|\"},\"mass\":209.202295772523,\"monoisotopicMass\":209.08004122653,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Dgua\",\"name\":\"Desoxyguanosine diradical\",\"mf\":\"C10H11N5O3\",\"kind\":\"DNA\",\"oneLetter\":\"G\",\"ocl\":{\"value\":\"fbmia@IF]ELJYAxb\\\\Tef]ye^Z\\\\lxLZjjjeZfkBEa\\\\`@\",\"coordinates\":\"!B\\\\KqpQARcg|T^|X@@Id`zeHo@Ie}]vaLcg|T^qAMDDvN_vaLcg|\"},\"mass\":249.22643809214986,\"monoisotopicMass\":249.08618923539,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Dthy\",\"name\":\"Desoxythymidine diradical\",\"mf\":\"C10H12N2O4\",\"kind\":\"DNA\",\"oneLetter\":\"T\",\"ocl\":{\"value\":\"fdyPQ@IVaPtP^HgEIYg^YuiqwjjjjYikBEa\\\\`@\",\"coordinates\":\"!BBOpH_UARcc}TN|Y@PIe`zeIO@MDSIrpXTd}RSqLgDr]RSp\"},\"mass\":224.2136741361865,\"monoisotopicMass\":224.07970687390002,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":4}]},{\"symbol\":\"Dura\",\"name\":\"Desoxyuridine diradical\",\"mf\":\"C9H10N2O4\",\"kind\":\"DNA\",\"oneLetter\":\"U\",\"ocl\":{\"value\":\"fhiPQ@IVaPpP^HgEIYg^Y~gG^jjjifZpaXWH@\",\"coordinates\":\"!BBOpH_UARcc}TN|Y@PIe`zeIO@MDSIrpXTd}RSqLgTd|\"},\"mass\":210.1870567313397,\"monoisotopicMass\":210.06405680944,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":10},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":4}]},{\"symbol\":\"Amp\",\"name\":\"Adenosine monophosphate diradical\",\"mf\":\"C10H12N5O6P\",\"kind\":\"RNAp\",\"oneLetter\":\"A\",\"alternativeOneLetter\":\"α\",\"ocl\":{\"value\":\"fakhs@INBwlJ\\\\TgHOFwaEqrIQQSYQJIRIMLyxMVuUUUPLpEPQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@@\"},\"mass\":329.20635561758047,\"monoisotopicMass\":329.05252012475,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cmp\",\"name\":\"Cytidine monophosphate diradical\",\"mf\":\"C9H12N3O7P\",\"kind\":\"RNAp\",\"oneLetter\":\"C\",\"alternativeOneLetter\":\"ς\",\"ocl\":{\"value\":\"ff}qs@I^kBgENSdGc[pbxyDhhilheDiLv\\\\BVjjjjYfZbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":305.1816182222719,\"monoisotopicMass\":305.04128673546,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Gmp\",\"name\":\"Guanosine monophosphate diradical\",\"mf\":\"C10H12N5O7P\",\"kind\":\"RNAp\",\"oneLetter\":\"G\",\"alternativeOneLetter\":\"γ\",\"ocl\":{\"value\":\"fi{is@INBwlJ\\\\TgHp^MoBKcdRbbfrbTRdR\\\\SN^CUmUUUUKMSMQDSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtP@gD}D@\"},\"mass\":345.20576054189877,\"monoisotopicMass\":345.04743474432,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tmp\",\"name\":\"Thymidine monophosphate diradical\",\"mf\":\"C10H13N2O8P\",\"kind\":\"RNAp\",\"oneLetter\":\"T\",\"alternativeOneLetter\":\"τ\",\"ocl\":{\"value\":\"fncPK@I^aSbgIrtGc[pbxyDhhilheDiLjs`RuUUUSLuMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":320.1929965859354,\"monoisotopicMass\":320.04095238282997,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ump\",\"name\":\"Uridine monophosphate diradical\",\"mf\":\"C9H11N2O8P\",\"kind\":\"RNAp\",\"oneLetter\":\"U\",\"alternativeOneLetter\":\"υ\",\"ocl\":{\"value\":\"ff}PK@I^aSbgIsTGc[pbxyDhhilheDiLv\\\\BVjjjjYffbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":306.1663791810886,\"monoisotopicMass\":306.02530231837,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Rmp\",\"name\":\"Ribose monophosphate diradical\",\"mf\":\"C5H7O6P\",\"kind\":\"RNAp\",\"ocl\":{\"value\":\"d@\",\"coordinates\":\"\"},\"mass\":194.07945630639637,\"monoisotopicMass\":193.99802494145,\"unsaturation\":4,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Adp\",\"name\":\"Adenosine diphosphate diradical\",\"mf\":\"C10H13N5O9P2\",\"kind\":\"RNApp\",\"oneLetter\":\"A\",\"ocl\":{\"value\":\"fcoiH`INCt\\\\J\\\\UENU{Axv|F~DwGHeEEMeDheHd\\\\eHsg`u{UUUU@mAEMPQDqBId@@\",\"coordinates\":\"!BvuPfpDnDtEK_t_rHtXBH_TwPbOr_IorHbGtgD}F@RxPBuxc|_]^OTh}R_`CQ`MF@_`@_`A~\"},\"mass\":409.186273143011,\"monoisotopicMass\":409.01885101411,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Cdp\",\"name\":\"Cytidine diphosphate diradical\",\"mf\":\"C9H13N3O10P2\",\"kind\":\"RNApp\",\"oneLetter\":\"C\",\"ocl\":{\"value\":\"fe{ph`I^[BgENbgHy`|[^E_CkcdRbbfrbTRdqrdYpIZjjjieijZbHfHQL`@\",\"coordinates\":\"!BvuPfpDnDtEK_t_rHtXBH_TwPb@K_cbpXbKtSItwPS]@Bux`Bo]\\\\lFGx@S]A~@C}~@Gx\"},\"mass\":385.1615357477025,\"monoisotopicMass\":385.00761762482,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Gdp\",\"name\":\"Guanosine diphosphate diradical\",\"mf\":\"C10H13N5O10P2\",\"kind\":\"RNApp\",\"oneLetter\":\"G\",\"ocl\":{\"value\":\"fkhh`INCt\\\\J\\\\UENY{NCqmxM|EnNQJJJ[JIQJQHzIRLyxM^uUUUTkUSLuQDSDHfP@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_I`JHbGtgD}F@RxPBux`B_]^OTh}R_`CQ`B\\\\StXA~@C}~@Gx\"},\"mass\":425.1856780673293,\"monoisotopicMass\":425.01376563368,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Tdp\",\"name\":\"Thymidine diphosphate diradical\",\"mf\":\"C10H14N2O11P2\",\"kind\":\"RNApp\",\"oneLetter\":\"T\",\"ocl\":{\"value\":\"fmgQh`I^aSbgQSglu`|[^C_@[bdls^rruo}LxDmUUUTruTsTQDqBId@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPbOs_cbpXbGtSItwPS]@Bux`B_]\\\\lFBpX_`AMtGx@Owx@_`\"},\"mass\":400.172914111366,\"monoisotopicMass\":400.00728327219,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Udp\",\"name\":\"Uridine diphosphate diradical\",\"mf\":\"C9H12N2O11P2\",\"kind\":\"RNApp\",\"oneLetter\":\"U\",\"ocl\":{\"value\":\"fe{Qh`I^aSbgQSehy`|[^E_CkcdRbbfrbTRdqrdYpIZjjjiejfZbHfHQL`@\",\"coordinates\":\"!BvuPfpDnDtEK_t_rHtXBH_TwPb@K_cbpXbKtSItwPS]@Bux`Bo]\\\\lFGx@S]A~@C}~@Gx\"},\"mass\":386.14629670651925,\"monoisotopicMass\":385.99163320773005,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Atp\",\"name\":\"Adenosine triphosphate diradical\",\"mf\":\"C10H14N5O12P3\",\"kind\":\"RNAppp\",\"oneLetter\":\"A\",\"ocl\":{\"value\":\"e`TZCJ@IG@nahJNEHdliemgo`OFspZ|CoByqrIQQSYQJIRIGIRWRL\\\\^AU]UUUUPKPQMTuABDpaBX`@\",\"coordinates\":\"!BvuPfpDnDtEK_t_rHtXBH_TwPbOr_IorHbGtgD}F@RxS|uxc|_]^OTh}R_`CQ`MF@@hcW@A~_`A~@@A~Owx\"},\"mass\":489.16619066844174,\"monoisotopicMass\":488.98518190347005,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":12},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Ctp\",\"name\":\"Cytidine triphosphate diradical\",\"mf\":\"C9H14N3O13P3\",\"kind\":\"RNAppp\",\"oneLetter\":\"C\",\"ocl\":{\"value\":\"fgqZ`I^[BgENbgOQsO\\\\Gc[pkxK|MnNQJJJ[JIQJSGJPzQg@ejjjjfVffjZbHfHQL`@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@K_cbpXbGtSItwPS]C|ux`B_]\\\\lFGx@S]@BbM\\\\B@Gy~@Gx@@Gx_`\"},\"mass\":465.1414532731331,\"monoisotopicMass\":464.97394851418,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":13},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Gtp\",\"name\":\"Guanosine triphosphate diradical\",\"mf\":\"C10H14N5O13P3\",\"kind\":\"RNAppp\",\"oneLetter\":\"G\",\"ocl\":{\"value\":\"eh\\\\ZKJ@IG@nahJNEHdliemco`POFspZ|KoAyqrIQQSYQJIRIGQJQzQccpJkjjjjjeZjYZijbDIaBDq@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_I`JHbGtgD}F@RxPBux`B_]^OTh}R_`CQ`B\\\\StX@BbM_|@Gy~@Gx@@Gx_`\"},\"mass\":505.16559559276,\"monoisotopicMass\":504.98009652304,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":13},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Ttp\",\"name\":\"Thymidine triphosphate diradical\",\"mf\":\"C10H15N2O14P3\",\"kind\":\"RNAppp\",\"oneLetter\":\"T\",\"ocl\":{\"value\":\"eo`TGJ@IOHJNEGHdlnaiekg`OFspZ|Mo@yqrIQQSYQJIRY[ZPzQc`HjjjjjYZjVjZbDIaBDq@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@K_cbpXbGtSItwPS]@Bux`B_]\\\\lFBpX_`AMt@JHupH@_gx@_`@@_c}~\"},\"mass\":480.15283163679663,\"monoisotopicMass\":479.97361416155,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":14},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Utp\",\"name\":\"Uridine triphosphate diradical\",\"mf\":\"C9H13N2O14P3\",\"kind\":\"RNAppp\",\"oneLetter\":\"U\",\"ocl\":{\"value\":\"fgPz`I^aSbgQSeoQsO\\\\Gc[pkxK|MnNQJJJ[JIQJSGJPzQg@ejjjjfVjVjZbHfHQL`@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@K_cbpXbGtSItwPS]C|ux`B_]\\\\lFGx@S]@BbM\\\\B@Gy~@Gx@@Gx_`\"},\"mass\":466.12621423194986,\"monoisotopicMass\":465.95796409709004,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":14},{\"symbol\":\"P\",\"number\":3}]},{\"symbol\":\"Ade\",\"name\":\"Adenosine diradical\",\"mf\":\"C10H11N5O3\",\"kind\":\"RNA\",\"oneLetter\":\"A\",\"ocl\":{\"value\":\"fbmia@IV|gLJ\\\\Axj\\\\Tef[vyWV\\\\]zJZjjj`PJ`bIbDSH@\",\"coordinates\":\"!BBOpH_UARccFPEP{PId{RpBN[~i|BEP{iVA@fUARU@QTADBYPId\"},\"mass\":249.22643809214986,\"monoisotopicMass\":249.08618923539,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Cyt\",\"name\":\"Cytidine diradical\",\"mf\":\"C9H11N3O4\",\"kind\":\"RNA\",\"oneLetter\":\"C\",\"ocl\":{\"value\":\"fdypQ@INcBgK@|UNJRsM{\\\\~sg`uUUULmQDSDHfP@\",\"coordinates\":\"!BBOpH_UARccFPEP{PId{RpBN[~iRTBpgDq`@c`BNKB\\\\@c`\"},\"mass\":225.20170069684127,\"monoisotopicMass\":225.0749558461,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":4}]},{\"symbol\":\"Gua\",\"name\":\"Guanosine diradical\",\"mf\":\"C10H11N5O4\",\"kind\":\"RNA\",\"oneLetter\":\"G\",\"ocl\":{\"value\":\"fj}hQ@IV|gLJ\\\\JCqTxiKLwmroKNN}EMUUUTkTuDQLPbY@@\",\"coordinates\":\"!BBOpH_UARccFPEP{PId{RpBN[~k|BEP{iVA@fUARU@QTADBYiVA@fP\"},\"mass\":265.22584301646816,\"monoisotopicMass\":265.08110385496,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":4}]},{\"symbol\":\"Thy\",\"name\":\"Thymidine diradical\",\"mf\":\"C10H12N2O5\",\"kind\":\"RNA\",\"oneLetter\":\"T\",\"ocl\":{\"value\":\"fleQQ@INaSed`|UNJRsM{\\\\zlyxMUUUSMMDQLPbY@@\",\"coordinates\":\"!BBOpH_UARccFPEP{PId{RpBN[~iRTBpgDq`@c`BNKB\\\\lIpBN\"},\"mass\":240.21307906050478,\"monoisotopicMass\":240.07462149347,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":5}]},{\"symbol\":\"Ura\",\"name\":\"Uridine diradical\",\"mf\":\"C9H10N2O5\",\"kind\":\"RNA\",\"oneLetter\":\"U\",\"ocl\":{\"value\":\"fdyQQ@INaSeh`|UNJRsM{\\\\~sg`uUUULsQDSDHfP@\",\"coordinates\":\"!BBOpH_UARccFPEP{PId{RpBN[~iRTBpgDq`@c`BNKB\\\\@c`\"},\"mass\":226.18646165565798,\"monoisotopicMass\":226.05897142901,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":10},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":5}]},{\"symbol\":\"Dam\",\"name\":\"1,2′-O-dimethyladenosine monophosphate diradical 01A\",\"mf\":\"C12H16N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"œ\",\"ocl\":{\"value\":\"feghs@E^ct\\\\J\\\\udhOEw`eqrIQQQKZIQJQIiLxFK^uUUUUKLtuQDSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@MD@SuH\"},\"mass\":357.2595904272741,\"monoisotopicMass\":357.08382025367,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dgm\",\"name\":\"1,2′-O-dimethylguanosine monophosphate diradical 01G\",\"mf\":\"C12H16N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ε\",\"ocl\":{\"value\":\"fmwis@E^ct\\\\J\\\\udlp^KoAKcdRbbbVtRbTbSbSNAbwmUUUURsMSUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@B\\\\StPAOT`\"},\"mass\":373.2589953515923,\"monoisotopicMass\":373.07873487324,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dim\",\"name\":\"1,2′-O-dimethylinosine monophosphate diradical 019A\",\"mf\":\"C12O7N4H15P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ξ\",\"ocl\":{\"value\":\"fegIs@E^cvENZrTXOEw`eqrIQQQKZIQJQIiLxFK^uUUUUKLtuQDSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@MD@SuH\"},\"mass\":358.2443513860907,\"monoisotopicMass\":358.06783583658,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":4},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tia\",\"name\":\"2- methylthiomethylenethio-N6-isopentenyl-adenosine monophosphate diradical\",\"mf\":\"C17H24N5O6PS2\",\"kind\":\"NucleotideP\",\"oneLetter\":\"£\",\"ocl\":{\"value\":\"eh\\\\ZFJ@IG@nahJNEDl`OFspb\\\\V`cXHrIQQSYQJIRINIYIKQccpJkjjjjjAfBJjfjBDIaBDq@@\",\"coordinates\":\"!BpBYTvxBNFY|bEJObGvOS\\\\@Yt]~DUEJOctu~@Ha}`HzOSTwPTh~H@hc|_`BH_Xa}b@JH@gx@bGvH@h`B_`BH_P\"},\"mass\":489.50637075565066,\"monoisotopicMass\":489.09056286031,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":17},{\"symbol\":\"H\",\"number\":24},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":2}]},{\"symbol\":\"Mhc\",\"name\":\"2′‐O‐Methyl-5-hydroxymethylcytidine monophosphate diradical\",\"mf\":\"C11H16N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"¡\",\"ocl\":{\"value\":\"fikpK@EA{BgM^rTXOEw`eqrIQQQKZIQJSJigHujjjjifYjkBHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@HoTuOSU@HC~NKA`HoQLgSUAMT@a}oS_|BBpXKAaMT@CQ\"},\"mass\":349.2342579562838,\"monoisotopicMass\":349.06750148395,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Odg\",\"name\":\"N2,2′-O-dimethylguanosine monophosphate diradical 02G\",\"mf\":\"C12H16N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"γ\",\"ocl\":{\"value\":\"fmwis@E^ct\\\\J\\\\udlp^KoAKcdRbbbVtRbTbSbsNAbwmUUUURsMSUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@B\\\\StPAOT`\"},\"mass\":373.2589953515923,\"monoisotopicMass\":373.07873487324,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ntg\",\"name\":\"N2,N2,2′-O-trimethylguanosine monophosphate diradical 022G\",\"mf\":\"C13H18N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"|\",\"ocl\":{\"value\":\"fcois@E^ct\\\\J\\\\udlp^KoAKcdRbbbVtRbTbSbTYpLVcjjjjjVYjZjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuHgD}D@tPBNOt}R\"},\"mass\":387.2856127564392,\"monoisotopicMass\":387.0943849377,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Otg\",\"name\":\"N2,7,2′-O-trimethylguanosine monophosphate diradical 027G\",\"mf\":\"C13H20N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"æ\",\"ocl\":{\"value\":\"fcoisBE^bN\\\\J\\\\udjp^KoAKcFU}dRbbbVtRbTbRlQYpLVcjjjjjVYjjjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKFPMD@IqOQ@D}R\"},\"mass\":389.30149426455074,\"monoisotopicMass\":389.11003500216,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Rya\",\"name\":\"2′-O-ribosyladenosine monophosphate diradical 00A\",\"mf\":\"C15H20N5O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"^\",\"ocl\":{\"value\":\"e`\\\\ZIL@DaegobFAIO@hlm`OGSp\\\\\\\\\\\\bbbfrRbdTT\\\\rbRQUCDQTrusuUUUUMUU@pET@@@\",\"coordinates\":\"!BIlAKaMARw}DBbMF@bGuMtHc|KAbH_ZU`@GzH_WwW@h`XKFjKB_jXB\\\\SiVA`zmG_Irp_hQKctvOSR\\\\lIrp\"},\"mass\":445.3217759066577,\"monoisotopicMass\":445.09986424130005,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ryg\",\"name\":\"2′-O-ribosylguanosine monophosphate diradical 00G\",\"mf\":\"C15H20N5O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ℑ\",\"ocl\":{\"value\":\"ehRZEL@DaegobFAIO@hlm`POGSp\\\\\\\\\\\\bbbfrRbdTT\\\\rbRQbhXbJfVn^jjjjijjjVZfj@@@\",\"coordinates\":\"!BIlAKaMARw}DBbMF@bGuMtH`BKAbH_ZU`@GzH_WwW@h`XKFjKB_jXB\\\\SiVA`zmG_Irp_hQKctvOSR\\\\lt]|gK@\"},\"mass\":461.321180830976,\"monoisotopicMass\":461.09477886087,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tmu\",\"name\":\"2-thio-2′-O-methyluridine monophosphate diradical 02U\",\"mf\":\"C10H13N2O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∏\",\"ocl\":{\"value\":\"fncQp`EAaSfleZCq]x^BDnNQJJJI[QJIRYlyFmUUUULsSQDSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@\"},\"mass\":336.25837906774416,\"monoisotopicMass\":336.01810893766003,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Dmut\",\"name\":\"3,2′-O-dimethyluridine monophosphate diradical 03U\",\"mf\":\"C11H15N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"σ\",\"ocl\":{\"value\":\"fasPK@EAaSfoYKtGb{pRxyDhhhemDheIhv\\\\cVjjjjfYjZHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXOxyMT@\"},\"mass\":334.2196139907822,\"monoisotopicMass\":334.05660244729,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Amc\",\"name\":\"N4-acetyl-2′-O-methylcytidine monophosphate diradical 042C\",\"mf\":\"C12H16N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ℵ\",\"ocl\":{\"value\":\"fe{pK@EA[BgM^rTXOEw`eqrIQQQKZIQJSMJLyFmUUUULsMMQDSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@caLgSU@\"},\"mass\":361.244993853019,\"monoisotopicMass\":361.06750148395,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tmc\",\"name\":\"N4,N4,2′-O-trimethylcytidine monophosphate diradical 044C\",\"mf\":\"C12H18N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"β\",\"ocl\":{\"value\":\"fikqs@EA[BgM^rTGb{pRxyDhhhemDheIfhsdZuUUUTsLuTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@cbpX\"},\"mass\":347.2614704368123,\"monoisotopicMass\":347.08823692884005,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dcy\",\"name\":\"N4,2′-O-dimethylcytidine monophosphate diradical 04C\",\"mf\":\"C11H16N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"λ\",\"ocl\":{\"value\":\"fasqs@EA[BgM^rTGb{pRxyDhhhemDheIff\\\\cVjjjjfYfjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@lF@\"},\"mass\":333.23485303196554,\"monoisotopicMass\":333.07258686438,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Muo\",\"name\":\"2′-O-methyluridine 5-oxyacetic acid methyl ester monophosphate diradical 0503U\",\"mf\":\"C13H17N2O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ͽ\",\"ocl\":{\"value\":\"fkoQk@EAaSfoYJwj}`|W^BWGHeEEDmheDiLjlif\\\\cVjjjjfYjZZhbIbDSH@\",\"coordinates\":\"!BKAb@tURD@m\\\\YpMAMpBYMcvjbOplIwx@bGuMc}\\\\Bb@JH@dvOcuKPSXa}bGvHH`BbGu~Oxc|bGt\"},\"mass\":408.25518206531905,\"monoisotopicMass\":408.05699637046,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":17},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Xmu\",\"name\":\"5-carboxymethylaminomethyl-2′-O-methyluridine monophosphate diradical 051U\",\"mf\":\"C13H18N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\")\",\"ocl\":{\"value\":\"fkopk@EAGBgM^rWns`|W^BWGHeEEDmheDiLjleF\\\\cVjjjjfYjZfhbIbDSH@\",\"coordinates\":\"!BKAb@tURD@m\\\\YpMAMpBYMcvjb@HlIwx@bGuMc}\\\\Bb@JH@dvOcuKPSXa}bGvH@h`BbGvH@gx@bKt\"},\"mass\":407.2704211065024,\"monoisotopicMass\":407.07298078755,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mmu\",\"name\":\"5-methoxycarbonylmethyl-2′-O-methyluridine monophosphate diradical 0521U\",\"mf\":\"C13H17N2O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∩\",\"ocl\":{\"value\":\"fcwPk@EAaSfoYKvZp^KoAKcdRbbbVtRbTfUVfYrMZjjjjYfifjHbXaDr@@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lI}mK_`B@cm\\\\Bb@HlI}]}_`A~@BpgIqLXKH`Bb@I~@Ha}_c~HHa}\"},\"mass\":392.2557771410008,\"monoisotopicMass\":392.06208175089,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":17},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cue\",\"name\":\"5-(carboxyhydroxymethyl)-2′-O-methyluridine methyl ester monophosphate diradical 0522U\",\"mf\":\"C13H17N2O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∩\",\"ocl\":{\"value\":\"fkoQk@EAaSfoYKtZ}`|W^BWGHeEEDmheDiLjhYf\\\\cVjjjjfYjZZhbIbDSH@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lI}mK_`B@cm\\\\Bb@HlI}]}_`A~@BpgIqLXKH`Bb@I~@Gx@bGu~Oxc|bGt\"},\"mass\":408.25518206531905,\"monoisotopicMass\":408.05699637046,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":17},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cyu\",\"name\":\"5-carbamoylmethyl-2′-O-methyluridine monophosphate diradical 053U\",\"mf\":\"C12H16N3O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"~\",\"ocl\":{\"value\":\"fmgqK@EAWBgM^rWlp^KoAKcdRbbbVtRbTfUVcNQkUUUUSLuLuDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXKAaMTDuPOxxlF@\"},\"mass\":377.24439877733727,\"monoisotopicMass\":377.06241610352,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ipu\",\"name\":\"5-(isopentenylaminomethyl)-2′-O-methyluridine monophosphate diradical 0583U\",\"mf\":\"C16H24N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"¼\",\"ocl\":{\"value\":\"fgpK@EAGBgM^rWhOEw`eqrIQQQKZIQJSJkIJLyFmUUUULsTuMTQDqBId@@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lI}mK_`B@cm\\\\Bb@HlI}]}_`A~@BpgIqLXKH`Bb@I~@Ha}b@JH_Xc|_`BH_P\"},\"mass\":417.35146347240624,\"monoisotopicMass\":417.13010174179004,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":16},{\"symbol\":\"H\",\"number\":24},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mcy\",\"name\":\"5,2′-O-dimethylcytidine monophosphate diradical monophosphate diradical 05C\",\"mf\":\"C11H16N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"τ\",\"ocl\":{\"value\":\"fasqs@EA{BgM^rTGb{pRxyDhhhemDheIeV\\\\cVjjjjfYfjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXKAaMT@\"},\"mass\":333.23485303196554,\"monoisotopicMass\":333.07258686438,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dmuf\",\"name\":\"5,2′-O-dimethyluridine monophosphate diradical 05U\",\"mf\":\"C11H15N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"\\\\\",\"ocl\":{\"value\":\"fasPK@EAaSfoYKtGb{pRxyDhhhemDheIeV\\\\cVjjjjfYjZHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXKAaMT@\"},\"mass\":334.2196139907822,\"monoisotopicMass\":334.05660244729,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tma\",\"name\":\"N6,N6,2′-O-trimethyladenosine monophosphate diradical 066A\",\"mf\":\"C13H18N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"η\",\"ocl\":{\"value\":\"fmwhs@E^ct\\\\J\\\\udhOEw`eqrIQQQKZIQJQIkQg@q[vjjjj`Y`JjBHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@MD@SuHXK@\"},\"mass\":371.2862078321209,\"monoisotopicMass\":371.09947031813005,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Nda\",\"name\":\"N6,2′-O-dimethyladenosine monophosphate diradical 06A\",\"mf\":\"C12H16N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"χ\",\"ocl\":{\"value\":\"feghs@E^ct\\\\J\\\\udhOEw`eqrIQQQKZIQJQIkLxFK^uUUUTCLAUADSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@MD@FBp\"},\"mass\":357.2595904272741,\"monoisotopicMass\":357.08382025367,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Fmc\",\"name\":\"5-formyl-2′-O-methylcytidine monophosphate diradical 071C\",\"mf\":\"C10H12N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"°\",\"ocl\":{\"value\":\"faspK@I^[BgENSghOFwaEqrIQQSYQJIRYULxDmUUUTsLttQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":333.1917590433254,\"monoisotopicMass\":333.03620135502996,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Omi\",\"name\":\"2′-O-methylinosine monophosphate diradical 09A\",\"mf\":\"C11H13N4O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"≤\",\"ocl\":{\"value\":\"fi{Is@E^cvENZrTXOEw`eqrIQQQKZIQJQIig@q[vjjjjiYffhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@MD@\"},\"mass\":344.21773398124395,\"monoisotopicMass\":344.05218577211997,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":4},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Opu\",\"name\":\"2′-O-methylpseudouridine monophosphate diradical 09U\",\"mf\":\"C10H13N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Z\",\"ocl\":{\"value\":\"fncPK@@qaSfoYJtGb{pRxyDhhhemDheIfsdZuUUULuMMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@\"},\"mass\":320.1929965859354,\"monoisotopicMass\":320.04095238282997,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Oma\",\"name\":\"2′-O-methyladenosine monophosphate diradical 0A\",\"mf\":\"C11H14N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\":\",\"ocl\":{\"value\":\"fi{hs@E^ct\\\\J\\\\udhOEw`eqrIQQQKZIQJQIig@q[vjjjj`Y`J`bIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@MD@\"},\"mass\":343.2329730224273,\"monoisotopicMass\":343.06817018921,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Omc\",\"name\":\"2′-O-methylcytidine monophosphate diradical 0C\",\"mf\":\"C10H14N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"B\",\"ocl\":{\"value\":\"fncqs@EA[BgM^rTGb{pRxyDhhhemDheIfsdZuUUUTsLuDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@\"},\"mass\":319.2082356271187,\"monoisotopicMass\":319.05693679992004,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Omg\",\"name\":\"2′-O-methylguanosine monophosphate diradical 0G\",\"mf\":\"C11H14N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"#\",\"ocl\":{\"value\":\"fegis@E^ct\\\\J\\\\udlp^KoAKcdRbbbVtRbTbSbYpLV}jjjjjVYjZbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@HoTuOSU@HEF@`H_R\\\\StPAKA@a}_S_|BD}RSuKQ@B\\\\StP@\"},\"mass\":359.23237794674554,\"monoisotopicMass\":359.06308480878,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Omu\",\"name\":\"2′-O-methyluridinemonophosphate diradical 0U\",\"mf\":\"C10H13N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"J\",\"ocl\":{\"value\":\"fncPK@EAaSfoYJtGb{pRxyDhhhemDheIfsdZuUUUTsMMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuOSU@HC~NKA`H_QLgSUAMT@a}_S_|BBpXSU@\"},\"mass\":320.1929965859354,\"monoisotopicMass\":320.04095238282997,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cdg\",\"name\":\"7-cyano-7-deazaguanosine monophosphate diradical 100G\",\"mf\":\"C12H12N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"φ\",\"ocl\":{\"value\":\"fmwis@INzM\\\\J\\\\TgLp^MoBKcdRbbfrbTRdRUbSN^CWmUUUUKLuSuDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RqdCQ@B\\\\StPCFP@\"},\"mass\":369.22723233536925,\"monoisotopicMass\":369.04743474432,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Azg\",\"name\":\"7-aminomethyl-7-deazaguanosine monophosphate diradical 101G\",\"mf\":\"C12H16N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∉\",\"ocl\":{\"value\":\"fmwis@INzM\\\\J\\\\TgLp^MoBKcdRbbfrbTRdRUbSN^CWmUUUUKLuSUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RqdCQ@B\\\\StPA`z`\"},\"mass\":373.2589953515923,\"monoisotopicMass\":373.07873487324,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Eqo\",\"name\":\"epoxyqueuosine monophosphate diradical 102G\",\"mf\":\"C17H22N5O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ς\",\"ocl\":{\"value\":\"el^ZEL@IGNaehJNEDlig`TPOFspb\\\\\\\\bTTTvTRbTbRlRjbbfXx|Bjz~aAajjjjiYfjZjjjjHPfDHSD@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RqdCQ@B\\\\StP@{ULY@TEIKA@a}tPA}BOpHAEP\"},\"mass\":487.3585341325581,\"monoisotopicMass\":487.11042892533,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":17},{\"symbol\":\"H\",\"number\":22},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Aes\",\"name\":\"archaeosine monophosphate diradical 103G\",\"mf\":\"C12H15N6O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"(\",\"ocl\":{\"value\":\"fcoYs@INzM^xTxiNY`|[^DWGHeEEMeDheHdkDhsg`u{UUUURsMTmTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RqdCQ@B\\\\StP@{UFCj\"},\"mass\":386.2577578089824,\"monoisotopicMass\":386.07398384544,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Goq\",\"name\":\"galactosyl-queuosine monophosphate diradical 104G\",\"mf\":\"C23H32N5O14P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"9\",\"ocl\":{\"value\":\"ekXzGL@IGNaehJNEDliod\\\\VU]SPOFspb\\\\\\\\bTTTvTRbTbRlRjbTrTrbfRXx|Bjz^AyEjjjjiYfjZijjjjjjbDIaBDq@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_IorHbGtgD}F@RxRH_WwW@hbOTh}RIlCQ`B\\\\StXC[UB[@RxSPT`JHbGwQ`H`BaEQ~@Ha}bOq~Ox`BbGu~@Ha}bOrH@`\"},\"mass\":633.4999767508004,\"monoisotopicMass\":633.16833772591,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":23},{\"symbol\":\"H\",\"number\":32},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":14},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Gaq\",\"name\":\"glutamyl-queuosine monophosphate diradical105G\",\"mf\":\"C22H29N6O12P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"⊄\",\"ocl\":{\"value\":\"emWVCL@IGNaejXJNEDlioh\\\\YUPOFspb\\\\\\\\bTTTvTRbTbRlRjbTJTtrTXx|Bjz^AjjjjiYfjZijfjfjbDIaBDq@@\",\"coordinates\":\"!BTmB@c`JHUMmMtL@YtEHYgxQTaDoQ`L@YFY|gKMARH`Ygy|fpAfN`Hz@`H{PTb\\\\ltEIRtHBNHaTv|@YFYPTha}b@I~@Ha}_c~H@ha}bOq~@Ha}\"},\"mass\":600.473311954707,\"monoisotopicMass\":600.15810739451,\"unsaturation\":22,\"elements\":[{\"symbol\":\"C\",\"number\":22},{\"symbol\":\"H\",\"number\":29},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":12},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Moq\",\"name\":\"mannosyl-queuosine monophosphate diradical 106G\",\"mf\":\"C23H32N5O14P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"8\",\"ocl\":{\"value\":\"ekXzGL@IGNaehJNEDliod\\\\VU]SPOFspb\\\\\\\\bTTTvTRbTbRlRjbTrTrbfRXx|Bjz^AyEjjjjiYfjZijjjjjjbDIaBDq@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_IorHbGtgD}F@RxRH_WwW@hbOTh}RIlCQ`B\\\\StXC[UB[@RxSPT`JHbGwQ`H`BaEQ~@Ha}bOq~Ox`BbGu~@Ha}bOrH@`\"},\"mass\":633.4999767508004,\"monoisotopicMass\":633.16833772591,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":23},{\"symbol\":\"H\",\"number\":32},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":14},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Qus\",\"name\":\"queuosine monophosphate diradical 10G\",\"mf\":\"C17H22N5O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Q\",\"ocl\":{\"value\":\"edZZIL@IGNaehJNEDliohPOFspb\\\\\\\\bTTTvTRbTbRlRjbTKGG`UWSpMUUUUKLuSUMUTPaLHPfH@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPHoWtw@aOTd}RqdCQ@B\\\\StP@{ULY@RpQPTopHBGwQ@@QT\"},\"mass\":471.35912920823984,\"monoisotopicMass\":471.11551430576,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":17},{\"symbol\":\"H\",\"number\":22},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cpo\",\"name\":\"1-methyl-3-(3-amino-3-carboxypropyl)pseudouridine monophosphate diradical 1309U\",\"mf\":\"C14H20N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"α\",\"ocl\":{\"value\":\"fgpk@OAWBgENSgi{`|[^DWGHeEEMeDheIhjbihs`RuUUTsTuSUMQDSDHfP@\",\"coordinates\":\"!BTh|SI~ioOwy`iR\\\\SiV|SFGxw}FH_]]}DqbH@gx_c|SFA`lIqOW_Xa}uwu~Ox`BbGu~Ox`B_`BH_P\"},\"mass\":421.2970385113492,\"monoisotopicMass\":421.08863085201,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":14},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mls\",\"name\":\"1-methylinosine monophosphate diradical 19A\",\"mf\":\"C11H13N4O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"O\",\"ocl\":{\"value\":\"fi{Is@INBvENJSghOFwaEqrIQQSYQJIRIMIgOAjvjjjjefZZhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@D}R\"},\"mass\":344.21773398124395,\"monoisotopicMass\":344.05218577211997,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":4},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mpu\",\"name\":\"1-methylpseudouridine monophosphate diradical 19U\",\"mf\":\"C10H13N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"]\",\"ocl\":{\"value\":\"fncPK@OAaSbgIrtGc[pbxyDhhilheDiLjs`RuUUTsTuMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":320.1929965859354,\"monoisotopicMass\":320.04095238282997,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mad\",\"name\":\"1-methyladenosine monophosphate diradical 1A\",\"mf\":\"C11H14N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"\\\"\",\"ocl\":{\"value\":\"fi{hs@INBwlJ\\\\TgHOFwaEqrIQQSYQJIRIMIgOAjvjjjjefZZhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@D}R\"},\"mass\":343.2329730224273,\"monoisotopicMass\":343.06817018921,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mgs\",\"name\":\"1-methylguanosine monophosphate diradical 1G\",\"mf\":\"C11H14N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"K\",\"ocl\":{\"value\":\"fegis@INBwlJ\\\\TgHp^MoBKcdRbbfrbTRdR\\\\RYspZmjjjjiYfijbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtP@gD}D@SuH\"},\"mass\":359.23237794674554,\"monoisotopicMass\":359.06308480878,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Msu\",\"name\":\"5-aminomethyl-2-selenouridine monophosphate diradical 20510U\",\"mf\":\"C10H14N3O7PSe\",\"kind\":\"NucleotideP\",\"oneLetter\":\"π\",\"ocl\":{\"value\":\"fasqp`I^{BgEIrtGc[p\\\\bQ\\\\\\\\bTTTvTRbTfUSNAKUUUULsTuDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":398.1676241841323,\"monoisotopicMass\":398.97345859992004,\"unsaturation\":null,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"Se\",\"number\":1}]},{\"symbol\":\"Mse\",\"name\":\"5-methylaminomethyl-2-selenouridine monophosphate diradical 20511U\",\"mf\":\"C11H16N3O7PSe\",\"kind\":\"NucleotideP\",\"oneLetter\":\"≅\",\"ocl\":{\"value\":\"fikqp`I^{BgEIrtGc[p\\\\bQ\\\\\\\\bTTTvTRbTfUVYpIZjjjifZfjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTBpX\"},\"mass\":412.19424158897914,\"monoisotopicMass\":412.98910866438,\"unsaturation\":null,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"Se\",\"number\":1}]},{\"symbol\":\"Cse\",\"name\":\"5-carboxymethylaminomethyl-2-selenouridine monophosphate diradical 2051U\",\"mf\":\"C12H16N3O9PSe\",\"kind\":\"NucleotideP\",\"oneLetter\":\"⊥\",\"ocl\":{\"value\":\"fcwqH`I^{BgEIru^p^MoArIEqrIQQSYQJIRYUYJLxDmUUUTsMSTuDQLPbY@@\",\"coordinates\":\"!BKAb@tURDM\\\\YpMAMpBYMcx`BKB]~@Ha}SXW@h`Bb@IMcx}RtDvH_Xa}b@JH@ha}b@I~@Ha}\"},\"mass\":456.20378733435086,\"monoisotopicMass\":456.97893790352,\"unsaturation\":null,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"Se\",\"number\":1}]},{\"symbol\":\"Agm\",\"name\":\"agmatidine monophosphate diradical 20C\",\"mf\":\"C14H26N7O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"¿\",\"ocl\":{\"value\":\"fgxs@I^BuY{piqR\\\\`|[^DWGHeEEMeDeEHmUddhsgbuUUUSTuUUMIDSDHfP@\",\"coordinates\":\"!BDqc_tTnD_]\\\\fpH}MgrYRc}_|Dr_W_Wx@ThWM_|bOqRc}ARctu~@Gx@urH@gx@b@I~@H`BbGu~@@\"},\"mass\":419.373876184194,\"monoisotopicMass\":419.16821858483,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":14},{\"symbol\":\"H\",\"number\":26},{\"symbol\":\"N\",\"number\":7},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Sou\",\"name\":\"2-selenouridine monophosphate diradical 20U\",\"mf\":\"C9H11N2O7PSe\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ω\",\"ocl\":{\"value\":\"ff}Qp`I^aSbdyjCqmxNQHnNQJJJ[JIQJSMg@ejjjjfYihbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":369.1263628137839,\"monoisotopicMass\":369.9469094988,\"unsaturation\":null,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"Se\",\"number\":1}]},{\"symbol\":\"Agu\",\"name\":\"5-aminomethyl-2-geranylthiouridine monophosphate diradical 21510U\",\"mf\":\"C20H30N3O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Δ\",\"ocl\":{\"value\":\"ed\\\\\\\\NB@IOIhJNEDla`OFsp\\\\BHgGHeEEMeDheHdjdcEdhqpEUUUUURsUSMTuQBDpaBXdDt@\",\"coordinates\":\"!BDr__cdo[_X`fgx}RgqeRtM]}Dqa~O}\\\\BTmBH_]]}uwuRtMAMcuI~O}\\\\BupJH_]]}_`A~Oxa}uwu~Oxa}_cW_Xa}\"},\"mass\":487.5074340654907,\"monoisotopicMass\":487.15420849000003,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":20},{\"symbol\":\"H\",\"number\":30},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mgu\",\"name\":\"5-methylaminomethyl-2-geranylthiouridine monophosphate diradical 21511U\",\"mf\":\"C21H32N3O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"h\",\"ocl\":{\"value\":\"elR\\\\NB@IOIhJNEDla`OFsp\\\\BHgGHeEEMeDheHdjdlileFN@jjjjjjVZjYjijbDIaBDqHIh\",\"coordinates\":\"!BTv^cbn{__@fw|}RwqeRdK]}Tva~_{_|TiCp_[]}mwuRdIAMsuI~_{]|mwsp_[]}mwu~_{_||Gvw_Wy|Gu~_{]}|Gt\"},\"mass\":501.5340514703375,\"monoisotopicMass\":501.16985855446006,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":21},{\"symbol\":\"H\",\"number\":32},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Cgu\",\"name\":\"5-carboxymethylaminomethyl-2-geranylthiouridine monophosphate diradical 2151U\",\"mf\":\"C22H32N3O9PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"f\",\"ocl\":{\"value\":\"ef^\\\\IB@IOIhJNEDla`XPOFsp\\\\BHgGHeEEMeDheHdjdlhehbhqpEUUUUURsUSMUMMTPaLHPfIAM@\",\"coordinates\":\"!BTv^cbn{_@fw|}RwqeRdK]}Tva~_{]|TiCp[_}muRdIAMsuI~_{]|mwsp_[]}mwu~_{]||Gvw_[_}_g}~_{]||Ou~_{]}|Gt\"},\"mass\":545.5435972157093,\"monoisotopicMass\":545.1596877935999,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":22},{\"symbol\":\"H\",\"number\":32},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mha\",\"name\":\"2-methylthio-N6-(cis-hydroxyisopentenyl) adenosine monophosphate diradical 2160A\",\"mf\":\"C16H22N5O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"≠\",\"ocl\":{\"value\":\"e`TZNB@IG@nahJNEDlo`OFspb\\\\V`cHeEEMeDheHdxeleDqqxEUuUUUU@sAETuTDHSBDIbP[P\",\"coordinates\":\"!BzfC@IeKPaDn}bHCQb@KQwuRDFALYpHCQt]WHc|TmCQw}~N`ME~@Gx@upJH@h`B_`BH_X`BbGvHGxbGt\"},\"mass\":459.41437086899504,\"monoisotopicMass\":459.09775624102,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":16},{\"symbol\":\"H\",\"number\":22},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mpa\",\"name\":\"2-methylthio-N6-isopentenyladenosine monophosphate diradical 2161A\",\"mf\":\"C16H22N5O6PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"*\",\"ocl\":{\"value\":\"eohZFB@IG@nahJNEDl`OFspb\\\\V`cHeEEMeDheHdxeleFNO@jnjjjjhFXHjfjBDIaBDq@@\",\"coordinates\":\"!BpBYTvxBNFY|bEJObGvOS\\\\@Yt]~DUEJOctu~@Ha}`HzOSTwPTh~H@h`B_`BH_Xa}bOrH@ha}b@I~@Ha}\"},\"mass\":443.4149659446768,\"monoisotopicMass\":443.10284162145,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":16},{\"symbol\":\"H\",\"number\":22},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mca\",\"name\":\"2-methylthio-N6-threonylcarbamoyladenosine monophosphate diradical 2162A\",\"mf\":\"C16H21N6O10PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"[\",\"ocl\":{\"value\":\"ebVVEB@IG@nachJNEDlm`XTPOFspb\\\\V`cHeEEMeDheHdxemLhhhqqxEUuUUUU@sAESUMUABDpaBX`@\",\"coordinates\":\"!BzfC@IeKPaDn}bHCQb@KQwuRDFALYpHCQt]W@h`BTmCQw}~N`ME~@Gx@upJH@h`B_`BH_Wxb@JH_WxbOrHo]^}_`BH_P\"},\"mass\":520.4113480993399,\"monoisotopicMass\":520.07774907193,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":16},{\"symbol\":\"H\",\"number\":21},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mva\",\"name\":\"2-methylthio-N6-hydroxynorvalylcarbamoyladenosine monophosphate diradical 2163A\",\"mf\":\"C17H23N6O10PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"≈\",\"ocl\":{\"value\":\"ej^VEB@IG@nachJNEDlm`XTPOFspb\\\\V`cHeEEMeDheHdxemLhhiVNO@jnjjjjhFXHjZijjBDIaBDq@@\",\"coordinates\":\"!BpBYTvxBNFY|BbEJObGvOS\\\\@Yt]~DUEJOctu~@Ha}`HzOSTwPTh~H@h`B_`BH_Xa}bOrH@gx@bGvHGx@bGwW@h`B_c~H@ha}\"},\"mass\":534.4379655041866,\"monoisotopicMass\":534.09339913639,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":17},{\"symbol\":\"H\",\"number\":23},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mya\",\"name\":\"2-methylthio cyclic N6-threonylcarbamoyladenosine monophosphate diradical 2164A\",\"mf\":\"C17H20N5O9PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ÿ\",\"ocl\":{\"value\":\"elVZIB@IG@nkhJNEDlcghPOFspb\\\\V`cHeEEMeDheHdxeihiUFNO@jnkojjjjhFXHjfZjbHPfDHSD@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_IorHbGtgD}F@RxRH_WwW@hbOTh}RIqOQ`MF@cuKW@hQTcttfpL@YS]@BbGvH@Gx\"},\"mass\":501.4080351062552,\"monoisotopicMass\":501.07193541570007,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":17},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Hta\",\"name\":\"hydroxy-N6-threonylcarbamoyladenosine monophosphate diradical 2165A\",\"mf\":\"C15H19N6O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"«\",\"ocl\":{\"value\":\"elZVML@IG@fnehJNEDligo`TPOFspb\\\\\\\\bTTTvTRbTbSVTrbbeXx|BjZjjjj`Y`JZijjBDIaBDq@@\",\"coordinates\":\"!BpBYTvxBNFY|bEJObGvOS\\\\@Yt]~DUEJOctu~@Ha}`HzOSTwPTh~HH`BbGvH_Xc|_`BH_Xc|_`BH_]_|bOq~Oxc|bGt\"},\"mass\":490.31934821268436,\"monoisotopicMass\":490.08494245264,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":19},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Lyd\",\"name\":\"2-lysidine monophosphate diradical 21C\",\"mf\":\"C15H24N5O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"}\",\"ocl\":{\"value\":\"eo`ZAL@IGOFmhJNEDlkg`OFspb\\\\\\\\bTTTvTRbTbSVRTtXxBJjjjjfYjZjfhaBXPaLP@\",\"coordinates\":\"!BTh|SI~ioOwy`iR\\\\SiV|SFGxw}FH_]]}Dqa~Oxc|_c|SFA`lIqOW_Xa}_c~HHa}bOrH_WxbOq~@Ha}\"},\"mass\":433.3541339985626,\"monoisotopicMass\":433.13624975064994,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":24},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Gtu\",\"name\":\"2-geranylthiouridine monophosphate diradical 21U\",\"mf\":\"C19H27N2O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Γ\",\"ocl\":{\"value\":\"e`XTNB@IOHJNEDln`OFsp\\\\BHgGHeEEMeDheHdtmEdhqpEUUUUURsUKUMTPaLHPfIAu@\",\"coordinates\":\"!BTv^cbn{__@fw|}RwqeRdK]}Tva~_{_|TiCp_[]}mwuRdIAMsuI~_{]||Gvw_Wy|Gvw_Wy|Gu~_{]}|Gt\"},\"mass\":458.46617269514235,\"monoisotopicMass\":458.12765938888003,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":19},{\"symbol\":\"H\",\"number\":27},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Tyg\",\"name\":\"N2,N2,7-trimethylguanosine cap monophosphate diradical (cap TMG) 2279553N\",\"mf\":\"C13H20N5O10P2\",\"kind\":\"NucleotideP\",\"oneLetter\":\"¶\",\"ocl\":{\"value\":\"e`TZEBHIG@aihJNEHdleck`OFspz|MgDJTef[vVVe_gifNO@jijjjjjUijifjhaBXPaLP@\",\"coordinates\":\"!BvuPfpDnDtEK_t_rHtXBH_TwPbOr_I`JHbGtgD}F@RxS|uxc|_]^OTh}RIlA~@B\\\\StXCQ`Gx@Owx@_h{_cuH\"},\"mass\":468.2734710359255,\"monoisotopicMass\":468.06854085929,\"unsaturation\":13,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Tmg\",\"name\":\"N2,N2,7-trimethylguanosine monophosphate diradical 227G\",\"mf\":\"C13H20N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∠\",\"ocl\":{\"value\":\"fcoisBINCt\\\\J\\\\TgLp^MoBKbFY}dRbbfrbTRdRUbtYspZcjjjjiYfjjjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}Rqd@gD}D@tPBNOt}R\"},\"mass\":389.30149426455074,\"monoisotopicMass\":389.11003500216,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dgu\",\"name\":\"N2,N2-dimethylguanosine monophosphate diradical 22G\",\"mf\":\"C12H16N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"R\",\"ocl\":{\"value\":\"fmwis@INBwlJ\\\\TgHp^MoBKcdRbbfrbTRdR\\\\RcN^CWmUUUUKLuMUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RIqOQ@MD@cc}OT`\"},\"mass\":373.2589953515923,\"monoisotopicMass\":373.07873487324,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Atu\",\"name\":\"5-aminomethyl-2-thiouridine monophosphate diradical 2510U\",\"mf\":\"C10H14N3O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∫\",\"ocl\":{\"value\":\"fasqp`I^{BgEIrtGc[p\\\\DQ\\\\\\\\bTTTvTRbTfUSNAKUUUULsTuDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":351.27302303324575,\"monoisotopicMass\":351.02900797432005,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mou\",\"name\":\"5-methylaminomethyl-2-thiouridine monophosphate diradical 2511U\",\"mf\":\"C11H16N3O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"S\",\"ocl\":{\"value\":\"fikqp`I^{BgEIrtGc[p\\\\DQ\\\\\\\\bTTTvTRbTfUVYpIZjjjifZfjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTBpX\"},\"mass\":365.2996404380926,\"monoisotopicMass\":365.04465803878,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Ctu\",\"name\":\"5-carboxymethylaminomethyl-2-thiouridine monophosphate diradical 251U\",\"mf\":\"C12H16N3O9PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"$\",\"ocl\":{\"value\":\"fcwqH`I^{BgEIru^p^MoApQEqrIQQSYQJIRYUYJLxDmUUUTsMSTuDQLPbY@@\",\"coordinates\":\"!BKAb@tURDM\\\\YpMAMpBYMcx`BKB]~@Ha}SXW@h`Bb@IMcx}RtDvH_Xa}b@JH@ha}b@I~@Ha}\"},\"mass\":409.3091861834643,\"monoisotopicMass\":409.03448727792,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Myu\",\"name\":\"5-methoxycarbonylmethyl-2-thiouridine monophosphate diradical 2521U\",\"mf\":\"C12H15N2O9PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"3\",\"ocl\":{\"value\":\"fmgQH`I^aSbdyZNXOFw`xHbxyDhhilheDiLjmLs`RuUUUSLuLuQDSDHfP@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lIwx@`H{WHc|KB_W_Wx@_`@lIr\\\\SFBrH@h`B_`BH_WxbOrH_P\"},\"mass\":394.2945422179627,\"monoisotopicMass\":394.02358824126003,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Cou\",\"name\":\"5-carbamoylmethyl-2-thiouridine monophosphate diradical 253U\",\"mf\":\"C11H14N3O8PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"l\",\"ocl\":{\"value\":\"fe{pH`I^gBgEIrtXOFw`xHbxyDhhilheDiLjmF\\\\BVjjjjYfifhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTC~NKA`\"},\"mass\":379.2831638542993,\"monoisotopicMass\":379.02392259389,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Cau\",\"name\":\"5-carboxymethyl-2-thiouridine monophosphate diradical 2540U\",\"mf\":\"C11H13N2O9PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"℘\",\"ocl\":{\"value\":\"fe{QH`I^aSbdyZNXOFw`xHbxyDhhilheDiLjmF\\\\BVjjjjYfifhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTC~NKA`\"},\"mass\":380.26792481311594,\"monoisotopicMass\":380.00793817680005,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Tau\",\"name\":\"5-taurinomethyl-2-thiouridine monophosphate diradical 254U\",\"mf\":\"C12H18N3O10PS2\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∃\",\"ocl\":{\"value\":\"fgpj`I^{BgEIrwY{`|[^C`bKblHrIQQSYQJIRYUYIRLxDmUUUTsMSUKTQDqBId@@\",\"coordinates\":\"!BKAb@tURD@m\\\\YpMAMpBYMcx`BKB]~@Ha}SXW@h`Bb@IMcx}RtDvH_Xa}b@JH@ha}b@JH__rH_]^H_P\"},\"mass\":459.3892600220213,\"monoisotopicMass\":459.01712313635005,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":2}]},{\"symbol\":\"Itu\",\"name\":\"5-(isopentenylaminomethyl)-2-thiouridine monophosphate diradical 2583U\",\"mf\":\"C15H22N3O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"½\",\"ocl\":{\"value\":\"fkoqp`I^{BgEIrtGc[p\\\\DQ\\\\\\\\bTTTvTRbTfUVRTYpIZjjjifZfijbHfHQL`@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lIwx@`H{W@h`BKB_W_Wx@_`@lIr\\\\SFBrH@h`B_`BH_Xc|bGvH@gx@bGt\"},\"mass\":419.3902285493682,\"monoisotopicMass\":419.09160823216,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":22},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Mth\",\"name\":\"5-methyl-2-thiouridine monophosphate diradical 25U\",\"mf\":\"C10H13N2O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"F\",\"ocl\":{\"value\":\"fncQp`I^aSbdyZCqmxNBHnNQJJJ[JIQJSJlxDmUUUTsMSQDSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":336.25837906774416,\"monoisotopicMass\":336.01810893766003,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Dmg\",\"name\":\"N2,7-dimethylguanosine monophosphate diradical 27G\",\"mf\":\"C12H18N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∨\",\"ocl\":{\"value\":\"fmwisBINCt\\\\J\\\\TgLp^MoBKbFY}dRbbfrbTRdRUbKN^CWmUUUUKLuUUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RqdCQ@B\\\\StPAOT`\"},\"mass\":375.27487685970397,\"monoisotopicMass\":375.0943849377,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dma\",\"name\":\"2,8-dimethyladenosine monophosphate diradical 28A\",\"mf\":\"C12H16N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"±\",\"ocl\":{\"value\":\"feghs@INCv\\\\J\\\\UdhOFw`eqrIQQSYQJJJQKqLyxK^uUUUPMLAUADSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpP@c`a}_S_|BD}RSuKQ@B\\\\StP@\"},\"mass\":357.2595904272741,\"monoisotopicMass\":357.08382025367,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mas\",\"name\":\"2-methyladenosine monophosphate diradical 2A\",\"mf\":\"C11H14N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"/\",\"ocl\":{\"value\":\"fi{hs@INBt\\\\J\\\\TgHOFwaEqrIQQSYQJIRINIgOAjvjjjjAf@j`bIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtP@gD}D@\"},\"mass\":343.2329730224273,\"monoisotopicMass\":343.06817018921,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tcy\",\"name\":\"2-thiocytidine monophosphate diradical 2C\",\"mf\":\"C9H12N3O6PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"%\",\"ocl\":{\"value\":\"ff}pp`I^kBgEIrCqmxNBHnNQJJJ[JIQJSMg@ejjjjfYfhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":321.2470007040807,\"monoisotopicMass\":321.01844329029,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Nmg\",\"name\":\"N2-methylguanosine monophosphate diradical 2G\",\"mf\":\"C11H14N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"L\",\"ocl\":{\"value\":\"fegis@INBwlJ\\\\TgHp^MoBKcdRbbfrbTRdR\\\\VYspZmjjjjiYfijbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtP@gD}D@SuH\"},\"mass\":359.23237794674554,\"monoisotopicMass\":359.06308480878,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Thu\",\"name\":\"2-thiouridine monophosphate diradical 2U\",\"mf\":\"C9H11N2O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"2\",\"ocl\":{\"value\":\"ff}Qp`I^aSbdyjCqmxNBHnNQJJJ[JIQJSMg@ejjjjfYihbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":322.2317616628973,\"monoisotopicMass\":322.0024588732,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Ahu\",\"name\":\"3-(3-amino-3-carboxypropyl)-5,6-dihydrouridine monophosphate diradical 308U\",\"mf\":\"C13H20N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ð\",\"ocl\":{\"value\":\"fkopk@I^gBgENSens`|[^DWGHeEEMeDheIhueMF\\\\BVjjjjZfijfhbIbDSH@\",\"coordinates\":\"!BTh|SI~ioOwy`iR\\\\SiV|SFGxw}FH_]]}DqbH@gx_c|SFA`lIqOW_Xa}_c~HHa}_c~H@gx@bGt\"},\"mass\":409.28630261461393,\"monoisotopicMass\":409.08863085201,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"App\",\"name\":\"3-(3-amino-3-carboxypropyl)pseudouridine monophosphate diradical 309U\",\"mf\":\"C13H18N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Þ\",\"ocl\":{\"value\":\"fkopk@OAgBgENSens`|[^DWGHeEEMeDheIhueMF\\\\BVjjjfZfijfhbIbDSH@\",\"coordinates\":\"!BTh|SI~ioOwy`iR\\\\SiV|SFGxw}FH_]]}DqbH@gx_c|SFA`lIqOW_Xa}_c~HHa}_c~H@gx@bGt\"},\"mass\":407.2704211065024,\"monoisotopicMass\":407.07298078755,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Apu\",\"name\":\"3-(3-amino-3-carboxypropyl)uridine monophosphate diradical 30U\",\"mf\":\"C13H18N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"X\",\"ocl\":{\"value\":\"fkopk@I^gBgENSens`|[^DWGHeEEMeDheIhueMF\\\\BVjjjjYfijfhbIbDSH@\",\"coordinates\":\"!BTh|SI~ioOwy`iR\\\\SiV|SFGxw}FH_]]}DqbH@gx_c|SFA`lIqOW_Xa}_c~HHa}_c~H@gx@bGt\"},\"mass\":407.2704211065024,\"monoisotopicMass\":407.07298078755,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mws\",\"name\":\"methylwyosine monophosphate diradical 342G\",\"mf\":\"C15H18N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∑\",\"ocl\":{\"value\":\"eghZNL@IG@nahJNEDli`OFspb\\\\\\\\bTTTvTRbTbb\\\\rVSGG`SPrvuUUUUKMTsUUIBDpaBX`@\",\"coordinates\":\"!B_`CW@mF@ctvDUI|fRxPYgtwP[zV_IorHFY|gD}F@RxPYg|@YgrZOTh{_cuJOS]F@tXAKaI|fw}EMt@\"},\"mass\":411.3070845499097,\"monoisotopicMass\":411.0943849377,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Uhw\",\"name\":\"undermodified hydroxywybutosine monophosphate diradical 3470G\",\"mf\":\"C18H23N6O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"š\",\"ocl\":{\"value\":\"ejQVEL@IG@nahXJNEDliolRPOFspb\\\\\\\\bTTTvTRbTbb\\\\rVVTttXx|BZFVvjjjjiYjfZjjfjRDIaBDq@@\",\"coordinates\":\"!BKB^@ceS[H`Yg}ARpAeMtHa}KAcPTh{_S]CjXES[pAeMtH}MtEK@IdnDpBXBbES[UMo@F]ARaERH_X`B_`BH_WxbOq~@Ha}\"},\"mass\":514.3839139947949,\"monoisotopicMass\":514.12132796199,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":18},{\"symbol\":\"H\",\"number\":23},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Acw\",\"name\":\"7-aminocarboxypropylwyosine monophosphate diradical 347G\",\"mf\":\"C18H23N6O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ω\",\"ocl\":{\"value\":\"eb^VIL@IG@na`XJNEDlid\\\\POFspb\\\\\\\\bTTTvTRbTbb\\\\rVRrfcGG`SPrvuUUUUKMTsUUSUIBDpaBX`@\",\"coordinates\":\"!BDr]RcwwWpAg_tUS[cm~DUAf_XJUTvx}MaEP@_gwWcm~DUDnDUMo|urH@m_@FWwW_]^NwuS[bGtYgx`BbGu~Ox`B_`BH_P\"},\"mass\":498.38450907047655,\"monoisotopicMass\":498.12641334242,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":18},{\"symbol\":\"H\",\"number\":23},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hwy\",\"name\":\"methylated undermodified hydroxywybutosine monophosphate diradical 3480G\",\"mf\":\"C19H25N6O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"y\",\"ocl\":{\"value\":\"efYVEL@IG@nahXJNEDliolRPOFspb\\\\\\\\bTTTvTRbTbb\\\\rVVTttsGG`SPrvuUUUUKMTsUUTuTdHSBDIb@@\",\"coordinates\":\"!B`HyRtL@f_XbDRxz@UHS_chc|S]BN`MAMwxyKaL@fUHS_cmG_chCjXI|YzfA}bL@fpBYTaHz@F\\\\BH@gx@upJH@ha}_`CWHc|_`@\"},\"mass\":528.4105313996416,\"monoisotopicMass\":528.1369780264499,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":19},{\"symbol\":\"H\",\"number\":25},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hwb\",\"name\":\"hydroxywybutosine monophosphate diradical 34830G\",\"mf\":\"C21H27N6O12P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"⊆\",\"ocl\":{\"value\":\"ee[VCL@IG@nahXJNEDliobZV^POFspb\\\\\\\\bTTTvTRbTbb\\\\rVVTtRbfsGG`SPrvuUUUUKMTsUUULuUIBDpaBX`@\",\"coordinates\":\"!BKB^@ceS[@h`Yg}ARpAeMtHa}KAcPTh{_S]CjXES[pAeMtH}MtEK@IdnDpBXBbES[UMo@F]ARaERH_X`B_`BH_X`B_c~H_]]}bGu~Ox`B_c~H_P\"},\"mass\":586.4466945498602,\"monoisotopicMass\":586.14245733005,\"unsaturation\":22,\"elements\":[{\"symbol\":\"C\",\"number\":21},{\"symbol\":\"H\",\"number\":27},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":12},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Pwb\",\"name\":\"peroxywybutosine monophosphate diradical 34832G\",\"mf\":\"C21H27N6O13P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"W\",\"ocl\":{\"value\":\"emWVKL@IG@nadXJNEDliohZV^QPOFspb\\\\\\\\bTTTvTRbTbb\\\\rVVTRfTTvXx|BZFVvjjjjiYjfZjjjYjjRDIaBDq@@\",\"coordinates\":\"!BKB^@ceS[@h`Yg}ARpAeMtHa}KAcPTh{_S]CjXES[pAeMtH}MtEK@IdnDpB[|bES[UMo@F]ARaERH_X`B_`BH_X`Bb@I~Oxa}uwvH_Wxb@I~Oxa}\"},\"mass\":602.4460994741785,\"monoisotopicMass\":602.1373719496199,\"unsaturation\":22,\"elements\":[{\"symbol\":\"C\",\"number\":21},{\"symbol\":\"H\",\"number\":27},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":13},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Wyb\",\"name\":\"wybutosine monophosphate diradical 3483G\",\"mf\":\"C21H27N6O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Y\",\"ocl\":{\"value\":\"eiSVML@IG@na`XJNEDlilRZVPOFspb\\\\\\\\bTTTvTRbTbb\\\\rVVRbTTvXx|BZFVvjjjjiYjfZjjfZjdaBXPaLP@\",\"coordinates\":\"!BsJ\\\\@ciP{@`YWuARPAeMT@a}sNaPThxSUCjhIP{PAeMTD}MTEI@IllDPB[|BIP{eCm@FUARAIPH_Pc|BGtHGzBGtw_Pa}_k|HGzBGt\"},\"mass\":570.4472896255419,\"monoisotopicMass\":570.14754271048,\"unsaturation\":22,\"elements\":[{\"symbol\":\"C\",\"number\":21},{\"symbol\":\"H\",\"number\":27},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Awo\",\"name\":\"7-aminocarboxypropylwyosine methyl ester monophosphate diradical 348G\",\"mf\":\"C19H25N6O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"⇑\",\"ocl\":{\"value\":\"ejQVIL@IG@na`XJNEDlid\\\\POFspb\\\\\\\\bTTTvTRbTbb\\\\rVVRffXx|BZFVvjjjjiYjfZjjZjRDIaBDq@@\",\"coordinates\":\"!B`HyRtL@f_XbDRxz@UHS_ch`BS]BN`MAMwxyKaL@fUHS_cmG_chCjXI|YzfA}bL@fpBYTaHz@F\\\\BHHa}bOq~@Ha}_c~H@ha}\"},\"mass\":512.4111264753234,\"monoisotopicMass\":512.14206340688,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":19},{\"symbol\":\"H\",\"number\":25},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Wyo\",\"name\":\"wyosine monophosphate diradical 34G\",\"mf\":\"C14H16N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"€\",\"ocl\":{\"value\":\"ek`ZNL@IG@nahJNEDli`OFspb\\\\\\\\bTTTvTRbTbb\\\\rVXx|BZFVvjjjjiYjfZjdaBXPaLP@\",\"coordinates\":\"!B_`CWMF@ctvDUI|fRxPYgtwP[zV_IorHFY|gD}F@RxPYg|@YgrZOTh{_cuJOS]F@tXAKaI|fw}D\"},\"mass\":397.2804671450629,\"monoisotopicMass\":397.07873487324,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":14},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Pdu\",\"name\":\"3-methylpseudouridine monophosphate diradical 39U\",\"mf\":\"C10H13N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"κ\",\"ocl\":{\"value\":\"fncPK@OAaSbgIrtGc[pbxyDhhilheDiMFs`RuUUTsTuMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@HoWtw@`lFC~NSU@\"},\"mass\":320.1929965859354,\"monoisotopicMass\":320.04095238282997,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mri\",\"name\":\"3-methyluridine monophosphate diradical 3U\",\"mf\":\"C10H13N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"δ\",\"ocl\":{\"value\":\"fncPK@I^aSbgIrtGc[pbxyDhhilheDiMFs`RuUUUSLuMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@HoWtw@`lFC~NSU@\"},\"mass\":320.1929965859354,\"monoisotopicMass\":320.04095238282997,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Acc\",\"name\":\"N4-acetylcytidine monophosphate diradical 42C\",\"mf\":\"C11H14N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"M\",\"ocl\":{\"value\":\"fikpK@I^kBgENSghOFwaEqrIQQSYQJIRYiQg@ejjjjfYffhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuPOxxSItuP\"},\"mass\":347.21837644817225,\"monoisotopicMass\":347.05185141949,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Iws\",\"name\":\"isowyosine monophosphate diradical 42G\",\"mf\":\"C14H16N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"⊇\",\"ocl\":{\"value\":\"ek`ZNL@IG@fnhJNEDla`OFspb\\\\\\\\bTTTvTRbTbSbRrXx|BjzfVjjjjiYjYjjdaBXPaLP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RStwQ@MD@RpQ_qcQSU@\"},\"mass\":397.2804671450629,\"monoisotopicMass\":397.07873487324,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":14},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dmc\",\"name\":\"N4,N4-dimethylcytidine monophosphate diradical 44C\",\"mf\":\"C11H16N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"μ\",\"ocl\":{\"value\":\"fasqs@I^kBgENSdGc[pbxyDhhilheDiLuF\\\\BVjjjjYfZjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBGpcbpXBGtSItuPSU@H_Wtw@`lFDuPOxxlF@\"},\"mass\":333.23485303196554,\"monoisotopicMass\":333.07258686438,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Adw\",\"name\":\"7-aminocarboxypropyl-demethylwyosine monophosphate diradical 47G\",\"mf\":\"C17H21N6O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"¥\",\"ocl\":{\"value\":\"elVVIL@IG@fnohJNEDlahTPOFspb\\\\\\\\bTTTvTRbTbSbRrrTtXx|BjzfVjjjjiYjYjjijdaBXPaLP@\",\"coordinates\":\"!B`MERc|@Y_]^DUH{_UMo_tXa}SXPTh{_w}GjXES[pAg_t]F@cm@Il@f@haTvuS[pAgPThQTbGvH@ha}_c~HGx@bGt\"},\"mass\":484.3578916656298,\"monoisotopicMass\":484.1107632779601,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":17},{\"symbol\":\"H\",\"number\":21},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ncd\",\"name\":\"N4-methylcytidine monophosphate diradical 4C\",\"mf\":\"C10H14N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ν\",\"ocl\":{\"value\":\"fncqs@I^kBgENSdGc[pbxyDhhilheDiLts`RuUUUSLsUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuPKA`\"},\"mass\":319.2082356271187,\"monoisotopicMass\":319.05693679992004,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dmw\",\"name\":\"4-demethylwyosine monophosphate diradical 4G\",\"mf\":\"C13H14N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"†\",\"ocl\":{\"value\":\"fcis@INBwlJ\\\\TgHp^MoBKcdRbbfrbTRdR\\\\RVYspZ}fnjjjjefifjiHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RStwQ@MD@RpQ_qcQ\"},\"mass\":383.253849740216,\"monoisotopicMass\":383.06308480878,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mtu\",\"name\":\"5-methoxyuridine monophosphate diradical 501U\",\"mf\":\"C10H13N2O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"5\",\"ocl\":{\"value\":\"fasQK@I^aSbgIsUhOFwaEqrIQQSYQJIRYULxDmUUUTsMSTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":336.19240151025366,\"monoisotopicMass\":336.03586700240004,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Uoa\",\"name\":\"uridine 5-oxyacetic acid monophosphate diradical 502U\",\"mf\":\"C11H13N2O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"V\",\"ocl\":{\"value\":\"fmgQk@I^aSbgIsUlu`|[^DWGHeEEMeDheIeUeF\\\\BVjjjjYfiijHbXaDr@@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lIwx@`H{WHc|KB_W_Wx@_`@lIr\\\\SFBrHHc|_`BH_Xc|_`BH_P\"},\"mass\":380.2019472556255,\"monoisotopicMass\":380.02569624154,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ume\",\"name\":\"uridine 5-oxyacetic acid methyl ester monophosphate diradical 503U\",\"mf\":\"C12H15N2O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"υ\",\"ocl\":{\"value\":\"fcwQk@I^aSbgIsUlu`|[^DWGHeEEMeDheIeUeLs`RuUUUSLuMMTQDqBId@@\",\"coordinates\":\"!BKAb@tURDM\\\\YpMAMpBYMcxc|KB]~@Ha}SXWHc|bOqMcx}RtDvH_Xa}bOrH@ha}_c~HHa}\"},\"mass\":394.2285646604723,\"monoisotopicMass\":394.041346306,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hxc\",\"name\":\"5-hydroxycytidine monophosphate diradical 50C\",\"mf\":\"C9H12N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ç\",\"ocl\":{\"value\":\"fncpK@I^[BgENSfhOFwaEqrIQQSYQJIRYUg@ejjjjfYfjHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":321.1810231465902,\"monoisotopicMass\":321.03620135502996,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hxu\",\"name\":\"5-hydroxyuridine monophosphate diradical 50U\",\"mf\":\"C9H11N2O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∝\",\"ocl\":{\"value\":\"fncQK@I^aSbgIsUhOFwaEqrIQQSYQJIRYUg@ejjjjfYjZHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":322.1657841054069,\"monoisotopicMass\":322.02021693794,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Amu\",\"name\":\"5-aminomethyluridine monophosphate diradical 510U\",\"mf\":\"C10H14N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∪\",\"ocl\":{\"value\":\"faspK@I^{BgENSehOFwaEqrIQQSYQJIRYULxDmUUUTsMSTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":335.207640551437,\"monoisotopicMass\":335.05185141949,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mau\",\"name\":\"5-methylaminomethyluridine monophosphate diradical 511U\",\"mf\":\"C11H16N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"{\",\"ocl\":{\"value\":\"fikpK@I^{BgENSehOFwaEqrIQQSYQJIRYUYg@ejjjjfYjZhbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTBpX\"},\"mass\":349.2342579562838,\"monoisotopicMass\":349.06750148395,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hmc\",\"name\":\"5-hydroxymethylcytidine monophosphate diradical 51C\",\"mf\":\"C10H14N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∅\",\"ocl\":{\"value\":\"faspK@I^[BgENSghOFwaEqrIQQSYQJIRYULxDmUUUTsLuTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":335.207640551437,\"monoisotopicMass\":335.05185141949,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cur\",\"name\":\"5-carboxymethylaminomethyluridine monophosphate diradical 51U\",\"mf\":\"C12H16N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"!\",\"ocl\":{\"value\":\"fcwpk@I^{BgENSej}`|[^DWGHeEEMeDheIeUdhs`RuUUUSLuMSTQDqBId@@\",\"coordinates\":\"!BKAb@tURDM\\\\YpMAMpBYMcx`BKB]~@Ha}SXW@h`Bb@IMcx}RtDvH_Xa}b@JH@ha}b@I~@Ha}\"},\"mass\":393.24380370165557,\"monoisotopicMass\":393.05733072309,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Chr\",\"name\":\"5-carboxyhydroxymethyluridine monophosphate diradical 520U\",\"mf\":\"C11H13N2O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"≥\",\"ocl\":{\"value\":\"fmgQk@I^aSbgIrwlu`|[^DWGHeEEMeDheIeUCF\\\\BVjjjjYfiijHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tTuPOxxlF@\"},\"mass\":380.2019472556255,\"monoisotopicMass\":380.02569624154,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mcu\",\"name\":\"5-methoxycarbonylmethyluridine monophosphate diradical 521U\",\"mf\":\"C12H15N2O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"1\",\"ocl\":{\"value\":\"fmgPk@I^aSbgIrt\\\\p^MoBKcdRbbfrbTRdrjtsNAKUUUULsTsUDQLPbY@@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lIwx@`H{WHc|KB_W_Wx@_`@lIr\\\\SFBrH@h`B_`BH_WxbOrH_P\"},\"mass\":378.229159736154,\"monoisotopicMass\":378.04643168643,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hme\",\"name\":\"5-(carboxyhydroxymethyl)uridine methyl ester monophosphate diradical 522U\",\"mf\":\"C12H15N2O11P\",\"kind\":\"NucleotideP\",\"oneLetter\":\",\",\"ocl\":{\"value\":\"fcwQk@I^aSbgIrwlu`|[^DWGHeEEMeDheIeUCLs`RuUUUSLuMMTQDqBId@@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lIwx@`H{WHc|KB_W_Wx@_`@lIr\\\\SFBrHHc|_`A~@Ha}_c~H@ha}\"},\"mass\":394.2285646604723,\"monoisotopicMass\":394.041346306,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cxu\",\"name\":\"5-carboxymethyluridine monophosphate diradical 52U\",\"mf\":\"C11H13N2O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"◊\",\"ocl\":{\"value\":\"fe{Pk@I^aSbgIrt\\\\p^MoBKcdRbbfrbTRdrjtYpIZjjjifZfZbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTC~NKA`\"},\"mass\":364.2025423313072,\"monoisotopicMass\":364.03078162197,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hmu\",\"name\":\"5-carbamoylhydroxymethyluridine monophosphate diradical 531U\",\"mf\":\"C11H14N3O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"r\",\"ocl\":{\"value\":\"fmgpk@I^WBgENSeoY`|[^DWGHeEEMeDheIeUCF\\\\BVjjjjYfiijHbXaDr@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tTuPOxxlF@\"},\"mass\":379.21718629680873,\"monoisotopicMass\":379.04168065863,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ymu\",\"name\":\"5-carbamoylmethyluridine monophosphate diradical 53U\",\"mf\":\"C11H14N3O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"&\",\"ocl\":{\"value\":\"fe{qK@I^gBgENSehp^MoBKcdRbbfrbTRdrjtYpIZjjjifZfZbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSUAMTC~NKA`\"},\"mass\":363.2177813724905,\"monoisotopicMass\":363.04676603906006,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ttu\",\"name\":\"5-taurinomethyluridine monophosphate diradical 54U\",\"mf\":\"C12H18N3O11PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ê\",\"ocl\":{\"value\":\"fgqh`I^{BgENSenswAxv|HnJpcHeEEMeDheIeUdeHs`RuUUUSLuMTmQDSDHfP@\",\"coordinates\":\"!BKAb@tURD@m\\\\YpMAMpBYMcx`BKB]~@Ha}SXW@h`Bb@IMcx}RtDvH_Xa}b@JH@ha}b@JH__rH_]^H_P\"},\"mass\":443.32387754021244,\"monoisotopicMass\":443.03996658152005,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Cmu\",\"name\":\"5-cyanomethyluridine monophosphate diradical 55U\",\"mf\":\"C11H12N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ѷ\",\"ocl\":{\"value\":\"fikpK@I^GBgENSehOFwaEqrIQQSYQJIRYUYg@ejjjjfYj[hbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tPCQ\"},\"mass\":345.20249494006066,\"monoisotopicMass\":345.03620135502996,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Pyu\",\"name\":\"5-(isopentenylaminomethyl)uridine monophosphate diradical 583U\",\"mf\":\"C15H22N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"¾\",\"ocl\":{\"value\":\"fkopK@I^{BgENSehOFwaEqrIQQSYQJIRYUYIQg@ejjjjfYjZfjHbXaDr@@\",\"coordinates\":\"!BS]@lFJU`@Gyoza`lzf@lIwx@`H{W@h`BKB_W_Wx@_`@lIr\\\\SFBrH@h`B_`BH_Xc|bGvH@gx@bGt\"},\"mass\":403.32484606755946,\"monoisotopicMass\":403.11445167733,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":22},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mdu\",\"name\":\"5-methyldihydrouridine monophosphate diradical 58U\",\"mf\":\"C10H15N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ρ\",\"ocl\":{\"value\":\"fncPK@I^aSbgIrtGc[pbxyDhhilheDiLjs`RuUUUSTuMDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":322.20887809404695,\"monoisotopicMass\":322.05660244729,\"unsaturation\":8,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mcd\",\"name\":\"5-methylcytidine monophosphate diradical 5C\",\"mf\":\"C10H14N3O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"?\",\"ocl\":{\"value\":\"fncqs@I^[BgENSdGc[pbxyDhhilheDiLjs`RuUUUSLsUDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@\"},\"mass\":319.2082356271187,\"monoisotopicMass\":319.05693679992004,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hia\",\"name\":\"N6-(cis-hydroxyisopentenyl)adenosine monophosphate diradical 60A\",\"mf\":\"C15H20N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"`\",\"ocl\":{\"value\":\"eg`ZNL@IG@fnhJNEDlk`OFspb\\\\\\\\bTTTvTRbTbSVRTSGG`USUUUUTCLATuTDHSBDIbPSH\",\"coordinates\":\"!BzfC@IeKPaDn}bHCQb@KQwuRDFALYpHCQt]W@h`BTmCQw}~N`ME~@Gx@b@JH@ha}bOrH_Wxb@JH_P\"},\"mass\":413.3229660580212,\"monoisotopicMass\":413.11003500216003,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":20},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mta\",\"name\":\"2-methylthio-N6-methyladenosine monophosphate diradical 621A\",\"mf\":\"C12H16N5O6PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"∞\",\"ocl\":{\"value\":\"fmwhp`CQstZLDxipEfGa[qZDYEIlheDdhXdmDmKR\\\\u{MUUUU@aEUAFPTdmH@\",\"coordinates\":\"!BBGw|B@a}_S\\\\H@a}TEJNOuP{Ntm@fPBN[~iRSpHUCneXDBYTEITAEPDiVA@fTBYU@Sj[p\"},\"mass\":389.3243778334011,\"monoisotopicMass\":389.05589142807,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Tca\",\"name\":\"N6-threonylcarbamoyladenosine monophosphate diradical 62A\",\"mf\":\"C15H19N6O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"6\",\"ocl\":{\"value\":\"edRVEL@IG@fnehJNEDligo`POFspb\\\\\\\\bTTTvTRbTbSVTrbbcGG`USUUUUTCLASUMUABDpaBX`@\",\"coordinates\":\"!BzfC@IeKPaDn}bHCQbOsQwuRDFALYpHCQt]W@h`BTmCQw}~N`ME~@Gx@b@JH@ha}_c~H@ha}_c~H@ha}uwu~@Ha}\"},\"mass\":474.31994328836606,\"monoisotopicMass\":474.09002783307,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":19},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hva\",\"name\":\"N6-hydroxynorvalylcarbamoyladenosine monophosphate diradical 63A\",\"mf\":\"C16H21N6O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"√\",\"ocl\":{\"value\":\"elZVIB@IG@fnehJNDligo`POEQql|HgGHeEEMeDheHdueLhhiVNO@jfjjjjhFXBfjZj`aBXPaLP@\",\"coordinates\":\"!BpBYTvxBNFY|bEJObGvOS\\\\@Yt]~DUEJOctu~@Ha}`HzOSTwPTh~HH`BbGvH_Xc|_`BH_Xc|_`BH_]_|bOq~Oxc|bGt\"},\"mass\":488.34656069321284,\"monoisotopicMass\":488.10567789753003,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":16},{\"symbol\":\"H\",\"number\":21},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Aya\",\"name\":\"N6-acetyladenosine monophosphate diradical 64A\",\"mf\":\"C12H14N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"⇓\",\"ocl\":{\"value\":\"fmwis@INBwlJ\\\\TgLp^MoBKcdRbbfrbTRdRZrcN^CUmUUUTCLASTDQLPbY@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@D}RIqOQ@@\"},\"mass\":371.2431138434808,\"monoisotopicMass\":371.06308480878,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Gca\",\"name\":\"N6-glycinylcarbamoyladenosine monophosphate diradical 65A\",\"mf\":\"C13H15N6O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"≡\",\"ocl\":{\"value\":\"eohVIL@IG@fnehJNEDlikg`OFspb\\\\\\\\bTTTvTRbTbSVTrTXx|BjZjjjj`Y`JZfhHPfDHSD@@\",\"coordinates\":\"!BzfC@IeKPaDn}bHCQb@KQwuRDFALYpHCQt]W@h`BTmCQw}~N`ME~@Gx@bOrHHa}_c~H@ha}bOq~@Ha}\"},\"mass\":430.2673035543541,\"monoisotopicMass\":430.06381308458,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":13},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tya\",\"name\":\"N6-methyl-N6-threonylcarbamoyladenosinemonophosphate diradical 662A\",\"mf\":\"C16H21N6O10P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"E\",\"ocl\":{\"value\":\"elZVEL@IG@fnmhJNEDleo`XPOFspb\\\\\\\\bTTTvTRbTbSVbaTTTXx|BjZjjjj`Y`JfjZjBDIaBDq@@\",\"coordinates\":\"!BzfC@IeKPaDn}bHCQb@KQwuRDFALYpHCQt]W@h`BTmCQw}~N`ME~@Gx@bOrHHa}_`A~Ox`BbGu~Ox`BbGwW_Wx@bGt\"},\"mass\":488.34656069321284,\"monoisotopicMass\":488.10567789753003,\"unsaturation\":18,\"elements\":[{\"symbol\":\"C\",\"number\":16},{\"symbol\":\"H\",\"number\":21},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Nna\",\"name\":\"N6,N6-dimethyladenosine monophosphate diradical 66A\",\"mf\":\"C12H16N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"ζ\",\"ocl\":{\"value\":\"feghs@INBwlJ\\\\TgHOFwaEqrIQQSYQJIRIMZLyxMVuUUUPLpEUADSDHfP@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@D}RFBp\"},\"mass\":357.2595904272741,\"monoisotopicMass\":357.08382025367,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Fya\",\"name\":\"N6-formyladenosine monophosphate diradical 67A\",\"mf\":\"C11H12N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ϩ\",\"ocl\":{\"value\":\"fegis@INBwlJ\\\\TgLp^MoBKcdRbbfrbTRdRZrYspZmjjjj`Y`JZBHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@D}RtP@\"},\"mass\":357.216496438634,\"monoisotopicMass\":357.04743474432,\"unsaturation\":16,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Hma\",\"name\":\"N6-hydroxymethyladenosine monophosphate diradical 68A\",\"mf\":\"C11H14N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"Ϫ\",\"ocl\":{\"value\":\"fegis@INBwlJ\\\\TgLp^MoBKcdRbbfrbTRdRZrYspZmjjjj`Y`JjBHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@D}RtP@\"},\"mass\":359.23237794674554,\"monoisotopicMass\":359.06308480878,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Cca\",\"name\":\"cyclic N6-threonylcarbamoyladenosine monophosphate diradical 69A\",\"mf\":\"C15H17N6O9P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"e\",\"ocl\":{\"value\":\"ehRVIL@IG@fnehJNEDliko`OFspb\\\\\\\\bTTTvTRbTbSVTRRtXx|BjZvNjjjj`Y`IjfjbHPfDHSD`z`\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_IorHbGtgD}F@RxRH_WwW@hbOTh}RtXCQ`A`l_`A`iVCjKAcjX@A~@h`Bup\"},\"mass\":456.30465685593623,\"monoisotopicMass\":456.07946314904,\"unsaturation\":20,\"elements\":[{\"symbol\":\"C\",\"number\":15},{\"symbol\":\"H\",\"number\":17},{\"symbol\":\"N\",\"number\":6},{\"symbol\":\"O\",\"number\":9},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Fcy\",\"name\":\"5-formylcytidine monophosphate diradical71C\",\"mf\":\"C10H12N3O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\">\",\"ocl\":{\"value\":\"faspK@I^[BgENSghOFwaEqrIQQSYQJIRYULxDmUUUTsLttQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFBpXSU@@tP\"},\"mass\":333.1917590433254,\"monoisotopicMass\":333.03620135502996,\"unsaturation\":12,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":12},{\"symbol\":\"N\",\"number\":3},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Tur\",\"name\":\"4-thiouridine monophosphate diradical 74U\",\"mf\":\"C9H11N2O7PS\",\"kind\":\"NucleotideP\",\"oneLetter\":\"4\",\"ocl\":{\"value\":\"ff}Qp`I^aSbgIrCqmxQ\\\\ZaFQJJJ[JIQJSMg@ejjjjfYihbIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":322.2317616628973,\"monoisotopicMass\":322.0024588732,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Meg\",\"name\":\"7-methylguanosine monophosphate diradical 7G\",\"mf\":\"C11H15N5O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"7\",\"ocl\":{\"value\":\"fegisDINCt\\\\J\\\\TgLp^MoBKbF\\\\bTTTvTRbTbRlSN^CWmUUUUKLuSTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RqdCQ@B\\\\StP@\"},\"mass\":360.2403187008013,\"monoisotopicMass\":360.07090984101,\"unsaturation\":13,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mea\",\"name\":\"8-methyladenosine monophosphate diradical 8A\",\"mf\":\"C11H14N5O6P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"â\",\"ocl\":{\"value\":\"fi{hs@INCt\\\\J\\\\UdhOFw`eqrIQQSYQJJJQKigOA[vjjjjAi`J`bIbDSH@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpP@c`a}_S_|BD}RSuKQ@MD@\"},\"mass\":343.2329730224273,\"monoisotopicMass\":343.06817018921,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":14},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":6},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Dhu\",\"name\":\"dihydrouridine monophosphate diradical 8U\",\"mf\":\"C9H13N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"D\",\"ocl\":{\"value\":\"ff}PK@I^aSbgIsTGc[pbxyDhhilheDiLv\\\\BVjjjjZffbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":308.1822606892002,\"monoisotopicMass\":308.04095238282997,\"unsaturation\":8,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Ins\",\"name\":\"inosine monophosphate diradical 9A\",\"mf\":\"C10H11N4O7P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"I\",\"ocl\":{\"value\":\"fakIs@INBvENJSghOFwaEqrIQQSYQJIRIMLyxMVuUUUTlsSTQDqBId@@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOq_qopHBGtgD}D@RpPH_Wtw@aOTd}RtPCQ@@\"},\"mass\":330.1911165763972,\"monoisotopicMass\":330.03653570766,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":4},{\"symbol\":\"O\",\"number\":7},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Pis\",\"name\":\"pseudouridine monophosphate diradical 9U\",\"mf\":\"C9H11N2O8P\",\"kind\":\"NucleotideP\",\"oneLetter\":\"P\",\"ocl\":{\"value\":\"ff}PK@OAaSbgIsTGc[pbxyDhhilheDiLv\\\\BVjjjfZffbHfHQL`@\",\"coordinates\":\"!BNuSFPDlDTEHt_pHtP@H_TuPBOpcbpXBGtSItuPSU@H_Wtw@`lFDuP\"},\"mass\":306.1663791810886,\"monoisotopicMass\":306.02530231837,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":9},{\"symbol\":\"H\",\"number\":11},{\"symbol\":\"N\",\"number\":2},{\"symbol\":\"O\",\"number\":8},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Pqb\",\"name\":\"preQ0base 100G diradical (base)\",\"mf\":\"C7H5N5O\",\"kind\":\"Nucleotide\",\"oneLetter\":\"ψ\",\"ocl\":{\"value\":\"dk^h@DxYLLbbTTRekiujYj^`@\",\"coordinates\":\"!B|Gwp_Gy|Gwp_[lk_gp_Ag_wrYRs}|f\"},\"mass\":175.1477760289729,\"monoisotopicMass\":175.04940980287,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":5},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Pqg\",\"name\":\"preQ1base 101G diradical (base)\",\"mf\":\"C7H9N5O\",\"kind\":\"Nucleotide\",\"oneLetter\":\"∇\",\"ocl\":{\"value\":\"dk^h@DxYLLbbTTRckiUjYij`@\",\"coordinates\":\"!BWyfe[tlDWye_fXx@RpRe[wtHSuHH@a}\"},\"mass\":179.179539045196,\"monoisotopicMass\":179.08070993179,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":7},{\"symbol\":\"H\",\"number\":9},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Qba\",\"name\":\"Qbase 10G diradical (base)\",\"mf\":\"C12H15N5O3\",\"kind\":\"Nucleotide\",\"oneLetter\":\"∴\",\"ocl\":{\"value\":\"fbmi`@D\\\\EHpHyrJIQQJMJIPtyIPTmSMMUMUP@@\",\"coordinates\":\"!BRpQ_f^i`RpQKAEARzfA_f_pHtP@H_Pc|BGuPThxUCl{RtBYTd|\"},\"mass\":277.27967290184347,\"monoisotopicMass\":277.11748936431,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":15},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"Dgc\",\"name\":\"N2,7-dimethylguanosine cap (cap DMG) diradical 279553N\",\"mf\":\"C12H18N5O11P2\",\"kind\":\"Nucleotide\",\"oneLetter\":\"®\",\"ocl\":{\"value\":\"e`TZMBHIG@aihJNEHdlemck`OFspz|OgDJ\\\\bTTTvTRbTbRvbtfKGG`UPuUUUUJtuTmUTPaLHPfH@@\",\"coordinates\":\"!BvuPfpDnDtEK_t_rHtXBH_TwPbOr_IorHbGtgD}F@RxS|uxc|_]^OTh}RIlBH_]F@IqOQ`@A~_c|bH}RbGt\"},\"mass\":470.24625855539705,\"monoisotopicMass\":470.04780541440005,\"unsaturation\":13,\"elements\":[{\"symbol\":\"C\",\"number\":12},{\"symbol\":\"H\",\"number\":18},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Dpa\",\"name\":\"5′-(3′-dephosphoacetyl-CoA) diradical 4155N\",\"mf\":\"C23H35N7O16P3S\",\"kind\":\"Nucleotide\",\"oneLetter\":\"♣\",\"ocl\":{\"value\":\"elz~@jDCHlemnSTLBAEKBjfckgbV]XpEfCpB|IoCtHZy{lbdvbbfrbTRdRNRdnTbefRTrRTdTRrFVfjjjj`V`bZjjfjZjZ`bbLSaRP@\",\"coordinates\":\"!BvtmKaMmKUMlfgto[tDw_cosWt]~H@dvObGv_F_sWbOpgKMG_R}m}bHa}HbOSX}M_cQw}G_OwzH_[wW_c~H_Wx@G{|bM]}bGvHGxbGu~Oxa}bOq~Oxa}_c~H_WxuwvH_P\"},\"mass\":790.5483266874629,\"monoisotopicMass\":790.1073852418399,\"unsaturation\":21,\"elements\":[{\"symbol\":\"C\",\"number\":23},{\"symbol\":\"H\",\"number\":35},{\"symbol\":\"N\",\"number\":7},{\"symbol\":\"O\",\"number\":16},{\"symbol\":\"P\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Dpm\",\"name\":\"5′-(3′-dephosphomalonyl-CoA) diradical 4255N\",\"mf\":\"C24H35N7O18P3S\",\"kind\":\"Nucleotide\",\"oneLetter\":\"♥\",\"ocl\":{\"value\":\"efq~DjDCHlemnSTLBAEKBjfckgbV]XrzpEfCpB|IoCtHZy{lbdvbbfrbTRdRNRdnTbefRTrRTrdbbVPrtuUUUTBtDSUUTuSUSSTDTQb\\\\JR@@\",\"coordinates\":\"!BIlB_Ib[@pAe`zni`FALSF@A~FBq~OrpXbGveX@A~_c~OTa`lzf@_ha}_]_Q`MF@bOpXKA`loXbH__rHb@JHoX`B@m]}uwx@bGu~Ox`BbKvH@ha}_c~H@hb}b@JH_Xc|_`BH_X`B_`BHoP\"},\"mass\":834.5578724328346,\"monoisotopicMass\":834.0972144809799,\"unsaturation\":23,\"elements\":[{\"symbol\":\"C\",\"number\":24},{\"symbol\":\"H\",\"number\":35},{\"symbol\":\"N\",\"number\":7},{\"symbol\":\"O\",\"number\":18},{\"symbol\":\"P\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Dsc\",\"name\":\"5′-(3′-dephosphosuccinyl-CoA) radical 4355N\",\"mf\":\"C25H37N7O18P3S\",\"kind\":\"Nucleotide\",\"oneLetter\":\"♦\",\"ocl\":{\"value\":\"eny~DjDCHlemnSTLBAEKBjfckgbV]XzvpOFCpB|IoCtHZy{lbdvbbfrbTRdRNRdnTbefRTrRTrTdTRrFVfjjjj`V`bZjjfjZjZfhHhcDxTd@@\",\"coordinates\":\"!B[~kjXFjiV[Ry|fcm}MtGwWctvH_]Q_c}KaGwWbGvN`H}MgrX@_gx@h`gKB\\\\lbGvOSX}M@m^H@gwWbGvH@ha}_Xc|bGxb@I~@Ha}b@JH_X`B_`BH_X`BbGvH@ha}_c~H@ha}b@I~@Ha}\"},\"mass\":848.5844898376815,\"monoisotopicMass\":848.11286454544,\"unsaturation\":23,\"elements\":[{\"symbol\":\"C\",\"number\":25},{\"symbol\":\"H\",\"number\":37},{\"symbol\":\"N\",\"number\":7},{\"symbol\":\"O\",\"number\":18},{\"symbol\":\"P\",\"number\":3},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Dpc\",\"name\":\"5′-(3′-dephospho-CoA) radical 455N\",\"mf\":\"C21H32N7O13P2S\",\"kind\":\"Nucleotide\",\"oneLetter\":\"♠\",\"ocl\":{\"value\":\"ek_^KBDIG@nabYXJNEHdliemh\\\\QPEfspZ|CPcKmnrIQQSYQJIRIGIRWJQRsIJYIccpJkjjjjjAZBIjjjZijjBDIaBDq@@\",\"coordinates\":\"!B[zW[UI|YchAMc{vHcuJH@m~NbGuKvwvHb@JNwx}Rgqe}bHa}@h`gDr\\\\Sb@JOTh}R@m]~@@A~b@I~@H`B_X`_hb}_`CW@h`B_`BH@gx@upJH@gx@b@I~@@\"},\"mass\":684.5310558604504,\"monoisotopicMass\":684.1254042880199,\"unsaturation\":19,\"elements\":[{\"symbol\":\"C\",\"number\":21},{\"symbol\":\"H\",\"number\":32},{\"symbol\":\"N\",\"number\":7},{\"symbol\":\"O\",\"number\":13},{\"symbol\":\"P\",\"number\":2},{\"symbol\":\"S\",\"number\":1}]},{\"symbol\":\"Dpe\",\"name\":\"5′-diphosphate end 552N\",\"mf\":\"O3P\",\"kind\":\"Nucleotide\",\"oneLetter\":\"ϒ\",\"ocl\":{\"value\":\"gJQdebGF^Dx|duK@@\",\"coordinates\":\"!BbOq~@GxbGt\"},\"mass\":78.97197677137483,\"monoisotopicMass\":78.95850585713,\"unsaturation\":1,\"elements\":[{\"symbol\":\"O\",\"number\":3},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Mgc\",\"name\":\"7-methylguanosine cap (cap 0) diradical 79553N\",\"mf\":\"C11H16N5O11P2\",\"kind\":\"Nucleotide\",\"oneLetter\":\"©\",\"ocl\":{\"value\":\"eohZMBHIG@aihJNEHdlemck`OFspz|GgDJ\\\\bTTTvTRbTbRvbtcXx|BjFjjjjiVfjejjHPfDHSD@@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_I`JHbGtgD}F@RxPBux`B_]^OTh}RIlBH_]F@IqOQ`@A~_c|BbHa}\"},\"mass\":456.2196411505502,\"monoisotopicMass\":456.03215534994,\"unsaturation\":13,\"elements\":[{\"symbol\":\"C\",\"number\":11},{\"symbol\":\"H\",\"number\":16},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":11},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Gyy\",\"name\":\"guanylylated 5′ end (cap G) diradical 9553N\",\"mf\":\"C10H13N5O10P2\",\"kind\":\"Nucleotide\",\"oneLetter\":\"ϑ\",\"ocl\":{\"value\":\"fkhh`INCt\\\\J\\\\UENY{NCqmxM|EnNQJJJ[JIQJQHzIRLyxM^uUUUTkSULuQDSDHfP@\",\"coordinates\":\"!BvuPfpDnDtEK_tPJHtXBH_TwPb@J_I`JHbGtgD}F@RxPBux`B_]^OTh}R_`CQ`B\\\\StXA~@C}~@Gx\"},\"mass\":425.1856780673293,\"monoisotopicMass\":425.01376563368,\"unsaturation\":14,\"elements\":[{\"symbol\":\"C\",\"number\":10},{\"symbol\":\"H\",\"number\":13},{\"symbol\":\"N\",\"number\":5},{\"symbol\":\"O\",\"number\":10},{\"symbol\":\"P\",\"number\":2}]},{\"symbol\":\"Furp\",\"name\":\"furan phosphate radical\",\"mf\":\"C5H6O4P\",\"kind\":\"RNAp\",\"oneLetter\":\"⬠\",\"ocl\":{\"value\":\"dmtBPDpnAYcpRZ}eeYjii@@\",\"coordinates\":\"!BNvw|Vso|kUl{[So|PPAGuU\\\\z`pP\"},\"mass\":161.072705703704,\"monoisotopicMass\":161.00037067008,\"unsaturation\":5,\"elements\":[{\"symbol\":\"C\",\"number\":5},{\"symbol\":\"H\",\"number\":6},{\"symbol\":\"O\",\"number\":4},{\"symbol\":\"P\",\"number\":1}]},{\"symbol\":\"Phg\",\"ocl\":{\"value\":\"dcNHPBPOEgEInVuWYj`@@@\"},\"name\":\"Phenyl glycine diradical\",\"mf\":\"C8H7NO\",\"kind\":\"aa\",\"mass\":133.1475805880365,\"monoisotopicMass\":133.05276384961002,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":1}]},{\"symbol\":\"Hpg\",\"ocl\":{\"value\":\"dknDPBPp|V\\\\Tfy[WWYj`@`@@\",\"coordinates\":\"!BbOq~@Ha}bOq~Oxa}bGwW_Wx?_c?W_Wx?\"},\"name\":\"4-hydroxyphenylglycine diradical\",\"mf\":\"C8H7NO2\",\"kind\":\"aa\",\"mass\":149.14698551235477,\"monoisotopicMass\":149.04767846918,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":2}]},{\"symbol\":\"Dpg\",\"ocl\":{\"value\":\"dg^LPBS[CqYqR[emYTyj`BH@@\",\"coordinates\":\"!BbOr~@Hb}bOr~Wxb}bKvWo[y_oe}HoY^}Uwt\"},\"name\":\"3,5-dihydroxyphenylglycine diradical\",\"mf\":\"C8H7NO3\",\"kind\":\"aa\",\"mass\":165.14639043667304,\"monoisotopicMass\":165.04259308875,\"unsaturation\":10,\"elements\":[{\"symbol\":\"C\",\"number\":8},{\"symbol\":\"H\",\"number\":7},{\"symbol\":\"N\",\"number\":1},{\"symbol\":\"O\",\"number\":3}]},{\"symbol\":\"T\",\"name\":\"Tritium\",\"mf\":\"[3H]\",\"ocl\":{\"value\":\"eFAAYhBLCEX@\",\"coordinates\":\"!B@@L\"},\"mass\":3.0160492779,\"monoisotopicMass\":3.0160492779,\"unsaturation\":-1,\"elements\":[{\"symbol\":\"H\",\"number\":1,\"isotope\":3}]}]","import { groups } from './groups';\n\nexport const groupsObject = {};\ngroups.forEach((e) => {\n  if (groupsObject[e.symbol]) {\n    console.log('The symbol ' + e.symbol + ' is used more than once');\n  }\n  groupsObject[e.symbol] = e;\n});\n","import { groupsObject } from './groupsObject.js';\n\n/**\n * Recreate a one letter sequence\n * @param {object} mf\n */\n\nexport function groupsToSequence(mf) {\n  mf = mf.replace(/\\([^(]*\\)/g, '');\n  let parts = mf.split(/(?=[A-Z ])/);\n  let usefulParts = [];\n  for (let part of parts) {\n    if (part === ' ') {\n      usefulParts.push(' ');\n      continue;\n    }\n    if (!part.match(/^[A-Z][a-z]{2,6}/)) continue;\n    if (groupsObject[part] && groupsObject[part].oneLetter) {\n      usefulParts.push(groupsObject[part].oneLetter);\n    } else {\n      usefulParts.push('?');\n    }\n  }\n  return usefulParts.join('').replace(/ +/g, ' ').trim();\n}\n","import { elementsAndStableIsotopesObject as elements } from 'chemical-elements';\n\nexport function getIsotopeRatioInfo(value) {\n  let result = { mass: 0, monoisotopicMass: 0 };\n  let element = elements[value.atom];\n  if (!element) throw new Error(`Element not found: ${value.atom}`);\n  let isotopesArray = element.isotopes;\n  let ratios = normalize(value.ratio);\n  let max = Math.max(...ratios);\n  if (ratios.length > isotopesArray.length) {\n    throw new Error(\n      `the number of specified ratios is bigger that the number of stable isotopes: ${value.atom}`,\n    );\n  }\n  for (let i = 0; i < ratios.length; i++) {\n    result.mass += ratios[i] * isotopesArray[i].mass;\n    if (max === ratios[i] && result.monoisotopicMass === 0) {\n      result.monoisotopicMass = isotopesArray[i].mass;\n    }\n  }\n  return result;\n}\n\nfunction normalize(array) {\n  let sum = array.reduce((prev, current) => prev + current, 0);\n  return array.map((a) => a / sum);\n}\n","import {\n  isotopesObject as isotopes,\n  elementsObject as elements,\n} from 'chemical-elements';\nimport { groupsObject as groups } from 'chemical-groups';\n\nimport { Kind } from '../Kind';\n\nimport { getIsotopeRatioInfo } from './getIsotopeRatioInfo';\n\n/**\n *\n * @param {*} parts\n * @param {*} [options={}]\n */\nexport function getEA(parts) {\n  let results = {};\n  for (let part of parts) {\n    for (let line of part) {\n      switch (line.kind) {\n        case Kind.ISOTOPE: {\n          let isotope = isotopes[line.value.isotope + line.value.atom];\n          if (!isotope) {\n            throw new Error(\n              `Unknown isotope: ${line.value.isotope}${line.value.atom}`,\n            );\n          }\n          addMass(results, line.value.atom, isotope.mass * line.multiplier);\n          break;\n        }\n\n        case Kind.ISOTOPE_RATIO: {\n          let isotopeRatioInfo = getIsotopeRatioInfo(line.value);\n          addMass(\n            results,\n            line.value.atom,\n            isotopeRatioInfo.mass * line.multiplier,\n          );\n          break;\n        }\n\n        case Kind.ATOM: {\n          let element = elements[line.value];\n          if (!element) {\n            element = groups[line.value];\n            if (!element) throw Error(`Unknown element: ${line.value}`);\n            // need to explode group ????\n          }\n          addMass(results, line.value, element.mass * line.multiplier);\n          break;\n        }\n\n        case Kind.CHARGE:\n          break;\n        default:\n          throw new Error('partToMF unhandled Kind: ', line.kind);\n      }\n    }\n  }\n\n  let eas = [];\n  let sum = 0;\n  for (let key in results) {\n    sum += results[key];\n    eas.push({\n      element: key,\n      mass: results[key],\n    });\n  }\n\n  eas.forEach((ea) => {\n    ea.ratio = ea.mass / sum;\n  });\n  return eas;\n}\n\nfunction addMass(results, atom, mass) {\n  if (!results[atom]) results[atom] = 0;\n  results[atom] += mass;\n}\n","import { elementsObject, elementsAndIsotopesObject } from 'chemical-elements';\n\nimport { Kind } from '../Kind';\n\n/**\n *\n * @param {*} parts\n * @param {*} [options={}]\n */\nexport function getElements(parts) {\n  const elements = [];\n  for (const part of parts) {\n    for (const line of part) {\n      let number = line.multiplier;\n      switch (line.kind) {\n        case Kind.ATOM: {\n          let symbol = line.value;\n          let element = elementsObject[symbol];\n          if (!element) {\n            throw new Error(`element unknown: ${symbol} - ${line}`);\n          }\n          addElement(elements, { symbol, number });\n          break;\n        }\n        case Kind.ISOTOPE: {\n          let element = elementsAndIsotopesObject[line.value.atom];\n          if (!element) {\n            throw new Error(`element unknown: ${part.value.atom} - ${line}`);\n          }\n          let isotope = element.isotopes.filter(\n            (a) => a.nominal === line.value.isotope,\n          )[0];\n          if (!isotope) {\n            throw new Error(`isotope unknown: ${line.value.isotope} - ${line}`);\n          }\n          addElement(elements, {\n            symbol: line.value.atom,\n            number,\n            isotope: line.value.isotope,\n          });\n          break;\n        }\n        default:\n          throw new Error(`unknown type: ${line.kind}`);\n      }\n    }\n  }\n  return elements;\n}\n\nfunction addElement(elements, newElement) {\n  for (let element of elements) {\n    if (\n      element.symbol === newElement.symbol &&\n      element.isotope === newElement.isotope\n    ) {\n      element.number += newElement.number;\n      return;\n    }\n  }\n  elements.push(newElement);\n}\n","import { Kind } from '../Kind.js';\n\n/**\n * Convert a MF part to an array of atoms\n * This procedure will suppress the isotopes !\n * This is mainly used to make queries\n */\n\nexport function partToAtoms(part) {\n  let atoms = {};\n  for (let line of part) {\n    switch (line.kind) {\n      case Kind.ISOTOPE:\n        if (!atoms[line.value.atom]) atoms[line.value.atom] = 0;\n        atoms[line.value.atom] += line.multiplier;\n        break;\n      case Kind.ISOTOPE_RATIO:\n        if (!atoms[line.value.atom]) atoms[line.value.atom] = 0;\n        atoms[line.value.atom] += line.multiplier;\n        break;\n      case Kind.ATOM:\n        if (!atoms[line.value]) atoms[line.value] = 0;\n        atoms[line.value] += line.multiplier;\n        break;\n      case Kind.CHARGE:\n        break;\n      case Kind.ANCHOR:\n        break;\n      default:\n        throw new Error('partToMF unhandled Kind: ', line.kind);\n    }\n  }\n  return atoms;\n}\n","import { Kind } from '../Kind';\n\nexport function partToMF(part, options = {}) {\n  let mf = [];\n  for (let line of part) {\n    switch (line.kind) {\n      case Kind.ISOTOPE:\n        if (line.multiplier !== 0) {\n          mf.push(\n            `[${line.value.isotope}${line.value.atom}]${\n              line.multiplier !== 1 ? line.multiplier : ''\n            }`,\n          );\n        }\n        break;\n      case Kind.ISOTOPE_RATIO:\n        if (line.multiplier !== 0) {\n          mf.push(\n            `${line.value.atom}{${line.value.ratio.join(',')}}${\n              line.multiplier !== 1 ? line.multiplier : ''\n            }`,\n          );\n        }\n        break;\n      case Kind.ATOM:\n        if (line.multiplier !== 0) {\n          mf.push(line.value + (line.multiplier !== 1 ? line.multiplier : ''));\n        }\n        break;\n      case Kind.CHARGE:\n        if (line.value === 0 || options.neutral) break;\n        mf.push(`(${line.value > 0 ? `+${line.value}` : line.value})`);\n        break;\n      default:\n    }\n  }\n  return mf.join('');\n}\n","import {\n  ELECTRON_MASS,\n  unsaturationsObject as unsaturations,\n  elementsAndIsotopesObject as elements,\n  isotopesObject as isotopes,\n} from 'chemical-elements';\nimport { groupsObject as groups } from 'chemical-groups';\n\nimport { Kind } from '../Kind';\n\nimport { getIsotopeRatioInfo } from './getIsotopeRatioInfo';\nimport { partToAtoms } from './partToAtoms';\nimport { partToMF } from './partToMF';\n\n/**\n *\n * @param {*} parts\n * @param {*} [options={}]\n */\nexport function getInfo(parts, options = {}) {\n  let {\n    customUnsaturations = {},\n    emFieldName = 'monoisotopicMass',\n    msemFieldName = 'observedMonoisotopicMass',\n  } = options;\n  if (parts.length === 0) return {};\n  if (parts.length === 1) {\n    return getProcessedPart(parts[0], {\n      customUnsaturations,\n      emFieldName,\n      msemFieldName,\n    });\n  }\n\n  let result = { parts: [] };\n  for (let part of parts) {\n    result.parts.push(\n      getProcessedPart(part, {\n        customUnsaturations,\n        emFieldName,\n        msemFieldName,\n      }),\n    );\n  }\n\n  result[emFieldName] = 0;\n  result.mass = 0;\n  result.charge = 0;\n  result.unsaturation = 0;\n  result.atoms = {};\n  result.mf = result.parts.map((a) => a.mf).join('.');\n  for (const part of result.parts) {\n    result.mass += part.mass;\n    result[emFieldName] += part[emFieldName];\n    result.charge += part.charge;\n    result.unsaturation += part.unsaturation;\n    for (const atom in part.atoms) {\n      if (!result.atoms[atom]) {\n        result.atoms[atom] = 0;\n      }\n      result.atoms[atom] += part.atoms[atom];\n    }\n  }\n  return result;\n}\n\nfunction getProcessedPart(part, options) {\n  let { customUnsaturations, emFieldName, msemFieldName } = options;\n\n  let currentPart = {\n    mass: 0,\n    charge: 0,\n    mf: '',\n    atoms: partToAtoms(part),\n  };\n  currentPart[emFieldName] = 0;\n\n  let unsaturation = 0;\n  let validUnsaturation = true;\n  currentPart.mf = partToMF(part);\n\n  for (let line of part) {\n    let currentElement = '';\n    switch (line.kind) {\n      case Kind.ATOM: {\n        currentElement = line.value;\n        let element = elements[line.value];\n\n        // todo should we have a kind GROUP ?\n        if (!element) {\n          element = groups[line.value];\n          if (!element) throw Error(`Unknown element: ${line.value}`);\n          if (!customUnsaturations[line.value]) {\n            customUnsaturations[line.value] = element.unsaturation;\n          }\n        }\n        if (!element) throw new Error(`Unknown element: ${line.value}`);\n        currentPart[emFieldName] += element.monoisotopicMass * line.multiplier;\n        currentPart.mass += element.mass * line.multiplier;\n        break;\n      }\n      case Kind.ISOTOPE: {\n        currentElement = line.value.atom;\n        let isotope = isotopes[line.value.isotope + line.value.atom];\n        if (!isotope) {\n          throw new Error(\n            `Unknown isotope: ${line.value.isotope}${line.value.atom}`,\n          );\n        }\n        currentPart[emFieldName] += isotope.mass * line.multiplier;\n        currentPart.mass += isotope.mass * line.multiplier;\n        break;\n      }\n      case Kind.ISOTOPE_RATIO: {\n        currentElement = line.value.atom;\n        let isotopeRatioInfo = getIsotopeRatioInfo(line.value);\n        currentPart[emFieldName] +=\n          isotopeRatioInfo[emFieldName] * line.multiplier;\n        currentPart.mass += isotopeRatioInfo.mass * line.multiplier;\n        break;\n      }\n      case Kind.CHARGE:\n        currentPart.charge = line.value;\n        if (validUnsaturation) {\n          unsaturation -= line.value;\n        }\n        break;\n      default:\n        throw new Error('Unimplemented Kind in getInfo', line.kind);\n    }\n    if (currentElement) {\n      if (customUnsaturations[currentElement] !== undefined) {\n        unsaturation += customUnsaturations[currentElement] * line.multiplier;\n      } else if (unsaturations[currentElement] !== undefined) {\n        unsaturation += unsaturations[currentElement] * line.multiplier;\n      } else {\n        validUnsaturation = false;\n      }\n    }\n  }\n\n  // need to calculate the observedMonoisotopicMass\n  if (currentPart.charge) {\n    currentPart[msemFieldName] =\n      (currentPart[emFieldName] - currentPart.charge * ELECTRON_MASS) /\n      Math.abs(currentPart.charge);\n  }\n  if (validUnsaturation) {\n    currentPart.unsaturation = unsaturation / 2 + 1;\n  }\n  return currentPart;\n}\n","import {\n  elementsAndStableIsotopesObject as elements,\n  isotopesObject as isotopes,\n} from 'chemical-elements';\n\nimport { Kind } from '../Kind';\n\n/**\n *\n * @param {*} parts\n * @param {*} options\n */\nexport function getIsotopesInfo(parts) {\n  if (parts.length === 0) return [];\n  if (parts.length > 1) {\n    throw new Error('getIsotopesInfo can not be applied on multipart MF');\n  }\n\n  return getProcessedPart(parts[0]);\n}\n\nfunction getProcessedPart(part) {\n  let result = {\n    charge: 0,\n    isotopes: [],\n  };\n  for (let line of part) {\n    switch (line.kind) {\n      case Kind.ISOTOPE: {\n        let isotope = isotopes[line.value.isotope + line.value.atom];\n        if (!isotope) {\n          throw Error('unknown isotope:', line.value.atom, line.value.isotope);\n        }\n        result.isotopes.push({\n          atom: `[${line.value.isotope}${line.value.atom}]`,\n          number: line.multiplier,\n          distribution: [{ x: isotope.mass, y: 1 }],\n        });\n        break;\n      }\n      case Kind.ISOTOPE_RATIO:\n        {\n          let element = elements[line.value.atom];\n          if (!element) throw new Error('unknown element:', line.value);\n\n          let distribution = getDistribution(\n            element.isotopes,\n            line.value.ratio,\n          );\n          result.isotopes.push({\n            atom: `${line.value.atom}{${line.value.ratio.join(',')}}`,\n            number: line.multiplier,\n            distribution,\n          });\n        }\n        break;\n      case Kind.ATOM: {\n        let element = elements[line.value];\n        if (!element) throw new Error('unknown element:', line.value);\n        result.isotopes.push({\n          atom: line.value,\n          number: line.multiplier,\n          distribution: element.isotopes.map((e) => ({\n            x: e.mass,\n            y: e.abundance,\n          })),\n        });\n        break;\n      }\n      case Kind.CHARGE:\n        result.charge += line.value;\n        break;\n      default:\n        throw new Error('partToMF unhandled Kind: ', line.kind);\n    }\n  }\n  return result;\n}\n\nfunction getDistribution(isotopesArray, ratio) {\n  let ratios = normalize(ratio);\n  let result = [];\n  if (ratios.length > isotopesArray.length) {\n    throw new Error(\n      `the number of specified ratios is bigger that the number of stable isotopes: ${isotopes}`,\n    );\n  }\n  for (let i = 0; i < ratios.length; i++) {\n    result.push({\n      x: isotopesArray[i].mass,\n      y: ratios[i],\n    });\n  }\n  return result;\n}\n\nfunction normalize(array) {\n  let sum = array.reduce((prev, current) => prev + current, 0);\n  return array.map((a) => a / sum);\n}\n","import { partToMF } from './partToMF';\n\nexport function partsToMF(parts, options) {\n  let mf = [];\n  for (let part of parts) {\n    mf.push(partToMF(part, options));\n  }\n  return mf.join(' . ');\n}\n","/**\n * Implementation of the Hill system for sorting atoms\n * https://en.wikipedia.org/wiki/Chemical_formula#Hill_system\n * @param {string} a - first atom to compare\n * @param {string} b - second atom to compare\n * @returns\n */\n\nexport function atomSorter(a, b) {\n  if (a === b) return 0;\n  if (a === 'C') return -1;\n  if (b === 'C') return 1;\n  if (a === 'H') return -1;\n  if (b === 'H') return 1;\n  if (a < b) return -1;\n  return 1;\n}\n","import { atomSorter } from 'atom-sorter';\nimport { groupsObject } from 'chemical-groups';\n\nimport { Kind } from '../Kind';\n\n/**\n *\n * @param {*} lines\n * @param {object} [options={}]\n * @param {boolean} [options.expand=true] - Should we expand the groupsObject\n */\n\nexport function toParts(lines, options = {}) {\n  const { expand: shouldExpandgroupsObject = true } = options;\n  let parts = [];\n  let currentPart = createNewPart();\n  let previousKind = Kind.BEGIN;\n  parts.push(currentPart);\n  for (let line of lines) {\n    switch (line.kind) {\n      case Kind.ATOM:\n      case Kind.ISOTOPE_RATIO:\n      case Kind.ISOTOPE:\n      case Kind.CHARGE:\n        currentPart.lines.push({ ...line, multiplier: 1 });\n        break;\n      case Kind.OPENING_PARENTHESIS:\n        openingParenthesis(currentPart);\n        break;\n      case Kind.CLOSING_PARENTHESIS:\n        closingParenthesis(currentPart);\n        break;\n      case Kind.PRE_MULTIPLIER:\n        preMultiplier(currentPart, line);\n        break;\n      case Kind.MULTIPLIER:\n        postMultiplier(currentPart, line.value, previousKind);\n        break;\n      case Kind.SALT:\n        globalPartMultiplier(currentPart);\n        currentPart = createNewPart();\n        parts.push(currentPart);\n        break;\n      case Kind.ANCHOR: // we ignore anchors to create the parts and canonized MF\n        break;\n      case Kind.COMMENT: // we ignore comments to create the parts and canonized MF\n        break;\n      case Kind.TEXT:\n        break;\n      default:\n        throw new Error(`Can not process mf having: ${line.kind}`);\n    }\n    previousKind = line.kind;\n  }\n  globalPartMultiplier(currentPart);\n  if (shouldExpandgroupsObject) expandgroupsObject(parts);\n  return combineAtomsIsotopesCharges(parts);\n}\n\nfunction createNewPart() {\n  let currentMultiplier = { value: 1, fromIndex: 0 };\n  return { lines: [], multipliers: [currentMultiplier], currentMultiplier };\n}\n\nfunction openingParenthesis(currentPart) {\n  currentPart.currentMultiplier = {\n    value: 1,\n    fromIndex: currentPart.lines.length,\n  };\n  currentPart.multipliers.push(currentPart.currentMultiplier);\n}\n\nfunction closingParenthesis(currentPart) {\n  currentPart.currentMultiplier = currentPart.multipliers.pop();\n  if (currentPart.currentMultiplier !== 1) {\n    for (\n      let i = currentPart.currentMultiplier.fromIndex;\n      i < currentPart.lines.length;\n      i++\n    ) {\n      currentPart.lines[i].multiplier *= currentPart.currentMultiplier.value;\n    }\n  }\n}\n\nfunction preMultiplier(currentPart, line) {\n  currentPart.currentMultiplier.value *= line.value;\n}\n\nfunction globalPartMultiplier(currentPart) {\n  for (\n    let i = currentPart.multipliers[0].fromIndex;\n    i < currentPart.lines.length;\n    i++\n  ) {\n    currentPart.lines[i].multiplier *= currentPart.multipliers[0].value;\n  }\n}\n\nfunction postMultiplier(currentPart, value, previousKind) {\n  if (previousKind === Kind.CLOSING_PARENTHESIS) {\n    // need to apply to everything till the previous parenthesis\n    for (\n      let i = currentPart.currentMultiplier.fromIndex;\n      i < currentPart.lines.length;\n      i++\n    ) {\n      currentPart.lines[i].multiplier *= value;\n    }\n  } else {\n    // just applies to the previous element\n    currentPart.lines[currentPart.lines.length - 1].multiplier *= value;\n  }\n}\n\nfunction expandgroupsObject(parts) {\n  for (let part of parts) {\n    let expanded = false;\n    for (let i = 0; i < part.lines.length; i++) {\n      let line = part.lines[i];\n      if (line.kind === Kind.ATOM) {\n        let group = groupsObject[line.value];\n\n        if (group) {\n          expanded = true;\n          for (let element of group.elements) {\n            if (element.isotope) {\n              part.lines.push({\n                kind: 'isotope',\n                value: { atom: element.symbol, isotope: element.isotope },\n                multiplier: line.multiplier * element.number,\n              });\n            } else {\n              part.lines.push({\n                kind: 'atom',\n                value: element.symbol,\n                multiplier: line.multiplier * element.number,\n              });\n            }\n          }\n          part.lines[i] = undefined;\n        }\n      }\n    }\n    if (expanded) part.lines = part.lines.filter((a) => a);\n  }\n}\n\nfunction combineAtomsIsotopesCharges(parts) {\n  let results = [];\n  for (let part of parts) {\n    let result = [];\n    results.push(result);\n    calculateAndSortKeys(part);\n\n    let currentKey = '';\n    for (let key of part.keys) {\n      if (key.key === Kind.CHARGE) {\n        if (currentKey !== key.key) {\n          result.push({\n            kind: Kind.CHARGE,\n            value: key.value.value * key.value.multiplier,\n          });\n        } else {\n          result[result.length - 1].value +=\n            key.value.value * key.value.multiplier;\n        }\n      } else if (currentKey !== key.key) {\n        result.push(key.value);\n      } else {\n        result[result.length - 1].multiplier += key.value.multiplier;\n      }\n      currentKey = key.key;\n    }\n\n    result.sort((a, b) => {\n      if (a.kind === Kind.CHARGE) return 1;\n      if (b.kind === Kind.CHARGE) return -1;\n\n      let atomA = a.kind === Kind.ATOM ? a.value : a.value.atom;\n      let atomB = b.kind === Kind.ATOM ? b.value : b.value.atom;\n      if (atomA !== atomB) return atomSorter(atomA, atomB);\n      // same atome but some isotopes ...\n      if (a.kind === Kind.ATOM) return -1;\n      if (b.kind === Kind.ATOM) return 1;\n      if (a.kind === Kind.ISOTOPE) return -1;\n      if (b.kind === Kind.ISOTOPE) return 1;\n      if (a.kind === Kind.ISOTOPE_RATIO) return -1;\n      if (b.kind === Kind.ISOTOPE_RATIO) return 1;\n      return 0;\n    });\n  }\n  return results;\n}\n\nfunction calculateAndSortKeys(part) {\n  part.keys = [];\n  for (let line of part.lines) {\n    part.keys.push({ key: getKey(line), value: line });\n  }\n  part.keys.sort((a, b) => stringComparator(a.key, b.key));\n}\n\nfunction getKey(line) {\n  let key = [line.kind];\n\n  switch (line.kind) {\n    case Kind.CHARGE:\n      break;\n    default:\n      if (typeof line.value === 'string') {\n        key.push(line.value);\n      } else {\n        for (let prop of Object.keys(line.value).sort()) {\n          key.push(line.value[prop]);\n        }\n      }\n  }\n  return key.join('-');\n}\n\nfunction stringComparator(a, b) {\n  if (a < b) return -1;\n  if (a > b) return 1;\n  return 0;\n}\n","import { ensureCase } from './ensureCase';\nimport { parse } from './parse';\nimport { getEA } from './util/getEA';\nimport { getElements } from './util/getElements';\nimport { getInfo } from './util/getInfo';\nimport { getIsotopesInfo } from './util/getIsotopesInfo';\nimport { partsToDisplay } from './util/partsToDisplay';\nimport { partsToMF } from './util/partsToMF';\nimport { toDisplay } from './util/toDisplay';\nimport { toHtml } from './util/toHtml';\nimport { toParts } from './util/toParts';\nimport { toText } from './util/toText';\n\n/**\n * Class allowing to deal with molecular formula and derived information\n */\nexport class MF {\n  constructor(mf, options = {}) {\n    if (options.ensureCase) {\n      mf = ensureCase(mf);\n    }\n    this.parsed = parse(mf);\n    this.cache = {};\n  }\n\n  toDisplay() {\n    if (!this.cache.displayed) this.cache.displayed = toDisplay(this.parsed);\n    return this.cache.displayed;\n  }\n\n  toHtml() {\n    if (!this.cache.html) {\n      this.toDisplay();\n      this.cache.html = toHtml(this.cache.displayed);\n    }\n    return this.cache.html;\n  }\n\n  toText() {\n    if (!this.cache.text) {\n      this.toDisplay();\n      this.cache.text = toText(this.cache.displayed);\n    }\n    return this.cache.text;\n  }\n\n  toCanonicText() {\n    if (!this.cache.canonicText) {\n      this.cache.canonicText = new MF(this.toMF()).toText(this.cache.displayed);\n    }\n    return this.cache.canonicText;\n  }\n\n  toParts(options) {\n    if (!this.cache.parts) {\n      this.cache.parts = toParts(this.parsed, options);\n    }\n    return this.cache.parts;\n  }\n\n  /**\n   * Returns an object with the global MF, global charge, monoisotopic mass and mass\n   * as well as the same information for all the parts\n   * @param {object} [options={}] options\n   * @param {object} [options.customUnsaturations={}] custom unsaturations\n   * @param {string} [options.emFieldName='monoisotopicMass'] name of the monoisotopic mass field\n   * @param {string} [options.msemFieldName='observedMonoisotopicMass'] name of the observed monoisotopic mass field\n   */\n  getInfo(options = {}) {\n    if (!this.cache.info) {\n      this.toParts();\n      this.cache.info = getInfo(this.cache.parts, options);\n    }\n    return this.cache.info;\n  }\n\n  /**\n   * Returns an object with the elemental analysis\n   */\n  getEA(options = {}) {\n    if (!this.cache.ea) {\n      this.toParts();\n      this.cache.ea = getEA(this.cache.parts, options);\n    }\n    return this.cache.ea;\n  }\n\n  /**\n   * Get the different elements for each part\n   * @returns an array\n   */\n  getElements() {\n    if (!this.cache.elements) {\n      this.toParts();\n      this.cache.elements = getElements(this.cache.parts);\n    }\n    return this.cache.elements;\n  }\n\n  /**\n   * Returns an array with each atom and isotopic composition\n   */\n  getIsotopesInfo(options = {}) {\n    if (!this.cache.isotopesInfo) {\n      this.toParts();\n      this.cache.isotopesInfo = getIsotopesInfo(this.cache.parts, options);\n    }\n    return this.cache.isotopesInfo;\n  }\n\n  /**\n   * Get a canonized MF\n   */\n  toMF() {\n    if (!this.cache.mf) {\n      this.toParts();\n      this.cache.mf = partsToMF(this.cache.parts);\n    }\n    return this.cache.mf;\n  }\n\n  /**\n   * Get a canonized MF\n   */\n  toNeutralMF() {\n    if (!this.cache.neutralMF) {\n      this.toParts();\n      this.cache.neutralMF = partsToMF(this.cache.parts, { neutral: true });\n    }\n    return this.cache.neutralMF;\n  }\n\n  canonize() {\n    this.toParts();\n    this.cache.displayed = partsToDisplay(this.cache.parts);\n    this.cache.html = undefined;\n  }\n}\n","import { Format } from '../Format';\nimport { Style } from '../Style';\n\nexport function toHtml(lines) {\n  let html = [];\n  for (let line of lines) {\n    switch (line.kind) {\n      case Format.SUBSCRIPT:\n        html.push(`<sub>${line.value}</sub>`);\n        break;\n      case Format.SUPERSCRIPT:\n        html.push(`<sup>${line.value}</sup>`);\n        break;\n      case Format.SUPERIMPOSE:\n        html.push(`<span style=\"${Style.SUPERIMPOSE}\">`);\n        html.push(\n          `<sup style=\"${Style.SUPERIMPOSE_SUP_SUB}\">${line.over}</sup>`,\n        );\n        html.push(\n          `<sub style=\"${Style.SUPERIMPOSE_SUP_SUB}\">${line.under}</sub>`,\n        );\n        html.push('</span>');\n        break;\n      default:\n        html.push(line.value);\n    }\n  }\n  return html.join('');\n}\n","import { Format } from '../Format';\n\nimport { superscript, subscript } from './subSuperscript';\n\nexport function toText(lines) {\n  let text = [];\n  for (let line of lines) {\n    switch (line.kind) {\n      case Format.SUBSCRIPT:\n        {\n          const value = String(line.value);\n          for (let i = 0; i < value.length; i++) {\n            const char = value[i];\n            if (subscript[char]) {\n              text.push(subscript[char]);\n            } else {\n              throw new Error(`Subscript problem with: ${char}`);\n            }\n          }\n        }\n        break;\n      case Format.SUPERSCRIPT: {\n        const value = String(line.value);\n        for (let i = 0; i < value.length; i++) {\n          const char = value[i];\n          if (superscript[char]) {\n            text.push(superscript[char]);\n          } else {\n            throw new Error(`Superscript problem with: ${char}`);\n          }\n        }\n        break;\n      }\n      case Format.SUPERIMPOSE: {\n        const under = String(line.under);\n        for (let i = 0; i < under.length; i++) {\n          const char = under[i];\n          if (subscript[char]) {\n            text.push(subscript[char]);\n          } else {\n            throw new Error(`Subscript problem with: ${char}`);\n          }\n        }\n        const over = String(line.over);\n        for (let i = 0; i < over.length; i++) {\n          const char = over[i];\n          if (superscript[char]) {\n            text.push(superscript[char]);\n          } else {\n            throw new Error(`Superscript problem with: ${char}`);\n          }\n        }\n        break;\n      }\n      default:\n        text.push(line.value);\n    }\n  }\n  return text.join('');\n}\n","import { Kind } from '../Kind';\n\nimport { toDisplay } from './toDisplay.js';\n/**\n * Converts an array of mf elements to an array of formatting information\n * @param {Array<Object>} result of the parse method\n */\n\nexport function partsToDisplay(parts) {\n  let lines = [];\n  for (let part of parts) {\n    if (lines.length > 0) lines.push({ kind: Kind.SALT, value: '•' });\n    for (let partLine of part) {\n      lines.push(partLine);\n      if (partLine.multiplier) {\n        lines.push({\n          kind: Kind.MULTIPLIER,\n          value: partLine.multiplier,\n        });\n      }\n    }\n  }\n\n  return toDisplay(lines);\n}\n","import {\n  xyObjectMaxXPoint,\n  xyObjectMinXPoint,\n  xyObjectSumY,\n} from 'ml-spectra-processing';\n\n/**\n * Filter the array of peaks\n * @param {array} peaks - array of all the peaks\n * @param {object} [options={}]\n * @param {number} [options.from] - min X value of the window to consider\n * @param {number} [options.to] - max X value of the window to consider\n * @param {number} [options.threshold=0.01] - minimal intensity compare to base peak\n * @param {number} [options.limit=undefined] - maximal number of peaks (based on intensity)\n * @param {number} [options.sumValue] // if sumValue is defined, maxValue is ignored\n * @returns {array} - copy of peaks with 'close' annotation\n */\n\nexport function getPeaks(peaks, options = {}) {\n  const {\n    from = xyObjectMinXPoint(peaks).x,\n    to = xyObjectMaxXPoint(peaks).x,\n    threshold = 0.01,\n    limit,\n    sumValue,\n  } = options;\n\n  let maxY = Number.MIN_SAFE_INTEGER;\n  for (let peak of peaks) {\n    if (peak.y > maxY) maxY = peak.y;\n  }\n  let minY = maxY * threshold;\n\n  peaks = peaks.filter(\n    (peak) => peak.x >= from && peak.x <= to && peak.y >= minY,\n  );\n\n  if (limit && peaks.length > limit) {\n    peaks.sort((a, b) => b.y - a.y);\n    peaks = peaks.slice(0, limit);\n  }\n  if (sumValue) {\n    peaks = JSON.parse(JSON.stringify(peaks));\n    const currentSum = xyObjectSumY(peaks);\n    const ratio = sumValue / currentSum;\n    peaks.forEach((peak) => (peak.y *= ratio));\n  }\n\n  return peaks.sort((a, b) => a.x - b.x);\n}\n","import { xyObjectCheck } from './xyObjectCheck';\n/**\n * Calculate the sum of Y values\n *\n * @param points - Object that contains property x and y (an array)\n */\nexport function xyObjectSumY(points = []) {\n    xyObjectCheck(points);\n    let sum = 0;\n    for (let point of points) {\n        sum += point.y;\n    }\n    return sum;\n}\n//# sourceMappingURL=xyObjectSumY.js.map","export function calculateOverlapFromDiff(diffs) {\n    if (diffs[1].length === 0)\n        return 0;\n    let sumPos = 0;\n    for (let i = 0; i < diffs[1].length; i++) {\n        sumPos += Math.abs(diffs[1][i]);\n    }\n    return 1 - sumPos;\n}\n//# sourceMappingURL=calculateOverlapFromDiff.js.map","/**\n * This code requires the use of an array like  [[x1,y1],[x2,y2], ...]\n * If it is not the right format, we will just convert it\n * Otherwise we return the correct format\n * @param {Peaks} peaks\n * @returns [number[], number[]]\n */\nexport function checkPeaks(peaks) {\n    // if it is already a 2D array of points, we just return them\n    if (Array.isArray(peaks) && Array.isArray(peaks[0]) && peaks.length === 2) {\n        return peaks;\n    }\n    if (Array.isArray(peaks.x) && Array.isArray(peaks.y)) {\n        return [peaks.x, peaks.y];\n    }\n    const x = new Array(peaks.length);\n    const y = new Array(peaks.length);\n    for (let i = 0; i < peaks.length; i++) {\n        x[i] = peaks[i][0];\n        y[i] = peaks[i][1];\n    }\n    return [x, y];\n}\n//# sourceMappingURL=checkPeaks.js.map","export function extract(array, from, to) {\n    const newArray = [[], []];\n    let j = 0;\n    const length = array[0] ? array[0].length : 0;\n    for (let i = 0; i < length; i++) {\n        if ((!from || array[0][i] >= from) && (!to || array[0][i] <= to)) {\n            newArray[0][j] = array[0][i];\n            newArray[1][j] = array[1][i];\n            j++;\n        }\n    }\n    return newArray;\n}\n//# sourceMappingURL=extract.js.map","// returns an new array based on array1 where there is a peak of array2 at a distance under width/2\nexport function getCommonArray(array1, array2, width) {\n    const newArray = [[], []];\n    let pos2 = 0;\n    width /= 2;\n    let j = 0;\n    const array1Length = array1[0] ? array1[0].length : 0;\n    const array2Length = array2[0] ? array2[0].length : 0;\n    for (let i = 0; i < array1Length; i++) {\n        while (pos2 < array2Length && array1[0][i] > array2[0][pos2] + width) {\n            pos2++;\n        }\n        if (pos2 < array2Length && array1[0][i] > array2[0][pos2] - width) {\n            newArray[0][j] = array1[0][i];\n            newArray[1][j] = array1[1][i];\n            j++;\n        }\n    }\n    return newArray;\n}\n//# sourceMappingURL=getCommonArray.js.map","'use strict';\n\nfunction compareNumbers(a, b) {\n    return a - b;\n}\n\n/**\n * Computes the sum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.sum = function sum(values) {\n    var sum = 0;\n    for (var i = 0; i < values.length; i++) {\n        sum += values[i];\n    }\n    return sum;\n};\n\n/**\n * Computes the maximum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.max = function max(values) {\n    var max = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] > max) max = values[i];\n    }\n    return max;\n};\n\n/**\n * Computes the minimum of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.min = function min(values) {\n    var min = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] < min) min = values[i];\n    }\n    return min;\n};\n\n/**\n * Computes the min and max of the given values\n * @param {Array} values\n * @returns {{min: number, max: number}}\n */\nexports.minMax = function minMax(values) {\n    var min = values[0];\n    var max = values[0];\n    var l = values.length;\n    for (var i = 1; i < l; i++) {\n        if (values[i] < min) min = values[i];\n        if (values[i] > max) max = values[i];\n    }\n    return {\n        min: min,\n        max: max\n    };\n};\n\n/**\n * Computes the arithmetic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.arithmeticMean = function arithmeticMean(values) {\n    var sum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        sum += values[i];\n    }\n    return sum / l;\n};\n\n/**\n * {@link arithmeticMean}\n */\nexports.mean = exports.arithmeticMean;\n\n/**\n * Computes the geometric mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.geometricMean = function geometricMean(values) {\n    var mul = 1;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        mul *= values[i];\n    }\n    return Math.pow(mul, 1 / l);\n};\n\n/**\n * Computes the mean of the log of the given values\n * If the return value is exponentiated, it gives the same result as the\n * geometric mean.\n * @param {Array} values\n * @returns {number}\n */\nexports.logMean = function logMean(values) {\n    var lnsum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        lnsum += Math.log(values[i]);\n    }\n    return lnsum / l;\n};\n\n/**\n * Computes the weighted grand mean for a list of means and sample sizes\n * @param {Array} means - Mean values for each set of samples\n * @param {Array} samples - Number of original values for each set of samples\n * @returns {number}\n */\nexports.grandMean = function grandMean(means, samples) {\n    var sum = 0;\n    var n = 0;\n    var l = means.length;\n    for (var i = 0; i < l; i++) {\n        sum += samples[i] * means[i];\n        n += samples[i];\n    }\n    return sum / n;\n};\n\n/**\n * Computes the truncated mean of the given values using a given percentage\n * @param {Array} values\n * @param {number} percent - The percentage of values to keep (range: [0,1])\n * @param {boolean} [alreadySorted=false]\n * @returns {number}\n */\nexports.truncatedMean = function truncatedMean(values, percent, alreadySorted) {\n    if (alreadySorted === undefined) alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n    var l = values.length;\n    var k = Math.floor(l * percent);\n    var sum = 0;\n    for (var i = k; i < (l - k); i++) {\n        sum += values[i];\n    }\n    return sum / (l - 2 * k);\n};\n\n/**\n * Computes the harmonic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.harmonicMean = function harmonicMean(values) {\n    var sum = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        if (values[i] === 0) {\n            throw new RangeError('value at index ' + i + 'is zero');\n        }\n        sum += 1 / values[i];\n    }\n    return l / sum;\n};\n\n/**\n * Computes the contraharmonic mean of the given values\n * @param {Array} values\n * @returns {number}\n */\nexports.contraHarmonicMean = function contraHarmonicMean(values) {\n    var r1 = 0;\n    var r2 = 0;\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n        r1 += values[i] * values[i];\n        r2 += values[i];\n    }\n    if (r2 < 0) {\n        throw new RangeError('sum of values is negative');\n    }\n    return r1 / r2;\n};\n\n/**\n * Computes the median of the given values\n * @param {Array} values\n * @param {boolean} [alreadySorted=false]\n * @returns {number}\n */\nexports.median = function median(values, alreadySorted) {\n    if (alreadySorted === undefined) alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n    var l = values.length;\n    var half = Math.floor(l / 2);\n    if (l % 2 === 0) {\n        return (values[half - 1] + values[half]) * 0.5;\n    } else {\n        return values[half];\n    }\n};\n\n/**\n * Computes the variance of the given values\n * @param {Array} values\n * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.\n * @returns {number}\n */\nexports.variance = function variance(values, unbiased) {\n    if (unbiased === undefined) unbiased = true;\n    var theMean = exports.mean(values);\n    var theVariance = 0;\n    var l = values.length;\n\n    for (var i = 0; i < l; i++) {\n        var x = values[i] - theMean;\n        theVariance += x * x;\n    }\n\n    if (unbiased) {\n        return theVariance / (l - 1);\n    } else {\n        return theVariance / l;\n    }\n};\n\n/**\n * Computes the standard deviation of the given values\n * @param {Array} values\n * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.\n * @returns {number}\n */\nexports.standardDeviation = function standardDeviation(values, unbiased) {\n    return Math.sqrt(exports.variance(values, unbiased));\n};\n\nexports.standardError = function standardError(values) {\n    return exports.standardDeviation(values) / Math.sqrt(values.length);\n};\n\n/**\n * IEEE Transactions on biomedical engineering, vol. 52, no. 1, january 2005, p. 76-\n * Calculate the standard deviation via the Median of the absolute deviation\n *  The formula for the standard deviation only holds for Gaussian random variables.\n * @returns {{mean: number, stdev: number}}\n */\nexports.robustMeanAndStdev = function robustMeanAndStdev(y) {\n    var mean = 0, stdev = 0;\n    var length = y.length, i = 0;\n    for (i = 0; i < length; i++) {\n        mean += y[i];\n    }\n    mean /= length;\n    var averageDeviations = new Array(length);\n    for (i = 0; i < length; i++)\n        averageDeviations[i] = Math.abs(y[i] - mean);\n    averageDeviations.sort(compareNumbers);\n    if (length % 2 === 1) {\n        stdev = averageDeviations[(length - 1) / 2] / 0.6745;\n    } else {\n        stdev = 0.5 * (averageDeviations[length / 2] + averageDeviations[length / 2 - 1]) / 0.6745;\n    }\n\n    return {\n        mean: mean,\n        stdev: stdev\n    };\n};\n\nexports.quartiles = function quartiles(values, alreadySorted) {\n    if (typeof (alreadySorted) === 'undefined') alreadySorted = false;\n    if (!alreadySorted) {\n        values = [].concat(values).sort(compareNumbers);\n    }\n\n    var quart = values.length / 4;\n    var q1 = values[Math.ceil(quart) - 1];\n    var q2 = exports.median(values, true);\n    var q3 = values[Math.ceil(quart * 3) - 1];\n\n    return {q1: q1, q2: q2, q3: q3};\n};\n\nexports.pooledStandardDeviation = function pooledStandardDeviation(samples, unbiased) {\n    return Math.sqrt(exports.pooledVariance(samples, unbiased));\n};\n\nexports.pooledVariance = function pooledVariance(samples, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var sum = 0;\n    var length = 0, l = samples.length;\n    for (var i = 0; i < l; i++) {\n        var values = samples[i];\n        var vari = exports.variance(values);\n\n        sum += (values.length - 1) * vari;\n\n        if (unbiased)\n            length += values.length - 1;\n        else\n            length += values.length;\n    }\n    return sum / length;\n};\n\nexports.mode = function mode(values) {\n    var l = values.length,\n        itemCount = new Array(l),\n        i;\n    for (i = 0; i < l; i++) {\n        itemCount[i] = 0;\n    }\n    var itemArray = new Array(l);\n    var count = 0;\n\n    for (i = 0; i < l; i++) {\n        var index = itemArray.indexOf(values[i]);\n        if (index >= 0)\n            itemCount[index]++;\n        else {\n            itemArray[count] = values[i];\n            itemCount[count] = 1;\n            count++;\n        }\n    }\n\n    var maxValue = 0, maxIndex = 0;\n    for (i = 0; i < count; i++) {\n        if (itemCount[i] > maxValue) {\n            maxValue = itemCount[i];\n            maxIndex = i;\n        }\n    }\n\n    return itemArray[maxIndex];\n};\n\nexports.covariance = function covariance(vector1, vector2, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var mean1 = exports.mean(vector1);\n    var mean2 = exports.mean(vector2);\n\n    if (vector1.length !== vector2.length)\n        throw 'Vectors do not have the same dimensions';\n\n    var cov = 0, l = vector1.length;\n    for (var i = 0; i < l; i++) {\n        var x = vector1[i] - mean1;\n        var y = vector2[i] - mean2;\n        cov += x * y;\n    }\n\n    if (unbiased)\n        return cov / (l - 1);\n    else\n        return cov / l;\n};\n\nexports.skewness = function skewness(values, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var theMean = exports.mean(values);\n\n    var s2 = 0, s3 = 0, l = values.length;\n    for (var i = 0; i < l; i++) {\n        var dev = values[i] - theMean;\n        s2 += dev * dev;\n        s3 += dev * dev * dev;\n    }\n    var m2 = s2 / l;\n    var m3 = s3 / l;\n\n    var g = m3 / (Math.pow(m2, 3 / 2.0));\n    if (unbiased) {\n        var a = Math.sqrt(l * (l - 1));\n        var b = l - 2;\n        return (a / b) * g;\n    } else {\n        return g;\n    }\n};\n\nexports.kurtosis = function kurtosis(values, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var theMean = exports.mean(values);\n    var n = values.length, s2 = 0, s4 = 0;\n\n    for (var i = 0; i < n; i++) {\n        var dev = values[i] - theMean;\n        s2 += dev * dev;\n        s4 += dev * dev * dev * dev;\n    }\n    var m2 = s2 / n;\n    var m4 = s4 / n;\n\n    if (unbiased) {\n        var v = s2 / (n - 1);\n        var a = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));\n        var b = s4 / (v * v);\n        var c = ((n - 1) * (n - 1)) / ((n - 2) * (n - 3));\n\n        return a * b - 3 * c;\n    } else {\n        return m4 / (m2 * m2) - 3;\n    }\n};\n\nexports.entropy = function entropy(values, eps) {\n    if (typeof (eps) === 'undefined') eps = 0;\n    var sum = 0, l = values.length;\n    for (var i = 0; i < l; i++)\n        sum += values[i] * Math.log(values[i] + eps);\n    return -sum;\n};\n\nexports.weightedMean = function weightedMean(values, weights) {\n    var sum = 0, l = values.length;\n    for (var i = 0; i < l; i++)\n        sum += values[i] * weights[i];\n    return sum;\n};\n\nexports.weightedStandardDeviation = function weightedStandardDeviation(values, weights) {\n    return Math.sqrt(exports.weightedVariance(values, weights));\n};\n\nexports.weightedVariance = function weightedVariance(values, weights) {\n    var theMean = exports.weightedMean(values, weights);\n    var vari = 0, l = values.length;\n    var a = 0, b = 0;\n\n    for (var i = 0; i < l; i++) {\n        var z = values[i] - theMean;\n        var w = weights[i];\n\n        vari += w * (z * z);\n        b += w;\n        a += w * w;\n    }\n\n    return vari * (b / (b * b - a));\n};\n\nexports.center = function center(values, inPlace) {\n    if (typeof (inPlace) === 'undefined') inPlace = false;\n\n    var result = values;\n    if (!inPlace)\n        result = [].concat(values);\n\n    var theMean = exports.mean(result), l = result.length;\n    for (var i = 0; i < l; i++)\n        result[i] -= theMean;\n};\n\nexports.standardize = function standardize(values, standardDev, inPlace) {\n    if (typeof (standardDev) === 'undefined') standardDev = exports.standardDeviation(values);\n    if (typeof (inPlace) === 'undefined') inPlace = false;\n    var l = values.length;\n    var result = inPlace ? values : new Array(l);\n    for (var i = 0; i < l; i++)\n        result[i] = values[i] / standardDev;\n    return result;\n};\n\nexports.cumulativeSum = function cumulativeSum(array) {\n    var l = array.length;\n    var result = new Array(l);\n    result[0] = array[0];\n    for (var i = 1; i < l; i++)\n        result[i] = result[i - 1] + array[i];\n    return result;\n};\n","'use strict';\n\nvar arrayStat = require('./array');\n\nfunction compareNumbers(a, b) {\n    return a - b;\n}\n\nexports.max = function max(matrix) {\n    var max = -Infinity;\n    for (var i = 0; i < matrix.length; i++) {\n        for (var j = 0; j < matrix[i].length; j++) {\n            if (matrix[i][j] > max) max = matrix[i][j];\n        }\n    }\n    return max;\n};\n\nexports.min = function min(matrix) {\n    var min = Infinity;\n    for (var i = 0; i < matrix.length; i++) {\n        for (var j = 0; j < matrix[i].length; j++) {\n            if (matrix[i][j] < min) min = matrix[i][j];\n        }\n    }\n    return min;\n};\n\nexports.minMax = function minMax(matrix) {\n    var min = Infinity;\n    var max = -Infinity;\n    for (var i = 0; i < matrix.length; i++) {\n        for (var j = 0; j < matrix[i].length; j++) {\n            if (matrix[i][j] < min) min = matrix[i][j];\n            if (matrix[i][j] > max) max = matrix[i][j];\n        }\n    }\n    return {\n        min:min,\n        max:max\n    };\n};\n\nexports.entropy = function entropy(matrix, eps) {\n    if (typeof (eps) === 'undefined') {\n        eps = 0;\n    }\n    var sum = 0,\n        l1 = matrix.length,\n        l2 = matrix[0].length;\n    for (var i = 0; i < l1; i++) {\n        for (var j = 0; j < l2; j++) {\n            sum += matrix[i][j] * Math.log(matrix[i][j] + eps);\n        }\n    }\n    return -sum;\n};\n\nexports.mean = function mean(matrix, dimension) {\n    if (typeof (dimension) === 'undefined') {\n        dimension = 0;\n    }\n    var rows = matrix.length,\n        cols = matrix[0].length,\n        theMean, N, i, j;\n\n    if (dimension === -1) {\n        theMean = [0];\n        N = rows * cols;\n        for (i = 0; i < rows; i++) {\n            for (j = 0; j < cols; j++) {\n                theMean[0] += matrix[i][j];\n            }\n        }\n        theMean[0] /= N;\n    } else if (dimension === 0) {\n        theMean = new Array(cols);\n        N = rows;\n        for (j = 0; j < cols; j++) {\n            theMean[j] = 0;\n            for (i = 0; i < rows; i++) {\n                theMean[j] += matrix[i][j];\n            }\n            theMean[j] /= N;\n        }\n    } else if (dimension === 1) {\n        theMean = new Array(rows);\n        N = cols;\n        for (j = 0; j < rows; j++) {\n            theMean[j] = 0;\n            for (i = 0; i < cols; i++) {\n                theMean[j] += matrix[j][i];\n            }\n            theMean[j] /= N;\n        }\n    } else {\n        throw new Error('Invalid dimension');\n    }\n    return theMean;\n};\n\nexports.sum = function sum(matrix, dimension) {\n    if (typeof (dimension) === 'undefined') {\n        dimension = 0;\n    }\n    var rows = matrix.length,\n        cols = matrix[0].length,\n        theSum, i, j;\n\n    if (dimension === -1) {\n        theSum = [0];\n        for (i = 0; i < rows; i++) {\n            for (j = 0; j < cols; j++) {\n                theSum[0] += matrix[i][j];\n            }\n        }\n    } else if (dimension === 0) {\n        theSum = new Array(cols);\n        for (j = 0; j < cols; j++) {\n            theSum[j] = 0;\n            for (i = 0; i < rows; i++) {\n                theSum[j] += matrix[i][j];\n            }\n        }\n    } else if (dimension === 1) {\n        theSum = new Array(rows);\n        for (j = 0; j < rows; j++) {\n            theSum[j] = 0;\n            for (i = 0; i < cols; i++) {\n                theSum[j] += matrix[j][i];\n            }\n        }\n    } else {\n        throw new Error('Invalid dimension');\n    }\n    return theSum;\n};\n\nexports.product = function product(matrix, dimension) {\n    if (typeof (dimension) === 'undefined') {\n        dimension = 0;\n    }\n    var rows = matrix.length,\n        cols = matrix[0].length,\n        theProduct, i, j;\n\n    if (dimension === -1) {\n        theProduct = [1];\n        for (i = 0; i < rows; i++) {\n            for (j = 0; j < cols; j++) {\n                theProduct[0] *= matrix[i][j];\n            }\n        }\n    } else if (dimension === 0) {\n        theProduct = new Array(cols);\n        for (j = 0; j < cols; j++) {\n            theProduct[j] = 1;\n            for (i = 0; i < rows; i++) {\n                theProduct[j] *= matrix[i][j];\n            }\n        }\n    } else if (dimension === 1) {\n        theProduct = new Array(rows);\n        for (j = 0; j < rows; j++) {\n            theProduct[j] = 1;\n            for (i = 0; i < cols; i++) {\n                theProduct[j] *= matrix[j][i];\n            }\n        }\n    } else {\n        throw new Error('Invalid dimension');\n    }\n    return theProduct;\n};\n\nexports.standardDeviation = function standardDeviation(matrix, means, unbiased) {\n    var vari = exports.variance(matrix, means, unbiased), l = vari.length;\n    for (var i = 0; i < l; i++) {\n        vari[i] = Math.sqrt(vari[i]);\n    }\n    return vari;\n};\n\nexports.variance = function variance(matrix, means, unbiased) {\n    if (typeof (unbiased) === 'undefined') {\n        unbiased = true;\n    }\n    means = means || exports.mean(matrix);\n    var rows = matrix.length;\n    if (rows === 0) return [];\n    var cols = matrix[0].length;\n    var vari = new Array(cols);\n\n    for (var j = 0; j < cols; j++) {\n        var sum1 = 0, sum2 = 0, x = 0;\n        for (var i = 0; i < rows; i++) {\n            x = matrix[i][j] - means[j];\n            sum1 += x;\n            sum2 += x * x;\n        }\n        if (unbiased) {\n            vari[j] = (sum2 - ((sum1 * sum1) / rows)) / (rows - 1);\n        } else {\n            vari[j] = (sum2 - ((sum1 * sum1) / rows)) / rows;\n        }\n    }\n    return vari;\n};\n\nexports.median = function median(matrix) {\n    var rows = matrix.length, cols = matrix[0].length;\n    var medians = new Array(cols);\n\n    for (var i = 0; i < cols; i++) {\n        var data = new Array(rows);\n        for (var j = 0; j < rows; j++) {\n            data[j] = matrix[j][i];\n        }\n        data.sort(compareNumbers);\n        var N = data.length;\n        if (N % 2 === 0) {\n            medians[i] = (data[N / 2] + data[(N / 2) - 1]) * 0.5;\n        } else {\n            medians[i] = data[Math.floor(N / 2)];\n        }\n    }\n    return medians;\n};\n\nexports.mode = function mode(matrix) {\n    var rows = matrix.length,\n        cols = matrix[0].length,\n        modes = new Array(cols),\n        i, j;\n    for (i = 0; i < cols; i++) {\n        var itemCount = new Array(rows);\n        for (var k = 0; k < rows; k++) {\n            itemCount[k] = 0;\n        }\n        var itemArray = new Array(rows);\n        var count = 0;\n\n        for (j = 0; j < rows; j++) {\n            var index = itemArray.indexOf(matrix[j][i]);\n            if (index >= 0) {\n                itemCount[index]++;\n            } else {\n                itemArray[count] = matrix[j][i];\n                itemCount[count] = 1;\n                count++;\n            }\n        }\n\n        var maxValue = 0, maxIndex = 0;\n        for (j = 0; j < count; j++) {\n            if (itemCount[j] > maxValue) {\n                maxValue = itemCount[j];\n                maxIndex = j;\n            }\n        }\n\n        modes[i] = itemArray[maxIndex];\n    }\n    return modes;\n};\n\nexports.skewness = function skewness(matrix, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var means = exports.mean(matrix);\n    var n = matrix.length, l = means.length;\n    var skew = new Array(l);\n\n    for (var j = 0; j < l; j++) {\n        var s2 = 0, s3 = 0;\n        for (var i = 0; i < n; i++) {\n            var dev = matrix[i][j] - means[j];\n            s2 += dev * dev;\n            s3 += dev * dev * dev;\n        }\n\n        var m2 = s2 / n;\n        var m3 = s3 / n;\n        var g = m3 / Math.pow(m2, 3 / 2);\n\n        if (unbiased) {\n            var a = Math.sqrt(n * (n - 1));\n            var b = n - 2;\n            skew[j] = (a / b) * g;\n        } else {\n            skew[j] = g;\n        }\n    }\n    return skew;\n};\n\nexports.kurtosis = function kurtosis(matrix, unbiased) {\n    if (typeof (unbiased) === 'undefined') unbiased = true;\n    var means = exports.mean(matrix);\n    var n = matrix.length, m = matrix[0].length;\n    var kurt = new Array(m);\n\n    for (var j = 0; j < m; j++) {\n        var s2 = 0, s4 = 0;\n        for (var i = 0; i < n; i++) {\n            var dev = matrix[i][j] - means[j];\n            s2 += dev * dev;\n            s4 += dev * dev * dev * dev;\n        }\n        var m2 = s2 / n;\n        var m4 = s4 / n;\n\n        if (unbiased) {\n            var v = s2 / (n - 1);\n            var a = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));\n            var b = s4 / (v * v);\n            var c = ((n - 1) * (n - 1)) / ((n - 2) * (n - 3));\n            kurt[j] = a * b - 3 * c;\n        } else {\n            kurt[j] = m4 / (m2 * m2) - 3;\n        }\n    }\n    return kurt;\n};\n\nexports.standardError = function standardError(matrix) {\n    var samples = matrix.length;\n    var standardDeviations = exports.standardDeviation(matrix);\n    var l = standardDeviations.length;\n    var standardErrors = new Array(l);\n    var sqrtN = Math.sqrt(samples);\n\n    for (var i = 0; i < l; i++) {\n        standardErrors[i] = standardDeviations[i] / sqrtN;\n    }\n    return standardErrors;\n};\n\nexports.covariance = function covariance(matrix, dimension) {\n    return exports.scatter(matrix, undefined, dimension);\n};\n\nexports.scatter = function scatter(matrix, divisor, dimension) {\n    if (typeof (dimension) === 'undefined') {\n        dimension = 0;\n    }\n    if (typeof (divisor) === 'undefined') {\n        if (dimension === 0) {\n            divisor = matrix.length - 1;\n        } else if (dimension === 1) {\n            divisor = matrix[0].length - 1;\n        }\n    }\n    var means = exports.mean(matrix, dimension);\n    var rows = matrix.length;\n    if (rows === 0) {\n        return [[]];\n    }\n    var cols = matrix[0].length,\n        cov, i, j, s, k;\n\n    if (dimension === 0) {\n        cov = new Array(cols);\n        for (i = 0; i < cols; i++) {\n            cov[i] = new Array(cols);\n        }\n        for (i = 0; i < cols; i++) {\n            for (j = i; j < cols; j++) {\n                s = 0;\n                for (k = 0; k < rows; k++) {\n                    s += (matrix[k][j] - means[j]) * (matrix[k][i] - means[i]);\n                }\n                s /= divisor;\n                cov[i][j] = s;\n                cov[j][i] = s;\n            }\n        }\n    } else if (dimension === 1) {\n        cov = new Array(rows);\n        for (i = 0; i < rows; i++) {\n            cov[i] = new Array(rows);\n        }\n        for (i = 0; i < rows; i++) {\n            for (j = i; j < rows; j++) {\n                s = 0;\n                for (k = 0; k < cols; k++) {\n                    s += (matrix[j][k] - means[j]) * (matrix[i][k] - means[i]);\n                }\n                s /= divisor;\n                cov[i][j] = s;\n                cov[j][i] = s;\n            }\n        }\n    } else {\n        throw new Error('Invalid dimension');\n    }\n\n    return cov;\n};\n\nexports.correlation = function correlation(matrix) {\n    var means = exports.mean(matrix),\n        standardDeviations = exports.standardDeviation(matrix, true, means),\n        scores = exports.zScores(matrix, means, standardDeviations),\n        rows = matrix.length,\n        cols = matrix[0].length,\n        i, j;\n\n    var cor = new Array(cols);\n    for (i = 0; i < cols; i++) {\n        cor[i] = new Array(cols);\n    }\n    for (i = 0; i < cols; i++) {\n        for (j = i; j < cols; j++) {\n            var c = 0;\n            for (var k = 0, l = scores.length; k < l; k++) {\n                c += scores[k][j] * scores[k][i];\n            }\n            c /= rows - 1;\n            cor[i][j] = c;\n            cor[j][i] = c;\n        }\n    }\n    return cor;\n};\n\nexports.zScores = function zScores(matrix, means, standardDeviations) {\n    means = means || exports.mean(matrix);\n    if (typeof (standardDeviations) === 'undefined') standardDeviations = exports.standardDeviation(matrix, true, means);\n    return exports.standardize(exports.center(matrix, means, false), standardDeviations, true);\n};\n\nexports.center = function center(matrix, means, inPlace) {\n    means = means || exports.mean(matrix);\n    var result = matrix,\n        l = matrix.length,\n        i, j, jj;\n\n    if (!inPlace) {\n        result = new Array(l);\n        for (i = 0; i < l; i++) {\n            result[i] = new Array(matrix[i].length);\n        }\n    }\n\n    for (i = 0; i < l; i++) {\n        var row = result[i];\n        for (j = 0, jj = row.length; j < jj; j++) {\n            row[j] = matrix[i][j] - means[j];\n        }\n    }\n    return result;\n};\n\nexports.standardize = function standardize(matrix, standardDeviations, inPlace) {\n    if (typeof (standardDeviations) === 'undefined') standardDeviations = exports.standardDeviation(matrix);\n    var result = matrix,\n        l = matrix.length,\n        i, j, jj;\n\n    if (!inPlace) {\n        result = new Array(l);\n        for (i = 0; i < l; i++) {\n            result[i] = new Array(matrix[i].length);\n        }\n    }\n\n    for (i = 0; i < l; i++) {\n        var resultRow = result[i];\n        var sourceRow = matrix[i];\n        for (j = 0, jj = resultRow.length; j < jj; j++) {\n            if (standardDeviations[j] !== 0 && !isNaN(standardDeviations[j])) {\n                resultRow[j] = sourceRow[j] / standardDeviations[j];\n            }\n        }\n    }\n    return result;\n};\n\nexports.weightedVariance = function weightedVariance(matrix, weights) {\n    var means = exports.mean(matrix);\n    var rows = matrix.length;\n    if (rows === 0) return [];\n    var cols = matrix[0].length;\n    var vari = new Array(cols);\n\n    for (var j = 0; j < cols; j++) {\n        var sum = 0;\n        var a = 0, b = 0;\n\n        for (var i = 0; i < rows; i++) {\n            var z = matrix[i][j] - means[j];\n            var w = weights[i];\n\n            sum += w * (z * z);\n            b += w;\n            a += w * w;\n        }\n\n        vari[j] = sum * (b / (b * b - a));\n    }\n\n    return vari;\n};\n\nexports.weightedMean = function weightedMean(matrix, weights, dimension) {\n    if (typeof (dimension) === 'undefined') {\n        dimension = 0;\n    }\n    var rows = matrix.length;\n    if (rows === 0) return [];\n    var cols = matrix[0].length,\n        means, i, ii, j, w, row;\n\n    if (dimension === 0) {\n        means = new Array(cols);\n        for (i = 0; i < cols; i++) {\n            means[i] = 0;\n        }\n        for (i = 0; i < rows; i++) {\n            row = matrix[i];\n            w = weights[i];\n            for (j = 0; j < cols; j++) {\n                means[j] += row[j] * w;\n            }\n        }\n    } else if (dimension === 1) {\n        means = new Array(rows);\n        for (i = 0; i < rows; i++) {\n            means[i] = 0;\n        }\n        for (j = 0; j < rows; j++) {\n            row = matrix[j];\n            w = weights[j];\n            for (i = 0; i < cols; i++) {\n                means[j] += row[i] * w;\n            }\n        }\n    } else {\n        throw new Error('Invalid dimension');\n    }\n\n    var weightSum = arrayStat.sum(weights);\n    if (weightSum !== 0) {\n        for (i = 0, ii = means.length; i < ii; i++) {\n            means[i] /= weightSum;\n        }\n    }\n    return means;\n};\n\nexports.weightedCovariance = function weightedCovariance(matrix, weights, means, dimension) {\n    dimension = dimension || 0;\n    means = means || exports.weightedMean(matrix, weights, dimension);\n    var s1 = 0, s2 = 0;\n    for (var i = 0, ii = weights.length; i < ii; i++) {\n        s1 += weights[i];\n        s2 += weights[i] * weights[i];\n    }\n    var factor = s1 / (s1 * s1 - s2);\n    return exports.weightedScatter(matrix, weights, means, factor, dimension);\n};\n\nexports.weightedScatter = function weightedScatter(matrix, weights, means, factor, dimension) {\n    dimension = dimension || 0;\n    means = means || exports.weightedMean(matrix, weights, dimension);\n    if (typeof (factor) === 'undefined') {\n        factor = 1;\n    }\n    var rows = matrix.length;\n    if (rows === 0) {\n        return [[]];\n    }\n    var cols = matrix[0].length,\n        cov, i, j, k, s;\n\n    if (dimension === 0) {\n        cov = new Array(cols);\n        for (i = 0; i < cols; i++) {\n            cov[i] = new Array(cols);\n        }\n        for (i = 0; i < cols; i++) {\n            for (j = i; j < cols; j++) {\n                s = 0;\n                for (k = 0; k < rows; k++) {\n                    s += weights[k] * (matrix[k][j] - means[j]) * (matrix[k][i] - means[i]);\n                }\n                cov[i][j] = s * factor;\n                cov[j][i] = s * factor;\n            }\n        }\n    } else if (dimension === 1) {\n        cov = new Array(rows);\n        for (i = 0; i < rows; i++) {\n            cov[i] = new Array(rows);\n        }\n        for (i = 0; i < rows; i++) {\n            for (j = i; j < rows; j++) {\n                s = 0;\n                for (k = 0; k < cols; k++) {\n                    s += weights[k] * (matrix[j][k] - means[j]) * (matrix[i][k] - means[i]);\n                }\n                cov[i][j] = s * factor;\n                cov[j][i] = s * factor;\n            }\n        }\n    } else {\n        throw new Error('Invalid dimension');\n    }\n\n    return cov;\n};\n","'use strict';\n\nexports.array = require('./array');\nexports.matrix = require('./matrix');\n","import { array as StatArray } from 'ml-stat';\nexport function normalize(array) {\n    const min = StatArray.min(array[1]);\n    const max = StatArray.max(array[1]);\n    const sum = StatArray.sum(array[1]);\n    const length = array[1] ? array[1].length : 0;\n    if (sum !== 0) {\n        for (let i = 0; i < length; i++) {\n            array[1][i] /= sum;\n        }\n    }\n    return {\n        sum,\n        min,\n        max,\n    };\n}\n//# sourceMappingURL=normalize.js.map","import { extract } from './extract';\nimport { getCommonArray } from './getCommonArray';\nimport { normalize } from './normalize';\nimport { COMMON_SECOND, COMMON_FIRST } from './index';\n// this method will systematically take care of both array\nexport function commonExtractAndNormalize(array1, array2, width, from, to, common) {\n    if (!Array.isArray(array1) || !Array.isArray(array2)) {\n        return {\n            info: undefined,\n            data: undefined,\n        };\n    }\n    const extract1 = extract(array1, from, to);\n    const extract2 = extract(array2, from, to);\n    let common1, common2, info1, info2;\n    if (common & COMMON_SECOND) {\n        common1 = getCommonArray(extract1, extract2, width);\n        info1 = normalize(common1);\n    }\n    else {\n        common1 = extract1;\n        info1 = normalize(common1);\n    }\n    if (common & COMMON_FIRST) {\n        common2 = getCommonArray(extract2, extract1, width);\n        info2 = normalize(common2);\n    }\n    else {\n        common2 = extract2;\n        info2 = normalize(common2);\n    }\n    return {\n        info1,\n        info2,\n        data1: common1,\n        data2: common2,\n    };\n}\n//# sourceMappingURL=commonExtractAndNormalize.js.map","import { extract } from './extract';\nimport { normalize } from './normalize';\nexport function extractAndNormalize(array, from, to) {\n    if (!Array.isArray(array)) {\n        return {\n            info: undefined,\n            data: undefined,\n        };\n    }\n    const newArray = extract(array, from, to);\n    const info = normalize(newArray);\n    return {\n        info,\n        data: newArray,\n    };\n}\n//# sourceMappingURL=extractAndNormalize.js.map","// Adapted from: http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/1968345#1968345\nexport function getIntersection(segment1, segment2) {\n    const p0X = segment1[0][0];\n    const p0Y = segment1[0][1];\n    const p1X = segment1[1][0];\n    const p1Y = segment1[1][1];\n    const p2X = segment2[0][0];\n    const p2Y = segment2[0][1];\n    const p3X = segment2[1][0];\n    const p3Y = segment2[1][1];\n    const s1X = p1X - p0X;\n    const s1Y = p1Y - p0Y;\n    const s2X = p3X - p2X;\n    const s2Y = p3Y - p2Y;\n    const s = (-s1Y * (p0X - p2X) + s1X * (p0Y - p2Y)) / (-s2X * s1Y + s1X * s2Y);\n    const t = (s2X * (p0Y - p2Y) - s2Y * (p0X - p2X)) / (-s2X * s1Y + s1X * s2Y);\n    if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n        return {\n            x: p0X + t * s1X,\n            y: p0Y + t * s1Y,\n        };\n    }\n    return null; // No collision\n}\n//# sourceMappingURL=getIntersection.js.map","import { calculateOverlapFromDiff } from './calculateOverlapFromDiff';\nimport { checkPeaks } from './checkPeaks';\nimport { commonExtractAndNormalize } from './commonExtractAndNormalize';\nimport { extract } from './extract';\nimport { extractAndNormalize } from './extractAndNormalize';\nimport { getCommonArray } from './getCommonArray.js';\nimport { getIntersection } from './getIntersection';\nimport { normalize } from './normalize';\nexport const COMMON_NO = 0;\nexport const COMMON_FIRST = 1;\nexport const COMMON_SECOND = 2;\nexport const COMMON_BOTH = 3;\n/**\n * A number, or a string containing a number.\n * @typedef {([number[],number[]]|[number,number][]|{x:number[],y:number[]})} Peaks\n */\n/**\n * Create a comparator class\n * {object} [options={}]\n * {string} [options.common=''] should we take only common peaks 'first', 'second', 'both', ''\n * {number} [options.widthBottom=2] bottom trapezoid width for similarity evaluation\n * {number} [options.widthTop=1] top trapezoid width for similarity evaluation\n * {number} [options.from] from region used for similarity calculation\n * {number} [options.to] to region used for similarity calculation\n */\nexport class Comparator {\n    constructor(options = {}) {\n        this.array1 = [];\n        this.array2 = [];\n        this.setOptions(options);\n    }\n    /*\n       2 formats are allowed:\n       [[x1,x2,...],[y1,y2,...]] or [[x1,y1],[x2,y2], ...]\n      */\n    setOptions(options = {}) {\n        if (typeof options.common === 'string') {\n            if (options.common.toLowerCase() === 'first') {\n                this.common = COMMON_FIRST;\n            }\n            else if (options.common.toLowerCase() === 'second') {\n                this.common = COMMON_SECOND;\n            }\n            else if (options.common.toLowerCase() === 'both') {\n                this.common = COMMON_BOTH;\n            }\n            else {\n                this.common = COMMON_NO;\n            }\n        }\n        else if (options.common === true) {\n            this.common = COMMON_BOTH;\n        }\n        else {\n            this.common = COMMON_NO;\n        }\n        this.trapezoid = options.trapezoid;\n        this.commonFactor = options.commonFactor || this.commonFactor || 4;\n        const { widthBottom = this.widthBottom || 2, widthTop = this.widthTop || 1, from = this.from, to = this.to, } = options;\n        this.setTrapezoid(widthBottom, widthTop);\n        this.setFromTo(from, to);\n    }\n    /**\n     *\n     * @param {Peaks} peaks\n     */\n    setPeaks1(peaks) {\n        this.array1 = checkPeaks(peaks);\n        if (this.common) {\n            const extracts = commonExtractAndNormalize(this.array1, this.array2, this.widthBottom, this.from, this.to, this.common);\n            this.array1Extract = extracts.data1;\n            this.array1ExtractInfo = extracts.info1;\n            this.array2Extract = extracts.data2;\n            this.array2ExtractInfo = extracts.info2;\n        }\n        else {\n            const extract = extractAndNormalize(this.array1, this.from, this.to);\n            this.array1Extract = extract.data;\n            this.array1ExtractInfo = extract.info;\n        }\n    }\n    /**\n     *\n     * @param {Peaks} peaks\n     */\n    setPeaks2(peaks) {\n        this.array2 = checkPeaks(peaks);\n        if (this.common) {\n            const extracts = commonExtractAndNormalize(this.array1, this.array2, this.widthBottom, this.from, this.to, this.common);\n            this.array1Extract = extracts.data1;\n            this.array1ExtractInfo = extracts.info1;\n            this.array2Extract = extracts.data2;\n            this.array2ExtractInfo = extracts.info2;\n        }\n        else {\n            const extract = extractAndNormalize(this.array2, this.from, this.to);\n            this.array2Extract = extract.data;\n            this.array2ExtractInfo = extract.info;\n        }\n    }\n    getExtract1() {\n        return this.array1Extract;\n    }\n    getExtract2() {\n        return this.array2Extract;\n    }\n    getExtractInfo1() {\n        return this.array1ExtractInfo;\n    }\n    getExtractInfo2() {\n        return this.array2ExtractInfo;\n    }\n    /**\n     * Set the new bottom and top width of the trapezoid\n     * @param {number} newWidthBottom\n     * @param {number} newWidthTop\n     */\n    setTrapezoid(newWidthBottom, newWidthTop) {\n        this.widthTop = newWidthTop;\n        this.widthBottom = newWidthBottom;\n        this.widthSlope = (this.widthBottom - this.widthTop) / 2;\n        if (this.widthBottom < this.widthTop) {\n            throw new Error('widthBottom has to be larger than widthTop');\n        }\n    }\n    /**\n     * Set the from / to for comparison\n     * @param {number} newFrom - set the new from value\n     * @param {number} newTo - set the new to value\n     * @returns\n     */\n    setFromTo(newFrom, newTo) {\n        if (newFrom === this.from && newTo === this.to)\n            return;\n        this.from = newFrom;\n        this.to = newTo;\n        if (this.common) {\n            const extracts = commonExtractAndNormalize(this.array1, this.array2, this.widthBottom, this.from, this.to, this.common, this.commonFactor);\n            this.array1Extract = extracts.data1;\n            this.array1ExtractInfo = extracts.info1;\n            this.array2Extract = extracts.data2;\n            this.array2ExtractInfo = extracts.info2;\n        }\n        else {\n            let extract1 = extractAndNormalize(this.array1, this.from, this.to);\n            this.array1Extract = extract1.data;\n            this.array1ExtractInfo = extract1.info;\n            let extract2 = extractAndNormalize(this.array2, this.from, this.to);\n            this.array2Extract = extract2.data;\n            this.array2ExtractInfo = extract2.info;\n        }\n    }\n    /**\n     *\n     * @param {number} x1\n     * @param {number} y1\n     * @param {number} x2\n     * @param {number} y2\n     * @returns\n     */\n    getOverlap(x1, y1, x2, y2) {\n        if (y1 === 0 || y2 === 0)\n            return 0;\n        // TAKE CARE !!! We multiply the diff by 2 !!!\n        const diff = Math.abs(x1 - x2) * 2;\n        if (diff > this.widthBottom)\n            return 0;\n        if (diff <= this.widthTop) {\n            return Math.min(y1, y2);\n        }\n        const maxValue = (Math.max(y1, y2) * (this.widthBottom - diff)) /\n            (this.widthBottom - this.widthTop);\n        return Math.min(y1, y2, maxValue);\n    }\n    /**\n     * This is the old trapezoid similarity\n     * @param {number} x1\n     * @param {number} y1\n     * @param {number} x2\n     * @param {number} y2\n     * @param {number} widthTop\n     * @param {number} widthBottom\n     * @returns\n     */\n    getOverlapTrapezoid(x1, y1, x2, y2, widthTop, widthBottom) {\n        // eslint-disable-next-line no-console\n        console.error('getOverlapTrapezoid should not be used anymore');\n        const factor = 2 / (widthTop + widthBottom); // correction for surface=1\n        if (y1 === 0 || y2 === 0)\n            return 0;\n        if (x1 === x2) {\n            // they have the same position\n            return Math.min(y1, y2);\n        }\n        const diff = Math.abs(x1 - x2);\n        if (diff >= widthBottom)\n            return 0;\n        if (y1 === y2) {\n            // do they have the same height ???\n            // we need to find the common length\n            if (diff <= widthTop) {\n                return ((widthTop + widthBottom) / 2 - diff) * y1 * factor;\n            }\n            else if (diff <= widthBottom) {\n                return ((((((widthBottom - diff) * y1) / 2) * (diff - widthTop)) /\n                    (widthBottom - widthTop)) *\n                    factor);\n            }\n            return 0;\n        }\n        else {\n            // the height are different and not the same position ...\n            // we need to consider only one segment to find its intersection\n            const small = Math.min(y1, y2);\n            const big = Math.max(y1, y2);\n            const targets = [\n                [\n                    [0, 0],\n                    [this.widthSlope, small],\n                ],\n                [\n                    [this.widthSlope, small],\n                    [this.widthSlope + widthTop, small],\n                ],\n                [\n                    [widthTop + this.widthSlope, small],\n                    [widthBottom, 0],\n                ],\n            ];\n            let segment;\n            if ((x1 > x2 && y1 > y2) || (x1 < x2 && y1 < y2)) {\n                segment = [\n                    [diff, 0],\n                    [diff + this.widthSlope, big],\n                ];\n            }\n            else {\n                segment = [\n                    [diff + this.widthSlope, big],\n                    [diff, 0],\n                ];\n            }\n            for (let i = 0; i < 3; i++) {\n                const intersection = getIntersection(targets[i], segment);\n                if (intersection) {\n                    switch (i) {\n                        case 0:\n                            return small - ((diff * intersection.y) / 2) * factor;\n                        case 1: // to simplify ...\n                            //     console.log(\"           \",widthSlope,small,big,intersection.x)\n                            return ((((this.widthSlope * small) / (2 * big)) * small +\n                                (widthTop + this.widthSlope - intersection.x) * small +\n                                (this.widthSlope * small) / 2) *\n                                factor);\n                        case 2:\n                            return (((widthBottom - diff) * intersection.y) / 2) * factor;\n                        default:\n                            throw new Error(`unexpected intersection value: ${i}`);\n                    }\n                }\n            }\n        }\n        return NaN;\n    }\n    /**\n     * This method calculates the total diff. The sum of positive value will yield to overlap\n     * @returns\n     */\n    calculateDiff() {\n        // we need to take 2 pointers\n        // and travel progressively between them ...\n        const newFirst = [\n            this.array1Extract[0].slice(),\n            this.array1Extract[1].slice(),\n        ];\n        const newSecond = [\n            this.array2Extract[0].slice(),\n            this.array2Extract[1].slice(),\n        ];\n        const array1Length = this.array1Extract[0]\n            ? this.array1Extract[0].length\n            : 0;\n        const array2Length = this.array2Extract[0]\n            ? this.array2Extract[0].length\n            : 0;\n        let pos1 = 0;\n        let pos2 = 0;\n        let previous2 = 0;\n        while (pos1 < array1Length) {\n            const diff = newFirst[0][pos1] - this.array2Extract[0][pos2];\n            if (Math.abs(diff) < this.widthBottom) {\n                // there is some overlap\n                let overlap;\n                if (this.trapezoid) {\n                    // old trapezoid overlap similarity\n                    overlap = this.getOverlapTrapezoid(newFirst[0][pos1], newFirst[1][pos1], newSecond[0][pos2], newSecond[1][pos2], this.widthTop, this.widthBottom);\n                }\n                else {\n                    overlap = this.getOverlap(newFirst[0][pos1], newFirst[1][pos1], newSecond[0][pos2], newSecond[1][pos2], this.widthTop, this.widthBottom);\n                }\n                newFirst[1][pos1] -= overlap;\n                newSecond[1][pos2] -= overlap;\n                if (pos2 < array2Length - 1) {\n                    pos2++;\n                }\n                else {\n                    pos1++;\n                    pos2 = previous2;\n                }\n            }\n            else if (diff > 0 && pos2 < array2Length - 1) {\n                pos2++;\n                previous2 = pos2;\n            }\n            else {\n                pos1++;\n                pos2 = previous2;\n            }\n        }\n        return newSecond;\n    }\n    /**\n     * Set the new peaks and return info\n     * @param {Peaks} newPeaks1\n     * @param {Peaks} newPeaks2\n     * @returns\n     */\n    getSimilarity(newPeaks1, newPeaks2) {\n        if (newPeaks1)\n            this.setPeaks1(newPeaks1);\n        if (newPeaks2)\n            this.setPeaks2(newPeaks2);\n        const diff = this.calculateDiff();\n        return {\n            diff,\n            extract1: this.getExtract1(),\n            extract2: this.getExtract2(),\n            extractInfo1: this.getExtractInfo1(),\n            extractInfo2: this.getExtractInfo2(),\n            similarity: calculateOverlapFromDiff(diff),\n            widthBottom: this.widthBottom,\n            widthTop: this.widthTop,\n        };\n    }\n    /**\n     * This works mainly when you have a array1 that is fixed\n     * newPeaks2 have to be normalized ! (sum to 1)\n     * @param {Peaks} newPeaks2\n     * @param {number} from\n     * @param {number} to\n     * @returns\n     */\n    fastSimilarity(newPeaks2, from, to) {\n        this.array1Extract = extract(this.array1, from, to);\n        this.array2Extract = newPeaks2;\n        if (this.common & COMMON_SECOND) {\n            this.array1Extract = getCommonArray(this.array1Extract, this.array2Extract, this.widthBottom);\n        }\n        normalize(this.array1Extract);\n        const diff = this.calculateDiff();\n        return calculateOverlapFromDiff(diff);\n    }\n}\n//# sourceMappingURL=index.js.map","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 { isAnyArray } from 'is-any-array';\n/**\n * Apply Savitzky Golay algorithm\n * @param [ys] Array of y values\n * @param [xs] Array of X or deltaX\n * @return  Array containing the new ys (same length)\n */\nexport function sgg(ys, xs, options = {}) {\n    let { windowSize = 9, derivative = 0, polynomial = 3 } = options;\n    if (windowSize % 2 === 0 || windowSize < 5 || !Number.isInteger(windowSize)) {\n        throw new RangeError('Invalid window size (should be odd and at least 5 integer number)');\n    }\n    if (!isAnyArray(ys)) {\n        throw new TypeError('Y values must be an array');\n    }\n    if (typeof xs === 'undefined') {\n        throw new TypeError('X must be defined');\n    }\n    if (windowSize > ys.length) {\n        throw new RangeError(`Window size is higher than the data length ${windowSize}>${ys.length}`);\n    }\n    if (derivative < 0 || !Number.isInteger(derivative)) {\n        throw new RangeError('Derivative should be a positive integer');\n    }\n    if (polynomial < 1 || !Number.isInteger(polynomial)) {\n        throw new RangeError('Polynomial should be a positive integer');\n    }\n    if (polynomial >= 6) {\n        // eslint-disable-next-line no-console\n        console.warn('You should not use polynomial grade higher than 5 if you are' +\n            ' not sure that your data arises from such a model. Possible polynomial oscillation problems');\n    }\n    let half = Math.floor(windowSize / 2);\n    let np = ys.length;\n    let ans = new Float64Array(np);\n    let weights = fullWeights(windowSize, polynomial, derivative);\n    let hs = 0;\n    let constantH = true;\n    if (isAnyArray(xs)) {\n        constantH = false;\n    }\n    else {\n        hs = Math.pow(xs, derivative);\n    }\n    //For the borders\n    for (let i = 0; i < half; i++) {\n        let wg1 = weights[half - i - 1];\n        let wg2 = weights[half + i + 1];\n        let d1 = 0;\n        let d2 = 0;\n        for (let l = 0; l < windowSize; l++) {\n            d1 += wg1[l] * ys[l];\n            d2 += wg2[l] * ys[np - windowSize + l];\n        }\n        if (constantH) {\n            ans[half - i - 1] = d1 / hs;\n            ans[np - half + i] = d2 / hs;\n        }\n        else {\n            hs = getHs(xs, half - i - 1, half, derivative);\n            ans[half - i - 1] = d1 / hs;\n            hs = getHs(xs, np - half + i, half, derivative);\n            ans[np - half + i] = d2 / hs;\n        }\n    }\n    //For the internal points\n    let wg = weights[half];\n    for (let i = windowSize; i <= np; i++) {\n        let d = 0;\n        for (let l = 0; l < windowSize; l++)\n            d += wg[l] * ys[l + i - windowSize];\n        if (!constantH) {\n            hs = getHs(xs, i - half - 1, half, derivative);\n        }\n        ans[i - half - 1] = d / hs;\n    }\n    return ans;\n}\nfunction getHs(h, center, half, derivative) {\n    let hs = 0;\n    let count = 0;\n    for (let i = center - half; i < center + half; i++) {\n        if (i >= 0 && i < h.length - 1) {\n            hs += h[i + 1] - h[i];\n            count++;\n        }\n    }\n    return Math.pow(hs / count, derivative);\n}\nfunction gramPoly(i, m, k, s) {\n    let Grampoly = 0;\n    if (k > 0) {\n        Grampoly =\n            ((4 * k - 2) / (k * (2 * m - k + 1))) *\n                (i * gramPoly(i, m, k - 1, s) + s * gramPoly(i, m, k - 1, s - 1)) -\n                (((k - 1) * (2 * m + k)) / (k * (2 * m - k + 1))) *\n                    gramPoly(i, m, k - 2, s);\n    }\n    else {\n        if (k === 0 && s === 0) {\n            Grampoly = 1;\n        }\n        else {\n            Grampoly = 0;\n        }\n    }\n    return Grampoly;\n}\nfunction genFact(a, b) {\n    let gf = 1;\n    if (a >= b) {\n        for (let j = a - b + 1; j <= a; j++) {\n            gf *= j;\n        }\n    }\n    return gf;\n}\nfunction weight(i, t, m, n, s) {\n    let sum = 0;\n    for (let k = 0; k <= n; k++) {\n        sum +=\n            (2 * k + 1) *\n                (genFact(2 * m, k) / genFact(2 * m + k + 1, k + 1)) *\n                gramPoly(i, m, k, 0) *\n                gramPoly(t, m, k, s);\n    }\n    return sum;\n}\n/**\n * @private\n * @param m  Number of points\n * @param n  Polynomial grade\n * @param s  Derivative\n */\nfunction fullWeights(m, n, s) {\n    let weights = new Array(m);\n    let np = Math.floor(m / 2);\n    for (let t = -np; t <= np; t++) {\n        weights[t + np] = new Float64Array(m);\n        for (let j = -np; j <= np; j++) {\n            weights[t + np][j + np] = weight(j, t, np, n, s);\n        }\n    }\n    return weights;\n}\n//# sourceMappingURL=index.js.map","import { v4 as generateID } from '@lukeed/uuid';\nimport { sgg } from 'ml-savitzky-golay-generalized';\nimport { xIsEquallySpaced, xIsMonotonic, xMinValue, xMaxValue, xNoiseStandardDeviation, } from 'ml-spectra-processing';\nimport { optimizeTop } from './utils/optimizeTop';\n/**\n * Global spectra deconvolution\n * @param  data - Object data with x and y arrays. Values in x has to be growing\n * @param {number} [options.broadRatio = 0.00] - If `broadRatio` is higher than 0, then all the peaks which second derivative\n * smaller than `broadRatio * maxAbsSecondDerivative` will be marked with the soft mask equal to true.\n\n */\nexport function gsd(data, options = {}) {\n    let { sgOptions = {\n        windowSize: 9,\n        polynomial: 3,\n    }, noiseLevel, smoothY = false, maxCriteria = true, minMaxRatio = 0.00025, realTopDetection = false, } = options;\n    let { x, y } = data;\n    if (xIsMonotonic(x) !== 1) {\n        throw new Error('GSD only accepts monotone increasing x values');\n    }\n    //rescale;\n    y = y.slice();\n    // If the max difference between delta x is less than 5%, then,\n    // we can assume it to be equally spaced variable\n    let equallySpaced = xIsEquallySpaced(x);\n    if (noiseLevel === undefined) {\n        if (equallySpaced) {\n            const noiseInfo = xNoiseStandardDeviation(y);\n            if (maxCriteria) {\n                noiseLevel = noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n            else {\n                noiseLevel = -noiseInfo.median + 1.5 * noiseInfo.sd;\n            }\n        }\n        else {\n            noiseLevel = 0;\n        }\n    }\n    else if (!maxCriteria) {\n        noiseLevel *= -1;\n    }\n    if (!maxCriteria) {\n        for (let i = 0; i < y.length; i++) {\n            y[i] *= -1;\n        }\n    }\n    if (noiseLevel !== undefined) {\n        for (let i = 0; i < y.length; i++) {\n            if (y[i] < noiseLevel) {\n                y[i] = noiseLevel;\n            }\n        }\n    }\n    let yData = y;\n    let dY, ddY;\n    const { windowSize, polynomial } = sgOptions;\n    if (equallySpaced) {\n        if (smoothY) {\n            yData = sgg(y, x[1] - x[0], {\n                windowSize,\n                polynomial,\n                derivative: 0,\n            });\n        }\n        dY = sgg(y, x[1] - x[0], {\n            windowSize,\n            polynomial,\n            derivative: 1,\n        });\n        ddY = sgg(y, x[1] - x[0], {\n            windowSize,\n            polynomial,\n            derivative: 2,\n        });\n    }\n    else {\n        if (smoothY) {\n            yData = sgg(y, x, {\n                windowSize,\n                polynomial,\n                derivative: 0,\n            });\n        }\n        dY = sgg(y, x, {\n            windowSize,\n            polynomial,\n            derivative: 1,\n        });\n        ddY = sgg(y, x, {\n            windowSize,\n            polynomial,\n            derivative: 2,\n        });\n    }\n    const minY = xMinValue(yData);\n    const maxY = xMaxValue(yData);\n    if (minY > maxY || minY === maxY)\n        return [];\n    const yThreshold = minY + (maxY - minY) * minMaxRatio;\n    const dX = x[1] - x[0];\n    let lastMax = null;\n    let lastMin = null;\n    let minddY = [];\n    let intervalL = [];\n    let intervalR = [];\n    // By the intermediate value theorem We cannot find 2 consecutive maximum or minimum\n    for (let i = 1; i < yData.length - 1; ++i) {\n        if ((dY[i] < dY[i - 1] && dY[i] <= dY[i + 1]) ||\n            (dY[i] <= dY[i - 1] && dY[i] < dY[i + 1])) {\n            lastMin = {\n                x: x[i],\n                index: i,\n            };\n            if (dX > 0 && lastMax !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Maximum in first derivative\n        if ((dY[i] >= dY[i - 1] && dY[i] > dY[i + 1]) ||\n            (dY[i] > dY[i - 1] && dY[i] >= dY[i + 1])) {\n            lastMax = {\n                x: x[i],\n                index: i,\n            };\n            if (dX < 0 && lastMin !== null) {\n                intervalL.push(lastMax);\n                intervalR.push(lastMin);\n            }\n        }\n        // Minimum in second derivative\n        if (ddY[i] < ddY[i - 1] && ddY[i] < ddY[i + 1]) {\n            minddY.push(i);\n        }\n    }\n    let lastK = -1;\n    const peaks = [];\n    for (const minddYIndex of minddY) {\n        let deltaX = x[minddYIndex];\n        let possible = -1;\n        let k = lastK + 1;\n        let minDistance = Number.POSITIVE_INFINITY;\n        let currentDistance = 0;\n        while (possible === -1 && k < intervalL.length) {\n            currentDistance = Math.abs(deltaX - (intervalL[k].x + intervalR[k].x) / 2);\n            if (currentDistance < (intervalR[k].x - intervalL[k].x) / 2) {\n                possible = k;\n                lastK = k;\n            }\n            ++k;\n            // Not getting closer?\n            if (currentDistance >= minDistance) {\n                break;\n            }\n            minDistance = currentDistance;\n        }\n        if (possible !== -1) {\n            if (yData[minddYIndex] > yThreshold) {\n                let width = Math.abs(intervalR[possible].x - intervalL[possible].x);\n                peaks.push({\n                    id: generateID(),\n                    x: deltaX,\n                    y: yData[minddYIndex],\n                    width,\n                    index: minddYIndex,\n                    ddY: ddY[minddYIndex],\n                    inflectionPoints: {\n                        from: intervalL[possible],\n                        to: intervalR[possible],\n                    },\n                });\n            }\n        }\n    }\n    if (realTopDetection) {\n        optimizeTop({ x, y: yData }, peaks);\n    }\n    peaks.forEach((peak) => {\n        if (!maxCriteria) {\n            peak.y *= -1;\n            peak.ddY = peak.ddY * -1;\n        }\n    });\n    peaks.sort((a, b) => {\n        return a.x - b.x;\n    });\n    return peaks;\n}\n//# sourceMappingURL=gsd.js.map","/**\n * Check if the values are separated always by the same difference\n *\n * @param array - Monotone growing array of number\n */\nexport function xIsEquallySpaced(array, options = {}) {\n    if (array.length < 3)\n        return true;\n    const { tolerance = 0.05 } = options;\n    let maxDx = 0;\n    let minDx = Number.MAX_SAFE_INTEGER;\n    for (let i = 0; i < array.length - 1; ++i) {\n        let absoluteDifference = array[i + 1] - array[i];\n        if (absoluteDifference < minDx) {\n            minDx = absoluteDifference;\n        }\n        if (absoluteDifference > maxDx) {\n            maxDx = absoluteDifference;\n        }\n    }\n    return (maxDx - minDx) / maxDx < tolerance;\n}\n//# sourceMappingURL=xIsEquallySpaced.js.map","/**\n * Correction of the x and y coordinates using a quadratic optimizations with the peak and its 3 closest neighbors to determine the true x,y values of the peak.\n * This process is done in place and is very fast.\n * @param data\n * @param peaks\n */\nexport function optimizeTop(data, peaks) {\n    const { x, y } = data;\n    for (const peak of peaks) {\n        let currentIndex = peak.index;\n        // The detected peak could be moved 1 or 2 units to left or right.\n        if (y[currentIndex - 1] >= y[currentIndex - 2] &&\n            y[currentIndex - 1] >= y[currentIndex]) {\n            currentIndex--;\n        }\n        else if (y[currentIndex + 1] >= y[currentIndex] &&\n            y[currentIndex + 1] >= y[currentIndex + 2]) {\n            currentIndex++;\n        }\n        else if (y[currentIndex - 2] >= y[currentIndex - 3] &&\n            y[currentIndex - 2] >= y[currentIndex - 1]) {\n            currentIndex -= 2;\n        }\n        else if (y[currentIndex + 2] >= y[currentIndex + 1] &&\n            y[currentIndex + 2] >= y[currentIndex + 3]) {\n            currentIndex += 2;\n        }\n        // interpolation to a sin() function\n        if (y[currentIndex - 1] > 0 &&\n            y[currentIndex + 1] > 0 &&\n            y[currentIndex] >= y[currentIndex - 1] &&\n            y[currentIndex] >= y[currentIndex + 1] &&\n            (y[currentIndex] !== y[currentIndex - 1] ||\n                y[currentIndex] !== y[currentIndex + 1])) {\n            let alpha = 20 * Math.log10(y[currentIndex - 1]);\n            let beta = 20 * Math.log10(y[currentIndex]);\n            let gamma = 20 * Math.log10(y[currentIndex + 1]);\n            let p = (0.5 * (alpha - gamma)) / (alpha - 2 * beta + gamma);\n            peak.x = x[currentIndex] + (x[currentIndex] - x[currentIndex - 1]) * p;\n            peak.y =\n                y[currentIndex] -\n                    0.25 * (y[currentIndex - 1] - y[currentIndex + 1]) * p;\n        }\n    }\n}\n//# sourceMappingURL=optimizeTop.js.map","export const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2;\nexport const ROOT_PI_OVER_LN2 = Math.sqrt(Math.PI / Math.LN2);\nexport const ROOT_THREE = Math.sqrt(3);\nexport const ROOT_2LN2 = Math.sqrt(2 * Math.LN2);\nexport const ROOT_2LN2_MINUS_ONE = Math.sqrt(2 * Math.LN2) - 1;\n//# sourceMappingURL=constants.js.map","import { ROOT_2LN2, GAUSSIAN_EXP_FACTOR, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport erfinv from '../../../util/erfinv';\nexport class Gaussian {\n    constructor(options = {}) {\n        const { fwhm = 500, sd } = options;\n        this.fwhm = sd ? gaussianWidthToFWHM(2 * sd) : fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return gaussianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return gaussianWidthToFWHM(width);\n    }\n    fct(x) {\n        return gaussianFct(x, this.fwhm);\n    }\n    getArea(height = calculateGaussianHeight({ fwhm: this.fwhm })) {\n        return getGaussianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getGaussianFactor(area);\n    }\n    getData(options = {}) {\n        return getGaussianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateGaussianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport function calculateGaussianHeight(options) {\n    let { fwhm = 500, area = 1, sd } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (2 * area) / ROOT_PI_OVER_LN2 / fwhm;\n}\n/**\n * Calculate the height of the gaussian function of a specific width (fwhm) at a speicifc\n * x position (the gaussian is centered on x=0)\n * @param x\n * @param fwhm\n * @returns y\n */\nexport function gaussianFct(x, fwhm) {\n    return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2));\n}\nexport function gaussianWidthToFWHM(width) {\n    return width * ROOT_2LN2;\n}\nexport function gaussianFwhmToWidth(fwhm) {\n    return fwhm / ROOT_2LN2;\n}\nexport function getGaussianArea(options) {\n    let { fwhm = 500, sd, height = 1 } = options;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    return (height * ROOT_PI_OVER_LN2 * fwhm) / 2;\n}\nexport function getGaussianFactor(area = 0.9999) {\n    return Math.sqrt(2) * erfinv(area);\n}\nexport function getGaussianData(shape = {}, options = {}) {\n    let { fwhm = 500, sd } = shape;\n    if (sd)\n        fwhm = gaussianWidthToFWHM(2 * sd);\n    let { length, factor = getGaussianFactor(), height = calculateGaussianHeight({ fwhm }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = gaussianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n}\n//# sourceMappingURL=Gaussian.js.map","// https://en.wikipedia.org/wiki/Error_function#Inverse_functions\n// This code yields to a good approximation\n// If needed a better implementation using polynomial can be found on https://en.wikipedia.org/wiki/Error_function#Inverse_functions\nexport default function erfinv(x) {\n    let a = 0.147;\n    if (x === 0)\n        return 0;\n    let ln1MinusXSqrd = Math.log(1 - x * x);\n    let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a);\n    let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a);\n    let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2);\n    return secondSqrt * (x > 0 ? 1 : -1);\n}\n//# sourceMappingURL=erfinv.js.map","import { ROOT_THREE } from '../../../util/constants';\nexport class Lorentzian {\n    constructor(options = {}) {\n        const { fwhm = 500 } = options;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm) {\n        return lorentzianFwhmToWidth(fwhm);\n    }\n    widthToFWHM(width) {\n        return lorentzianWidthToFWHM(width);\n    }\n    fct(x) {\n        return lorentzianFct(x, this.fwhm);\n    }\n    getArea(height = 1) {\n        return getLorentzianArea({ fwhm: this.fwhm, height });\n    }\n    getFactor(area) {\n        return getLorentzianFactor(area);\n    }\n    getData(options = {}) {\n        return getLorentzianData(this, options);\n    }\n    calculateHeight(area = 1) {\n        return calculateLorentzianHeight({ fwhm: this.fwhm, area });\n    }\n    getParameters() {\n        return ['fwhm'];\n    }\n}\nexport const calculateLorentzianHeight = ({ fwhm = 1, area = 1 }) => {\n    return (2 * area) / Math.PI / fwhm;\n};\nexport const getLorentzianArea = (options) => {\n    const { fwhm = 500, height = 1 } = options;\n    return (height * Math.PI * fwhm) / 2;\n};\nexport const lorentzianFct = (x, fwhm) => {\n    return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2);\n};\nexport const lorentzianWidthToFWHM = (width) => {\n    return width * ROOT_THREE;\n};\nexport const lorentzianFwhmToWidth = (fwhm) => {\n    return fwhm / ROOT_THREE;\n};\nexport const getLorentzianFactor = (area = 0.9999) => {\n    if (area >= 1) {\n        throw new Error('area should be (0 - 1)');\n    }\n    const halfResidual = (1 - area) * 0.5;\n    const quantileFunction = (p) => Math.tan(Math.PI * (p - 0.5));\n    return ((quantileFunction(1 - halfResidual) - quantileFunction(halfResidual)) / 2);\n};\nexport const getLorentzianData = (shape = {}, options = {}) => {\n    let { fwhm = 500 } = shape;\n    let { length, factor = getLorentzianFactor(), height = calculateLorentzianHeight({ fwhm, area: 1 }), } = options;\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = lorentzianFct(i - center, fwhm) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=Lorentzian.js.map","import { GAUSSIAN_EXP_FACTOR, ROOT_2LN2_MINUS_ONE, ROOT_PI_OVER_LN2, } from '../../../util/constants';\nimport { gaussianFct, getGaussianFactor } from '../gaussian/Gaussian';\nimport { lorentzianFct, getLorentzianFactor } from '../lorentzian/Lorentzian';\nexport class PseudoVoigt {\n    constructor(options = {}) {\n        const { fwhm = 500, mu = 0.5 } = options;\n        this.mu = mu;\n        this.fwhm = fwhm;\n    }\n    fwhmToWidth(fwhm = this.fwhm, mu = this.mu) {\n        return pseudoVoigtFwhmToWidth(fwhm, mu);\n    }\n    widthToFWHM(width, mu = this.mu) {\n        return pseudoVoigtWidthToFWHM(width, mu);\n    }\n    fct(x) {\n        return pseudoVoigtFct(x, this.fwhm, this.mu);\n    }\n    getArea(height = 1) {\n        return getPseudoVoigtArea({ fwhm: this.fwhm, height, mu: this.mu });\n    }\n    getFactor(area) {\n        return getPseudoVoigtFactor(area);\n    }\n    getData(options = {}) {\n        const { length, factor, height = calculatePseudoVoigtHeight({\n            fwhm: this.fwhm,\n            mu: this.mu,\n            area: 1,\n        }), } = options;\n        return getPseudoVoigtData(this, { factor, length, height });\n    }\n    calculateHeight(area = 1) {\n        return calculatePseudoVoigtHeight({ fwhm: this.fwhm, mu: this.mu, area });\n    }\n    getParameters() {\n        return ['fwhm', 'mu'];\n    }\n}\nexport const calculatePseudoVoigtHeight = (options = {}) => {\n    let { fwhm = 1, mu = 0.5, area = 1 } = options;\n    return (2 * area) / (fwhm * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI));\n};\nexport const pseudoVoigtFct = (x, fwhm, mu) => {\n    return (1 - mu) * lorentzianFct(x, fwhm) + mu * gaussianFct(x, fwhm);\n};\nexport const pseudoVoigtWidthToFWHM = (width, mu = 0.5) => {\n    return width * (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const pseudoVoigtFwhmToWidth = (fwhm, mu = 0.5) => {\n    return fwhm / (mu * ROOT_2LN2_MINUS_ONE + 1);\n};\nexport const getPseudoVoigtArea = (options) => {\n    const { fwhm = 500, height = 1, mu = 0.5 } = options;\n    return (fwhm * height * (mu * ROOT_PI_OVER_LN2 + (1 - mu) * Math.PI)) / 2;\n};\nexport const getPseudoVoigtFactor = (area = 0.9999, mu = 0.5) => {\n    return mu < 1 ? getLorentzianFactor(area) : getGaussianFactor(area);\n};\nexport const getPseudoVoigtData = (shape = {}, options = {}) => {\n    let { fwhm = 500, mu = 0.5 } = shape;\n    let { length, factor = getPseudoVoigtFactor(0.999, mu), height = calculatePseudoVoigtHeight({ fwhm, mu, area: 1 }), } = options;\n    if (!height) {\n        height =\n            1 /\n                ((mu / Math.sqrt(-GAUSSIAN_EXP_FACTOR / Math.PI)) * fwhm +\n                    ((1 - mu) * fwhm * Math.PI) / 2);\n    }\n    if (!length) {\n        length = Math.min(Math.ceil(fwhm * factor), Math.pow(2, 25) - 1);\n        if (length % 2 === 0)\n            length++;\n    }\n    const center = (length - 1) / 2;\n    const data = new Float64Array(length);\n    for (let i = 0; i <= center; i++) {\n        data[i] = pseudoVoigtFct(i - center, fwhm, mu) * height;\n        data[length - 1 - i] = data[i];\n    }\n    return data;\n};\n//# sourceMappingURL=PseudoVoigt.js.map","import { Gaussian } from './gaussian/Gaussian';\nimport { Lorentzian } from './lorentzian/Lorentzian';\nimport { PseudoVoigt } from './pseudoVoigt/PseudoVoigt';\n/**\n * Generate a instance of a specific kind of shape.\n */\nexport function getShape1D(shape) {\n    const { kind } = shape;\n    switch (kind) {\n        case 'gaussian':\n            return new Gaussian(shape);\n        case 'lorentzian':\n            return new Lorentzian(shape);\n        case 'pseudoVoigt':\n            return new PseudoVoigt(shape);\n        default: {\n            throw Error(`Unknown distribution ${kind}`);\n        }\n    }\n}\n//# sourceMappingURL=getShape1D.js.map","/**\n * @param {object}   [options={}]\n * @param {object}   [options.min=1]\n * @param {object}   [options.max=10]\n * @param {object}   [options.low=-1]\n * @param {object}   [options.high=1]\n * @param {object}   [options.precision=100]\n */\n\nconst NEUTRON_MASS = 1;\n\nexport function appendPeaksCharge(peaks, options = {}) {\n  let {\n    precision = 100,\n    low = -1,\n    high = 1,\n    min: minCharge = 1,\n    max: maxCharge = 10,\n  } = options;\n  let fromCharge =\n    minCharge * maxCharge > 0\n      ? Math.round(Math.min(Math.abs(minCharge), Math.abs(maxCharge)))\n      : 1;\n  let toCharge = Math.round(Math.max(Math.abs(minCharge), Math.abs(maxCharge)));\n\n  let fromIsotope = Math.ceil(low);\n  let toIsotope = Math.floor(high);\n  let numberIsotopes = toIsotope - fromIsotope + 1;\n  let isotopeIntensity = 1 / numberIsotopes;\n  let fromIndex = 0;\n  let localFromIndex = 0;\n  let localToIndex = 0;\n  for (let peakIndex = 0; peakIndex < peaks.length; peakIndex++) {\n    let peak = peaks[peakIndex];\n\n    let targetMass = peak.x;\n    localFromIndex = fromIndex;\n    let bestCharge = fromCharge;\n    let bestChargeMatch = 0;\n    for (let charge = fromCharge; charge < toCharge + 1; charge++) {\n      let theoreticalPositions = {\n        x: [],\n        y: new Array(numberIsotopes).fill(isotopeIntensity),\n      };\n\n      let massRange = precision * 1e-6 * targetMass;\n      for (\n        let isotopePosition = fromIsotope;\n        isotopePosition < toIsotope + 1;\n        isotopePosition++\n      ) {\n        theoreticalPositions.x.push(\n          targetMass + (isotopePosition * NEUTRON_MASS) / charge,\n        );\n      }\n      let fromMass = targetMass + low / Math.abs(charge) - massRange;\n      let toMass = targetMass + high / Math.abs(charge) + massRange;\n\n      if (charge === 1) {\n        // we may move the fromIndex\n        while (peaks[fromIndex].x < fromMass) {\n          fromIndex++;\n        }\n      }\n\n      /*\n       * Find the from / to index for the specific peak and specific charge\n       */\n      while (peaks[localFromIndex].x < fromMass) {\n        localFromIndex++;\n      }\n      localToIndex = localFromIndex;\n      let localHeightSum = 0;\n      while (localToIndex < peaks.length && peaks[localToIndex].x < toMass) {\n        localHeightSum += peaks[localToIndex].y;\n        localToIndex++;\n      }\n      localToIndex--;\n\n      //  console.log({ localFromIndex, localToIndex });\n      /*\n        Calculate the overlap for a specific peak and specific charge\n      */\n      let currentTheoreticalPosition = 0;\n      let theoreticalMaxValue = 1 / numberIsotopes;\n      let totalMatch = 0;\n\n      for (let index = localFromIndex; index <= localToIndex; index++) {\n        let minMass =\n          theoreticalPositions.x[currentTheoreticalPosition] -\n          massRange / charge;\n        let maxMass =\n          theoreticalPositions.x[currentTheoreticalPosition] +\n          massRange / charge;\n\n        while (maxMass < peaks[index].x) {\n          currentTheoreticalPosition++;\n          theoreticalMaxValue = 1 / numberIsotopes;\n          minMass =\n            theoreticalPositions.x[currentTheoreticalPosition] -\n            massRange / charge;\n          maxMass =\n            theoreticalPositions.x[currentTheoreticalPosition] +\n            massRange / charge;\n        }\n\n        while (index < peaks.length && peaks[index].x < minMass) {\n          index++;\n        }\n\n        //    console.log({ index, minMass, maxMass, massRange, localHeightSum });\n        if (index < peaks.length && peaks[index].x <= maxMass) {\n          while (index < peaks.length && peaks[index].x <= maxMass) {\n            if (peaks[index].x >= minMass && peaks[index].x <= maxMass) {\n              let value = peaks[index].y / localHeightSum;\n              //      console.log({ theoreticalMaxValue, value });\n              value = Math.min(theoreticalMaxValue, value);\n\n              theoreticalMaxValue -= value;\n              totalMatch += value;\n            }\n            index++;\n          }\n          index--;\n        }\n\n        if (totalMatch > bestChargeMatch) {\n          bestCharge = charge;\n          bestChargeMatch = totalMatch;\n        }\n      }\n    }\n    peak.charge = bestCharge;\n  }\n  return peaks;\n}\n","import { gsd } from 'ml-gsd';\nimport { xyEnsureGrowingX } from 'ml-spectra-processing';\n\nimport { appendPeaksCharge } from './appendPeaksCharge';\n\n/**\n * Filter the array of peaks\n * @param {Spectrum} spectrum - array of all the peaks\n * @param {object} [options={}]\n * @param {object} [options.charge={}]\n * @param {number} [options.charge.min=1]\n * @param {number} [options.charge.max=10]\n * @param {number} [options.charge.low=-1]\n * @param {number} [options.charge.high=1]\n * @param {number} [options.charge.precision=30]\n * @returns {array} - copy of peaks with 'close' annotation\n */\n\nexport function peakPicking(spectrum, options = {}) {\n  const { charge: chargeOptions = {} } = options;\n  if (!spectrum.peaks || spectrum.peaks.length === 0) {\n    spectrum.peaks = [];\n    const keys = Object.keys(spectrum.data).filter(\n      (key) => key !== 'x' && key !== 'y',\n    );\n    if (spectrum.isContinuous()) {\n      // some experimental data are really problematic and we need to add this line\n      const data = xyEnsureGrowingX(spectrum.data);\n      const gsdPeaks = gsd(data, {\n        minMaxRatio: spectrum.options.threshold || 0.00025, // Threshold to determine if a given peak should be considered as a noise\n        realTopDetection: true,\n        smoothY: false,\n        sgOptions: { windowSize: 7, polynomial: 3 },\n      });\n      for (let gsdPeak of gsdPeaks) {\n        const peak = { x: gsdPeak.x, y: gsdPeak.y, width: gsdPeak.width };\n        for (let key of keys) {\n          peak[key] = spectrum.data[key][gsdPeak.index];\n        }\n        spectrum.peaks.push(peak);\n      }\n    } else {\n      spectrum.peaks = [];\n      let data = spectrum.data;\n      for (let i = 0; i < data.x.length; i++) {\n        const peak = {\n          x: data.x[i],\n          y: data.y[i],\n          width: 0,\n        };\n        for (let key of keys) {\n          peak[key] = spectrum.data[key][i];\n        }\n        spectrum.peaks.push(peak);\n      }\n    }\n    // required and linked to https://github.com/mljs/global-spectral-deconvolution/issues/17\n    spectrum.peaks = spectrum.peaks.filter(\n      (peak) => !isNaN(peak.x) && !isNaN(peak.y),\n    );\n    appendPeaksCharge(spectrum.peaks, chargeOptions);\n  }\n\n  return spectrum.peaks;\n}\n","import { xIsMonotonic } from '../x/xIsMonotonic';\nimport { xyCheck } from './xyCheck';\n/**\n * Filters x,y values to allow strictly growing values in x axis.\n *\n * @param data - Object that contains property x (an ordered increasing array) and y (an array).\n */\nexport function xyEnsureGrowingX(data) {\n    xyCheck(data);\n    if (xIsMonotonic(data.x) === 1)\n        return data;\n    const x = Array.from(data.x);\n    const y = Array.from(data.y);\n    let prevX = Number.NEGATIVE_INFINITY;\n    let currentIndex = 0;\n    for (let index = 0; index < x.length; index++) {\n        if (prevX < x[index]) {\n            if (currentIndex < index) {\n                x[currentIndex] = x[index];\n                y[currentIndex] = y[index];\n            }\n            currentIndex++;\n            prevX = x[index];\n        }\n    }\n    x.length = currentIndex;\n    y.length = currentIndex;\n    return { x, y };\n}\n//# sourceMappingURL=xyEnsureGrowingX.js.map","export default function maybeToPrecision(value, digits) {\n  if (value < 0) {\n    value = 0 - value;\n    if (typeof digits === 'number') {\n      return `- ${value.toPrecision(digits)}`;\n    } else {\n      return `- ${value.toString()}`;\n    }\n  } else {\n    if (typeof digits === 'number') {\n      return value.toPrecision(digits);\n    } else {\n      return value.toString();\n    }\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport default function checkArraySize(x, y) {\n  if (!isAnyArray(x) || !isAnyArray(y)) {\n    throw new TypeError('x and y must be arrays');\n  }\n  if (x.length !== y.length) {\n    throw new RangeError('x and y arrays must have the same length');\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n\nexport { default as maybeToPrecision } from './maybeToPrecision';\nexport { default as checkArrayLength } from './checkArrayLength';\n\nexport default class BaseRegression {\n  constructor() {\n    if (new.target === BaseRegression) {\n      throw new Error('BaseRegression must be subclassed');\n    }\n  }\n\n  predict(x) {\n    if (typeof x === 'number') {\n      return this._predict(x);\n    } else if (isAnyArray(x)) {\n      const y = [];\n      for (let i = 0; i < x.length; i++) {\n        y.push(this._predict(x[i]));\n      }\n      return y;\n    } else {\n      throw new TypeError('x must be a number or array');\n    }\n  }\n\n  _predict() {\n    throw new Error('_predict must be implemented');\n  }\n\n  train() {\n    // Do nothing for this package\n  }\n\n  toString() {\n    return '';\n  }\n\n  toLaTeX() {\n    return '';\n  }\n\n  /**\n   * Return the correlation coefficient of determination (r) and chi-square.\n   * @param {Array<number>} x\n   * @param {Array<number>} y\n   * @return {object}\n   */\n  score(x, y) {\n    if (!isAnyArray(x) || !isAnyArray(y) || x.length !== y.length) {\n      throw new Error('x and y must be arrays of the same length');\n    }\n\n    const n = x.length;\n    const y2 = new Array(n);\n    for (let i = 0; i < n; i++) {\n      y2[i] = this._predict(x[i]);\n    }\n\n    let xSum = 0;\n    let ySum = 0;\n    let chi2 = 0;\n    let rmsd = 0;\n    let xSquared = 0;\n    let ySquared = 0;\n    let xY = 0;\n    for (let i = 0; i < n; i++) {\n      xSum += y2[i];\n      ySum += y[i];\n      xSquared += y2[i] * y2[i];\n      ySquared += y[i] * y[i];\n      xY += y2[i] * y[i];\n      if (y[i] !== 0) {\n        chi2 += ((y[i] - y2[i]) * (y[i] - y2[i])) / y[i];\n      }\n      rmsd += (y[i] - y2[i]) * (y[i] - y2[i]);\n    }\n\n    const r =\n      (n * xY - xSum * ySum) /\n      Math.sqrt((n * xSquared - xSum * xSum) * (n * ySquared - ySum * ySum));\n\n    return {\n      r: r,\n      r2: r * r,\n      chi2: chi2,\n      rmsd: Math.sqrt(rmsd / n),\n    };\n  }\n}\n","import { isAnyArray } from 'is-any-array';\n/**\n * Check that x and y are arrays with the same length.\n * @param x - first array\n * @param y - second array\n * @throws if x or y are not the same length, or if they are not arrays\n */\nexport default function checkArrayLength(x, y) {\n    if (!isAnyArray(x) || !isAnyArray(y)) {\n        throw new TypeError('x and y must be arrays');\n    }\n    if (x.length !== y.length) {\n        throw new RangeError('x and y arrays must have the same length');\n    }\n}\n//# sourceMappingURL=checkArrayLength.js.map","/**\n * Cast `number` to string. Optionally `digits` specifies significant figures.\n * @param number\n * @param figures\n * @returns - A string representation of `number`.\n */\nexport default function maybeToPrecision(number, figures) {\n    if (number < 0) {\n        number = 0 - number;\n        if (typeof figures === 'number') {\n            return `- ${number.toPrecision(figures)}`;\n        }\n        else {\n            return `- ${number.toString()}`;\n        }\n    }\n    else if (typeof figures === 'number') {\n        return number.toPrecision(figures);\n    }\n    else {\n        return number.toString();\n    }\n}\n//# sourceMappingURL=maybeToPrecision.js.map","import { isAnyArray } from 'is-any-array';\nimport checkArrayLength from './checkArrayLength';\nexport { default as maybeToPrecision } from './maybeToPrecision';\nexport default class BaseRegression {\n    constructor() {\n        if (new.target === BaseRegression) {\n            throw new Error('BaseRegression must be subclassed');\n        }\n    }\n    predict(x) {\n        if (typeof x === 'number') {\n            return this._predict(x);\n        }\n        else if (isAnyArray(x)) {\n            const y = [];\n            for (const xVal of x) {\n                y.push(this._predict(xVal));\n            }\n            return y;\n        }\n        else {\n            throw new TypeError('x must be a number or array');\n        }\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _predict(x) {\n        throw new Error('_predict must be implemented');\n    }\n    train() {\n        // Do nothing for this package\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    toString(precision) {\n        return '';\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    toLaTeX(precision) {\n        return '';\n    }\n    /**\n     * Return the correlation coefficient of determination (r) and chi-square.\n     * @param x - explanatory variable\n     * @param y - response variable\n     * @return - Object with further statistics.\n     */\n    score(x, y) {\n        checkArrayLength(x, y);\n        const n = x.length;\n        const y2 = new Array(n);\n        for (let i = 0; i < n; i++) {\n            y2[i] = this._predict(x[i]);\n        }\n        let xSum = 0;\n        let ySum = 0;\n        let chi2 = 0;\n        let rmsd = 0;\n        let xSquared = 0;\n        let ySquared = 0;\n        let xY = 0;\n        for (let i = 0; i < n; i++) {\n            xSum += y2[i];\n            ySum += y[i];\n            xSquared += y2[i] * y2[i];\n            ySquared += y[i] * y[i];\n            xY += y2[i] * y[i];\n            if (y[i] !== 0) {\n                chi2 += ((y[i] - y2[i]) * (y[i] - y2[i])) / y[i];\n            }\n            rmsd += (y[i] - y2[i]) * (y[i] - y2[i]);\n        }\n        const r = (n * xY - xSum * ySum) /\n            Math.sqrt((n * xSquared - xSum * xSum) * (n * ySquared - ySum * ySum));\n        return {\n            r,\n            r2: r * r,\n            chi2,\n            rmsd: Math.sqrt(rmsd / n),\n        };\n    }\n}\nexport { checkArrayLength };\n//# sourceMappingURL=index.js.map","import BaseRegression, { checkArrayLength, maybeToPrecision, } from 'ml-regression-base';\n/**\n * Class representing simple linear regression.\n * The regression uses OLS to calculate intercept and slope.\n */\nexport default class SimpleLinearRegression extends BaseRegression {\n    /**\n     * @param x - explanatory variable\n     * @param y - response variable\n     */\n    constructor(x, y) {\n        super();\n        // @ts-expect-error internal use of the constructor, from `this.load`\n        if (x === true) {\n            // @ts-expect-error internal use of the constructor, from `this.load`\n            const yObj = y;\n            this.slope = yObj.slope;\n            this.intercept = yObj.intercept;\n            this.coefficients = [yObj.intercept, yObj.slope];\n        }\n        else {\n            checkArrayLength(x, y);\n            const result = regress(x, y);\n            this.slope = result.slope;\n            this.intercept = result.intercept;\n            this.coefficients = [result.intercept, result.slope];\n        }\n    }\n    /**\n     * Get the parameters and model name in JSON format\n     * @returns\n     */\n    toJSON() {\n        return {\n            name: 'simpleLinearRegression',\n            slope: this.slope,\n            intercept: this.intercept,\n        };\n    }\n    _predict(x) {\n        return this.slope * x + this.intercept;\n    }\n    /**\n     * Finds x for the given y value.\n     * @param y - response variable value\n     * @returns - x value\n     */\n    computeX(y) {\n        return (y - this.intercept) / this.slope;\n    }\n    /**\n     * Strings the linear function in the form 'f(x) = ax + b'\n     * @param precision - number of significant figures.\n     * @returns\n     */\n    toString(precision) {\n        let result = 'f(x) = ';\n        if (this.slope !== 0) {\n            const xFactor = maybeToPrecision(this.slope, precision);\n            result += `${xFactor === '1' ? '' : `${xFactor} * `}x`;\n            if (this.intercept !== 0) {\n                const absIntercept = Math.abs(this.intercept);\n                const operator = absIntercept === this.intercept ? '+' : '-';\n                result += ` ${operator} ${maybeToPrecision(absIntercept, precision)}`;\n            }\n        }\n        else {\n            result += maybeToPrecision(this.intercept, precision);\n        }\n        return result;\n    }\n    /**\n     * Strings the linear function in the form 'f(x) = ax + b'\n     * @param precision - number of significant figures.\n     * @returns\n     */\n    toLaTeX(precision) {\n        return this.toString(precision);\n    }\n    /**\n     * Class instance from a JSON Object.\n     * @param json\n     * @returns\n     */\n    static load(json) {\n        if (json.name !== 'simpleLinearRegression') {\n            throw new TypeError('not a SLR model');\n        }\n        // @ts-expect-error internal use of the constructor\n        return new SimpleLinearRegression(true, json);\n    }\n}\n/**\n * Internal  function.\n * It determines the parameters (slope, intercept) of the line that best fit the `x,y` vector-data (simple linear regression).\n * @param x - explanatory variable\n * @param y - response variable\n * @returns - slope and intercept of the best fit line\n */\nfunction regress(x, y) {\n    const n = x.length;\n    let xSum = 0;\n    let ySum = 0;\n    let xSquared = 0;\n    let xY = 0;\n    for (let i = 0; i < n; i++) {\n        xSum += x[i];\n        ySum += y[i];\n        xSquared += x[i] * x[i];\n        xY += x[i] * y[i];\n    }\n    const numerator = n * xY - xSum * ySum;\n    const slope = numerator / (n * xSquared - xSum * xSum);\n    return {\n        slope,\n        intercept: (1 / n) * ySum - slope * (1 / n) * xSum,\n    };\n}\n//# sourceMappingURL=index.js.map","import BaseRegression, {\n  checkArrayLength,\n  maybeToPrecision\n} from 'ml-regression-base';\nimport SimpleLinearRegression from 'ml-regression-simple-linear';\n\nexport default class PowerRegression extends BaseRegression {\n  constructor(x, y) {\n    super();\n    if (x === true) {\n      // reloading model\n      this.A = y.A;\n      this.B = y.B;\n    } else {\n      checkArrayLength(x, y);\n      regress(this, x, y);\n    }\n  }\n\n  _predict(newInputs) {\n    return this.A * Math.pow(newInputs, this.B);\n  }\n\n  toJSON() {\n    return {\n      name: 'powerRegression',\n      A: this.A,\n      B: this.B\n    };\n  }\n\n  toString(precision) {\n    return `f(x) = ${maybeToPrecision(\n      this.A,\n      precision\n    )} * x^${maybeToPrecision(this.B, precision)}`;\n  }\n\n  toLaTeX(precision) {\n    let latex = '';\n    if (this.B >= 0) {\n      latex = `f(x) = ${maybeToPrecision(\n        this.A,\n        precision\n      )}x^{${maybeToPrecision(this.B, precision)}}`;\n    } else {\n      latex = `f(x) = \\\\frac{${maybeToPrecision(\n        this.A,\n        precision\n      )}}{x^{${maybeToPrecision(-this.B, precision)}}}`;\n    }\n    latex = latex.replace(/e([+-]?[0-9]+)/g, 'e^{$1}');\n    return latex;\n  }\n\n  static load(json) {\n    if (json.name !== 'powerRegression') {\n      throw new TypeError('not a power regression model');\n    }\n    return new PowerRegression(true, json);\n  }\n}\n\nfunction regress(pr, x, y) {\n  const n = x.length;\n  const xl = new Array(n);\n  const yl = new Array(n);\n  for (let i = 0; i < n; i++) {\n    xl[i] = Math.log(x[i]);\n    yl[i] = Math.log(y[i]);\n  }\n\n  const linear = new SimpleLinearRegression(xl, yl);\n  pr.A = Math.exp(linear.intercept);\n  pr.B = linear.slope;\n}\n","import { isAnyArray } from 'is-any-array';\nimport {\n  xMaxValue,\n  xMinMaxValues,\n  xNormed,\n  xSum,\n  xMinValue,\n} from 'ml-spectra-processing';\nimport { parseXY } from 'xy-parser';\n\nimport { getBestPeaks } from './getBestPeaks';\nimport { getFragmentPeaks } from './getFragmentPeaks';\nimport { getMassRemainder } from './getMassRemainder';\nimport { getPeakChargeBySimilarity } from './getPeakChargeBySimilarity';\nimport { getPeaks } from './getPeaks';\nimport { isContinuous } from './isContinuous';\nimport { peakPicking } from './peakPicking';\nimport { peaksWidth } from './peaksWidth';\n\n/**\n * Class dealing with mass spectra and peak picking\n */\nexport class Spectrum {\n  /**\n   *\n   * @param {import('cheminfo-types').DataXY} data\n   * @param {object} [options={}]\n   * @param {number} [options.threshold]\n   */\n  constructor(data = { x: [], y: [] }, options = {}) {\n    if (\n      typeof data !== 'object' ||\n      !isAnyArray(data.x) ||\n      !isAnyArray(data.y)\n    ) {\n      throw new TypeError('Spectrum data must be an object with x:[], y:[]');\n    }\n    this.data = { ...data };\n    this.options = options;\n    Object.defineProperty(this.data, 'xOriginal', {\n      enumerable: false,\n      writable: true,\n    });\n    if (this.data && this.data.x.length > 0) {\n      this.info = {\n        minX: xMinValue(this.data.x),\n        maxX: xMaxValue(this.data.x),\n        minY: xMinValue(this.data.y),\n        maxY: xMaxValue(this.data.y),\n      };\n    } else {\n      this.info = {\n        minX: NaN,\n        maxX: NaN,\n        minY: NaN,\n        maxY: NaN,\n      };\n    }\n\n    this.cache = {};\n    this.peaks = [];\n  }\n\n  minMaxX() {\n    return xMinMaxValues(this.data.x);\n  }\n\n  maxY() {\n    return xMaxValue(this.data.y);\n  }\n\n  sumY() {\n    if (!this.cache.sumY) {\n      this.cache.sumY = xSum(this.data.y);\n    }\n    return this.cache.sumY;\n  }\n\n  scaleY(intensity = 1) {\n    this.data.y = Array.from(\n      xNormed(this.data.y, { value: intensity, algorithm: 'max' }),\n    );\n    return this;\n  }\n\n  rescaleX(callback) {\n    this.ensureOriginalX();\n\n    for (let i = 0; i < this.data.x.length; i++) {\n      this.data.x[i] = callback(this.data.xOriginal[i]);\n    }\n\n    return this;\n  }\n\n  ensureOriginalX() {\n    if (!this.data.xOriginal) {\n      this.data.xOriginal = this.data.x.slice(0);\n    }\n  }\n\n  normedY(total = 1) {\n    this.data.y = xNormed(this.data.y, { value: total });\n    return this;\n  }\n\n  peakPicking() {\n    peakPicking(this);\n    return this.peaks;\n  }\n\n  peaksWidth() {\n    peakPicking(this);\n    return peaksWidth(this.peaks);\n  }\n\n  getBestPeaks(options) {\n    peakPicking(this);\n    return getBestPeaks(this.peaks, options);\n  }\n\n  getPeakChargeBySimilarity(targetMass, options) {\n    return getPeakChargeBySimilarity(this, targetMass, options);\n  }\n\n  getPeaks(options) {\n    peakPicking(this);\n    return getPeaks(this.peaks, options);\n  }\n\n  getPeaksAsDataXY(options) {\n    peakPicking(this);\n    const peaks = getPeaks(this.peaks, options);\n    return {\n      x: peaks.map((peak) => peak.x),\n      y: peaks.map((peak) => peak.y),\n    };\n  }\n\n  /**\n   * Returns also peaks possible for a specific molecular formula\n   * @example\n   *  const spectrum = new Spectrum({x:[], y:[]})\n   *  await spectrum.getFragmentPeaks();\n   * @param {string} mf\n   * @param {object} options\n   * @returns\n   */\n  getFragmentPeaksFct(mf, options) {\n    peakPicking(this);\n    return getFragmentPeaks(this.peaks, mf, options);\n  }\n\n  isContinuous() {\n    return isContinuous(this);\n  }\n\n  /**\n   * Remove an integer number of time the specifiedd monoisotopic mass\n   * Mass remainder analysis (MARA): https://doi.org/10.1021/acs.analchem.7b04730\n   */\n  getMassRemainderFct(mass, options = {}) {\n    return getMassRemainder(this.data, mass, options);\n  }\n}\n\nexport function fromPeaks(peaks) {\n  if (peaks.length === 0) return new Spectrum();\n  const data = {};\n  for (let key of Object.keys(peaks[0])) {\n    data[key] = peaks.map((peak) => peak[key]);\n  }\n  return new Spectrum(data);\n}\n\nexport function fromText(text, options) {\n  const data = parseXY(text);\n  return new Spectrum(data, options);\n}\n","import Regression from 'ml-regression-power';\nimport { xMaxValue, xMinValue } from 'ml-spectra-processing';\n\nexport function peaksWidth(peaks) {\n  let xs = peaks.map((peak) => peak.x);\n  let widths = peaks.map((peak) => peak.width);\n\n  if (xs.length < 2) {\n    throw new Error(\n      `peaksWidth: not enough peaks (less than 2) for automatic width calculation: ${xs.length}`,\n    );\n  }\n  let regression = new Regression(xs, widths, {\n    computeQuality: true,\n    computeCoefficient: true,\n  });\n\n  if (isNaN(regression.A) || isNaN(regression.B)) {\n    throw new Error('peaksWidth: can not calculate regression');\n  }\n\n  let from = xMinValue(xs);\n  let to = xMaxValue(xs);\n\n  let regressionChart = { x: [], y: [] };\n  for (let x = from; x <= to; x += (to - from) / 1000) {\n    regressionChart.x.push(x);\n    regressionChart.y.push(regression.predict(x));\n  }\n  return {\n    widths: {\n      x: xs,\n      y: widths,\n    },\n    fit: regressionChart,\n    score: regression.score(xs, widths),\n\n    predictFct: regression.predict.bind(regression),\n    tex: regression.toLaTeX(3),\n    A: regression.A,\n    B: regression.B,\n    predictFctString: `${regression.A} * mass ** ${regression.B}`,\n  };\n}\n","import { Comparator } from 'peaks-similarity';\n\n/**\n * @param {object}   [options={}]\n * @param {object}   [options.minCharge=1]\n * @param {object}   [options.maxCharge=10]\n * @param {object}   [options.similarity={}]\n * @param {object}   [options.similarity.widthBottom]\n * @param {object}   [options.similarity.widthTop]\n * @param {object}   [options.similarity.widthFunction] - function called with mass that should return an object width containing top and bottom\n * @param {object}   [options.similarity.zone={}]\n * @param {object}   [options.similarity.zone.low=-0.5] - window shift based on observed monoisotopic mass\n * @param {object}   [options.similarity.zone.high=2.5] - to value for the comparison window\n * @param {object}   [options.similarity.common]\n */\n\nconst NEUTRON_MASS = 1;\n\nexport function getPeakChargeBySimilarity(spectrum, targetMass, options = {}) {\n  let { similarity = {}, minCharge = 1, maxCharge = 10 } = options;\n  let { zone = {}, widthFunction } = similarity;\n  let { low = -0.5, high = 2.5 } = zone;\n\n  if (!spectrum || !spectrum.data.x.length > 0) {\n    throw Error(\n      'You need to add an experimental spectrum first using setMassSpectrum',\n    );\n  }\n\n  let width = {\n    bottom: similarity.widthBottom,\n    top: similarity.widthTop,\n  };\n\n  similarity = JSON.parse(JSON.stringify(similarity));\n  similarity.common = 'second';\n\n  let experimentalData = spectrum.data;\n  let similarityProcessor = new Comparator(similarity);\n  similarityProcessor.setPeaks1([experimentalData.x, experimentalData.y]);\n\n  if (widthFunction && typeof widthFunction === 'string') {\n    // eslint-disable-next-line no-new-func\n    widthFunction = new Function('mass', widthFunction);\n    let checkTopBottom = widthFunction(123);\n    if (!checkTopBottom.bottom || !checkTopBottom.top) {\n      throw Error(\n        'widthFunction should return an object with bottom and top properties',\n      );\n    }\n  }\n\n  let fromCharge =\n    minCharge * maxCharge > 0\n      ? Math.round(Math.min(Math.abs(minCharge), Math.abs(maxCharge)))\n      : 1;\n  let toCharge = Math.round(Math.max(Math.abs(minCharge), Math.abs(maxCharge)));\n\n  let fromIsotope = Math.ceil(low);\n  let toIsotope = Math.floor(high);\n  let isotopeHeight = 1 / (toIsotope - fromIsotope + 1);\n\n  let results = [];\n\n  for (let charge = fromCharge; charge < toCharge + 1; charge++) {\n    let isotopePositions = { x: [], y: [] };\n    for (\n      let isotopePosition = fromIsotope;\n      isotopePosition < toIsotope + 1;\n      isotopePosition++\n    ) {\n      isotopePositions.x.push(\n        targetMass + (isotopePosition * NEUTRON_MASS) / charge,\n      );\n      isotopePositions.y.push(isotopeHeight);\n    }\n    let from = targetMass + low / Math.abs(charge);\n    let to = targetMass + high / Math.abs(charge);\n    similarityProcessor.setFromTo(from, to);\n    if (widthFunction) {\n      width = widthFunction(targetMass);\n      similarityProcessor.setTrapezoid(width.bottom, width.top);\n    }\n\n    similarityProcessor.setPeaks2([isotopePositions.x, isotopePositions.y]);\n    let result = similarityProcessor.getSimilarity();\n\n    results.push({ charge, similarity: result.similarity });\n  }\n\n  return results.sort((a, b) => b.similarity - a.similarity)[0].charge;\n}\n","import { EMDB } from 'emdb';\nimport { MF } from 'mf-parser';\n\nimport { getPeaks } from './getPeaks.js';\n\n/**\n * Filter the array of peaks\n * @param {array} peaks - array of all the peaks\n * @param {string} mf - Molecular formula of the parent molecule\n * @param {object} [options={}]\n * @param {number} [options.from] - min X value of the window to consider\n * @param {number} [options.to] - max X value of the window to consider\n * @param {number} [options.threshold=0.01] - minimal intensity compare to base peak\n * @param {number} [options.limit=undefined] - maximal number of peaks (based on intensity)\n * @param {string} [options.ionizations]\n * @param {number} [options.precision]\n * @returns {array} - copy of peaks with 'close' annotation\n */\n\nexport async function getFragmentPeaks(peaks, mf, options = {}) {\n  const emdb = new EMDB();\n\n  const { ionizations = '', precision } = options;\n\n  const mfInfo = new MF(mf).getInfo();\n  const ranges = Object.keys(mfInfo.atoms)\n    .map((key) => `${key}0-${mfInfo.atoms[key]}`)\n    .join(' ');\n  peaks = getPeaks(peaks, options);\n  for (let peak of peaks) {\n    peak.mfs = (\n      await emdb.fromMonoisotopicMass(peak.x, {\n        precision,\n        ranges,\n        ionizations,\n      })\n    ).mfs;\n  }\n  peaks = peaks.filter((peak) => peak.mfs.length > 0);\n  return peaks;\n}\n","import { xMaxValue } from 'ml-spectra-processing';\n/**\n * When a spectrum is continous ?\n * - has more than 100 points\n * - deltaX change can not be more than a factor 2\n * - deltaX may not be larger than 0.1\n * - if y is zero it does not count\n * @param {object} spectrum\n * @param {object} [options={}]\n * @param {number} [options.minLength=100]\n * @param {number} [options.relativeHeightThreshold=0.001] // Under this value the\n * @param {number} [options.maxDeltaRatio=3]\n */\n\nexport function isContinuous(spectrum, options = {}) {\n  const {\n    minLength = 100,\n    maxDeltaRatio = 3,\n    relativeHeightThreshold = 0.001,\n  } = options;\n  const minHeight = xMaxValue(spectrum.data.y) * relativeHeightThreshold;\n  const minRadio = 1 / maxDeltaRatio;\n  const maxRatio = 1 * maxDeltaRatio;\n  if (spectrum.continuous === undefined) {\n    let xs = spectrum.data.x;\n    let ys = spectrum.data.y;\n    if (xs.length < minLength) {\n      spectrum.continuous = false;\n    } else {\n      let previousDelta = xs[1] - xs[0];\n      spectrum.continuous = true;\n      let success = 0;\n      let failed = 0;\n      for (let i = 0; i < xs.length - 1; i++) {\n        if (ys[i] < minHeight || ys[i + 1] < minHeight) {\n          previousDelta = 0;\n          continue;\n        }\n        let delta = xs[i + 1] - xs[i];\n        if (previousDelta) {\n          let ratio = delta / previousDelta;\n          if (\n            (Math.abs(delta) > 0.1 || ratio < minRadio || ratio > maxRatio) &&\n            ys[i] !== 0 &&\n            ys[i + 1] !== 0\n          ) {\n            failed++;\n          } else {\n            success++;\n          }\n        }\n        previousDelta = delta;\n      }\n      if (success / failed < 10) {\n        spectrum.continuous = false;\n      }\n    }\n  }\n  return spectrum.continuous;\n}\n","import { xySortX, xyJoinX } from 'ml-spectra-processing';\n\n/**\n * Remove an integer number of time the specifiedd monoisotopic mass\n * Mass remainder analysis (MARA): https://doi.org/10.1021/acs.analchem.7b04730\n * @param {object} spectrum\n * @param {number} mass\n * @param {object} [options={}\n * @param {number} [options.delta=0.001]\n */\nexport function getMassRemainder(spectrum, mass, options = {}) {\n  const { delta = 0.001 } = options;\n  const x = spectrum.x.slice();\n  const y = spectrum.y;\n  for (let i = 0; i < x.length; i++) {\n    const factor = Math.floor(x[i] / mass);\n    x[i] = x[i] - factor * mass;\n  }\n  // we sort and join\n  return xyJoinX(xySortX({ x, y }), { delta });\n}\n","import { similarity } from 'ml-distance';\nimport {\n  xIsMonotonic,\n  xyArrayAlign,\n  xyFilterMinYValue,\n  xyFilterTopYValues,\n  xySortX,\n} from 'ml-spectra-processing';\n\nexport class MSComparator {\n  /**\n   * Create a class that will be able to get the similarity between 2 spectra\n   * The similarity is based on 'cosine' similarity. The goal is 2 prepare 2 vectors\n   * on which the similarity is calculated.\n   * The vectors are created by taking the mass and the intensity of the peaks.\n   * @param {object} [options={}]\n   * @param {number} [options.nbPeaks] - Before comparing spectra how many peaks should be kept\n   * @param {number} [options.minNbCommonPeaks] - Minimum number of peaks in common to consider any similarity\n   * @param {number} [options.minIntensity] - What is the minimal relative intensity to keep a peak\n   * @param {number} [options.massPower=3] - High power will give more weight to the mass. If you would prefer to observe fragments you should use a number less than 1\n   * @param {number} [options.intensityPower=0.6] - How important is the intensity. By default we don't give to much importance to it\n   * @param {number[]} [options.selectedMasses] - List of allowed masses.\n   * @param {number|Function} [options.delta=0.1] - Tolerance in Da (u) to consider 2 peaks as aligned. If a function is provided it will be called with the mass of the peak\n   */\n  constructor(options = {}) {\n    this.options = {\n      massPower: 3,\n      intensityPower: 0.6,\n      delta: 0.1,\n      ...options,\n    };\n    this.cache = new WeakMap();\n  }\n\n  /**\n   *\n   * @param {import('cheminfo-types').DataXY} dataXY1\n   * @param {import('cheminfo-types').DataXY} dataXY2\n   */\n  getSimilarity(dataXY1, dataXY2) {\n    const data1 = normalizeAndCacheData(this.cache, dataXY1, this.options);\n    const data2 = normalizeAndCacheData(this.cache, dataXY2, this.options);\n\n    let aligned;\n    if (this.options.selectedMasses?.length > 0) {\n      aligned = xyArrayAlign(\n        [\n          data1,\n          data2,\n          {\n            x: Float64Array.from(this.options.selectedMasses),\n            y: new Float64Array(this.options.selectedMasses.length).fill(1),\n          },\n        ],\n        {\n          delta: this.options.delta,\n          requiredY: true,\n        },\n      );\n    } else {\n      aligned = xyArrayAlign([data1, data2], {\n        delta: this.options.delta,\n      });\n    }\n\n    if (this.options.minNbCommonPeaks) {\n      let commonPeaks = 0;\n      for (let i = 0; i < aligned.ys[0].length; i++) {\n        if (aligned.ys[0][i] !== 0 && aligned.ys[1][i] !== 0) {\n          commonPeaks++;\n        }\n      }\n      if (commonPeaks < this.options.minNbCommonPeaks) return 0;\n    }\n\n    const vector1 = new Float64Array(aligned.x.length);\n    const vector2 = new Float64Array(aligned.x.length);\n    for (let i = 0; i < aligned.x.length; i++) {\n      vector1[i] =\n        aligned.x[i] ** this.options.massPower *\n        aligned.ys[0][i] ** this.options.intensityPower;\n      vector2[i] =\n        aligned.x[i] ** this.options.massPower *\n        aligned.ys[1][i] ** this.options.intensityPower;\n    }\n\n    return similarity.cosine(vector1, vector2);\n  }\n}\n\n/**\n *\n * @param {WeakMap} cache\n * @param {import('cheminfo-types').DataXY} dataXY\n * @param {object} [options={}]\n * @param {number} [options.nbPeaks]\n * @param {number} [options.minIntensity]\n */\nfunction normalizeAndCacheData(cache, dataXY, options = {}) {\n  const { nbPeaks, minIntensity } = options;\n  if (cache.has(dataXY)) return cache.get(dataXY);\n\n  let data = { ...dataXY };\n  if (xIsMonotonic(data.x) !== 1) {\n    data = xySortX(data);\n  }\n\n  if (minIntensity !== undefined) {\n    data = xyFilterMinYValue(data, minIntensity);\n  }\n\n  if (nbPeaks !== undefined) {\n    data = xyFilterTopYValues(data, nbPeaks);\n  }\n\n  cache.set(dataXY, data);\n  return data;\n}\n","/**\n * Returns the average of cosine distances between vectors a and b\n * @param a - first vector\n * @param b - second vector\n *\n */\nexport default function cosine(a, b) {\n    let p = 0;\n    let p2 = 0;\n    let q2 = 0;\n    for (let i = 0; i < a.length; i++) {\n        p += a[i] * b[i];\n        p2 += a[i] * a[i];\n        q2 += b[i] * b[i];\n    }\n    return p / (Math.sqrt(p2) * Math.sqrt(q2));\n}\n//# sourceMappingURL=cosine.js.map","import { xMinMaxValues } from '../x/xMinMaxValues';\n/** Filter an array x/y based on various criteria x points are expected to be sorted\n *\n * @param data - object containing 2 properties x and y\n * @param minRelativeYValue - the minimum relative value compare to the Y max value\n * @return filtered data\n */\nexport function xyFilterMinYValue(data, minRelativeYValue) {\n    if (minRelativeYValue === undefined)\n        return data;\n    const { x, y } = data;\n    const { min, max } = xMinMaxValues(y);\n    const threshold = max * minRelativeYValue;\n    if (min >= threshold)\n        return data;\n    const newX = [];\n    const newY = [];\n    for (let i = 0; i < x.length; i++) {\n        if (y[i] >= threshold) {\n            newX.push(x[i]);\n            newY.push(y[i]);\n        }\n    }\n    return {\n        x: newX,\n        y: newY,\n    };\n}\n//# sourceMappingURL=xyFilterMinYValue.js.map","import { EMDB } from 'emdb';\n\n/**\n *\n * @param {array} bestPeaks\n * @param {object} [options={}]\n * @param {array} [options.mfColors={}]\n * @param {number} [options.numberDigits=5]\n * @param {number} [options.numberMFs=0]\n * @param {boolean} [options.showMF=false]\n * @param {array} [options.mfColors={}]\n * @param {number} [options.charge=1]\n * @param {number} [options.shift=0]\n * @param {object} [options.mfPrefs]\n * @param {number} [options.displayCharge=true]\n * @param {number} [options.displayProperties=[]] Array of properties name to display\n * @returns {Promise}\n */\n\nexport async function getPeaksAnnotation(bestPeaks, options = {}) {\n  const emdb = new EMDB();\n\n  options = { limit: 5, precision: 100, ...options };\n\n  let {\n    numberDigits = 5,\n    shift = 0,\n    showMF = false,\n    numberMFs = 0,\n    charge = 1,\n    mfPrefs = {},\n    displayCharge = true,\n    displayProperties = [],\n    mfColors = [\n      { limit: 3, color: 'green' },\n      { limit: 20, color: 'lightgreen' },\n      { limit: 50, color: 'lightorange' },\n    ],\n  } = options;\n  if (showMF && !numberMFs) numberMFs = 1;\n  let annotations = [];\n  bestPeaks.sort((a, b) => (a.close ? -1 : b.close ? 1 : 0));\n\n  for (let peak of bestPeaks) {\n    let textLine = 0;\n    let annotation;\n    if (peak.close) {\n      annotation = {\n        type: 'line',\n        _highlight: peak._highlight,\n        info: peak,\n        position: [\n          {\n            y: peak.y,\n            dy: '-5px',\n            x: peak.x,\n          },\n          {\n            y: peak.y,\n            dy: '-15px',\n            x: peak.x,\n          },\n        ],\n      };\n      annotations.push(annotation);\n      annotation = {\n        type: 'ellipse',\n        _highlight: peak._highlight,\n        info: peak,\n        position: [\n          {\n            y: peak.y,\n            dy: '-15px',\n            x: peak.x,\n          },\n        ],\n        props: {\n          rx: '3px',\n          ry: '3px',\n          fillOpacity: 0.3,\n        },\n      };\n    } else {\n      annotation = {\n        type: 'line',\n        _highlight: peak._highlight,\n        position: [\n          {\n            y: peak.y,\n            dy: '-5px',\n            x: peak.x,\n          },\n          {\n            y: peak.y,\n            dy: '-25px',\n            x: peak.x,\n          },\n        ],\n        labels: [\n          {\n            text: (peak.x + shift).toFixed(numberDigits),\n            color: 'red',\n            position: {\n              x: peak.x,\n              y: peak.y,\n              dy: `${textLine++ * -13 - 17}px`,\n              dx: '2px',\n            },\n          },\n        ],\n      };\n\n      if (displayCharge) {\n        annotation.labels.push({\n          text: `Z:${peak.charge}`,\n          color: 'grey',\n          position: {\n            x: peak.x,\n            y: peak.y,\n            dy: '-4px',\n            dx: '2px',\n          },\n        });\n      }\n\n      if (numberMFs) {\n        // we have 2 cases. Either there is a shift and we deal with differences\n        // otherwise it is absolute\n        // if there is a shift we consider only a neutral loss and the parameter charge is important\n        if (shift) {\n          // neutral loss\n          let currentMfPrefs = {\n            ...mfPrefs,\n            allowNeutral: true,\n            ionizations: '',\n          };\n          // we need to deal with the precision and increase it\n          currentMfPrefs.precision =\n            (currentMfPrefs.precision / Math.max(Math.abs(peak.x + shift), 1)) *\n            peak.x;\n          await emdb.fromMonoisotopicMass(\n            Math.abs((peak.x + shift) * charge),\n            currentMfPrefs,\n          );\n        } else {\n          await emdb.fromMonoisotopicMass(Math.abs(peak.x * charge), mfPrefs);\n        }\n\n        let mfs = emdb.get('monoisotopic');\n        let numberOfMFS = Math.min(mfs.length, numberMFs);\n\n        for (let i = 0; i < numberOfMFS; i++) {\n          let mf = mfs[i];\n\n          let ppm = shift ? (mf.ms.ppm / shift) * mfs[0].ms.em : mf.ms.ppm;\n          annotation.labels.push({\n            text: mf.mf,\n            color: getColor(mfColors, Math.abs(ppm)),\n            position: {\n              x: peak.x,\n              y: peak.y,\n              dy: `${textLine++ * -13 - 17}px`,\n              dx: '2px',\n            },\n          });\n        }\n      }\n\n      if (displayProperties.length > 0) {\n        for (let property of displayProperties) {\n          annotation.labels.push({\n            text: peak[property],\n            color: 'red',\n            position: {\n              x: peak.x,\n              y: peak.y,\n              dy: `${textLine++ * -13 - 17}px`,\n              dx: '2px',\n            },\n          });\n        }\n      }\n    }\n    annotations.push(annotation);\n  }\n  return annotations;\n}\n\nfunction getColor(colors, value) {\n  for (let color of colors) {\n    if (value < color.limit) return color.color;\n  }\n  return 'lightgrey';\n}\n","import { getPeaksAnnotation } from './getPeaksAnnotation.js';\n\nexport const JsGraph = {\n  getPeaksAnnotation,\n};\n","/**\n * @param {object}   [entry={}]\n * @param {object}   [options={}]\n * @param {number}   [options.min=-Infinity] - Minimal unsaturation\n * @param {number}   [options.max=+Infinity] - Maximal unsaturation\n * @param {boolean}   [options.onlyInteger=false] - Integer unsaturation\n * @param {boolean}   [options.onlyNonInteger=false] - Non integer unsaturation\n * @return {boolean}\n */\n\nexport function unsaturationMatcher(entry, options = {}) {\n  const {\n    min = Number.MIN_SAFE_INTEGER,\n    max = Number.MAX_SAFE_INTEGER,\n    onlyInteger,\n    onlyNonInteger,\n  } = options;\n\n  if (entry.unsaturation !== undefined) {\n    if (entry.unsaturation < min || entry.unsaturation > max) return false;\n    if (onlyInteger && !Number.isInteger(entry.unsaturation)) return false;\n    if (onlyNonInteger && Number.isInteger(entry.unsaturation)) return false;\n  }\n  return true;\n}\n","import { unsaturationMatcher } from './unsaturationMatcher.js';\n\n/**\n * Returns true if the entry containing MF information match\n * @param {object}   [entry={}] - object containing mw, ...\n * @param {object}   [options={}]\n * @param {number}   [options.minMW=0] - Minimal molecular weight\n * @param {number}   [options.maxMW=+Infinity] - Maximal molecular weight\n * @param {number}   [options.minEM=0] - Minimal monoisotopic mass\n * @param {number}   [options.maxEM=+Infinity] - Maximal monoisotopic mass\n * @param {number}   [options.minCharge=-Infinity] - Minimal charge\n * @param {number}   [options.maxCharge=+Infinity] - Maximal charge\n * @param {boolean}  [options.absoluteCharge=false] - If true, the charge is absolute (so between 0 and +Infinity by default)\n * @param {object}   [options.unsaturation={}]\n * @param {number}   [options.unsaturation.min=-Infinity] - Minimal unsaturation\n * @param {number}   [options.unsaturation.max=+Infinity] - Maximal unsaturation\n * @param {boolean}   [options.unsaturation.onlyInteger=false] - Integer unsaturation\n * @param {boolean}   [options.unsaturation.onlyNonInteger=false] - Non integer unsaturation\n * @param {object}   [options.atoms] - object of atom:{min, max}\n * @return {boolean}\n */\n\nexport function generalMatcher(entry, options = {}) {\n  const {\n    minMW = 0,\n    maxMW = +Infinity,\n    minEM = 0,\n    maxEM = +Infinity,\n    minCharge = Number.MIN_SAFE_INTEGER,\n    maxCharge = Number.MAX_SAFE_INTEGER,\n    absoluteCharge = false,\n    unsaturation = {},\n    atoms,\n  } = options;\n\n  if (entry.mw !== undefined) {\n    if (entry.mw < minMW || entry.mw > maxMW) return false;\n  }\n\n  if (entry.em !== undefined) {\n    if (entry.em < minEM || entry.em > maxEM) return false;\n  }\n\n  if (entry.charge !== undefined) {\n    let charge = absoluteCharge ? Math.abs(entry.charge) : entry.charge;\n    if (charge < minCharge || charge > maxCharge) return false;\n  }\n\n  if (unsaturation !== undefined && entry.unsaturation !== undefined) {\n    if (!unsaturationMatcher(entry, unsaturation)) return false;\n  }\n\n  if (entry.atoms !== undefined && atoms) {\n    // all the atoms of the entry must fit in the range\n    for (let atom in entry.atoms) {\n      if (!atoms[atom]) return false;\n      if (entry.atoms[atom] < atoms[atom].min) return false;\n      if (entry.atoms[atom] > atoms[atom].max) return false;\n    }\n  }\n  return true;\n}\n","import { getMsem } from './getMsem';\n\n/**\n * Returns an object containing:\n * {ms: {em, charge, ionization}, ionization: {}}\n * We return the ionization in order to know which one has been selected\n */\n\nexport function getMsInfo(entry, options = {}) {\n  const {\n    allowNeutralMolecules,\n    ionization = { mf: '', em: 0, charge: 0 },\n    forceIonization = false,\n    targetMass,\n  } = options;\n\n  let realIonization = ionization;\n  if (!forceIonization && entry.ionization && entry.ionization.mf !== '') {\n    realIonization = entry.ionization;\n  }\n  let ms = {\n    ionization: realIonization.mf,\n    em: 0,\n    charge: entry.charge + realIonization.charge,\n  };\n\n  if (ms.charge !== 0) {\n    ms.em = getMsem(entry.em + realIonization.em, ms.charge);\n  } else if (allowNeutralMolecules) {\n    ms.em = entry.em + realIonization.em;\n  }\n  if (targetMass) {\n    ms.delta = targetMass - ms.em;\n    ms.ppm = ((targetMass - ms.em) / ms.em) * 1e6;\n  }\n  return {\n    ms,\n    ionization: realIonization,\n  };\n}\n","import { ELECTRON_MASS } from 'chemical-elements';\n\nexport function getMsem(em, charge) {\n  if (charge > 0) {\n    return em / charge - ELECTRON_MASS;\n  } else if (charge < 0) {\n    return em / (charge * -1) + ELECTRON_MASS;\n  } else {\n    return 0;\n  }\n}\n","import { MF } from 'mf-parser';\n\nexport function mfDiff(mfString1, mfString2) {\n  let mf1 = new MF(mfString1).getInfo().atoms;\n  let mf2 = new MF(mfString2).getInfo().atoms;\n  let atoms = Object.keys(mf1);\n  Object.keys(mf2).forEach((atom) => {\n    if (!atoms.includes(atom)) atoms.push(atom);\n  });\n  let mf = '';\n  for (let atom of atoms) {\n    let diff = (mf1[atom] || 0) - (mf2[atom] || 0);\n    if (diff) mf += atom + diff;\n  }\n  return new MF(mf).toMF();\n}\n","export function processRange(string, comment, options = {}) {\n  const { limit } = options;\n  let results = [];\n  let parts = string.split(/(-?[0-9]+--?[0-9]+)/).filter((v) => v); // remove empty parts\n\n  let position = -1;\n  let mfs = [];\n  for (let i = 0; i < parts.length; i++) {\n    let part = parts[i];\n    if (!~part.search(/-?[0-9]--?[0-9]/)) {\n      position++;\n      mfs[position] = {\n        mf: part,\n        min: 1,\n        max: 1,\n      };\n    } else {\n      let min = part.replace(/^(-?[0-9]*)-(-?[0-9]*)/, '$1') >> 0;\n      let max = part.replace(/^(-?[0-9]*)-(-?[0-9]*)/, '$2') >> 0;\n      mfs[position].min = Math.min(min, max);\n      mfs[position].max = Math.max(min, max);\n    }\n  }\n\n  let currents = new Array(mfs.length);\n  for (let i = 0; i < currents.length; i++) {\n    currents[i] = mfs[i].min;\n  }\n\n  position = 0;\n  while (position < currents.length) {\n    if (currents[position] < mfs[position].max) {\n      results.push(getMF(mfs, currents, comment));\n      currents[position]++;\n      for (let i = 0; i < position; i++) {\n        currents[i] = mfs[i].min;\n      }\n      position = 0;\n    } else {\n      position++;\n    }\n    if (results.length > limit) {\n      throw Error(`processRange generates to many fragments (over ${limit})`);\n    }\n  }\n\n  results.push(getMF(mfs, currents, comment));\n  return results;\n}\n\nfunction getMF(mfs, currents, comment) {\n  let mf = '';\n  for (let i = 0; i < mfs.length; i++) {\n    if (currents[i] === 0) {\n      // TODO we need to remove from currents[i] till we reach another part of the MF\n      mf += removeMFLastPart(mfs[i].mf);\n    } else {\n      mf += mfs[i].mf;\n      if (currents[i] !== 1) {\n        mf += currents[i];\n      }\n    }\n  }\n  if (comment) mf += `$${comment}`;\n  return mf;\n}\n\n/*\n   Allows to remove the last part of a MF. Useful when you have something with '0' times.\n   C10H -> C10\n   C10((Me)N) -> C10\n   C10Ala -> C10\n   C10Ala((Me)N) -> C10Ala\n   */\nfunction removeMFLastPart(mf) {\n  let parenthesis = 0;\n  let start = true;\n  for (let i = mf.length - 1; i >= 0; i--) {\n    let ascii = mf.charCodeAt(i);\n\n    if (ascii > 96 && ascii < 123) {\n      // lowercase\n      if (!start && !parenthesis) {\n        return mf.substr(0, i + 1);\n      }\n    } else if (ascii > 64 && ascii < 91) {\n      // uppercase\n      if (!start && !parenthesis) {\n        return mf.substr(0, i + 1);\n      }\n      start = false;\n    } else if (ascii === 40) {\n      // (\n      parenthesis--;\n      if (!parenthesis) return mf.substr(0, i);\n    } else if (ascii === 41) {\n      // )\n      parenthesis++;\n    } else {\n      start = false;\n      if (!parenthesis) return mf.substr(0, i + 1);\n    }\n  }\n  return '';\n}\n","import { MF } from 'mf-parser';\n\nimport { processRange } from './processRange';\n\nexport function preprocessIonizations(ionizationsString = '') {\n  if (Array.isArray(ionizationsString)) return ionizationsString;\n  let ionizations = ionizationsString.split(/ *[.,;\\t\\r\\n]+ */);\n\n  // it is allowed to have ranges in Ionizations. We need to explode them.\n\n  let results = [];\n\n  for (let ionization of ionizations) {\n    let parts = processRange(ionization);\n    for (let part of parts) {\n      let info = new MF(part).getInfo();\n      results.push({\n        mf: part,\n        em: info.monoisotopicMass,\n        charge: info.charge,\n        atoms: info.atoms,\n      });\n    }\n  }\n\n  return results;\n}\n","import { Kind, MF, parse } from 'mf-parser';\n\nexport function preprocessRanges(ranges) {\n  ranges = JSON.parse(JSON.stringify(ranges));\n  if (typeof ranges === 'string') {\n    // need to convert to ranges\n    let parsed = parse(ranges.replace(/[\\r\\n\\t ]/g, ''));\n    let newRanges = [];\n    let current = {\n      mf: '',\n      min: 1,\n      max: 1,\n    };\n\n    // example ClBr2(CH2)0-2NO\n    // the idea is that has long as we don't have a range we don't really care\n    // there is a limitation is that the range has to be first level of parenthesis\n    let parenthesisLevel = 0;\n    let currentMF = ''; // start at an atom first level or a parenthesis\n    for (let item of parsed) {\n      switch (item.kind) {\n        case Kind.ATOM:\n          if (parenthesisLevel === 0 && currentMF) {\n            current.mf += currentMF;\n            currentMF = '';\n          }\n          currentMF += item.value;\n          break;\n        case Kind.ISOTOPE:\n          if (parenthesisLevel === 0 && currentMF) {\n            current.mf += currentMF;\n            currentMF = '';\n          }\n          currentMF += `[${item.value.isotope}${item.value.atom}]`;\n          break;\n        case Kind.MULTIPLIER:\n          if (parenthesisLevel === 0 && currentMF) {\n            current.mf += currentMF + item.value;\n            currentMF = '';\n          } else {\n            currentMF += item.value;\n          }\n          break;\n        case Kind.MULTIPLIER_RANGE:\n          if (parenthesisLevel !== 0) {\n            throw new Error('Range multiplier can only be at the first level');\n          }\n          newRanges.push({\n            mf: currentMF,\n            min: item.value.from,\n            max: item.value.to,\n          });\n          currentMF = '';\n          break;\n        case Kind.OPENING_PARENTHESIS:\n          parenthesisLevel++;\n          currentMF += '(';\n          break;\n        case Kind.CLOSING_PARENTHESIS:\n          parenthesisLevel--;\n          currentMF += ')';\n          break;\n        default:\n          throw Error(`can not preprocess ${ranges}`);\n      }\n    }\n    if (currentMF) {\n      current.mf += currentMF;\n    }\n    if (current.mf) {\n      newRanges.push(current);\n    }\n    ranges = newRanges;\n  }\n  let possibilities = [];\n  for (let i = 0; i < ranges.length; i++) {\n    let range = ranges[i];\n    let min = range.min === undefined ? 0 : range.min;\n    let max = range.max === undefined ? 1 : range.max;\n    let possibility = {\n      mf: range.mf,\n      originalMinCount: min, // value defined by the user\n      originalMaxCount: max, // value defined by the user\n      currentMinCount: min,\n      currentMaxCount: max,\n      currentCount: min,\n      currentMonoisotopicMass: 0,\n      currentCharge: 0,\n      currentUnsaturation: 0,\n      initialOrder: i,\n      minInnerMass: 0,\n      maxInnerMass: 0,\n      minInnerCharge: 0,\n      maxInnerCharge: 0,\n      minCharge: 0,\n      maxCharge: 0,\n      minMass: 0,\n      maxMass: 0,\n      innerCharge: false,\n    };\n    possibilities.push(possibility);\n    let info = new MF(range.mf).getInfo();\n    possibility.em = range.em || info.monoisotopicMass;\n    possibility.charge = range.charge || info.charge;\n    possibility.unsaturation =\n      range.unsaturation === undefined\n        ? (info.unsaturation - 1) * 2\n        : range.unsaturation;\n    possibility.atoms = info.atoms;\n    if (possibility.mf !== info.mf) {\n      possibility.isGroup = true;\n    }\n  }\n  possibilities = possibilities.filter(\n    (r) => r.originalMinCount !== 0 || r.originalMaxCount !== 0,\n  );\n\n  // we will sort the way we analyse the data\n  // 1. The one possibility parameter\n  // 2. The charged part\n  // 3. Decreasing em\n  possibilities.sort((a, b) => {\n    if (a.originalMinCount === a.originalMaxCount) return -1; // should be in front, they are 'static'\n    if (b.originalMinCount === b.originalMaxCount) return 1;\n    if (a.charge && b.charge) {\n      if (Math.abs(a.charge) > Math.abs(b.charge)) return -1;\n      if (Math.abs(a.charge) < Math.abs(b.charge)) return 1;\n      return b.em - a.em;\n    }\n    if (a.charge) return -1;\n    if (b.charge) return 1;\n    return b.em - a.em;\n  });\n\n  // we calculate couple of fixed values\n\n  for (let i = 0; i < possibilities.length; i++) {\n    for (let j = i; j < possibilities.length; j++) {\n      let possibility = possibilities[j];\n      if (possibility.em > 0) {\n        possibilities[i].minMass +=\n          possibility.em * possibility.originalMinCount;\n        possibilities[i].maxMass +=\n          possibility.em * possibility.originalMaxCount;\n      } else {\n        possibilities[i].minMass +=\n          possibility.em * possibility.originalMaxCount;\n        possibilities[i].maxMass +=\n          possibility.em * possibility.originalMinCount;\n      }\n      if (possibility.charge > 0) {\n        possibilities[i].minCharge +=\n          possibility.charge * possibility.originalMinCount;\n        possibilities[i].maxCharge +=\n          possibility.charge * possibility.originalMaxCount;\n      } else {\n        possibilities[i].minCharge +=\n          possibility.charge * possibility.originalMaxCount;\n        possibilities[i].maxCharge +=\n          possibility.charge * possibility.originalMinCount;\n      }\n    }\n  }\n\n  for (let i = 0; i < possibilities.length; i++) {\n    if (i < possibilities.length - 1) {\n      let possibility = possibilities[i];\n      let innerPossibility = possibilities[i + 1];\n      possibility.minInnerMass = innerPossibility.minMass;\n      possibility.maxInnerMass = innerPossibility.maxMass;\n      possibility.minInnerCharge = innerPossibility.minCharge;\n      possibility.maxInnerCharge = innerPossibility.maxCharge;\n      if (possibility.minInnerCharge || possibility.maxInnerCharge) {\n        possibility.innerCharge = true;\n      }\n    }\n  }\n\n  return possibilities;\n}\n","import { getMsInfo } from 'mf-utilities';\nimport { xFindClosestIndex } from 'ml-spectra-processing';\n\nimport { unsaturationMatcher } from './unsaturationMatcher.js';\n/**\n * @param {object}         [entry={}]\n * @param {object}         [options={}]\n * @param {object}         [options.ionization={ mf: '', em: 0, charge: 0 }] - ionization method\n * @param {boolean}        [options.forceIonization=false] - If true ignore existing ionizations\n * @param {number}         [options.precision=1000] - The precision on the experimental mass\n * @param {number}         [options.targetMass] - Target mass, allows to calculate error and filter results\n * @param {number[]}       [options.targetMasses] - Target masses: SORTED array of numbers\n * @param {number[]}       [options.targetIntensities] - Target intensities: SORTED array of numbers\n * @param {number}         [options.minEM=0] - Minimal monoisotopic mass\n * @param {number}         [options.maxEM=+Infinity] - Maximal monoisotopic mass\n * @param {number}         [options.minMSEM=0] - Minimal monoisotopic mass observed by mass\n * @param {number}         [options.maxMSEM=+Infinity] - Maximal monoisotopic mass observed by mass\n * @param {number}         [options.minCharge=-Infinity] - Minimal charge\n * @param {number}         [options.maxCharge=+Infinity] - Maximal charge\n * @param {boolean}        [options.absoluteCharge=false] - If true, the charge is absolute (so between 0 and +Infinity by default)\n * @param {boolean}        [options.allowNegativeAtoms=false] - Allow to have negative number of atoms\n * @param {object}         [options.unsaturation={}]\n * @param {number}         [options.unsaturation.min=-Infinity] - Minimal unsaturation\n * @param {number}         [options.unsaturation.max=+Infinity] - Maximal unsaturation\n * @param {boolean}        [options.unsaturation.onlyInteger=false] - Integer unsaturation\n * @param {boolean}        [options.unsaturation.onlyNonInteger=false] - Non integer unsaturation\n * @param {boolean}        [options.atoms] - object of atom:{min, max}\n * @param {Function}       [options.callback] - a function that contains information about the current MF\n * @return {boolean}\n */\n\n/**\n * We always recalculate msem\n */\n\nexport function msemMatcher(entry, options = {}) {\n  const {\n    ionization = { mf: '', em: 0, charge: 0, atoms: {} },\n    forceIonization = false,\n    precision = 1000,\n    minCharge = Number.MIN_SAFE_INTEGER,\n    maxCharge = Number.MAX_SAFE_INTEGER,\n    absoluteCharge = false,\n    unsaturation = {},\n    targetMass, // if present we will calculate the errors\n    targetMasses, // if present we will calculate the smallest error\n    targetIntensities, // if present it will be added in the report\n    minEM = -Infinity,\n    maxEM = +Infinity,\n    minMSEM = -Infinity,\n    maxMSEM = +Infinity,\n    allowNegativeAtoms = false,\n    atoms,\n    callback,\n  } = options;\n\n  let msInfo = getMsInfo(entry, {\n    ionization,\n    forceIonization,\n    targetMass,\n  });\n  let ms = msInfo.ms;\n\n  if (entry.em !== undefined) {\n    if (entry.em < minEM || entry.em > maxEM) return false;\n  }\n\n  if (ms.em !== undefined) {\n    if (ms.em < minMSEM || ms.em > maxMSEM) return false;\n  }\n\n  if (targetMass && Math.abs(ms.ppm) > precision) return false;\n\n  if (ms.charge !== undefined) {\n    let charge = absoluteCharge ? Math.abs(ms.charge) : ms.charge;\n    if (charge < minCharge || charge > maxCharge) return false;\n  }\n  if (unsaturation !== undefined && entry.unsaturation !== undefined) {\n    if (!unsaturationMatcher(entry, unsaturation)) {\n      return false;\n    }\n  }\n  if (entry.atoms !== undefined && atoms) {\n    // all the atoms of the entry must fit in the range\n    for (let atom in entry.atoms) {\n      if (!atoms[atom]) return false;\n      if (entry.atoms[atom] < atoms[atom].min) return false;\n      if (entry.atoms[atom] > atoms[atom].max) return false;\n    }\n  }\n\n  if (entry.atoms !== undefined && !allowNegativeAtoms) {\n    const ionizationAtoms =\n      (msInfo.ionization && msInfo.ionization.atoms) || {};\n    const atomKeys = new Set(\n      Object.keys(ionizationAtoms).concat(Object.keys(entry.atoms)),\n    );\n    for (let atom of atomKeys) {\n      if ((entry.atoms[atom] || 0) + (ionizationAtoms[atom] || 0) < 0) {\n        return false;\n      }\n    }\n  }\n\n  if (targetMasses && targetMasses.length > 0) {\n    let index = xFindClosestIndex(targetMasses, ms.em);\n    let closestMass = targetMasses[index];\n    msInfo = getMsInfo(entry, {\n      ionization,\n      forceIonization,\n      targetMass: closestMass,\n    });\n    msInfo.ms.target = { mass: closestMass };\n    if (targetIntensities) {\n      msInfo.ms.target.intensity = targetIntensities[index];\n    }\n    // need to find the closest targetMasses\n    if (Math.abs(msInfo.ms.ppm) > precision) return false;\n  }\n\n  if (callback) {\n    if (!callback(entry)) return false;\n  }\n\n  return msInfo;\n}\n","import { ELECTRON_MASS } from 'chemical-elements';\n\n/**\n * returns all the possible neutral mass for a defined experimental (targetMass) mass\n */\nexport class TargetMassCache {\n  /**\n   * @param {number} targetMass\n   * @param {Array} possibilities\n   * @param {object} [options={}]\n   * @param {boolean} [options.allowNeutral=false]\n   * @param {number} [options.charge=0]\n   * @param {number} [options.precision=100]\n   * @param {object} [options.filter={}]\n   * @param {number} [options.filter.minCharge=Number.MIN_SAFE_INTEGER]\n   * @param {number} [options.filter.maxCharge=Number.MAX_SAFE_INTEGER]\n   * @returns\n   */\n  constructor(targetMass, possibilities, options = {}) {\n    const {\n      allowNeutral = false, // msem because em in this case !\n      filter = {},\n      charge = 0,\n      precision = 100,\n    } = options;\n    const {\n      minCharge = Number.MIN_SAFE_INTEGER,\n      maxCharge = Number.MAX_SAFE_INTEGER,\n    } = filter;\n\n    if (!possibilities || possibilities.length === 0) return;\n\n    let firstPossibility = possibilities[0];\n    let currentMinCharge = Math.max(\n      minCharge,\n      firstPossibility.minCharge + charge,\n    );\n    let currentMaxCharge = Math.min(\n      maxCharge,\n      firstPossibility.maxCharge + charge,\n    );\n\n    this.minCharge = currentMinCharge;\n    this.maxCharge = currentMaxCharge;\n\n    let size = this.maxCharge - this.minCharge + 1;\n    this.data = [];\n    let minMass = 0;\n    let maxMass = 0;\n    let range = (targetMass * precision) / 1e6;\n    for (let i = 0; i < size; i++) {\n      let currentCharge = i + this.minCharge;\n      if (currentCharge === 0) {\n        if (allowNeutral) {\n          minMass = targetMass - range;\n          maxMass = targetMass + range;\n        } else {\n          minMass = Number.MAX_SAFE_INTEGER;\n          maxMass = Number.MIN_SAFE_INTEGER;\n        }\n      } else {\n        minMass =\n          (targetMass - range) * Math.abs(currentCharge) +\n          ELECTRON_MASS * currentCharge;\n        maxMass =\n          (targetMass + range) * Math.abs(currentCharge) +\n          ELECTRON_MASS * currentCharge;\n      }\n\n      this.data.push({\n        charge: currentCharge,\n        minMass,\n        maxMass,\n      });\n    }\n  }\n\n  getMinMass(charge) {\n    return this.data[charge - this.minCharge]\n      ? this.data[charge - this.minCharge].minMass\n      : Number.MAX_SAFE_INTEGER;\n  }\n\n  getMaxMass(charge) {\n    return this.data[charge - this.minCharge]\n      ? this.data[charge - this.minCharge].maxMass\n      : Number.MIN_SAFE_INTEGER;\n  }\n}\n","import { atomSorter } from 'atom-sorter';\nimport { msemMatcher } from 'mf-matcher';\nimport {\n  preprocessIonizations,\n  preprocessRanges,\n  getMsInfo,\n} from 'mf-utilities';\n\nimport { TargetMassCache } from './TargetMassCache';\n\n/**\n * @param {number}        targetMass - Monoisotopic mass\n * @param {object}        [options={}]\n * @param {number}        [options.maxIterations=10000000] - Maximum number of iterations\n * @param {boolean}       [options.allowNeutral=true]\n * @param {boolean}       [options.uniqueMFs=true]\n * @param {number}        [options.limit=1000] - Maximum number of results\n * @param {string}        [options.ionizations=''] - string containing a comma separated list of modifications\n * @param {string}        [options.ranges='C0-100 H0-100 O0-100 N0-100'] - range of mfs to search\n * @param {number}        [options.precision=100] - Allowed mass range based on precision\n * @param {object}        [options.filter={}]\n * @param {number}        [options.filter.minCharge=-Infinity] - Minimal charge\n * @param {number}        [options.filter.maxCharge=+Infinity] - Maximal charge\n * @param {boolean}       [options.filter.absoluteCharge=false] - If true, the charge is absolute (so between 0 and +Infinity by default)\n * @param {object}        [options.filter.unsaturation={}]\n * @param {number}        [options.filter.unsaturation.min=-Infinity] - Minimal unsaturation\n * @param {number}        [options.filter.unsaturation.max=+Infinity] - Maximal unsaturation\n * @param {boolean}       [options.filter.unsaturation.onlyInteger=false] - Integer unsaturation\n * @param {boolean}       [options.filter.unsaturation.onlyNonInteger=false] - Non integer unsaturation\n * @param {object}        [options.filter.atoms] - object of atom:{min, max}\n * @param {function}      [options.filter.callback] - a function to filter the MF\n * @returns {object}\n */\n\nexport function findMFsSync(targetMass, options = {}) {\n  const {\n    filter = {},\n    maxIterations = 1e8,\n    limit = 1000,\n    allowNeutral = true, // if there is no msem we use em !\n    uniqueMFs = false, // if there is no msem we use em !\n    ranges = [\n      { mf: 'C', min: 0, max: 100 },\n      { mf: 'H', min: 0, max: 100 },\n      { mf: 'O', min: 0, max: 100 },\n      { mf: 'N', min: 0, max: 100 },\n    ],\n  } = options;\n  let targetMassCache;\n  const {\n    minCharge = Number.MIN_SAFE_INTEGER,\n    maxCharge = Number.MAX_SAFE_INTEGER,\n    unsaturation = {},\n  } = filter;\n\n  let filterUnsaturation = !!unsaturation;\n  // we calculate not the real unsaturation but the one before dividing by 2 + 1\n  let fakeMinUnsaturation =\n    unsaturation.min === undefined\n      ? Number.MIN_SAFE_INTEGER\n      : (unsaturation.min - 1) * 2;\n  let fakeMaxUnsaturation =\n    unsaturation.max === undefined\n      ? Number.MAX_SAFE_INTEGER\n      : (unsaturation.max - 1) * 2;\n\n  let filterCharge =\n    minCharge !== Number.MIN_SAFE_INTEGER ||\n    maxCharge !== Number.MAX_SAFE_INTEGER;\n\n  let advancedFilter;\n  if (filter.atoms || filter.callback) {\n    advancedFilter = {\n      atoms: filter.atoms,\n      callback: filter.callback,\n    };\n  }\n\n  let result = {\n    mfs: [],\n    info: {\n      numberMFEvaluated: 0,\n      numberResults: 0,\n    },\n  };\n  let orderMapping = []; // used to sort the atoms\n\n  // we need to make the processing for all the ionizations\n  let ionizations = preprocessIonizations(options.ionizations);\n  for (let ionization of ionizations) {\n    let currentIonization = {\n      currentMonoisotopicMass: ionization.em || 0,\n      currentCharge: ionization.charge,\n      currentUnsaturation: 0, // we don't take into account the unsaturation of the ionization agent\n    };\n    // if (DEBUG) console.log('new ionization', ionization.mf, ionization.em, ionization.charge);\n    // ionization em and charge will be used to set the first atom value\n    let possibilities = preprocessRanges(ranges);\n    orderMapping = getOrderMapping(possibilities);\n\n    if (possibilities.length === 0) return { mfs: [] };\n    targetMassCache = new TargetMassCache(targetMass, possibilities, {\n      ...options,\n      charge: ionization.charge,\n    });\n\n    let theEnd = false;\n    let maxPosition = possibilities.length;\n    let lastPosition = possibilities.length - 1;\n    let currentPosition = 0;\n    let currentAtom;\n    let previousAtom;\n    let lastPossibility = possibilities[lastPosition];\n\n    initializePossibilities(possibilities, currentIonization, targetMassCache);\n\n    //  if (DEBUG) console.log('possibilities', possibilities.map((a) => `${a.mf + a.originalMinCount}-${a.originalMaxCount}`));\n\n    let isValid = false; // designed so that the first time it is not a valid solution\n    while (!theEnd) {\n      if (result.info.numberMFEvaluated++ > maxIterations) {\n        throw Error(\n          `Iteration number is over the current maximum of: ${maxIterations}`,\n        );\n      }\n      if (filterUnsaturation) {\n        let unsaturationValue = lastPossibility.currentUnsaturation;\n        let isOdd = Math.abs(unsaturationValue % 2);\n        if (\n          (unsaturation.onlyInteger && isOdd === 1) ||\n          (unsaturation.onlyNonInteger && isOdd === 0) ||\n          fakeMinUnsaturation > unsaturationValue ||\n          fakeMaxUnsaturation < unsaturationValue\n        ) {\n          isValid = false;\n        }\n      }\n      if (\n        filterCharge &&\n        (lastPossibility.currentCharge < minCharge ||\n          lastPossibility.currentCharge > maxCharge)\n      ) {\n        isValid = false;\n      }\n\n      if (isValid) {\n        let minMass = targetMassCache.getMinMass(lastPossibility.currentCharge);\n        let maxMass = targetMassCache.getMaxMass(lastPossibility.currentCharge);\n        if (\n          lastPossibility.currentMonoisotopicMass < minMass ||\n          lastPossibility.currentMonoisotopicMass > maxMass\n        ) {\n          isValid = false;\n        }\n      }\n\n      if (isValid) {\n        result.info.numberResults++;\n        let newResult = getResult(\n          possibilities,\n          targetMass,\n          allowNeutral,\n          ionization,\n          orderMapping,\n        );\n        if (advancedFilter) {\n          isValid = msemMatcher(newResult, advancedFilter) !== false;\n        }\n        if (isValid) {\n          result.mfs.push(newResult);\n          if (result.mfs.length > 2 * limit) {\n            if (uniqueMFs) ensureUniqueMF(result);\n            result.mfs.sort((a, b) => Math.abs(a.ms.ppm) - Math.abs(b.ms.ppm));\n            result.mfs.length = limit;\n          }\n        }\n      }\n\n      isValid = true;\n      // we need to setup all the arrays if possible\n      while (currentPosition < maxPosition && currentPosition >= 0) {\n        currentAtom = possibilities[currentPosition];\n        previousAtom =\n          currentPosition === 0\n            ? currentIonization\n            : possibilities[currentPosition - 1];\n        if (currentAtom.currentCount < currentAtom.currentMaxCount) {\n          currentAtom.currentCount++;\n          updateCurrentAtom(currentAtom, previousAtom);\n          if (currentPosition < lastPosition) {\n            currentPosition++;\n            setCurrentMinMax(\n              possibilities[currentPosition],\n              possibilities[currentPosition - 1],\n              targetMassCache,\n            );\n          } else {\n            break;\n          }\n        } else {\n          currentPosition--;\n        }\n      }\n\n      if (currentPosition < 0) {\n        theEnd = true;\n      }\n    }\n  }\n\n  if (uniqueMFs) ensureUniqueMF(result);\n  result.mfs.sort((a, b) => Math.abs(a.ms.ppm) - Math.abs(b.ms.ppm));\n  if (result.mfs.length > limit) {\n    result.mfs.length = limit;\n  }\n  result.mfs.forEach((mf) => delete mf.currentCounts);\n  return result;\n}\n\n/**\n * Ensure that we have only once the same MF\n * In order to improve the speed we just consider the em\n * @param {object} result\n */\nfunction ensureUniqueMF(result) {\n  result.mfs.sort((a, b) => a.em - b.em);\n  let previousEM = 0;\n  let bestCounts = [];\n  const mfs = [];\n  next: for (let current of result.mfs) {\n    if (current.em - previousEM > 1e-8) {\n      previousEM = current.em;\n      bestCounts = current.currentCounts;\n      mfs.push(current);\n    } else {\n      for (let i = 0; i < current.currentCounts.length; i++) {\n        // better priority ???\n        if (current.currentCounts[i] > bestCounts[i]) {\n          mfs.pop();\n          mfs.push(current);\n          bestCounts = current.currentCounts;\n          continue;\n        } else if (current.currentCounts[i] < bestCounts[i]) {\n          continue next;\n        }\n      }\n    }\n  }\n  result.mfs = mfs;\n}\n\nfunction updateCurrentAtom(currentAtom, previousAtom) {\n  currentAtom.currentMonoisotopicMass =\n    previousAtom.currentMonoisotopicMass +\n    currentAtom.em * currentAtom.currentCount;\n  currentAtom.currentCharge =\n    previousAtom.currentCharge + currentAtom.charge * currentAtom.currentCount;\n  currentAtom.currentUnsaturation =\n    previousAtom.currentUnsaturation +\n    currentAtom.unsaturation * currentAtom.currentCount;\n}\n\nfunction getResult(\n  possibilities,\n  targetMass,\n  allowNeutralMolecules,\n  ionization,\n  orderMapping,\n) {\n  let lastPossibility = possibilities[possibilities.length - 1];\n\n  let result = {\n    em: lastPossibility.currentMonoisotopicMass - ionization.em,\n    unsaturation: lastPossibility.currentUnsaturation,\n    mf: '',\n    charge: lastPossibility.currentCharge - ionization.charge,\n    ionization,\n    atoms: {},\n    groups: {},\n    currentCounts: possibilities.map((possibility) => possibility.currentCount),\n  };\n\n  // we check that the first time we meet the ionization group it does not end\n  // in the final result\n\n  for (let i = 0; i < possibilities.length; i++) {\n    let possibility = possibilities[orderMapping[i]];\n    if (possibility.currentCount !== 0) {\n      if (possibility.isGroup) {\n        if (possibility.currentCount === 1) {\n          result.mf += `${possibility.mf}`;\n        } else if (possibility.mf.match(/^\\([^()]*\\)$/)) {\n          result.mf += `${possibility.mf}${possibility.currentCount}`;\n        } else {\n          result.mf += `(${possibility.mf})${possibility.currentCount}`;\n        }\n        if (result.groups[possibility.mf]) {\n          result.groups[possibility.mf] += possibility.currentCount;\n        } else {\n          result.groups[possibility.mf] = possibility.currentCount;\n        }\n      } else {\n        result.mf += possibility.mf;\n        if (possibility.currentCount !== 1) {\n          result.mf += possibility.currentCount;\n        }\n      }\n      for (let atom in possibility.atoms) {\n        if (result.atoms[atom]) {\n          result.atoms[atom] +=\n            possibility.atoms[atom] * possibility.currentCount;\n        } else {\n          result.atoms[atom] =\n            possibility.atoms[atom] * possibility.currentCount;\n        }\n      }\n    }\n  }\n  result.unsaturation = (result.unsaturation + Math.abs(result.charge)) / 2 + 1;\n  result.ms = getMsInfo(result, { targetMass, allowNeutralMolecules }).ms;\n  return result;\n}\n\nfunction setCurrentMinMax(currentAtom, previousAtom, targetMassCache) {\n  // the current min max can only be optimize if the charge will not change anymore\n  if (currentAtom.innerCharge === true || currentAtom.charge !== 0) {\n    currentAtom.currentMinCount = currentAtom.originalMinCount;\n    currentAtom.currentMaxCount = currentAtom.originalMaxCount;\n    currentAtom.currentCount = currentAtom.currentMinCount - 1;\n  } else {\n    // no more change of charge, we can optimize\n    let currentMass =\n      previousAtom !== undefined ? previousAtom.currentMonoisotopicMass : 0;\n    let currentCharge =\n      previousAtom !== undefined ? previousAtom.currentCharge : 0;\n    currentAtom.currentMinCount = Math.max(\n      Math.floor(\n        (targetMassCache.getMinMass(currentCharge) -\n          currentMass -\n          currentAtom.maxInnerMass) /\n          currentAtom.em,\n      ),\n      currentAtom.originalMinCount,\n    );\n    currentAtom.currentMaxCount = Math.min(\n      Math.floor(\n        (targetMassCache.getMaxMass(currentCharge) -\n          currentMass -\n          currentAtom.minInnerMass) /\n          currentAtom.em,\n      ),\n      currentAtom.originalMaxCount,\n    );\n    currentAtom.currentCount = currentAtom.currentMinCount - 1;\n  }\n}\n\nfunction initializePossibilities(\n  possibilities,\n  currentIonization,\n  targetMassCache,\n) {\n  for (let i = 0; i < possibilities.length; i++) {\n    if (i === 0) {\n      updateCurrentAtom(possibilities[i], currentIonization);\n      setCurrentMinMax(possibilities[i], currentIonization, targetMassCache);\n    } else {\n      updateCurrentAtom(possibilities[i], possibilities[i - 1]);\n    }\n  }\n}\n\n// eslint-disable-next-line no-unused-vars\nfunction possibilitiesToString(possibilities) {\n  return possibilities.map((a) => [\n    `mf:${a.mf}`,\n    `current:${a.currentCount}`,\n    `min:${a.currentMinCount}`,\n    `max:${a.currentMaxCount}`,\n    `charge:${a.currentCharge}`,\n  ]);\n}\n\nfunction getOrderMapping(possibilities) {\n  let mapping = possibilities.map((p, i) => ({ atom: p.mf, index: i }));\n  mapping.sort((a, b) => {\n    return atomSorter(a.atom, b.atom);\n  });\n  return mapping.map((a) => a.index);\n}\n","import { findMFsSync } from './findMFsSync';\n\n/**\n * @param {number}        targetMass - Monoisotopic mass\n * @param {object}        [options={}]\n * @param {number}        [options.maxIterations=10000000] - Maximum number of iterations\n * @param {boolean}       [options.allowNeutral=true]\n * @param {boolean}       [options.uniqueMFs=true]\n * @param {number}        [options.limit=1000] - Maximum number of results\n * @param {string}        [options.ionizations=''] - string containing a comma separated list of modifications\n * @param {string}        [options.ranges='C0-100 H0-100 O0-100 N0-100'] - range of mfs to search\n * @param {number}        [options.precision=100] - Allowed mass range based on precision\n * @param {object}        [options.filter={}]\n * @param {number}        [options.filter.minCharge=-Infinity] - Minimal charge\n * @param {number}        [options.filter.maxCharge=+Infinity] - Maximal charge\n * @param {boolean}       [options.filter.absoluteCharge=false] - If true, the charge is absolute (so between 0 and +Infinity by default)\n * @param {object}        [options.filter.unsaturation={}]\n * @param {number}        [options.filter.unsaturation.min=-Infinity] - Minimal unsaturation\n * @param {number}        [options.filter.unsaturation.max=+Infinity] - Maximal unsaturation\n * @param {boolean}       [options.filter.unsaturation.onlyInteger=false] - Integer unsaturation\n * @param {boolean}       [options.filter.unsaturation.onlyNonInteger=false] - Non integer unsaturation\n * @param {object}        [options.filter.atoms] - object of atom:{min, max}\n * @param {function}      [options.filter.callback] - a function to filter the MF\n * @returns {Promise}\n */\n\nexport async function findMFs(targetMass, options = {}) {\n  return findMFsSync(targetMass, options);\n}\n","'use strict';\n\n/**\n * Modify object a to join it with b and make the sum of each of the keys\n * @param {*} a\n * @param {*} source1\n *\n * @return {object}\n */\n\nfunction sum(target) {\n    for (var i = 1; i < arguments.length; i++) {\n        let toSum = arguments[i];\n        for (var key of Object.keys(toSum)) {\n            if (target[key]) {\n                target[key] += toSum[key];\n            } else {\n                target[key] = toSum[key];\n            }\n        }\n    }\n    return target;\n}\n\nmodule.exports = sum;\n","import { ELECTRON_MASS } from 'chemical-elements';\nimport { msemMatcher } from 'mf-matcher';\nimport { MF } from 'mf-parser';\nimport { processRange, preprocessIonizations } from 'mf-utilities';\nimport sum from 'sum-object-keys';\n/**\n * Generate all the possible combinations of molecular formula and calculate\n * for each of them the monoisotopic mass and observed monoisotopic mass (m/z)\n * In the molecular formula there may be a comment after the '$' symbol\n *\n * @param {Array}         ranges\n * @param {object}        [options={}]\n * @param {number}        [options.limit=10000000] - Maximum number of results\n * @param {boolean}       [options.estimate=false] - estimate the number of MF without filters\n * @param {boolean}       [options.canonizeMF=true] - Canonize molecular formula\n * @param {boolean}       [options.uniqueMFs=true] - Force canonization and make MF unique\n * @param {string}        [options.ionizations=''] - Comma separated list of ionizations (to charge the molecule)\n * @param {function}      [options.onStep] - Callback to do after each step\n * @param {object}        [options.filter={}]\n * @param {number}        [options.filter.minMass=0] - Minimal monoisotopic mass\n * @param {number}        [options.filter.maxMass=+Infinity] - Maximal monoisotopic mass\n * @param {number}        [options.filter.minEM=0] - Minimal neutral monoisotopic mass\n * @param {number}        [options.filter.maxEM=+Infinity] - Maximal neutral monoisotopic mass\n * @param {number}        [options.filter.precision=1000] - The precision on the experimental mass\n * @param {number}        [options.filter.targetMass] - Target mass, allows to calculate error and filter results\n * @param {number[]}      [options.filter.targetMasses] - Target masses: SORTED array of numbers\n * @param {number}        [options.filter.precision=1000] - Precision\n * @param {number}        [options.filter.minCharge=-Infinity] - Minimal charge\n * @param {number}        [options.filter.maxCharge=+Infinity] - Maximal charge\n * @param {boolean}       [options.filter.absoluteCharge=false] - If true, the charge is absolute (so between 0 and +Infinity by default)\n * @param {boolean}       [options.filter.allowNegativeAtoms=false] - Allow to have negative number of atoms\n * @param {object}        [options.filter.unsaturation={}]\n * @param {number}        [options.filter.unsaturation.min=-Infinity] - Minimal unsaturation\n * @param {number}        [options.filter.unsaturation.max=+Infinity] - Maximal unsaturation\n * @param {boolean}       [options.filter.unsaturation.onlyInteger=false] - Integer unsaturation\n * @param {boolean}       [options.filter.unsaturation.onlyNonInteger=false] - Non integer unsaturation\n * @param {object}        [options.filter.atoms] - object of atom:{min, max}\n * @param {function}      [options.filter.callback] - a function to filter the MF\n * @param {string}        [options.filterFct]\n * @param {object}        [options.links]\n * @param {boolean}       [options.links.filter] We filter all the MF that do not match the '*X'\n * @returns {Promise}\n */\n\nexport async function generateMFs(ranges, options = {}) {\n  if (!Array.isArray(ranges)) {\n    throw new Error('Ranges must be an array of string or object');\n  }\n\n  options = { ...options };\n\n  let { limit = 100000, uniqueMFs = true, estimate = false, onStep } = options;\n\n  options.filterFctVariables = {};\n  for (let i = 0; i < ranges.length; i++) {\n    const range = ranges[i];\n    if (typeof range === 'object' && range.name) {\n      options.filterFctVariables[range.name] = i;\n      ranges[i] = range.value;\n    }\n  }\n\n  if (options.filterFct) {\n    // we create a real javascript function\n    let variables = Object.keys(options.filterFctVariables);\n    variables.push('mm', 'mz', 'charge', 'unsaturation', 'atoms');\n    // eslint-disable-next-line no-new-func\n    options.filterFct = new Function(\n      ...variables,\n      `return ${options.filterFct}`,\n    );\n  }\n\n  if (uniqueMFs === true) options.canonizeMF = true;\n  if (options.canonizeMF === undefined) options.canonizeMF = true;\n  options.ionizations = preprocessIonizations(options.ionizations);\n\n  if (!Array.isArray(ranges)) {\n    throw new Error('You need to specify an array of strings or arrays');\n  }\n\n  // we allow String delimited by \". or ;\" instead of an array\n  for (let i = 0; i < ranges.length; i++) {\n    if (!Array.isArray(ranges[i])) {\n      ranges[i] = ranges[i].split(/[.,]/);\n    }\n  }\n\n  // we allow ranges in a string ...\n  // problem with ranges is that we need to know to what the range applies\n  for (let i = 0; i < ranges.length; i++) {\n    let parts = ranges[i];\n    let newParts = [];\n    for (let j = 0; j < parts.length; j++) {\n      let part = parts[j];\n      let comment = part.replace(/^([^$]*\\$|.*)/, '');\n      part = part.replace(/\\$.*/, '').replace(/\\s/g, '');\n      if (part.match(/[0-9]-[0-9-]/)) {\n        // deal with negative numbers\n        // there are ranges ... we are in trouble !\n        newParts = newParts.concat(processRange(part, comment, { limit }));\n      } else {\n        newParts.push(parts[j]); // the part with the comments !\n      }\n    }\n    ranges[i] = newParts;\n  }\n\n  if (estimate) {\n    let total = ranges.reduce(\n      (previous, current) => previous * current.length,\n      1,\n    );\n    return total * options.ionizations.length;\n  }\n\n  let results = [];\n  let sizes = [];\n  let currents = [];\n  for (let i = 0; i < ranges.length; i++) {\n    sizes.push(ranges[i].length - 1);\n    currents.push(0);\n  }\n  let position = 0;\n  let evolution = 0;\n  while (position < currents.length) {\n    if (currents[position] < sizes[position]) {\n      if (onStep) await onStep(evolution);\n      evolution++;\n      appendResult(results, currents, ranges, options);\n      currents[position]++;\n      for (let i = 0; i < position; i++) {\n        currents[i] = 0;\n      }\n      position = 0;\n    } else {\n      position++;\n    }\n    if (evolution > limit) {\n      throw new Error(\n        `You have reached the limit of ${limit}. You could still change this value using the limit option but it is likely to crash.`,\n      );\n    }\n  }\n\n  appendResult(results, currents, ranges, options);\n  if (uniqueMFs) {\n    let uniqueMFsObject = {};\n    results.forEach((result) => {\n      uniqueMFsObject[result.mf + result.ionization.mf] = result;\n    });\n    results = Object.keys(uniqueMFsObject).map((k) => uniqueMFsObject[k]);\n  }\n  results.sort((a, b) => a.em - b.em);\n  return results;\n}\n\nlet ems = {};\n\n// internal method used as a cache\nfunction getMonoisotopicMass(mfString) {\n  if (!ems[mfString]) {\n    // we need to calculate based on the mf but not very often ...\n    let mf = new MF(mfString);\n    let info = mf.getInfo();\n    ems[mfString] = {\n      em: info.monoisotopicMass,\n      charge: info.charge,\n      mw: info.mass,\n      unsaturation: (info.unsaturation - 1) * 2,\n      atoms: info.atoms,\n    };\n  }\n  return ems[mfString];\n}\n\nfunction getEMFromParts(parts, currents, ionization) {\n  let charge = 0;\n  let em = 0;\n  let mw = 0;\n  let unsaturation = 0;\n  let validUnsaturation = true;\n  let atoms = {};\n\n  for (let i = 0; i < parts.length; i++) {\n    let part = parts[i][currents[i]];\n    if (part) {\n      let info = getMonoisotopicMass(part);\n      charge += info.charge;\n      em += info.em;\n      mw += info.mw;\n      sum(atoms, info.atoms);\n      if (info.unsaturation && validUnsaturation) {\n        unsaturation += info.unsaturation;\n      }\n    }\n  }\n\n  return {\n    charge,\n    em,\n    mw,\n    ionization,\n    unsaturation: validUnsaturation ? unsaturation / 2 + 1 : undefined,\n    atoms,\n  };\n}\n\nfunction appendResult(results, currents, keys, options = {}) {\n  const { canonizeMF, filter, ionizations, links = {} } = options;\n  // this script is designed to combine molecular formula\n  // that may contain comments after a \"$\" sign\n  // therefore we should put all the comments at the ned\n\n  if (links.filter) {\n    let sharps = [];\n    for (let i = 0; i < keys.length; i++) {\n      let anchors = keys[i][currents[i]].match(/#[0-9]+/g);\n      if (anchors) sharps.push(...anchors);\n    }\n    if (sharps.length % 2 === 1) return;\n    sharps = sharps.sort();\n    for (let i = 0; i < sharps.length; i += 2) {\n      if (sharps[i] !== sharps[i + 1]) return;\n    }\n  }\n\n  for (let ionization of ionizations) {\n    let result = getEMFromParts(keys, currents, ionization);\n    if (options.filterFct) {\n      let variables = [];\n      for (let key in options.filterFctVariables) {\n        variables.push(currents[options.filterFctVariables[key]]);\n      }\n\n      variables.push(\n        result.em,\n        (result.em + ionization.em - ionization.charge * ELECTRON_MASS) /\n          Math.abs(ionization.charge),\n        result.charge + result.ionization.charge,\n        result.unsaturation,\n        result.atoms,\n      );\n      if (!options.filterFct.apply(null, variables)) continue;\n    }\n\n    result.parts = [];\n    result.mf = '';\n\n    let comments = [];\n    for (let i = 0; i < keys.length; i++) {\n      let key = keys[i][currents[i]];\n      if (key) {\n        if (key.indexOf('$') > -1) {\n          comments.push(key.replace(/^[^$]*\\$/, ''));\n          key = key.replace(/\\$.*/, '');\n        }\n        result.parts[i] = key;\n        result.mf += key;\n      }\n    }\n\n    if (comments.length > 0) {\n      result.comment = comments.join(' ');\n    }\n\n    let match = msemMatcher(result, filter);\n    if (!match) continue;\n    result.ms = match.ms;\n    result.ionization = match.ionization;\n\n    if (canonizeMF) {\n      result.mf = new MF(result.mf).toMF();\n    }\n\n    results.push(result);\n  }\n}\n","/**\n *\n * @param {import('openchemlib').Molecule} molecule An instance of a molecule\n * @param {object} [options={}]\n * @param {object} [options.OCL] openchemlib library\n */\nexport function makeRacemic(molecule) {\n    const { Molecule } = molecule.getOCL();\n    // 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","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","import { getXAtomicNumber } from './getXAtomicNumber';\n/**\n * Tag an atom to be able to visualize it\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","/**\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","import { isCsp3 } from '../util/isCsp3.js';\nimport { makeRacemic } from '../util/makeRacemic.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 OCL = molecule.getOCL();\n    const { allowedCustomLabels, minSphereSize = 0, maxSphereSize = 4, kind = FULL_HOSE_CODE, } = options;\n    // this force reordering of atoms in order to have hydrogens at the end\n    molecule.ensureHelperArrays(OCL.Molecule.cHelperNeighbours);\n    const rootAtoms = [];\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    const fragment = new OCL.Molecule(0, 0);\n    const results = [];\n    let min = 0;\n    let max = 0;\n    const atomMask = new Array(molecule.getAllAtoms());\n    const atomList = new Array(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        molecule.copyMoleculeByAtoms(fragment, atomMask, true, null);\n        if (sphere >= minSphereSize) {\n            makeRacemic(fragment);\n            results.push(fragment.getCanonizedIDCode(OCL.Molecule.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS));\n        }\n    }\n    return results;\n}\n//# sourceMappingURL=getHoseCodesForAtomsInternal.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 { ensureHeterotopicChiralBonds } from '../diastereotopic/ensureHeterotopicChiralBonds.js';\nimport { tagAtom } from '../util/tagAtom';\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 { 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 { 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    entries.forEach((entry) => {\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        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","/* @license\nPapa Parse\nv5.4.1\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n!function(e,t){\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()}(this,function s(){\"use strict\";var f=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==f?f:{};var n=!f.document&&!!f.postMessage,o=f.IS_PAPA_WORKER||!1,a={},u=0,b={parse:function(e,t){var r=(t=t||{}).dynamicTyping||!1;J(r)&&(t.dynamicTypingFunction=r,r={});if(t.dynamicTyping=r,t.transform=!!J(t.transform)&&t.transform,t.worker&&b.WORKERS_SUPPORTED){var i=function(){if(!b.WORKERS_SUPPORTED)return!1;var e=(r=f.URL||f.webkitURL||null,i=s.toString(),b.BLOB_URL||(b.BLOB_URL=r.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; \",\"(\",i,\")();\"],{type:\"text/javascript\"})))),t=new f.Worker(e);var r,i;return t.onmessage=_,t.id=u++,a[t.id]=t}();return i.userStep=t.step,i.userChunk=t.chunk,i.userComplete=t.complete,i.userError=t.error,t.step=J(t.step),t.chunk=J(t.chunk),t.complete=J(t.complete),t.error=J(t.error),delete t.worker,void i.postMessage({input:e,config:t,workerId:i.id})}var n=null;b.NODE_STREAM_INPUT,\"string\"==typeof e?(e=function(e){if(65279===e.charCodeAt(0))return e.slice(1);return e}(e),n=t.download?new l(t):new p(t)):!0===e.readable&&J(e.read)&&J(e.on)?n=new g(t):(f.File&&e instanceof File||e instanceof Object)&&(n=new c(t));return n.stream(e)},unparse:function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,r=!1,i=null,o=!1;!function(){if(\"object\"!=typeof t)return;\"string\"!=typeof t.delimiter||b.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter);(\"boolean\"==typeof t.quotes||\"function\"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes);\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(r=t.skipEmptyLines);\"string\"==typeof t.newline&&(y=t.newline);\"string\"==typeof t.quoteChar&&(s=t.quoteChar);\"boolean\"==typeof t.header&&(_=t.header);if(Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");i=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s);(\"boolean\"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(o=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\\-@\\t\\r].*$/)}();var u=new RegExp(Q(s),\"g\");\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return h(null,e,r);if(\"object\"==typeof e[0])return h(i||Object.keys(e[0]),e,r)}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||i),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])),h(e.fields||[],e.data||[],r);throw new Error(\"Unable to serialize unrecognized input\");function h(e,t,r){var i=\"\";\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t));var n=Array.isArray(e)&&0<e.length,s=!Array.isArray(t[0]);if(n&&_){for(var a=0;a<e.length;a++)0<a&&(i+=m),i+=v(e[a],a);0<t.length&&(i+=y)}for(var o=0;o<t.length;o++){var u=n?e.length:t[o].length,h=!1,f=n?0===Object.keys(t[o]).length:0===t[o].length;if(r&&!n&&(h=\"greedy\"===r?\"\"===t[o].join(\"\").trim():1===t[o].length&&0===t[o][0].length),\"greedy\"===r&&n){for(var d=[],l=0;l<u;l++){var c=s?e[l]:l;d.push(t[o][c])}h=\"\"===d.join(\"\").trim()}if(!h){for(var p=0;p<u;p++){0<p&&!f&&(i+=m);var g=n&&s?e[p]:p;i+=v(t[o][g],p)}o<t.length-1&&(!r||0<u&&!f)&&(i+=y)}}return i}function v(e,t){if(null==e)return\"\";if(e.constructor===Date)return JSON.stringify(e).slice(1,25);var r=!1;o&&\"string\"==typeof e&&o.test(e)&&(e=\"'\"+e,r=!0);var i=e.toString().replace(u,a);return(r=r||!0===n||\"function\"==typeof n&&n(e,t)||Array.isArray(n)&&n[t]||function(e,t){for(var r=0;r<t.length;r++)if(-1<e.indexOf(t[r]))return!0;return!1}(i,b.BAD_DELIMITERS)||-1<i.indexOf(m)||\" \"===i.charAt(0)||\" \"===i.charAt(i.length-1))?s+i+s:i}}};if(b.RECORD_SEP=String.fromCharCode(30),b.UNIT_SEP=String.fromCharCode(31),b.BYTE_ORDER_MARK=\"\\ufeff\",b.BAD_DELIMITERS=[\"\\r\",\"\\n\",'\"',b.BYTE_ORDER_MARK],b.WORKERS_SUPPORTED=!n&&!!f.Worker,b.NODE_STREAM_INPUT=1,b.LocalChunkSize=10485760,b.RemoteChunkSize=5242880,b.DefaultDelimiter=\",\",b.Parser=E,b.ParserHandle=r,b.NetworkStreamer=l,b.FileStreamer=c,b.StringStreamer=p,b.ReadableStreamStreamer=g,f.jQuery){var d=f.jQuery;d.fn.parse=function(o){var r=o.config||{},u=[];return this.each(function(e){if(!(\"INPUT\"===d(this).prop(\"tagName\").toUpperCase()&&\"file\"===d(this).attr(\"type\").toLowerCase()&&f.FileReader)||!this.files||0===this.files.length)return!0;for(var t=0;t<this.files.length;t++)u.push({file:this.files[t],inputElem:this,instanceConfig:d.extend({},r)})}),e(),this;function e(){if(0!==u.length){var e,t,r,i,n=u[0];if(J(o.before)){var s=o.before(n.file,n.inputElem);if(\"object\"==typeof s){if(\"abort\"===s.action)return e=\"AbortError\",t=n.file,r=n.inputElem,i=s.reason,void(J(o.error)&&o.error({name:e},t,r,i));if(\"skip\"===s.action)return void h();\"object\"==typeof s.config&&(n.instanceConfig=d.extend(n.instanceConfig,s.config))}else if(\"skip\"===s)return void h()}var a=n.instanceConfig.complete;n.instanceConfig.complete=function(e){J(a)&&a(e,n.file,n.inputElem),h()},b.parse(n.file,n.instanceConfig)}else J(o.complete)&&o.complete()}function h(){u.splice(0,1),e()}}}function h(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 r(t),(this._handle.streamer=this)._config=t}.call(this,e),this.parseChunk=function(e,t){if(this.isFirstChunk&&J(this._config.beforeFirstChunk)){var r=this._config.beforeFirstChunk(e);void 0!==r&&(e=r)}this.isFirstChunk=!1,this._halted=!1;var i=this._partialLine+e;this._partialLine=\"\";var n=this._handle.parse(i,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var s=n.meta.cursor;this._finished||(this._partialLine=i.substring(s-this._baseIndex),this._baseIndex=s),n&&n.data&&(this._rowCount+=n.data.length);var a=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(o)f.postMessage({results:n,workerId:b.WORKER_ID,finished:a});else if(J(this._config.chunk)&&!t){if(this._config.chunk(n,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);n=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(n.data),this._completeResults.errors=this._completeResults.errors.concat(n.errors),this._completeResults.meta=n.meta),this._completed||!a||!J(this._config.complete)||n&&n.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),a||n&&n.meta.paused||this._nextChunk(),n}this._halted=!0},this._sendError=function(e){J(this._config.error)?this._config.error(e):o&&this._config.error&&f.postMessage({workerId:b.WORKER_ID,error:e,finished:!1})}}function l(e){var i;(e=e||{}).chunkSize||(e.chunkSize=b.RemoteChunkSize),h.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(i=new XMLHttpRequest,this._config.withCredentials&&(i.withCredentials=this._config.withCredentials),n||(i.onload=v(this._chunkLoaded,this),i.onerror=v(this._chunkError,this)),i.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var t in e)i.setRequestHeader(t,e[t])}if(this._config.chunkSize){var r=this._start+this._config.chunkSize-1;i.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+r)}try{i.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===i.status&&this._chunkError()}},this._chunkLoaded=function(){4===i.readyState&&(i.status<200||400<=i.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:i.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader(\"Content-Range\");if(null===t)return-1;return parseInt(t.substring(t.lastIndexOf(\"/\")+1))}(i),this.parseChunk(i.responseText)))},this._chunkError=function(e){var t=i.statusText||e;this._sendError(new Error(t))}}function c(e){var i,n;(e=e||{}).chunkSize||(e.chunkSize=b.LocalChunkSize),h.call(this,e);var s=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,s?((i=new FileReader).onload=v(this._chunkLoaded,this),i.onerror=v(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;if(this._config.chunkSize){var t=Math.min(this._start+this._config.chunkSize,this._input.size);e=n.call(e,this._start,t)}var r=i.readAsText(e,this._config.encoding);s||this._chunkLoaded({target:{result:r}})},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 p(e){var r;h.call(this,e=e||{}),this.stream=function(e){return r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,t=this._config.chunkSize;return t?(e=r.substring(0,t),r=r.substring(t)):(e=r,r=\"\"),this._finished=!r,this.parseChunk(e)}}}function g(e){h.call(this,e=e||{});var t=[],r=!0,i=!1;this.pause=function(){h.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){h.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(){i&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):r=!0},this._streamData=v(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),r&&(r=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=v(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=v(function(){this._streamCleanUp(),i=!0,this._streamData(\"\")},this),this._streamCleanUp=v(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function r(m){var a,o,u,i=Math.pow(2,53),n=-i,s=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,h=/^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)))$/,t=this,r=0,f=0,d=!1,e=!1,l=[],c={data:[],errors:[],meta:{}};if(J(m.step)){var p=m.step;m.step=function(e){if(c=e,_())g();else{if(g(),0===c.data.length)return;r+=e.data.length,m.preview&&r>m.preview?o.abort():(c.data=c.data[0],p(c,t))}}}function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){return c&&u&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+b.DefaultDelimiter+\"'\"),u=!1),m.skipEmptyLines&&(c.data=c.data.filter(function(e){return!y(e)})),_()&&function(){if(!c)return;function e(e,t){J(m.transformHeader)&&(e=m.transformHeader(e,t)),l.push(e)}if(Array.isArray(c.data[0])){for(var t=0;_()&&t<c.data.length;t++)c.data[t].forEach(e);c.data.splice(0,1)}else c.data.forEach(e)}(),function(){if(!c||!m.header&&!m.dynamicTyping&&!m.transform)return c;function e(e,t){var r,i=m.header?{}:[];for(r=0;r<e.length;r++){var n=r,s=e[r];m.header&&(n=r>=l.length?\"__parsed_extra\":l[r]),m.transform&&(s=m.transform(s,n)),s=v(n,s),\"__parsed_extra\"===n?(i[n]=i[n]||[],i[n].push(s)):i[n]=s}return m.header&&(r>l.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+l.length+\" fields but parsed \"+r,f+t):r<l.length&&k(\"FieldMismatch\",\"TooFewFields\",\"Too few fields: expected \"+l.length+\" fields but parsed \"+r,f+t)),i}var t=1;!c.data.length||Array.isArray(c.data[0])?(c.data=c.data.map(e),t=c.data.length):c.data=e(c.data,0);m.header&&c.meta&&(c.meta.fields=l);return f+=t,c}()}function _(){return m.header&&0===l.length}function v(e,t){return r=e,m.dynamicTypingFunction&&void 0===m.dynamicTyping[r]&&(m.dynamicTyping[r]=m.dynamicTypingFunction(r)),!0===(m.dynamicTyping[r]||m.dynamicTyping)?\"true\"===t||\"TRUE\"===t||\"false\"!==t&&\"FALSE\"!==t&&(function(e){if(s.test(e)){var t=parseFloat(e);if(n<t&&t<i)return!0}return!1}(t)?parseFloat(t):h.test(t)?new Date(t):\"\"===t?null:t):t;var r}function k(e,t,r,i){var n={type:e,code:t,message:r};void 0!==i&&(n.row=i),c.errors.push(n)}this.parse=function(e,t,r){var i=m.quoteChar||'\"';if(m.newline||(m.newline=function(e,t){e=e.substring(0,1048576);var r=new RegExp(Q(t)+\"([^]*?)\"+Q(t),\"gm\"),i=(e=e.replace(r,\"\")).split(\"\\r\"),n=e.split(\"\\n\"),s=1<n.length&&n[0].length<i[0].length;if(1===i.length||s)return\"\\n\";for(var a=0,o=0;o<i.length;o++)\"\\n\"===i[o][0]&&a++;return a>=i.length/2?\"\\r\\n\":\"\\r\"}(e,i)),u=!1,m.delimiter)J(m.delimiter)&&(m.delimiter=m.delimiter(e),c.meta.delimiter=m.delimiter);else{var n=function(e,t,r,i,n){var s,a,o,u;n=n||[\",\",\"\\t\",\"|\",\";\",b.RECORD_SEP,b.UNIT_SEP];for(var h=0;h<n.length;h++){var f=n[h],d=0,l=0,c=0;o=void 0;for(var p=new E({comments:i,delimiter:f,newline:t,preview:10}).parse(e),g=0;g<p.data.length;g++)if(r&&y(p.data[g]))c++;else{var _=p.data[g].length;l+=_,void 0!==o?0<_&&(d+=Math.abs(_-o),o=_):o=_}0<p.data.length&&(l/=p.data.length-c),(void 0===a||d<=a)&&(void 0===u||u<l)&&1.99<l&&(a=d,s=f,u=l)}return{successful:!!(m.delimiter=s),bestDelimiter:s}}(e,m.newline,m.skipEmptyLines,m.comments,m.delimitersToGuess);n.successful?m.delimiter=n.bestDelimiter:(u=!0,m.delimiter=b.DefaultDelimiter),c.meta.delimiter=m.delimiter}var s=w(m);return m.preview&&m.header&&s.preview++,a=e,o=new E(s),c=o.parse(a,t,r),g(),d?{meta:{paused:!0}}:c||{meta:{paused:!1}}},this.paused=function(){return d},this.pause=function(){d=!0,o.abort(),a=J(m.chunk)?\"\":a.substring(o.getCharIndex())},this.resume=function(){t.streamer._halted?(d=!1,t.streamer.parseChunk(a,!0)):setTimeout(t.resume,3)},this.aborted=function(){return e},this.abort=function(){e=!0,o.abort(),c.meta.aborted=!0,J(m.complete)&&m.complete(c),a=\"\"}}function Q(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function E(j){var z,M=(j=j||{}).delimiter,P=j.newline,U=j.comments,q=j.step,N=j.preview,B=j.fastMode,K=z=void 0===j.quoteChar||null===j.quoteChar?'\"':j.quoteChar;if(void 0!==j.escapeChar&&(K=j.escapeChar),(\"string\"!=typeof M||-1<b.BAD_DELIMITERS.indexOf(M))&&(M=\",\"),U===M)throw new Error(\"Comment character same as delimiter\");!0===U?U=\"#\":(\"string\"!=typeof U||-1<b.BAD_DELIMITERS.indexOf(U))&&(U=!1),\"\\n\"!==P&&\"\\r\"!==P&&\"\\r\\n\"!==P&&(P=\"\\n\");var W=0,H=!1;this.parse=function(i,t,r){if(\"string\"!=typeof i)throw new Error(\"Input must be a string\");var n=i.length,e=M.length,s=P.length,a=U.length,o=J(q),u=[],h=[],f=[],d=W=0;if(!i)return L();if(j.header&&!t){var l=i.split(P)[0].split(M),c=[],p={},g=!1;for(var _ in l){var m=l[_];J(j.transformHeader)&&(m=j.transformHeader(m,_));var y=m,v=p[m]||0;for(0<v&&(g=!0,y=m+\"_\"+v),p[m]=v+1;c.includes(y);)y=y+\"_\"+v;c.push(y)}if(g){var k=i.split(P);k[0]=c.join(M),i=k.join(P)}}if(B||!1!==B&&-1===i.indexOf(z)){for(var b=i.split(P),E=0;E<b.length;E++){if(f=b[E],W+=f.length,E!==b.length-1)W+=P.length;else if(r)return L();if(!U||f.substring(0,a)!==U){if(o){if(u=[],I(f.split(M)),F(),H)return L()}else I(f.split(M));if(N&&N<=E)return u=u.slice(0,N),L(!0)}}return L()}for(var w=i.indexOf(M,W),R=i.indexOf(P,W),C=new RegExp(Q(K)+Q(z),\"g\"),S=i.indexOf(z,W);;)if(i[W]!==z)if(U&&0===f.length&&i.substring(W,W+a)===U){if(-1===R)return L();W=R+s,R=i.indexOf(P,W),w=i.indexOf(M,W)}else if(-1!==w&&(w<R||-1===R))f.push(i.substring(W,w)),W=w+e,w=i.indexOf(M,W);else{if(-1===R)break;if(f.push(i.substring(W,R)),D(R+s),o&&(F(),H))return L();if(N&&u.length>=N)return L(!0)}else for(S=W,W++;;){if(-1===(S=i.indexOf(z,S+1)))return r||h.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:u.length,index:W}),T();if(S===n-1)return T(i.substring(W,S).replace(C,z));if(z!==K||i[S+1]!==K){if(z===K||0===S||i[S-1]!==K){-1!==w&&w<S+1&&(w=i.indexOf(M,S+1)),-1!==R&&R<S+1&&(R=i.indexOf(P,S+1));var O=A(-1===R?w:Math.min(w,R));if(i.substr(S+1+O,e)===M){f.push(i.substring(W,S).replace(C,z)),i[W=S+1+O+e]!==z&&(S=i.indexOf(z,W)),w=i.indexOf(M,W),R=i.indexOf(P,W);break}var x=A(R);if(i.substring(S+1+x,S+1+x+s)===P){if(f.push(i.substring(W,S).replace(C,z)),D(S+1+x+s),w=i.indexOf(M,W),S=i.indexOf(z,W),o&&(F(),H))return L();if(N&&u.length>=N)return L(!0);break}h.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:u.length,index:W}),S++}}else S++}return T();function I(e){u.push(e),d=W}function A(e){var t=0;if(-1!==e){var r=i.substring(S+1,e);r&&\"\"===r.trim()&&(t=r.length)}return t}function T(e){return r||(void 0===e&&(e=i.substring(W)),f.push(e),W=n,I(f),o&&F()),L()}function D(e){W=e,I(f),f=[],R=i.indexOf(P,W)}function L(e){return{data:u,errors:h,meta:{delimiter:M,linebreak:P,aborted:H,truncated:!!e,cursor:d+(t||0)}}}function F(){q(L()),u=[],h=[]}},this.abort=function(){H=!0},this.getCharIndex=function(){return W}}function _(e){var t=e.data,r=a[t.workerId],i=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){i=!0,m(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:y,resume:y};if(J(r.userStep)){for(var s=0;s<t.results.data.length&&(r.userStep({data:t.results.data[s],errors:t.results.errors,meta:t.results.meta},n),!i);s++);delete t.results}else J(r.userChunk)&&(r.userChunk(t.results,n,t.file),delete t.results)}t.finished&&!i&&m(t.workerId,t.results)}function m(e,t){var r=a[e];J(r.userComplete)&&r.userComplete(t),r.terminate(),delete a[e]}function y(){throw new Error(\"Not implemented.\")}function w(e){if(\"object\"!=typeof e||null===e)return e;var t=Array.isArray(e)?[]:{};for(var r in e)t[r]=w(e[r]);return t}function v(e,t){return function(){e.apply(t,arguments)}}function J(e){return\"function\"==typeof e}return o&&(f.onmessage=function(e){var t=e.data;void 0===b.WORKER_ID&&t&&(b.WORKER_ID=t.workerId);if(\"string\"==typeof t.input)f.postMessage({workerId:b.WORKER_ID,results:b.parse(t.input,t.config),finished:!0});else if(f.File&&t.input instanceof File||t.input instanceof Object){var r=b.parse(t.input,t.config);r&&f.postMessage({workerId:b.WORKER_ID,results:r,finished:!0})}}),(l.prototype=Object.create(h.prototype)).constructor=l,(c.prototype=Object.create(h.prototype)).constructor=c,(p.prototype=Object.create(p.prototype)).constructor=p,(g.prototype=Object.create(h.prototype)).constructor=g,b});","import { getCharge } from '../../util/getCharge.js';\nimport { getMF } from '../../util/getMF.js';\n/**\n * @description Get the info of a molecule\n * @param {import('openchemlib').Molecule} molecule\n * @param {Map} moleculesInfo Map of molecules info\n * @returns {Object} object with molfile, idCode, mf, em, mz and charge\n */\nexport function getInfo(molecule, moleculesInfo) {\n    if (moleculesInfo.has(molecule)) {\n        return moleculesInfo.get(molecule);\n    }\n    let em = molecule.getMolecularFormula().absoluteWeight;\n    let charge = getCharge(molecule);\n    let mz = em / (charge === 0 ? 1 : Math.abs(charge));\n    const reactantInfo = {\n        molfile: molecule.toMolfile(),\n        idCode: molecule.getIDCode(),\n        mf: getMF(molecule).mf,\n        em,\n        mz,\n        charge,\n    };\n    moleculesInfo.set(molecule, reactantInfo);\n    return reactantInfo;\n}\n//# sourceMappingURL=getReactantInfo.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 { getInfo } from './getReactantInfo.js';\n/**\n * @description apply one reaction to one reactant\n * @param {*} reactants either a molecule or an array of molecules\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.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.moleculesInfo map of molecules info\n * @param {Set} options.processedMolecules set of processed molecules\n * @param {Array} options.trees array of trees of previous recursions\n * @param {*} options.OCL OCL object\n * @returns {Array} array of results\n */\nexport function applyOneReactantReaction(reactants, reactions, options) {\n    const { currentDepth, maxDepth, moleculesInfo, processedMolecules, trees } = options;\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 >= maxDepth)\n        return [];\n    // if the reactants is not an array, we make it an array\n    if (!Array.isArray(reactants)) {\n        reactants = [reactants];\n    }\n    const { OCL } = options;\n    for (const reactant of reactants) {\n        const idCode = reactant.getIDCode();\n        // check if the reactant has already been processed\n        if (processedMolecules.has(idCode)) {\n            continue;\n        }\n        else {\n            processedMolecules.add(idCode);\n        }\n        for (const reaction of reactions) {\n            if (options.stats.counter >= options.limitReactions) {\n                return [];\n            }\n            options.stats.counter++;\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                // get the products of the reaction\n                const oneReactionProducts = reactor.getProducts();\n                for (const oneReactionProduct of oneReactionProducts) {\n                    const products = [];\n                    for (const reactionProduct of oneReactionProduct) {\n                        // get the info of the product (molfile, idCode, mf)\n                        const moleculeInfo = getInfo(reactionProduct, moleculesInfo);\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 (!processedMolecules.has(moleculeInfo.idCode)) {\n                            const product = {\n                                ...moleculeInfo,\n                                children: [],\n                            };\n                            products.push(product);\n                            todoNextDepth.push(() => {\n                                return applyOneReactantReaction(reactionProduct, reactions, {\n                                    ...options,\n                                    currentDepth: options.currentDepth + 1,\n                                    trees: product.children,\n                                });\n                            });\n                        }\n                    }\n                    // if there is at least one product, we add the reaction to the results\n                    if (products.length > 0) {\n                        // eslint-disable-next-line no-unused-vars\n                        const { oclReaction, needToBeCharged, ...reactionWithoutOCL } = reaction;\n                        const oneReaction = {\n                            reaction: reactionWithoutOCL,\n                            reactant: getInfo(reactant, moleculesInfo),\n                            products,\n                        };\n                        trees.push(oneReaction);\n                    }\n                }\n            }\n        }\n    }\n    // by returning todoNextDepth, we make sure that the recursion will continue\n    return todoNextDepth;\n}\n//# sourceMappingURL=applyOneReactantReaction.js.map","/**\n * @description Trim the tree of reactions to keep only the paths to the product\n * @param {string} idCode idCode of the product\n * @param {Object} tree Tree of reactions\n * @param {Array} reactions Array of rxnCode of reactions\n */\nexport function trimTree(idCode, tree, reactions) {\n    markProduct(idCode, tree);\n    cutBranches(tree, reactions);\n}\n/**\n * @description For a given idCode, mark the products that contain it with a flag true and the others with a flag false\n * @param {string} idCode idCode of the product\n * @param {Object} tree Current branch of the tree of reactions\n */\nfunction markProduct(idCode, tree) {\n    for (const product of tree.products) {\n        product.flag = product.idCode === idCode;\n        if (product.children.length > 0) {\n            for (const child of product.children) {\n                markProduct(idCode, child);\n            }\n        }\n    }\n}\n/**\n * @description Check if the child branch has a flag true in its products\n * @param {Object} tree Current branch of the tree of reactions\n * @returns {boolean} true if the tree has a flag true in its products\n */\nfunction childHasFlag(tree) {\n    for (const product of tree.products) {\n        if (product.flag) {\n            return true;\n        }\n        if (product.children.length > 0) {\n            for (const child of product.children) {\n                if (childHasFlag(child)) {\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n/**\n *@description Cut the branches of the tree that don't have a flag true in their products\n * @param {Object} tree Current branch of the tree of reactions\n * @param {Array} reactions Array of rxnCode of reactions\n */\nfunction cutBranches(tree, reactions) {\n    reactions.push(tree.reaction.rxnCode);\n    for (const product of tree.products) {\n        if (product.flag) {\n            product.children = [];\n        }\n        if (product.children.length > 0) {\n            for (const child of product.children) {\n                const hasFlag = childHasFlag(child);\n                if (!hasFlag) {\n                    child.products = [];\n                }\n                cutBranches(child, reactions);\n            }\n            product.children = product.children.filter((child) => child.products.length > 0);\n        }\n    }\n}\n//# sourceMappingURL=trimTree.js.map","import { trimTree } from './trimTree.js';\n/**\n * @description Group reaction trees by product idCode\n * @param {Array} trees Trees of reactions\n * @returns {Array} Array of products with their corresponding trees and reactions\n */\nexport function groupTreesByProducts(trees) {\n    const results = {};\n    for (const tree of trees) {\n        const copyTree = JSON.parse(JSON.stringify(tree));\n        groupProductTrees(copyTree, results, tree);\n    }\n    return Object.values(results);\n}\n/**\n * @description For a given reaction tree, recursively group the branches by idCode of the product\n * @param {Object} currentBranch Current recursive branch of the tree of reactions\n * @param {Object} results Object with the branches grouped by idCode\n * @param {Object} originalBranch Original tree of reactions (not modified)\n */\nfunction groupProductTrees(currentBranch, results, originalBranch) {\n    for (const product of currentBranch.products) {\n        // This way is faster than structuredClone\n        const copyBranch = JSON.parse(JSON.stringify(originalBranch));\n        const reactions = [];\n        // Trim the tree to get all branches leading to the idCode of the product\n        trimTree(product.idCode, copyBranch, reactions);\n        const nbReactions = reactions.length;\n        if (results[product.idCode] === undefined) {\n            results[product.idCode] = {\n                idCode: product.idCode,\n                mf: product.mf,\n                em: product.em,\n                mz: product.mz,\n                charge: product.charge,\n                trees: [copyBranch],\n                reactions,\n                minSteps: nbReactions,\n            };\n        }\n        else {\n            results[product.idCode].trees.push(copyBranch);\n            if (nbReactions < results[product.idCode].minSteps) {\n                results[product.idCode].minSteps = nbReactions;\n                results[product.idCode].reactions = reactions;\n            }\n        }\n        if (product.children.length > 0) {\n            for (const child of product.children) {\n                groupProductTrees(child, results, originalBranch);\n            }\n        }\n    }\n}\n//# sourceMappingURL=groupTreesByProducts.js.map","import { applyOneReactantReaction } from './utils/applyOneReactantReaction.js';\nimport { groupTreesByProducts } from './utils/groupTreesByProducts.js';\n/**\n * Create reaction trees of products based on reactions and reactants\n * @param {import('openchemlib').Molecule[]} reactants\n * @param {Array} reactions array of reactions objects with rxnCode, label and needChargeToReact\n * @param {object} options options to apply the reaction\n * @param {number} [options.maxDepth=5] max depth of the recursion\n * @param {number} [options.limitReactions=200] limit the number of reactions to apply\n * @param {boolean} [options.getProductsTrees=false] if true, the returned object will have a products property with the products trees grouped by idCode else it will be an empty array\n * @returns {Object} The returned object has two properties:\n * - trees: the tree of reactions\n * - products: reactions trees grouped by product idCode\n */\nexport function applyReactions(reactants, reactions, options = {}) {\n    // Reaction are applied recursively until maximal tree depth is reached (default 10)\n    const { maxDepth = 5, limitReactions = 200, getProductsTrees = false, } = options;\n    const moleculesInfo = new Map();\n    const processedMolecules = new Set();\n    if (!reactants.length) {\n        throw new Error('Can not extract OCL because there is no reactants');\n    }\n    // get the OCL object from the first reactant\n    const OCL = reactants[0].getOCL();\n    reactions = appendOCLReaction(reactions, OCL);\n    const stats = { counter: 0 };\n    const trees = [];\n    // Start the recursion by applying the first level of reactions\n    let todoCurrentLevel = applyOneReactantReaction(reactants, reactions, {\n        OCL,\n        currentDepth: 0,\n        moleculesInfo,\n        processedMolecules,\n        maxDepth,\n        trees,\n        stats,\n        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    let products;\n    if (getProductsTrees) {\n        products = groupTreesByProducts(trees);\n    }\n    else {\n        products = [];\n    }\n    return { trees, products, stats };\n}\n/**\n * @description Append the OCL reaction to the reaction object\n * @param {Array} reactions array of reactions objects with rxnCode and label\n * @param {Object} OCL OCL object\n * @returns {Array} array of reactions objects with rxnCode, label and oclReaction (a decoded version of rxnCode reaction)\n */\nfunction appendOCLReaction(reactions, OCL) {\n    reactions = JSON.parse(JSON.stringify(reactions)).filter((reaction) => reaction.rxnCode);\n    for (const reaction of reactions) {\n        reaction.oclReaction = OCL.ReactionEncoder.decode(reaction.rxnCode);\n    }\n    return reactions;\n}\n//# sourceMappingURL=applyReactions.js.map","import { getRingsInfo } from './getRingsInfo.js';\n/**\n * This function returns an array of objects with all combination of 2 bonds who can be fragmented in the same ring\n * @param {import('openchemlib').Molecule} molecule - The OCL molecule to be fragmented\n * @returns All combination of 2 bonds who can be fragmented in the same ring\n */\nexport function getFragmentableRings(molecule) {\n  let ringsInfo = getRingsInfo(molecule);\n  let fragmentableRingBonds = [];\n  for (let ring = 0; ring < ringsInfo.length; ring++) {\n    let bonds = ringsInfo[ring].bonds;\n    // we prevent to consecutive bonds to be cleaved\n    for (let first = 0; first < bonds.length; first++) {\n      let end = first === 0 ? bonds.length - 1 : bonds.length;\n      for (let second = first + 2; second < end; second++) {\n        if (\n          bonds[first].order === 1 &&\n          bonds[second].order === 1 &&\n          !bonds[first].isAromatic &&\n          !bonds[second].isAromatic &&\n          bonds[first].nbRings < 2 &&\n          bonds[second].nbRings < 2\n        ) {\n          fragmentableRingBonds.push({ bonds: [bonds[first], bonds[second]] });\n        }\n      }\n    }\n  }\n\n  return fragmentableRingBonds;\n}\n","/**\n * This function returns ringBond, and object that contains information about the bonds of each ring\n * @param {import('openchemlib').Molecule} molecule - The OCL molecule to be fragmented\n * @returns Information of ring bonds for each ring in the molecule\n */\n\nexport function getRingsInfo(molecule) {\n  const ringSet = molecule.getRingSet();\n  let ringBonds = [];\n  // create a new array with the length of the number of bonds in the molecule and fills it with 0\n  let nbRingForBonds = new Array(molecule.getAllBonds()).fill(0);\n\n  for (let i = 0; i < ringSet.getSize(); i++) {\n    for (let bond of ringSet.getRingBonds(i)) {\n      nbRingForBonds[bond]++;\n    }\n  }\n\n  for (let i = 0; i < ringSet.getSize(); i++) {\n    ringBonds.push({\n      bonds: ringSet.getRingBonds(i).map((bondIndex) => ({\n        index: bondIndex,\n        ringIndex: i,\n        nbRings: nbRingForBonds[bondIndex], // in how many rings this bond is included\n        order: molecule.getBondOrder(bondIndex),\n        isAromatic: ringSet.isAromatic(i),\n        atom1: molecule.getBondAtom(0, bondIndex),\n        atom2: molecule.getBondAtom(1, bondIndex),\n      })),\n    });\n  }\n\n  return ringBonds;\n}\n","import { MF } from 'mf-parser';\nimport { getMF } from 'openchemlib-utils';\n\nimport { fragmentAcyclicBonds } from './fragmentAcyclicBonds.js';\nimport { fragmentRings } from './fragmentRings.js';\n\n/**\n * This function fragment both acyclic and cyclic bonds of the molecule\n * @param {import('openchemlib').Molecule} molecule - The OCL molecule to be fragmented\n * @param {object} [options={}]\n * @param {boolean} [options.calculateHoseCodes=false] - calculating hose code for bonds is quite time consuming\n * @param {boolean} [options.cyclic=true] - calculate cyclic fragmentation\n * @param {boolean} [options.acyclic=true] - calculate acyclic fragmentation\n * @param {boolean} [options.full=true] - calculate the molecular formula of the full molecule\n * @returns {object} In-Silico fragmentation results\n */\nexport function fragment(molecule, options = {}) {\n  const {\n    cyclic = true,\n    acyclic = true,\n    full = true,\n    calculateHoseCodes = false,\n  } = options;\n\n  const parentIDCode = molecule.getIDCode();\n\n  let molecularIon = full\n    ? [\n        {\n          idCode: parentIDCode,\n          parentIDCode,\n          mfInfo: new MF(getMF(molecule).mf).getInfo(),\n          fragmentType: 'molecule',\n        },\n      ]\n    : [];\n  let acyclicBonds = acyclic\n    ? fragmentAcyclicBonds(molecule, { calculateHoseCodes, parentIDCode })\n    : [];\n  let cyclicBonds = cyclic\n    ? fragmentRings(molecule, { calculateHoseCodes, parentIDCode })\n    : [];\n  let result = [...molecularIon, ...acyclicBonds, ...cyclicBonds];\n\n  return result.sort(\n    (a, b) => a.mfInfo.monoisotopicMass - b.mfInfo.monoisotopicMass,\n  );\n}\n","import { MF } from 'mf-parser';\nimport { getMF, getHoseCodesForAtoms } from 'openchemlib-utils';\n\n/**\n * The function performs the fragmentation of all single linear bonds\n * @param {import('openchemlib').Molecule} molecule - The OCL molecule to be fragmented\n * @param {object} [options={}]\n * @param {boolean} [options.calculateHoseCodes=false] - calculating hose code for bonds is quite time consuming\n * @param {string} [options.parentIDCode=molecule.getIDCode()]\n * @returns Results fragmentation of acyclic bonds\n */\n\nexport function fragmentAcyclicBonds(molecule, options = {}) {\n  const { Molecule } = molecule.getOCL();\n  const { calculateHoseCodes, parentIDCode = molecule.getIDCode() } = options;\n  let atoms = [];\n  // Prepare object with lenght equal to number of atoms\n  for (let i = 0; i < molecule.getAllAtoms(); i++) {\n    let atom = {};\n    atoms.push(atom);\n    atom.i = i;\n    atom.links = [];\n  }\n  let bonds = [];\n  for (let i = 0; i < molecule.getAllBonds(); i++) {\n    let bond = {};\n    // get informations of bonds\n    bond.index = i;\n    bond.order = molecule.getBondOrder(i); // dative, single , double, triple\n    bond.atom1 = molecule.getBondAtom(0, i); // atom 1 index\n    bond.atom2 = molecule.getBondAtom(1, i); // atom 2 index\n\n    bond.type = molecule.getBondType(i); // cBondTypeSingle,cBondTypeDouble,cBondTypeTriple,cBondTypeDelocalized\n    bond.isAromatic = molecule.isAromaticBond(i);\n    bond.isRingBond = molecule.isRingBond(i);\n\n    // Mapping of bonds to be fragmented, only if they are single bond not aromatic and cyclic the mapping occurs\n    if (\n      bond.isAromatic ||\n      bond.type > 1 ||\n      bond.isRingBond ||\n      bond.order !== 1\n    ) {\n      continue;\n    } else {\n      bond.selected = true;\n      atoms[bond.atom1].links.push(bond.atom2);\n      atoms[bond.atom2].links.push(bond.atom1);\n    }\n    bonds.push(bond);\n  }\n\n  let brokenMolecule = {};\n  let fragmentMap = [];\n  let nbFragments = [];\n  let results = [];\n\n  for (let bond of bonds) {\n    if (bond.selected) {\n      // if bond.selected is true (line 46) the molecule will be fragmented\n      brokenMolecule[bond.index] = molecule.getCompactCopy(); // get a copy of the molecule\n      brokenMolecule[bond.index].setAtomCustomLabel(bond.atom1, '*');\n      brokenMolecule[bond.index].setAtomCustomLabel(bond.atom2, '*');\n      brokenMolecule[bond.index].markBondForDeletion(bond.index); //mark bond to be deleted\n      // the function returns an array of map\n\n      brokenMolecule[bond.index].deleteMarkedAtomsAndBonds(); // delete marked bonds\n    }\n    nbFragments = brokenMolecule[bond.index].getFragmentNumbers(fragmentMap);\n    // only if there are 2 fragments code can continue\n    if (nbFragments === 2) {\n      for (let i = 0; i < nbFragments; i++) {\n        const result = {};\n        if (calculateHoseCodes) {\n          result.hoses = getHoseCodesForAtoms(molecule, [\n            bond.atom1,\n            bond.atom2,\n          ]);\n        }\n\n        result.atomMap = [];\n\n        // assign fragment id to index of for loop\n        let includeAtom = fragmentMap.map((id) => {\n          return id === i;\n        });\n\n        let fragment = new Molecule(100, 100);\n\n        let atomMap = [];\n\n        brokenMolecule[bond.index].copyMoleculeByAtoms(\n          fragment,\n          includeAtom,\n          false,\n          atomMap,\n        );\n\n        for (let j = 0; j < atomMap.length; j++) {\n          if (fragment.getAtomCustomLabel(atomMap[j]) === '*') {\n            result.atomMap.push(j);\n            if (atoms[j].links.length > 0) {\n              fragment.addBond(atomMap[j], fragment.addAtom(154));\n            }\n          }\n        }\n        fragment.removeAtomCustomLabels();\n        fragment.setFragment(false);\n        result.idCode = fragment.getIDCode();\n        result.parentIDCode = parentIDCode;\n        result.cleavedBonds = [\n          {\n            index: bond.index,\n            order: bond.order,\n            atom1: bond.atom1,\n            atom2: bond.atom2,\n          },\n        ];\n        result.mfInfo = new MF(\n          getMF(fragment).mf.replace(/R[1-9]?/, ''),\n        ).getInfo();\n        result.fragmentType = 'acyclic';\n\n        results.push(result);\n      }\n    }\n  }\n  // sort result in order fragment 1-2; 3-4; ...\n  results = results.sort((a, b) => {\n    return a.mfInfo.monoisotopicMass - b.mfInfo.monoisotopicMass;\n  });\n\n  return results;\n}\n","import { MF } from 'mf-parser';\nimport { getMF, getHoseCodesForAtoms } from 'openchemlib-utils';\n\nimport { getFragmentableRings } from './utils/getFragmentableRings.js';\n\n/**\n * The function performs the fragmentation of all single ring bonds not belonging to aromatic rings\n * @param {import('openchemlib').Molecule} molecule - The OCL molecule to be fragmented\n * @param {object} [options={}]\n * @param {boolean} [options.calculateHoseCodes=false] - calculating hose code for bonds is quite time consuming\n * @param {string} [options.parentIDCode=molecule.getIDCode()]\n * @returns  Array with results for the fragmentation of ring bonds\n */\n\nexport function fragmentRings(molecule, options = {}) {\n  const { Molecule } = molecule.getOCL();\n  const { calculateHoseCodes, parentIDCode = molecule.getIDCode() } = options;\n\n  const fragmentableRingBonds = getFragmentableRings(molecule);\n\n  let fragmentationResults = [];\n\n  for (let ringBonds of fragmentableRingBonds) {\n    const brokenMolecule = molecule.getCompactCopy();\n    let fragmentMap = [];\n    let atoms = [];\n    let rLinks = {};\n    for (let bond of ringBonds.bonds) {\n      brokenMolecule.markBondForDeletion(bond.index);\n      brokenMolecule.setAtomCustomLabel(bond.atom1, '*');\n      brokenMolecule.setAtomCustomLabel(bond.atom2, '*');\n      atoms.push(bond.atom1);\n      atoms.push(bond.atom2);\n      rLinks[bond.atom1] = bond.atom2;\n      rLinks[bond.atom2] = bond.atom1;\n    }\n    brokenMolecule.deleteMarkedAtomsAndBonds();\n\n    const nbFragments = brokenMolecule.getFragmentNumbers(fragmentMap);\n\n    for (let i = 0; i < nbFragments; i++) {\n      const result = {};\n      if (calculateHoseCodes) {\n        result.hoses = getHoseCodesForAtoms(molecule, atoms);\n      }\n\n      result.atomMap = [];\n      let includeAtom = fragmentMap.map((id) => {\n        return id === i;\n      });\n      let fragment = new Molecule(0, 0);\n      let atomMap = [];\n\n      brokenMolecule.copyMoleculeByAtoms(fragment, includeAtom, false, atomMap);\n      // if includeAtom has more then 3 true all true should become false and all false should become true\n\n      for (let j = 0; j < atomMap.length; j++) {\n        if (fragment.getAtomCustomLabel(atomMap[j]) === '*') {\n          result.atomMap.push(j);\n          if (rLinks[j] !== undefined) {\n            fragment.addBond(atomMap[j], fragment.addAtom(154));\n          }\n        }\n      }\n      fragment.removeAtomCustomLabels();\n\n      fragment.setFragment(false);\n      //      console.log(fragment.getIDCode(), getMF(fragment).mf);\n      result.idCode = fragment.getIDCode();\n      result.parentIDCode = parentIDCode;\n      result.cleavedBonds = ringBonds.bonds;\n      result.mfInfo = new MF(\n        getMF(fragment).mf.replace(/R[1-9]?/, ''),\n      ).getInfo();\n      result.fragmentType = 'cyclic';\n      fragmentationResults.push(result);\n    }\n  }\n\n  fragmentationResults = fragmentationResults.sort((a, b) => {\n    return a.mfInfo.monoisotopicMass - b.mfInfo.monoisotopicMass;\n  });\n  return fragmentationResults;\n}\n","/**\n * openchemlib - Manipulate molecules\n * @version v8.5.0\n * @date 2023-08-14T05:59:45.973Z\n * @link https://github.com/cheminfo/openchemlib-js\n * @license BSD-3-Clause\n*/\n(function (root) {\n  'use strict';\n\n  function getExports($wnd) {\n\n    var $doc = $wnd.document;\n    var $gwt = {};\n    var navigator = {\n      userAgent: 'webkit'\n    };\n\n    function noop(){}\n\n    var __gwtModuleFunction = noop;\n    __gwtModuleFunction.__moduleStartupDone = noop;\n    var $sendStats = noop;\n    var $moduleName, $moduleBase;\n\n    // Start GWT code \nvar Hlb='object',Ilb='anonymous',Jlb='fnStack',Klb='\\n',Llb={4:1,10:1,5:1,8:1},Mlb='Unknown',Nlb='boolean',Olb='number',Plb='string',Qlb=2147483647,Rlb='For input string: \"',Slb='null',Tlb='__noinit__',Ulb={4:1,5:1,8:1},Vlb={4:1,15:1,22:1},Wlb=' (copy)',Xlb={4:1,10:1,31:1,5:1,17:1,8:1,29:1},Ylb=65536,Zlb=65535,$lb=10000,_lb=', length: ',amb='Index: ',bmb=', Size: ',cmb='fromIndex: ',dmb=', toIndex: ',emb={12:1,4:1,5:1},fmb={4:1},gmb={7:1,4:1,5:1},hmb=16777215,imb=65280,jmb=0.30000001192092896,kmb=545460846592,lmb=4294967296,mmb=8589934592,nmb=17179869184,omb=34359738368,pmb=68719476736,qmb=137438953472,rmb=274877906944,smb='<line x1=\"',tmb='\" ',umb='y1=\"',vmb='x2=\"',wmb='y2=\"',xmb='stroke=\"',ymb='stroke-width=\"',zmb='\" />',Amb={11:1,4:1,5:1},Bmb=536870912,Cmb=2.617993878,Dmb=3.665191429,Emb=6.283185307179586,Fmb=3.141592653589793,Gmb=1.5707963267948966,Hmb=16384,Imb=4096,Jmb={l:0,m:0,h:1},Kmb={l:0,m:0,h:2},Lmb={l:0,m:0,h:4},Mmb=1920,Nmb=1024,Omb=234881024,Pmb=167772160,Qmb=100663296,Rmb=201326592,Smb=114688,Tmb=4063232,Umb=3538944,Vmb=3014656,Wmb=2097152,Xmb=393216,Ymb=917504,Zmb=1966080,$mb=17042430230528,_mb=16492674416640,anb=15942918602752,bnb=14843406974976,cnb=12644383719424,dnb=8796093022208,enb=549755813888,fnb=1649267441664,gnb=3848290697216,hnb=8246337208320,inb=29360128,jnb=268435456,knb=8192,lnb=2048,mnb=-1.5707963267948966,nnb=130560,onb=6291456,pnb=1.0471975511965976,qnb=0.5235987755982988,rnb=786432,snb=524288,tnb=262144,unb=-16777216,vnb=16711680,wnb=-32768,xnb='<DrawingObject type=\"',ynb='><\\/DrawingObject>',znb={4:1,5:1,13:1},Anb={4:1,5:1},Bnb='unsupported atomicNo:',Cnb=2.8415926535897933,Dnb={26:1,4:1,10:1,5:1,8:1},Enb={4:1,5:1,17:1,8:1},Fnb={9:1,4:1,5:1},Gnb=131072,Hnb={l:6,m:0,h:4},Inb=1048576,Jnb=3221225472,Knb={l:0,m:0,h:3},Lnb=8388608,Mnb=-65536,Nnb={38:1,39:1,45:1},Onb={38:1,39:1,79:1,45:1,98:1},Pnb={4:1,5:1,38:1,39:1,79:1,18:1,45:1,98:1,156:1},Qnb='??',Rnb=2013265920,Snb=32505856,Tnb=31744,Unb=1.7976931348623157E308,Vnb={105:1,4:1,10:1,5:1,17:1,8:1},Wnb=33554432,Xnb=67108864,Ynb=32768,Znb=-33554433,$nb=-33292289,_nb=-3.141592653589793,aob=4194303,bob=3072,cob={36:1,4:1,5:1},dob=0.7853981633974483,eob=3.061592653589793,fob=1073741824,gob=541165879296,hob={14:1,4:1,5:1,8:1},iob=281.17,job=289.19,kob=294.21,lob='0.0000',mob='M  END\\n',nob='ATOMS',oob=-2147483648,pob='M  END',qob='$$$$',rob='M  V30 ',sob='M  V30 COUNTS ',tob=')\\n',uob='M  V30 MDLV30/STEREL',vob='M  V30 MDLV30/STERAC',wob=3.4028234663852886E38,xob={l:2,m:0,h:4},yob=4194304,zob={l:4179966,m:4063288,h:7},Aob={l:4194302,m:4193343,h:7},Bob={117:1,103:1,104:1,4:1,10:1,5:1,8:1},Cob='class=\"event\" ',Dob='opacity=\"0\" />',Eob='Assignment of aromatic double bonds failed',Fob=1099511627776,Gob=2199023255552,Hob=4398046511104,Iob='Members of ESR groups must only be stereo centers with known configuration.',Job='Over- or under-specified stereo feature or more than one racemic type bond',Kob='Ambiguous configuration at stereo center because of 2 parallel bonds',Lob={91:1,74:1,25:1,4:1},Mob=100000,Nob=3.1415927410125732,Oob=1.5707963705062866,Pob=0.029999999329447746,Qob=6.2831854820251465,Rob=1.9106119871139526,Sob=2.2639999389648438,Tob=2.16759991645813,Uob=2.0662999153137207,Vob=2.3561999797821045,Wob=2.2844998836517334,Xob=1.9106120066311025,Yob=2.094395160675049,Zob=0.6000000238418579,$ob=1.7999999523162842,_ob=0.05000000074505806,apb={4:1,10:1,5:1,8:1,30:1},bpb=0.2617993950843811,cpb=2.0943951023931953,dpb=1.2000000476837158,epb=1.4299999475479126,fpb=1.659999966621399,gpb=1.4600000381469727,hpb=1.8200000524520874,ipb=2.4600000381469727,jpb=2.4200000762939453,kpb=2.450000047683716,lpb=2.440000057220459,mpb=2.4000000953674316,npb=2.319999933242798,opb=2.2899999618530273,ppb=1.8600000143051147,qpb=2.5299999713897705,rpb=2.490000009536743,spb=2.4700000286102295,tpb=2.880000114440918,upb=2.9200000762939453,vpb=2.869999885559082,wpb=2.8299999237060547,xpb=2.7899999618530273,ypb=2.809999942779541,zpb=2.799999952316284,Apb=3.049999952316284,Bpb=1.3300000429153442,Cpb=1.3899999856948853,Dpb=1.159999966621399,Epb=1.1100000143051147,Fpb=1.0700000524520874,Gpb=1.9600000381469727,Hpb=1.7100000381469727,Ipb=1.3600000143051147,Jpb=1.340000033378601,Kpb=1.2200000286102295,Lpb=1.2400000095367432,Mpb=1.2100000381469727,Npb=1.850000023841858,Opb=1.6299999952316284,Ppb=1.4700000286102295,Qpb=1.2799999713897705,Rpb=1.440000057220459,Spb=1.399999976158142,Tpb=1.7599999904632568,Upb=1.7300000190734863,Vpb=1.7200000286102295,Wpb=1.6799999475479126,Xpb=1.690000057220459,Ypb=1.6699999570846558,Zpb=1.649999976158142,$pb=1.7000000476837158,_pb=1.6200000047683716,aqb=1.3700000047683716,bqb=1.2899999618530273,cqb=1.4500000476837158,dqb=1.5700000524520874,eqb=-0.5235987755982988,fqb=-1.0471975511965976,gqb=-0.7853981633974483,hqb=0.017453292519943295,iqb=0.17453292519943295,jqb=1.0E-4,kqb={114:1},lqb=57.29577951308232,mqb=0.021922173386725217,nqb=1.0E-8,oqb=2.5120960256267386,pqb=1.0E-5,qqb='MMFF94s+',rqb='nonbonded cutoff',sqb='dielectric constant',tqb='dielectric model',uqb='angle bend',vqb='bond stretch',wqb='electrostatic',xqb='out of plane',yqb='stretch bend',zqb='torsion angle',Aqb='van der waals',Bqb={4:1,10:1,5:1,17:1,8:1},Cqb=0.07000000000000006,Dqb=0.1200000000000001,Eqb=-7.840000000000001,Fqb='OCL_RXN_V1.0:',Gqb=\"'$MOL' tag not found\",Hqb=\"'M  END' not found\",Iqb='\\nActelion Java MolfileCreator 2.0\\n\\n  0  0  0  0  0  0              0 V3000\\n',Jqb='M  V30 END CTAB',Kqb=2475109711874,Lqb=2475109711875,Mqb=2887426572290,Nqb=2887426572291,Oqb=2887627898882,Pqb=2887627898883,Qqb=2887627997186,Rqb=3437182386178,Sqb=3437182386179,Tqb=3437383712770,Uqb=3437383811074,Vqb=3437652148226,Wqb=3437652377602,Xqb=4674132967426,Yqb=4674334294018,Zqb=4674334392322,$qb=4674602729474,_qb=4674602958850,arb=5086449827842,brb=5086449827848,crb=5086651154434,drb=5086651252738,erb=5086651252743,frb=5086919589890,grb=5086919688194,hrb=5636406968322,irb=5636407066626,jrb=5636675502082,krb={l:589826,m:590112,h:4},lrb={l:589827,m:590112,h:4},mrb={l:589826,m:590160,h:4},nrb={l:589827,m:590160,h:4},orb={l:688130,m:590160,h:4},prb={l:589826,m:590224,h:4},qrb={l:589827,m:590224,h:4},rrb={l:819203,m:590224,h:4},srb={l:589826,m:590368,h:4},trb={l:688130,m:590368,h:4},urb={l:819202,m:590368,h:4},vrb={l:819208,m:590368,h:4},wrb={l:589826,m:590416,h:4},xrb={l:589832,m:590416,h:4},yrb={l:688130,m:590416,h:4},zrb={l:819202,m:590416,h:4},Arb={l:589826,m:598304,h:4},Brb={l:589827,m:598304,h:4},Crb={l:688130,m:598304,h:4},Drb={l:1114114,m:598304,h:4},Erb={l:1212418,m:598304,h:4},Frb={l:589826,m:598308,h:4},Grb={l:589826,m:688416,h:4},Hrb={l:589826,m:688464,h:4},Irb={l:589826,m:688720,h:4},Jrb={l:688130,m:688720,h:4},Krb={l:589826,m:590112,h:288},Lrb={l:589826,m:590112,h:336},Mrb={l:589826,m:688416,h:336},Nrb={l:589826,m:688464,h:336},Orb={l:688130,m:688464,h:336},Prb={l:589826,m:590112,h:400},Qrb={l:589826,m:688416,h:400},Rrb={l:589826,m:688464,h:400},Srb={l:688130,m:688464,h:400},Trb={l:589826,m:819488,h:400},Urb={l:589826,m:819536,h:400},Vrb={l:589826,m:819600,h:400},Wrb={l:688130,m:819600,h:400},Xrb={l:819202,m:819600,h:400},Yrb={l:589831,m:688416,h:592},Zrb={l:589831,m:688464,h:592},$rb={l:688135,m:688464,h:592},_rb={l:589831,m:819536,h:592},asb={l:688135,m:819536,h:592},bsb={l:688135,m:819600,h:592},csb={l:589832,m:1212704,h:592},dsb={l:589832,m:1212752,h:592},esb={l:688136,m:1212752,h:592},fsb={l:589831,m:688464,h:656},gsb={l:589826,m:590112,h:8480},hsb={l:589826,m:688416,h:8480},isb={l:589826,m:688464,h:8480},jsb={l:688130,m:688464,h:8480},ksb={l:819202,m:819600,h:8480},lsb={l:688135,m:1212752,h:8480},msb={l:589832,m:1213008,h:8480},nsb={l:688136,m:1213008,h:8480},osb={l:589826,m:590112,h:8484},psb={l:589826,m:590160,h:8484},qsb={l:688130,m:598304,h:8484},rsb=0.6262000203132629,ssb=-1.3825000524520874,tsb=0.33169999718666077,usb=-1.4915000200271606,vsb=0.3540000021457672,wsb=0.38179999589920044,xsb=-0.6019999980926514,ysb=-0.7379999756813049,zsb='Atom-types are 64-bit numbers describing atoms and their near surrounding.',Asb='Recognized atom types and their contributions are:',Bsb='Druglikeness predictor not properly initialized.',Csb=3.009999990463257,Dsb=-0.17000000178813934,Esb=-0.1809999942779541,Fsb=-0.2029999941587448,Gsb=2147483648,Hsb='MMFF94',Isb='MMFF94s',Jsb='117\\nint,int,int,int,float\\n0,2,0,0,0.020\\n1,2,1,2,0.030\\n1,2,2,2,0.027\\n1,2,2,3,0.026\\n1,2,2,5,0.013\\n1,2,2,37,0.032\\n2,2,2,5,0.013\\n2,2,3,5,0.012\\n2,2,5,5,0.006\\n2,2,5,6,0.027\\n2,2,5,37,0.017\\n2,2,5,40,0.012\\n2,2,5,41,0.008\\n0,3,0,0,0.130\\n1,3,1,7,0.146\\n1,3,2,7,0.138\\n1,3,3,7,0.134\\n1,3,5,7,0.122\\n1,3,6,7,0.141\\n1,3,7,10,0.129\\n1,3,7,37,0.138\\n2,3,5,7,0.113\\n2,3,5,9,0.081\\n2,3,6,7,0.127\\n2,3,7,10,0.116\\n3,3,5,7,0.113\\n3,3,6,7,0.127\\n5,3,5,7,0.103\\n5,3,5,9,0.074\\n5,3,5,54,0.078\\n5,3,6,7,0.119\\n5,3,7,10,0.102\\n5,3,9,40,0.067\\n6,3,7,37,0.127\\n7,3,10,10,0.113\\n7,3,20,20,0.151\\n9,3,40,40,0.057\\n0,8,0,0,0.000\\n0,10,0,0,0.015\\n1,10,1,3,0.015\\n1,10,3,6,0.015\\n1,10,3,28,0.015\\n3,10,3,28,0.015\\n3,10,28,28,0.015\\n0,17,0,0,0.000\\n0,26,0,0,0.000\\n0,30,0,0,0.010\\n5,30,20,30,0.008\\n0,37,0,0,0.035\\n1,37,37,37,0.040\\n2,37,37,37,0.031\\n3,37,37,37,0.027\\n5,37,37,37,0.015\\n5,37,37,38,0.046\\n5,37,37,63,0.008\\n5,37,37,64,0.012\\n5,37,37,69,0.016\\n5,37,38,38,0.084\\n6,37,37,37,0.048\\n15,37,37,37,0.025\\n37,37,37,40,0.046\\n0,39,0,0,0.020\\n1,39,63,63,0.012\\n23,39,63,63,-0.014\\n23,39,63,65,0.021\\n23,39,65,65,0.062\\n0,40,0,0,0.030\\n1,40,28,37,0.030\\n2,40,28,28,0.030\\n3,40,28,28,0.030\\n28,40,28,37,0.030\\n0,41,0,0,0.180\\n1,41,32,32,0.178\\n2,41,32,32,0.161\\n5,41,32,32,0.158\\n0,43,0,0,0.000\\n0,45,0,0,0.150\\n0,49,0,0,0.000\\n50,49,50,50,0.000\\n0,54,0,0,0.020\\n1,54,3,36,0.016\\n3,54,36,36,0.018\\n0,55,0,0,0.020\\n1,55,36,57,0.020\\n36,55,36,57,0.020\\n0,56,0,0,0.020\\n1,56,36,57,0.020\\n36,56,36,57,0.020\\n0,57,0,0,0.080\\n5,57,55,55,0.038\\n56,57,56,56,0.158\\n0,58,0,0,0.025\\n0,63,0,0,0.050\\n5,63,39,64,0.019\\n5,63,39,66,0.068\\n5,63,44,64,0.014\\n5,63,44,66,0.055\\n5,63,59,64,0.033\\n5,63,59,66,0.085\\n37,63,39,64,0.010\\n0,64,0,0,0.040\\n5,64,63,64,0.006\\n5,64,63,66,0.043\\n5,64,64,65,0.052\\n5,64,65,66,0.094\\n37,64,63,64,-0.01\\n0,67,0,0,0.070\\n0,69,0,0,0.070\\n32,69,37,37,0.067\\n0,73,0,0,0.000\\n0,78,0,0,0.045\\n5,78,78,81,0.046\\n0,80,0,0,0.080\\n5,80,81,81,0.057\\n0,81,0,0,0.025\\n36,81,78,80,0.016\\n0,82,0,0,0.000\\n',Ksb={214:1,4:1,5:1,8:1},Lsb='undefined',Msb=0.08726646502812703,Nsb=0.003921568859368563,Osb='Too many percent/per mille characters in pattern \"',Psb=1048575,Qsb=17592186044416,Rsb=1000000000,Ssb=-17592186044416,Tsb='CSS1Compat',Usb=5.56,Vsb=11.12,Wsb=13.34,Xsb=14.44,Ysb=0.3010299956639812,Zsb='BigInteger divide by zero',$sb=4294967295,_sb={l:0,m:0,h:524288},atb={27:1,87:1},btb={99:1},ctb={38:1,39:1,45:1,85:1},dtb='delete',etb=15525485,ftb=5.9604644775390625E-8,gtb=16777216,htb={4:1,27:1,52:1,64:1},itb='Invalid UTF8 sequence',jtb=0.20000000298023224,ktb=' distance:',ltb='gGP`@dfyjidNcGI[WQCP`<',mtb={43:1};var Ykb={};var Zkb={};var $kb={};var _kb={};var alb={};var blb={};var clb={};var dlb={};var elb={};var flb={};var glb={};var hlb={};var ilb={};var jlb={};var klb={};var llb={};var mlb={};var nlb={};var olb={};var plb={};var qlb={};var rlb={};var slb={};var tlb={};var ulb={};var vlb={};var wlb={};var xlb={};var ylb={};var zlb={};var Alb={};var Blb={};var Clb={};var Dlb={};var Elb={};var Flb={};var Glb={};var _;var R1;var L1;var $0=-1;Ykb._0=function _0(){};function Q1(a,b){typeof window===Hlb&&typeof window['$gwt']===Hlb&&(window['$gwt'][a]=b)}\nfunction P1(b,c,d,e){Ykb.O1();var f=L1;$moduleName=c;$moduleBase=d;$0=e;function g(){for(var a=0;a<f.length;a++){f[a]()}}\nif(b){try{Xkb(g)()}catch(a){b(c,a)}}else{Xkb(g)()}}\nYkb.O1=function O1(){L1==null&&(L1=[])};function N1(){Ykb.O1();var a=L1;for(var b=0;b<arguments.length;b++){a.push(arguments[b])}}\nYkb.M1=function M1(){};function a2(){}\nfunction _1(a){if(Array.isArray(a)&&a.uc===a2){return Zkb.Mc(a)}return a.toString()}\nfunction $1(a,b){var c=$wnd;if(a===''){return c}var d=a.split('.');!(d[0] in c)&&c.execScript&&c.execScript('var '+d[0]);if(b){var e=b.prototype.sc;e.e=b}for(var f;d.length&&(f=d.shift());){c=c[f]=c[f]||!d.length&&b||{}}return c}\nYkb.Z1=function Z1(a){function b(){}\n;b.prototype=a||{};return new b};Ykb.Y1=function Y1(a){return a instanceof Array?a[0]:null};function X1(a,b,c){var d=function(){return a.apply(d,arguments)};b.apply(d,c);return d}\nfunction W1(){}\nfunction V1(a,b){for(var c in b){b[c]['configurable']=true}Object.defineProperties(a,b)}\nfunction U1(a,b,c){var d=R1;var e=d[a];var f=Ykb.Y1(e);if(e&&!f){_=e}else{_=Ykb.T1(b);_.tc=c;!b&&(_.uc=a2);d[a]=_}for(var g=3;g<arguments.length;++g){arguments[g].prototype=_}f&&(_.sc=f)}\nYkb.T1=function T1(a){var b=a&&a.prototype;!b&&(b=R1[a]);return Ykb.Z1(b)};Ykb.S1=function S1(){};$wnd.goog=$wnd.goog||{};$wnd.goog.global=$wnd.goog.global||$wnd;R1={};Zkb.Bc=function Bc(a,b){return uX(a)===uX(b)};Zkb.Cc=function Cc(a){return a.sc};Zkb.Dc=function Dc(a){return alb.wgb(a)};function Ec(){}\nZkb.Gc=function Gc(a,b){return rX(a)?Zkb.c5(a,b):oX(a)?Zkb.V3(a,b):nX(a)?Zkb.P2(a,b):lX(a)?a.ib(b):iW(a)?Zkb.Bc(a,b):$kb.pU(a,b)};Zkb.Ic=function Ic(a){return rX(a)?Zkb.e5():oX(a)?Zkb.W3():nX(a)?Zkb.Q2():lX(a)?a.sc:iW(a)?Zkb.Cc(a):$kb.qU(a)};Zkb.Kc=function Kc(a){return rX(a)?Zkb.f5(a):oX(a)?Zkb.X3(a):nX(a)?Zkb.R2(a):lX(a)?a.kb():iW(a)?Zkb.Dc(a):$kb.rU(a)};Zkb.Mc=function Mc(a){var b;return Zkb.q3(Zkb.Ic(a))+'@'+(b=alb.Pgb(alb.Ogb(Zkb.Kc(a))),b.toString(16))};U1(1,null,{},Ec);_.ib=function Fc(a){return Zkb.Bc(this,a)};_.jb=function Hc(){return Zkb.Cc(this)};_.kb=function Jc(){return Zkb.Dc(this)};_.lb=function Lc(){var a;return Zkb.q3(Zkb.Ic(this))+'@'+(a=alb.Pgb(alb.Ogb(Zkb.Kc(this))),a.toString(16))};_.equals=function(a){return this.ib(a)};_.hashCode=function(){return this.kb()};_.toString=function(){return this.lb()};$kb.pU=function pU(a,b){return $kb.vU(a)?$kb.sU(a,b):uX(a)===uX(b)};$kb.qU=function qU(a){return a.sc||Array.isArray(a)&&aW(Ykb.r$,1)||Ykb.r$};$kb.rU=function rU(a){return $kb.wU(a)?$kb.tU(a):alb.wgb(a)};$kb.sU=function sU(a,b){return a.equals(b)};$kb.tU=function tU(a){return a.hashCode()};$kb.uU=function uU(){return []};$kb.vU=function vU(a){return !!a&&!!a.equals};$kb.wU=function wU(a){return !!a&&!!a.hashCode};$kb.xU=function xU(a){return a.toString?a.toString():'[JavaScriptObject]'};_kb.bV=function bV(){_kb.bV=W1;var a,b;b=!_kb.kV();a=new _kb.tV;_kb.aV=b?new _kb.lV:a};_kb.cV=function cV(a){_kb.bV();_kb.aV.Tb(a)};_kb.dV=function dV(a){_kb.bV();var b;b=_kb.aV.Ub(a);return _kb.eV(b)};_kb.eV=function eV(a){var b,c,d,e;b='cV';c='mz';e=$wnd.Math.min(a.length,5);for(d=e-1;d>=0;d--){if(Zkb.c5(a[d].d,b)||Zkb.c5(a[d].d,c)){a.length>=d+1&&alb.Pgb(a).splice(0,d+1);break}}return a};_kb.fV=function fV(a){var b=/function(?:\\s+([\\w$]+))?\\s*\\(/;var c=b.exec(a);return c&&c[1]||Ilb};_kb.gV=function gV(a){_kb.bV();return a&&a[Jlb]?a[Jlb]:[]};_kb.hV=function hV(a){_kb.bV();return a.name||(a.name=_kb.fV(a.toString()))};_kb.iV=function iV(a){_kb.bV();return parseInt(a)||-1};_kb.jV=function jV(a){_kb.bV();var b=a.backingJsObject;if(b&&b.stack){var c=b.stack;var d=b+Klb;c.substring(0,d.length)==d&&(c=c.substring(d.length));return c.split(Klb)}return []};_kb.kV=function kV(){if(Error.stackTraceLimit>0){$wnd.Error.stackTraceLimit=Error.stackTraceLimit=64;return true}return 'stack' in new Error};U1(330,1,{});_kb.lV=function lV(){};U1(236,330,{},_kb.lV);_.Tb=function mV(a){var b={};var c=[];a[Jlb]=c;var d=arguments.callee.caller;while(d){var e=_kb.hV(d);c.push(e);var f=':'+e;var g=b[f];if(g){var h,i;for(h=0,i=g.length;h<i;h++){if(g[h]===d){return}}}(g||(b[f]=[])).push(d);d=d.caller}};_.Ub=function nV(a){var b,c,d,e;d=_kb.gV(a);c=$kb.DU(d);e=gW(Ykb.h_,Llb,66,c,0,1);for(b=0;b<c;b++){e[b]=new Zkb.T4($kb.CU(d,b),null,-1)}return e};_kb.oV=function oV(a,b){var c,d,e,f,g,h,i,j,k;j='';if(alb.Pgb(b).length==0){return a.Vb(Mlb,Ilb,-1,-1)}k=Zkb.q5(b);Zkb.c5(alb.Pgb(k).substr(0,3),'at ')&&(k=(alb.Kgb(3,alb.Pgb(k).length+1),alb.Pgb(k).substr(3)));k=_kb.pV(k);g=alb.Pgb(k).indexOf('(');if(g==-1){g=alb.Pgb(k).indexOf('@');if(g==-1){j=k;k=''}else{j=Zkb.q5((alb.Kgb(g+1,alb.Pgb(k).length+1),alb.Pgb(k).substr(g+1)));k=Zkb.q5((alb.Jgb(0,g,alb.Pgb(k).length),alb.Pgb(k).substr(0,g)))}}else{c=alb.Pgb(k).indexOf(')',g);j=(alb.Jgb(g+1,c,alb.Pgb(k).length),alb.Pgb(k).substr(g+1,c-(g+1)));k=Zkb.q5((alb.Jgb(0,g,alb.Pgb(k).length),alb.Pgb(k).substr(0,g)))}g=Zkb.g5(k,s5(46));g!=-1&&(k=(alb.Kgb(g+1,alb.Pgb(k).length+1),alb.Pgb(k).substr(g+1)));(alb.Pgb(k).length==0||Zkb.c5(k,'Anonymous function'))&&(k=Ilb);h=Zkb.j5(j,s5(58));e=Zkb.k5(j,s5(58),h-1);i=-1;d=-1;f=Mlb;if(h!=-1&&e!=-1){f=(alb.Jgb(0,e,alb.Pgb(j).length),alb.Pgb(j).substr(0,e));i=_kb.iV((alb.Jgb(e+1,h,alb.Pgb(j).length),alb.Pgb(j).substr(e+1,h-(e+1))));d=_kb.iV((alb.Kgb(h+1,alb.Pgb(j).length+1),alb.Pgb(j).substr(h+1)))}return a.Vb(f,k,i,d)};_kb.pV=function pV(a){return a.replace(/\\[.*?\\]/g,'')};U1(331,330,{});_.Tb=function qV(a){};_.Vb=function rV(a,b,c,d){return new Zkb.T4(b,a+'@'+d,c<0?-1:c)};_.Ub=function sV(a){var b,c,d,e,f,g;e=_kb.jV(a);f=gW(Ykb.h_,Llb,66,0,0,1);b=0;d=$kb.DU(e);if(d==0){return f}g=_kb.oV(this,$kb.CU(e,0));Zkb.c5(g.d,Ilb)||(f[b++]=g);for(c=1;c<d;c++){f[b++]=_kb.oV(this,$kb.CU(e,c))}return f};_kb.tV=function tV(){};U1(237,331,{},_kb.tV);_.Vb=function uV(a,b,c,d){return new Zkb.T4(b,a,-1)};Ykb._V=function _V(a){return a};function aW(a,b){return Ykb.bW(a,b)}\nYkb.bW=function bW(a,b){return Zkb.A3(a,b)};Ykb.cW=function cW(a){return a.__elementTypeCategory$==null?10:a.__elementTypeCategory$};Ykb.dW=function dW(a){return a.__elementTypeId$};function eW(a,b,c,d,e,f){return Ykb.fW(a,b,c,d,e,0,f)}\nYkb.fW=function fW(a,b,c,d,e,f,g){var h,i,j,k,l;k=e[f];j=f==g-1;h=j?d:0;l=Ykb.hW(h,k);d!=10&&oW(aW(a,g-f),b[f],c[f],h,l);if(!j){++f;for(i=0;i<k;++i){Ykb.jW(l,i,Ykb.fW(a,b,c,d,e,f,g))}}return l};function gW(a,b,c,d,e,f){var g;g=Ykb.hW(e,d);e!=10&&oW(aW(a,f),b,c,e,g);return g}\nYkb.hW=function hW(a,b){var c=new Array(b);var d;switch(a){case 14:case 15:d=0;break;case 16:d=false;break;default:return c;}for(var e=0;e<b;++e){c[e]=d}return c};function iW(a){return Array.isArray(a)&&a.uc===a2}\nYkb.jW=function jW(a,b,c){return a[b]=c};function kW(a,b,c){return Ykb.jW(a,b,c)}\nYkb.lW=function lW(a,b){a.sc=b};Ykb.mW=function mW(a,b){a.__elementTypeCategory$=b};Ykb.nW=function nW(a,b){a.__elementTypeId$=b};function oW(a,b,c,d,e){Ykb.lW(e,a);e.tc=b;e.uc=a2;Ykb.nW(e,c);Ykb.mW(e,d);return e}\nYkb.pW=function pW(a,b){Ykb.cW(b)!=10&&oW(Zkb.Ic(b),b.tc,Ykb.dW(b),Ykb.cW(b),a);return Ykb._V(a)};function kX(a,b){if(rX(a)){return !!jX[b]}else if(a.tc){return !!a.tc[b]}else if(oX(a)){return !!iX[b]}else if(nX(a)){return !!hX[b]}return false}\nfunction lX(a){return !Array.isArray(a)&&a.uc===a2}\nfunction mX(a,b){return a!=null&&kX(a,b)}\nfunction nX(a){return typeof a===Nlb}\nfunction oX(a){return typeof a===Olb}\nfunction pX(a){return a!=null&&Ykb.sX(a)&&!(a.uc===a2)}\nfunction qX(a,b){return Ykb.tX(a,b)}\nfunction rX(a){return typeof a===Plb}\nYkb.sX=function sX(a){return typeof a===Hlb||typeof a==='function'};Ykb.tX=function tX(a,b){return a&&b&&a instanceof b};function uX(a){return a==null?null:a}\nfunction vX(a){return Math.max(Math.min(a,Qlb),-2147483648)|0}\nvar hX;var iX;var jX;Ykb.a1=function a1(a){return a&&a.__java$exception};function b1(a){var b;if(mX(a,22)){return a}b=Ykb.a1(a);if(!b){b=new $kb.jU(a);_kb.cV(b)}return b}\nfunction c1(a){return a.backingJsObject}\nfunction s2(a){var b;if(a==null){return false}b=typeof(a);return Zkb.c5(b,Nlb)||Zkb.c5(b,Olb)||Zkb.c5(b,Plb)||a.$implements__java_io_Serializable||Array.isArray(a)}\nfunction L3(a){var b;b=typeof(a);if(Zkb.c5(b,Nlb)||Zkb.c5(b,Olb)||Zkb.c5(b,Plb)){return true}return a!=null&&a.$implements__java_lang_Comparable}\nZkb.L2=function L2(){Zkb.L2=W1;K2=alb.Pgb(false);alb.Pgb(true)};Zkb.M2=function M2(a){return alb.Qgb((alb.Egb(a),a))};Zkb.N2=function N2(a,b){return T2(alb.Qgb((alb.Egb(a),a)),alb.Qgb((alb.Egb(b),b)))};Zkb.O2=function O2(a,b){return Zkb.N2(a,b)};Zkb.P2=function P2(a,b){return alb.Egb(a),uX(a)===uX(b)};Zkb.Q2=function Q2(){return Ykb.R$};Zkb.R2=function R2(a){return alb.Qgb((alb.Egb(a),a))?1231:1237};function S2(a){Zkb.L2();return Zkb.c5(Nlb,typeof(a))}\nfunction T2(a,b){Zkb.L2();return a==b?0:a?1:-1}\nZkb.U2=function U2(a,b){Zkb.L2();return rX(a)?Zkb.Y4(a,b):oX(a)?Zkb.T3(a,b):nX(a)?Zkb.O2(a,b):a.qb(b)};hX={4:1,233:1,27:1};var K2;function V2(a){if(Zkb.c5(typeof(a),Plb)){return true}return a!=null&&a.$implements__java_lang_CharSequence}\nZkb.o3=function o3(a){a.i=n3++};Zkb.p3=function p3(a){if(a.n!=null){return}Zkb.E3(a)};Zkb.q3=function q3(a){Zkb.p3(a);return a.n};Zkb.r3=function r3(a){return (a.f&4)!=0};Zkb.s3=function s3(a){return (a.f&1)!=0};Zkb.t3=function t3(){Zkb.o3(this);this.n=null;this.j=null;this.g=null;this.d=null;this.b=null;this.k=null;this.a=null};Zkb.v3=function v3(a){var b;b=new Zkb.t3;b.n='Class$'+(a?'S'+a:''+b.i);b.b=b.n;b.j=b.n;return b};function w3(a){var b;b=Zkb.v3(a);Zkb.I3(a,b);return b}\nfunction x3(a,b){var c;c=Zkb.v3(a);Zkb.I3(a,c);c.f=b?8:0;return c}\nfunction y3(a){var b;b=Zkb.v3(a);b.k=a;b.f=1;return b}\nZkb.A3=function A3(a,b){var c=a.a=a.a||[];return c[b]||(c[b]=a.Wb(b))};function C3(a){if(a._b()){return null}var b=a.k;return R1[b]}\nZkb.E3=function E3(a){if(a.$b()){var b=a.c;b._b()?(a.n='['+b.k):!b.$b()?(a.n='[L'+b.Yb()+';'):(a.n='['+b.Yb());a.b=b.Xb()+'[]';a.j=b.Zb()+'[]';return}var c=a.g;var d=a.d;d=d.split('/');a.n=Zkb.H3('.',[c,Zkb.H3('$',d)]);a.b=Zkb.H3('.',[c,Zkb.H3('.',d)]);a.j=d[d.length-1]};Zkb.H3=function H3(a,b){var c=0;while(!b[c]||b[c]==''){c++}var d=b[c++];for(;c<b.length;c++){if(!b[c]||b[c]==''){continue}d+=a+b[c]}return d};Zkb.I3=function I3(a,b){var c;if(!a){return}b.k=a;var d=C3(b);if(!d){R1[a]=[b];return}d.sc=b};U1(157,1,{},Zkb.t3);_.Wb=function u3(a){var b;b=new Zkb.t3;b.f=4;a>1?(b.c=Zkb.A3(this,a-1)):(b.c=this);return b};_.Xb=function z3(){Zkb.p3(this);return this.b};_.Yb=function B3(){return Zkb.q3(this)};_.Zb=function D3(){Zkb.p3(this);return this.j};_.$b=function F3(){return Zkb.r3(this)};_._b=function G3(){return Zkb.s3(this)};_.lb=function J3(){return ((this.f&2)!=0?'interface ':(this.f&1)!=0?'':'class ')+(Zkb.p3(this),this.n)};_.f=0;_.i=0;var n3=1;Zkb.N3=function N3(a){return Zkb.c5(Olb,typeof(a))||qX(a,$wnd.java.lang.Number$impl)};Zkb.O3=function O3(a){Zkb.M3==null&&(Zkb.M3=new RegExp('^\\\\s*[+-]?(NaN|Infinity|((\\\\d+\\\\.?\\\\d*)|(\\\\.\\\\d+))([eE][+-]?\\\\d+)?[dDfF]?)\\\\s*$'));if(!Zkb.M3.test(a)){throw c1(new Zkb.S4(Rlb+a+'\"'))}return parseFloat(a)};Zkb.P3=function P3(a,b,c){var d,e,f,g,h;if(a==null){throw c1(new Zkb.S4(Slb))}f=alb.Pgb(a).length;g=f>0&&(alb.Kgb(0,alb.Pgb(a).length),alb.Pgb(a).charCodeAt(0)==45||(alb.Kgb(0,alb.Pgb(a).length),alb.Pgb(a).charCodeAt(0)==43))?1:0;for(d=g;d<f;d++){if(_2((alb.Kgb(d,alb.Pgb(a).length),alb.Pgb(a).charCodeAt(d)))==-1){throw c1(new Zkb.S4(Rlb+a+'\"'))}}h=parseInt(a,10);e=h<b;if(isNaN(h)){throw c1(new Zkb.S4(Rlb+a+'\"'))}else if(e||h>c){throw c1(new Zkb.S4(Rlb+a+'\"'))}return h};Zkb.Q3=function Q3(a){return oX(a)?Zkb.U3(a):a.ac()};Zkb.R3=function R3(a){return oX(a)?Zkb.Y3(a):a.bc()};U1(95,1,{4:1,95:1});Zkb.S3=function S3(a,b){return $3(alb.Rgb((alb.Egb(a),a)),alb.Rgb((alb.Egb(b),b)))};Zkb.T3=function T3(a,b){return Zkb.S3(a,b)};Zkb.U3=function U3(a){return alb.Rgb((alb.Egb(a),a))};Zkb.V3=function V3(a,b){return alb.Egb(a),uX(a)===uX(b)};Zkb.W3=function W3(){return Ykb.U$};Zkb.X3=function X3(a){return vX(alb.Rgb((alb.Egb(a),a)))};Zkb.Y3=function Y3(a){return vX(alb.Rgb((alb.Egb(a),a)))};function Z3(a){return Zkb.c5(Olb,typeof(a))}\nfunction $3(a,b){if(a<b){return -1}if(a>b){return 1}if(a==b){return a==0?$3(1/a,1/b):0}return isNaN(a)?isNaN(b)?0:1:-1}\nfunction _3(a){if(isNaN(a)){return {l:0,m:0,h:524160}}return alb.Lgb(a)}\niX={4:1,27:1,234:1,95:1};Zkb.Vy=function Vy(a){a.g=gW(Ykb.h_,Llb,66,0,0,1)};Zkb.Wy=function Wy(a){_kb.cV(a)};Zkb.Xy=function Xy(a){return _kb.dV(a)};Zkb.Yy=function Yy(a){if(a.j){a.backingJsObject!==Tlb&&a.Hb();a.g=null}return a};Zkb.Zy=function Zy(a){return a.e};Zkb.$y=function $y(d,b){if(b instanceof Object){try{b.__java$exception=d;if(navigator.userAgent.toLowerCase().indexOf('msie')!=-1&&$doc.documentMode<9){return}var c=d;Object.defineProperties(b,{cause:{get:function(){var a=c.Fb();return a&&a.Db()}},suppressed:{get:function(){return c.Eb()}}})}catch(a){}}};Zkb._y=function _y(a,b,c){var d,e,f,g,h;String.fromCharCode(10);Zkb.az(a);for(e=(a.i==null&&(a.i=gW(Ykb.m_,Llb,22,0,0,1)),a.i),f=0,g=e.length;f<g;++f){d=e[f];Zkb._y(d,b,'\\t'+c)}h=a.e;!!h&&Zkb._y(h,b,c)};Zkb.az=function az(a){var b,c,d;for(b=(a.g==null&&(a.g=Zkb.Xy(a)),a.g),c=0,d=b.length;c<d;++c){String.fromCharCode(10)}};Zkb.bz=function bz(a,b){a.backingJsObject=b;Zkb.$y(a,b)};Zkb.cz=function cz(a){return Zkb.dz(a,a.Gb())};Zkb.dz=function dz(a,b){var c;c=Zkb.q3(a.sc);return b==null?c:c+': '+b};Zkb.ez=function ez(){Zkb.Vy(this);Zkb.Yy(this);this.Hb()};Zkb.fz=function fz(a){Zkb.Vy(this);this.f=a;Zkb.Yy(this);this.Hb()};Zkb.hz=function hz(b){if(!('stack' in b)){try{throw b}catch(a){}}return b};function nz(a){var b;if(a!=null){b=a.__java$exception;if(b){return b}}return qX(a,TypeError)?new Zkb.P4(a):new Zkb.bU(a)}\nU1(22,1,{4:1,22:1});_.Cb=function gz(a){return new Error(a)};_.Db=function iz(){return this.backingJsObject};_.Eb=function jz(){var a,b,c;c=(this.i==null&&(this.i=gW(Ykb.m_,Llb,22,0,0,1)),this.i);b=gW(Ykb.f_,Ulb,1,c.length,5,1);for(a=0;a<c.length;a++){b[a]=c[a].backingJsObject}return b};_.Fb=function kz(){return Zkb.Zy(this)};_.Gb=function lz(){return this.f};_.Hb=function mz(){Zkb.bz(this,Zkb.hz(this.Cb(Zkb.dz(this,this.f))));Zkb.Wy(this)};_.lb=function oz(){return Zkb.cz(this)};_.backingJsObject=Tlb;_.j=true;Zkb.pz=function pz(){Zkb.ez.call(this)};Zkb.qz=function qz(a){Zkb.Vy(this);Zkb.Yy(this);this.backingJsObject=a;Zkb.$y(this,a);this.f=a==null?Slb:_1(a)};Zkb.rz=function rz(a){Zkb.fz.call(this,a)};U1(15,22,Vlb,Zkb.rz);Zkb.sz=function sz(){Zkb.pz.call(this)};Zkb.tz=function tz(a){Zkb.qz.call(this,a)};Zkb.uz=function uz(a){Zkb.rz.call(this,a)};U1(41,15,Vlb);Zkb.G2=function G2(){Zkb.sz.call(this)};Zkb.H2=function H2(a){Zkb.uz.call(this,a)};U1(69,41,Vlb,Zkb.G2,Zkb.H2);Zkb.aU=function aU(){Zkb.sz.call(this)};Zkb.bU=function bU(a){Zkb.tz.call(this,a)};Zkb.cU=function cU(a){Zkb.uz.call(this,a)};U1(100,41,Vlb,Zkb.bU);Zkb.O4=function O4(){Zkb.aU.call(this)};Zkb.P4=function P4(a){Zkb.bU.call(this,a)};Zkb.Q4=function Q4(a){Zkb.cU.call(this,a)};U1(62,100,Vlb,Zkb.O4,Zkb.P4,Zkb.Q4);_.Cb=function R4(a){return new TypeError(a)};Zkb.X4=function X4(a,b){alb.Kgb(b,alb.Pgb(a).length);return alb.Pgb(a).charCodeAt(b)};Zkb.Y4=function Y4(a,b){return Zkb.Z4(a,b)};Zkb.Z4=function Z4(a,b){var c,d;c=Zkb.U3(alb.Pgb(a));d=Zkb.U3(alb.Pgb(b));return c==d?0:c<d?-1:1};Zkb.$4=function $4(a,b){return Zkb.Z4(alb.Pgb(a).toLowerCase(),alb.Pgb(b).toLowerCase())};Zkb._4=function _4(a,b){return alb.Egb(a),a+(''+(alb.Egb(b),b))};Zkb.a5=function a5(a){var b;return Zkb.u5(alb.ogb(a,0,(b=a.length,alb.lgb(),b)))};Zkb.b5=function b5(a){var b;b=alb.Pgb(Wlb).length;return Zkb.c5(alb.Pgb(a).substr(alb.Pgb(a).length-b,b),Wlb)};Zkb.c5=function c5(a,b){return alb.Egb(a),uX(a)===uX(b)};Zkb.d5=function d5(a,b){alb.Egb(a);if(b==null){return false}if(Zkb.c5(a,b)){return true}return alb.Pgb(a).length==alb.Pgb(b).length&&Zkb.c5(alb.Pgb(a).toLowerCase(),alb.Pgb(b).toLowerCase())};Zkb.e5=function e5(){return Ykb.l_};Zkb.f5=function f5(a){var b,c;b=0;for(c=0;c<alb.Pgb(a).length;c++){b=(b<<5)-b+(alb.Kgb(c,alb.Pgb(a).length),alb.Pgb(a).charCodeAt(c))|0}return b};Zkb.g5=function g5(a,b){return alb.Pgb(a).indexOf(b)};Zkb.h5=function h5(a,b,c){return alb.Pgb(a).indexOf(b,c)};function i5(a){return Zkb.c5(Plb,typeof(a))}\nZkb.j5=function j5(a,b){return alb.Pgb(a).lastIndexOf(b)};Zkb.k5=function k5(a,b,c){return alb.Pgb(a).lastIndexOf(b,c)};Zkb.l5=function l5(a,b){var c;c=Zkb.m5(b,'([/\\\\\\\\\\\\.\\\\*\\\\+\\\\?\\\\|\\\\(\\\\)\\\\[\\\\]\\\\{\\\\}$^])','\\\\\\\\$1');return Zkb.m5(a,c,'')};Zkb.m5=function m5(a,b,c){c=Zkb.t5(c);return alb.Pgb(a).replace(new RegExp(b,'g'),c)};Zkb.n5=function n5(a,b){var c,d,e,f,g,h,i,j;c=new RegExp(b,'g');i=gW(Ykb.l_,Xlb,2,0,6,1);d=0;j=a;f=null;while(true){h=c.exec(j);if(h==null||j==''){i[d]=j;break}else{g=h.index;i[d]=(alb.Jgb(0,g,alb.Pgb(j).length),alb.Pgb(j).substr(0,g));j=Zkb.p5(j,g+alb.Pgb(alb.Pgb(h)[0]).length,alb.Pgb(j).length);c.lastIndex=0;if(f==j){i[d]=(alb.Jgb(0,1,alb.Pgb(j).length),alb.Pgb(j).substr(0,1));j=(alb.Kgb(1,alb.Pgb(j).length+1),alb.Pgb(j).substr(1))}f=j;++d}}if(alb.Pgb(a).length>0){e=i.length;while(e>0&&i[e-1]==''){--e}e<i.length&&(alb.Pgb(i).length=e)}return i};Zkb.o5=function o5(a,b){alb.Kgb(b,alb.Pgb(a).length+1);return alb.Pgb(a).substr(b)};Zkb.p5=function p5(a,b,c){alb.Jgb(b,c,alb.Pgb(a).length);return alb.Pgb(a).substr(b,c-b)};Zkb.q5=function q5(a){var b,c,d;c=alb.Pgb(a).length;d=0;while(d<c&&(alb.Kgb(d,alb.Pgb(a).length),alb.Pgb(a).charCodeAt(d)<=32)){++d}b=c;while(b>d&&(alb.Kgb(b-1,alb.Pgb(a).length),alb.Pgb(a).charCodeAt(b-1)<=32)){--b}return d>0||b<c?(alb.Jgb(d,b,alb.Pgb(a).length),alb.Pgb(a).substr(d,b-d)):a};Zkb.r5=function r5(a){return String.fromCharCode.apply(null,a)};function s5(a){var b,c;if(a>=Ylb){b=55296+(a-Ylb>>10&1023)&Zlb;c=56320+(a-Ylb&1023)&Zlb;return String.fromCharCode(b)+(''+String.fromCharCode(c))}else{return String.fromCharCode(a&Zlb)}}\nZkb.t5=function t5(a){var b;b=0;while(0<=(b=alb.Pgb(a).indexOf('\\\\',b))){alb.Kgb(b+1,alb.Pgb(a).length);alb.Pgb(a).charCodeAt(b+1)==36?(a=(alb.Jgb(0,b,alb.Pgb(a).length),alb.Pgb(a).substr(0,b)+'$'+Zkb.o5(a,++b))):(a=(alb.Jgb(0,b,alb.Pgb(a).length),alb.Pgb(a).substr(0,b)+(''+Zkb.o5(a,++b))))}return a};Zkb.u5=function u5(a){return Zkb.v5(a,0,a.length)};Zkb.v5=function v5(a,b,c){var d,e,f,g;f=b+c;alb.Jgb(b,f,a.length);g='';for(e=b;e<f;){d=$wnd.Math.min(e+$lb,f);g+=Zkb.r5(alb.Pgb(a).slice(e,d));e=d}return g};jX={4:1,159:1,27:1,2:1};Zkb.M5=function M5(a){Zkb.H2.call(this,a)};U1(178,69,Vlb,Zkb.M5);alb.agb=function agb(a){var b;b=alb.Pgb(a).slice();return alb.kgb(b,a)};\nalb.bgb=function bgb(a,b,c,d,e,f){var g,h,i,j,k;if(e==0){return}if(uX(a)===uX(c)){a=alb.Pgb(a).slice(b,b+e);b=0}i=alb.Pgb(c);for(h=b,j=b+e;h<j;){g=$wnd.Math.min(h+$lb,j);e=g-h;k=alb.Pgb(a).slice(h,g);alb.Pgb(k).splice(0,0,alb.Pgb(d),alb.Pgb(f?e:0));Array.prototype.splice.apply(i,k);h=g;d+=e}};alb.cgb=function cgb(a,b){return alb.kgb(new Array(b),a)};alb.dgb=function dgb(a,b,c){alb.Pgb(a).splice(b,0,c)};alb.egb=function egb(a,b,c){alb.bgb(c,0,a,b,c.length,false)};alb.fgb=function fgb(a,b){alb.Pgb(a).push(b)};alb.ggb=function ggb(a,b){alb.Pgb(a).push(b)};alb.hgb=function hgb(a,b,c){alb.Pgb(a).splice(b,c)};alb.igb=function igb(a,b){alb.Pgb(a).length=b};alb.jgb=function jgb(a,b){alb.Pgb(a).sort(b)};U1(374,1,{});alb.tgb=function tgb(){};alb.ugb=function ugb(a){switch(typeof(a)){case Plb:return Zkb.f5(alb.Pgb(a));case Olb:return Zkb.X3(alb.Pgb(a));case Nlb:return Zkb.R2(alb.Pgb(a));default:return a==null?0:alb.wgb(a);}};alb.vgb=function vgb(){return ++alb.sgb};alb.wgb=function wgb(a){return a.$H||(a.$H=alb.vgb())};U1(328,1,{},alb.tgb);alb.sgb=0;alb.xgb=function xgb(a){if(!a){throw c1(new Zkb.b4)}};alb.ygb=function ygb(a,b){if(!a){throw c1(new Zkb.c4(b))}};alb.zgb=function zgb(a,b){if(0>a){throw c1(new Zkb.c4('fromIndex: 0 > toIndex: '+a))}if(a>b){throw c1(new Zkb.J2('fromIndex: 0, toIndex: '+a+_lb+b))}};alb.Agb=function Agb(a){if(a<0){throw c1(new Zkb.N4('Negative array size: '+a))}};alb.Bgb=function Bgb(a,b){if(a!=b){throw c1(new dlb.Icb)}};alb.Cgb=function Cgb(a){if(!a){throw c1(new dlb.Ndb)}};alb.Dgb=function Dgb(a,b){if(a<0||a>=b){throw c1(new Zkb.H2(amb+a+bmb+b))}};alb.Egb=function Egb(a){if(a==null){throw c1(new Zkb.O4)}return a};alb.Fgb=function Fgb(a,b){if(a==null){throw c1(new Zkb.Q4(b))}};alb.Ggb=function Ggb(a,b){if(a<0||a>b){throw c1(new Zkb.H2(amb+a+bmb+b))}};alb.Hgb=function Hgb(a,b,c){if(a<0||b>c){throw c1(new Zkb.H2(cmb+a+dmb+b+', size: '+c))}if(a>b){throw c1(new Zkb.c4(cmb+a+' > toIndex: '+b))}};alb.Igb=function Igb(a){if(!a){throw c1(new Zkb.d4)}};alb.Jgb=function Jgb(a,b,c){if(a<0||b>c||b<a){throw c1(new Zkb.M5(cmb+a+dmb+b+_lb+c))}};alb.Kgb=function Kgb(a,b){if(a<0||a>=b){throw c1(new Zkb.M5(amb+a+bmb+b))}};alb.Lgb=function Lgb(a){var b,c;b=new ArrayBuffer(8);alb.Pgb(new Float64Array(b))[0]=a;c=alb.Pgb(new Uint32Array(b));return alb.Sgb(c[0]|0,c[1]|0)};alb.Mgb=function Mgb(a,b){return a[b]};alb.Ngb=function Ngb(a){return a===undefined};alb.Ogb=function Ogb(a){return a>>>0};alb.Pgb=function Pgb(a){return a};alb.Qgb=function Qgb(a){return a};alb.Rgb=function Rgb(a){return a};U1(329,1,{});Ykb.f_=w3(1);Ykb.r$=w3(0);Ykb.y$=w3(330);Ykb.v$=w3(236);Ykb.x$=w3(331);Ykb.w$=w3(237);Ykb.R$=w3(233);Ykb.T$=w3(157);Ykb.e_=w3(95);Ykb.U$=w3(234);Ykb.m_=w3(22);Ykb.W$=w3(15);Ykb.g_=w3(41);Ykb.Z$=w3(69);Ykb._$=w3(100);Ykb.c_=w3(62);Ykb.l_=w3(2);Ykb.k_=w3(178);Ykb.t0=w3(328);Ykb.u0=w3(329);blb.Nc=function Nc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q;this.c=a.length;this.d=a[0].length;G=$wnd.Math.min(this.c,this.d);this.e=gW(Ykb.yX,emb,6,$wnd.Math.min(this.c+1,this.d),15,1);this.a=eW(Ykb.yX,[Llb,emb],[12,6],15,[this.c,G],2);this.b=eW(Ykb.yX,[Llb,emb],[12,6],15,[this.d,this.d],2);e=gW(Ykb.yX,emb,6,this.d,15,1);Q=gW(Ykb.yX,emb,6,this.c,15,1);D=$wnd.Math.min(this.c-1,this.d);F=$wnd.Math.max(0,$wnd.Math.min(this.d-2,this.c));for(v=0;v<$wnd.Math.max(D,F);v++){if(v<D){this.e[v]=0;for(l=v;l<this.c;l++){this.e[v]=blb.Oc(this.e[v],a[l][v])}if(this.e[v]!=0){a[v][v]<0&&(this.e[v]=-this.e[v]);for(k=v;k<this.c;k++){a[k][v]/=this.e[v]}a[v][v]+=1}this.e[v]=-this.e[v]}for(q=v+1;q<this.d;q++){if(v<D&this.e[v]!=0){P=0;for(l=v;l<this.c;l++){P+=a[l][v]*a[l][q]}P=-P/a[v][v];for(k=v;k<this.c;k++){a[k][q]+=P*a[k][v]}}e[q]=a[v][q]}if(true&v<D){for(k=v;k<this.c;k++){this.a[k][v]=a[k][v]}}if(v<F){e[v]=0;for(l=v+1;l<this.d;l++){e[v]=blb.Oc(e[v],e[l])}if(e[v]!=0){e[v+1]<0&&(e[v]=-e[v]);for(m=v+1;m<this.d;m++){e[m]/=e[v]}e[v+1]+=1}e[v]=-e[v];if(v+1<this.c&e[v]!=0){for(m=v+1;m<this.c;m++){Q[m]=0}for(r=v+1;r<this.d;r++){for(n=v+1;n<this.c;n++){Q[n]+=e[r]*a[n][r]}}for(s=v+1;s<this.d;s++){P=-e[s]/e[v+1];for(n=v+1;n<this.c;n++){a[n][s]+=P*Q[n]}}}for(k=v+1;k<this.d;k++){this.b[k][v]=e[k]}}}H=$wnd.Math.min(this.d,this.c+1);D<this.d&&(this.e[D]=a[D][D]);this.c<H&&(this.e[H-1]=0);F+1<H&&(e[F]=a[F][H-1]);e[H-1]=0;for(t=D;t<G;t++){for(k=0;k<this.c;k++){this.a[k][t]=0}this.a[t][t]=1}for(w=D-1;w>=0;w--){if(this.e[w]!=0){for(p=w+1;p<G;p++){P=0;for(l=w;l<this.c;l++){P+=this.a[l][w]*this.a[l][p]}P=-P/this.a[w][w];for(m=w;m<this.c;m++){this.a[m][p]+=P*this.a[m][w]}}for(n=w;n<this.c;n++){this.a[n][w]=-this.a[n][w]}this.a[w][w]=1+this.a[w][w];for(k=0;k<w-1;k++){this.a[k][w]=0}}else{for(k=0;k<this.c;k++){this.a[k][w]=0}this.a[w][w]=1}}for(A=this.d-1;A>=0;A--){if(A<F&e[A]!=0){for(p=A+1;p<G;p++){P=0;for(l=A+1;l<this.d;l++){P+=this.b[l][A]*this.b[l][p]}P=-P/this.b[A+1][A];for(m=A+1;m<this.d;m++){this.b[m][p]+=P*this.b[m][A]}}}for(k=0;k<this.d;k++){this.b[k][A]=0}this.b[A][A]=1}I=H-1;o=0;h=$wnd.Math.pow(2,-52);while(H>0){for(u=H-2;u>=-1;u--){if(u==-1){break}if($wnd.Math.abs(e[u])<=h*($wnd.Math.abs(this.e[u])+$wnd.Math.abs(this.e[u+1]))){e[u]=0;break}}if(u==H-2){B=4}else{for(C=H-1;C>=u;C--){if(C==u){break}P=(C!=H?$wnd.Math.abs(e[C]):0)+(C!=u+1?$wnd.Math.abs(e[C-1]):0);if($wnd.Math.abs(this.e[C])<=h*P){this.e[C]=0;break}}if(C==u){B=3}else if(C==H-1){B=1}else{B=2;u=C}}++u;switch(B){case 1:{i=e[H-2];e[H-2]=0;for(p=H-2;p>=u;p--){P=blb.Oc(this.e[p],i);d=this.e[p]/P;M=i/P;this.e[p]=P;if(p!=u){i=-M*e[p-1];e[p-1]=d*e[p-1]}for(k=0;k<this.d;k++){P=d*this.b[k][p]+M*this.b[k][H-1];this.b[k][H-1]=-M*this.b[k][p]+d*this.b[k][H-1];this.b[k][p]=P}}}break;case 2:{i=e[u-1];e[u-1]=0;for(p=u;p<H;p++){P=blb.Oc(this.e[p],i);d=this.e[p]/P;M=i/P;this.e[p]=P;i=-M*e[p];e[p]=d*e[p];for(k=0;k<this.c;k++){P=d*this.a[k][p]+M*this.a[k][u-1];this.a[k][u-1]=-M*this.a[k][p]+d*this.a[k][u-1];this.a[k][p]=P}}}break;case 3:{J=$wnd.Math.max($wnd.Math.max($wnd.Math.max($wnd.Math.max($wnd.Math.abs(this.e[H-1]),$wnd.Math.abs(this.e[H-2])),$wnd.Math.abs(e[H-2])),$wnd.Math.abs(this.e[u])),$wnd.Math.abs(e[u]));N=this.e[H-1]/J;O=this.e[H-2]/J;g=e[H-2]/J;L=this.e[u]/J;f=e[u]/J;b=((O+N)*(O-N)+g*g)/2;c=N*g*(N*g);K=0;if(b!=0|c!=0){K=$wnd.Math.sqrt(b*b+c);b<0&&(K=-K);K=c/(b+K)}i=(L+N)*(L-N)+K;j=L*f;for(p=u;p<H-1;p++){P=blb.Oc(i,j);d=i/P;M=j/P;p!=u&&(e[p-1]=P);i=d*this.e[p]+M*e[p];e[p]=d*e[p]-M*this.e[p];j=M*this.e[p+1];this.e[p+1]=d*this.e[p+1];for(l=0;l<this.d;l++){P=d*this.b[l][p]+M*this.b[l][p+1];this.b[l][p+1]=-M*this.b[l][p]+d*this.b[l][p+1];this.b[l][p]=P}P=blb.Oc(i,j);d=i/P;M=j/P;this.e[p]=P;i=d*e[p]+M*this.e[p+1];this.e[p+1]=-M*e[p]+d*this.e[p+1];j=M*e[p+1];e[p+1]=d*e[p+1];if(p<this.c-1){for(k=0;k<this.c;k++){P=d*this.a[k][p]+M*this.a[k][p+1];this.a[k][p+1]=-M*this.a[k][p]+d*this.a[k][p+1];this.a[k][p]=P}}}e[H-2]=i;o=o+1}break;case 4:{if(this.e[u]<=0){this.e[u]=this.e[u]<0?-this.e[u]:0;for(k=0;k<=I;k++){this.b[k][u]=-this.b[k][u]}}while(u<I){if(this.e[u]>=this.e[u+1]){break}P=this.e[u];this.e[u]=this.e[u+1];this.e[u+1]=P;if(u<this.d-1){for(k=0;k<this.d;k++){P=this.b[k][u+1];this.b[k][u+1]=this.b[k][u];this.b[k][u]=P}}if(u<this.c-1){for(k=0;k<this.c;k++){P=this.a[k][u+1];this.a[k][u+1]=this.a[k][u];this.a[k][u]=P}}++u}o=0;--H}}}};blb.Oc=function Oc(a,b){var c;if($wnd.Math.abs(a)>$wnd.Math.abs(b)){c=b/a;c=$wnd.Math.abs(a)*$wnd.Math.sqrt(1+c*c)}else if(b!=0){c=a/b;c=$wnd.Math.abs(b)*$wnd.Math.sqrt(1+c*c)}else{c=0}return c};U1(155,1,fmb,blb.Nc);_.c=0;_.d=0;Ykb.CX=w3(155);clb.Qc=function Qc(){clb.Qc=W1;clb.Pc=oW(aW(Ykb.AX,1),gmb,6,15,[0,hmb,14286847,13402367,12779264,16758197,9474192,3166456,16715021,9494608,11789301,11230450,9109248,12560038,15780000,16744448,16777008,2093087,8442339,9388244,4062976,15132390,12567239,10921643,9083335,10255047,14706227,15765664,5296208,13140019,8224944,12750735,6721423,12419299,16752896,10889513,6076625,7351984,imb,9764863,9756896,7586505,5551541,3907230,2396047,687500,27013,12632256,16767375,10909043,6717568,10380213,13924864,9699476,4366000,5707663,51456,7394559,16777159,14286791,13107143,10747847,9437127,6422471,4587463,3211207,2097095,65436,58997,54354,48952,43812,5096191,5089023,2200790,2522539,2516630,1528967,13684960,16765219,12105936,10900557,5724513,10375093,11230208,7688005,4358806,4325478,32000,7384058,47871,41471,36863,33023,27647,5528818,7888099,9064419,10565332,11739092,11739066,11734438,12389767,13041766,13369433,13697103,14221381,14680120,15073326,15400998,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13158600,1334015,56540,15075850,15132160,56540,15075850,15461355,8553170,1016335,1016335,1334015,15132160,3289770,14456450,16422400,16422400,11819700,3289770,1016335])};clb.Rc=function Rc(a){a.u=new plb.XF};clb.Sc=function Sc(a){var b,c;if((a.D&32)!=0)return;c=clb.Jt(a.J);if(c!=null){if(a.v.a==0&&a.v.b==0){b=a.P.c*clb.vk(a.J);a.u=clb.Md(a);clb.bd(a,b);clb.Jd(a,null,b,0)}clb.Os(a,vX(a.w));a.J.O!=1&&clb.Kd(a,448);clb.Is(a,c,a.v.a,a.v.b+jmb*a.w)}};clb.Tc=function Tc(a,b){return a==null?b:b==null?a:a+','+b};clb.Uc=function Uc(a){var b;b=a.P.c*clb.vk(a.J);a.W=b*0.06;a.R=b*0.15;a.Q=b*0.38;a.U=b*0.47;a.V=vX(b*a.H*0.6+0.5);a.T=b*0.12;a.X=b*0.4;a.w=b*0.5+0.5};clb.Vc=function Vc(a){var b,c;a=e1(a,kmb);for(c=0;c<(olb.NF(),olb.MF).length;c++)if(o1(a,olb.MF[c]))return olb.LF[c];b=new Zkb.L5('R');z1(e1(a,lmb),0)&&(b.a+='0',b);z1(e1(a,mmb),0)&&(b.a+='3',b);z1(e1(a,nmb),0)&&(b.a+='4',b);z1(e1(a,omb),0)&&(b.a+='5',b);z1(e1(a,pmb),0)&&(b.a+='6',b);z1(e1(a,qmb),0)&&(b.a+='7',b);z1(e1(a,rmb),0)&&(b.a+='8',b);return b.a};clb.Wc=function Wc(a,b,c,d){var e,f,g;e=new clb.Sd;f=new clb.Sd;e.a=b.a;e.c=b.c;e.b=(b.a+b.b)/2;e.d=(b.c+b.d)/2;f.a=e.b;f.c=e.d;f.b=b.b;f.d=b.d;if(clb.Gd(a,e)){clb.Kd(a,a.p[c]);g=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,g)}if(clb.Gd(a,f)){clb.Kd(a,a.p[d]);g=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,g)}clb.Kd(a,a.O)};clb.Xc=function Xc(a,b,c,d){var e,f,g,h,i,j,k,l,m;l=(b.b-b.a)/10;m=(b.d-b.c)/10;e=new clb.Sd;if(clb.cl(a.J,clb.tn(a.J,c,d))){f=-3;g=-3}else{f=a.p[c];g=a.p[d]}clb.Kd(a,f);e.a=b.a;e.c=b.c;e.b=b.a+l*2;e.d=b.c+m*2;i=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,i);e.a=b.a+l*4;e.c=b.c+m*4;e.b=b.a+l*5;e.d=b.c+m*5;j=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.a),Blb.b8)))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,j);clb.Kd(a,g);e.a=b.a+l*5;e.c=b.c+m*5;e.b=b.a+l*6;e.d=b.c+m*6;k=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.a),Blb.b8)))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,k);e.a=b.a+l*8;e.c=b.c+m*8;e.b=b.b;e.d=b.d;h=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.a),Blb.b8)))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,h);clb.Kd(a,a.O)};clb.Yc=function Yc(a,b,c){clb.Js(a,b-a.T/2,c-a.T/2,a.T)};clb.Zc=function Zc(a,b,c,d){var e;if(clb.cl(a.J,clb.tn(a.J,c,d))){clb.Kd(a,-3);e=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,e);clb.Kd(a,a.O)}else if(a.p[c]!=a.p[d]){clb.Wc(a,b,c,d)}else if(a.p[c]!=0){clb.Kd(a,a.p[c]);e=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,e);clb.Kd(a,a.O)}else{e=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(b.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,e)}};clb.$c=function $c(a,b,c,d,e,f,g){g.a=b.a+e;g.c=b.c+f;g.b=b.b+e;g.d=b.d+f;clb.Zc(a,g,c,d)};clb._c=function _c(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;l=b.b-b.a;o=b.d-b.c;i=$wnd.Math.sqrt(l*l+o*o);j=2*I1(p1($wnd.Math.round(i/(4*a.W))));m=l/(j-1);p=o/(j-1);if(clb.cl(a.J,clb.tn(a.J,c,d))){e=-3;f=-3}else{e=a.p[c];f=a.p[d]}k=b.a-a.W/2;n=b.c-a.W/2;clb.Kd(a,e);for(h=0;h<(j/2|0);h++){clb.Js(a,k,n,a.W);k+=m;n+=p}clb.Kd(a,f);for(g=0;g<(j/2|0);g++){clb.Js(a,k,n,a.W);k+=m;n+=p}clb.Kd(a,a.O)};clb.ad=function ad(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;i=(b.c-b.d)/9;n=(b.b-b.a)/9;j=b.b+i;o=b.d+n;k=b.b-i;p=b.d-n;l=(b.a+j)/2;q=(b.c+o)/2;m=(b.a+k)/2;r=(b.c+p)/2;g=new plb.SF(3);h=new plb.SF(4);plb.RF(g,b.a,b.c);plb.RF(g,l,q);plb.RF(g,m,r);plb.RF(h,m,r);plb.RF(h,l,q);plb.RF(h,j,o);plb.RF(h,k,p);if(clb.cl(a.J,clb.tn(a.J,c,d))){e=-3;f=-3}else{e=a.p[c];f=a.p[d];if(a.J.O!=1){f=clb.ed(a,c);e==clb.ek(a.J,c)&&(e=f)}}clb.Kd(a,e);clb.Hs(a,g);clb.Kd(a,f);clb.Hs(a,h);clb.Kd(a,a.O)};clb.bd=function bd(a,b){var c,d;for(d=0;d<a.Y.a.length;d++)a.u=plb.WF(a.u,dlb.Bi(a.Y,d));clb.cd(a,b);c=0.1*b;a.u.c-=c;a.u.d-=c;a.u.b+=2*c;a.u.a+=2*c};clb.cd=function cd(a,b){var c,d,e,f,g,h,i;e=gW(Ykb.Z0,Amb,6,a.J.q,16,1);for(d=0;d<a.J.r;d++){if(clb.al(a.J,d)){e[clb.zk(a.J,0,d)]=true;e[clb.zk(a.J,1,d)]=true}}g=new plb.XF;for(c=0;c<a.J.q;c++){f=z1(e1(clb.pk(a.J,c),Bmb),0)?b*0.47:e[c]?b*0.38:0;if(f!=0){h=clb.Mh(a.P,clb.rk(a.J,c));i=clb.Nh(a.P,clb.sk(a.J,c));plb.VF(g,h-f,i-f,f*2,f*2);a.u=plb.WF(a.u,g)}}};clb.dd=function dd(a,b){var c;c=a.K!=0?a.K:a.B!=0?a.B:-1;return slb.FT(b,c)};clb.ed=function ed(a,b){var c,d;if((a.D&4224)!=0)return a.p[b];d=clb.fd(a,b);if(d==-1){c=clb.an(a.J,b);if(c!=-1){b=c;d=clb.fd(a,b)}}if(d==-1)return a.p[b];switch(d&255){case 1:return 384;case 2:return 64;default:return 448;}};clb.fd=function fd(a,b){var c,d,e;e=-1;d=-1;if((a.D&128)!=0)return e;if(clb.$k(a.J,b)){e=clb.ik(a.J,b);d=clb.hk(a.J,b)}c=clb.cn(a.J,b);if(c!=-1){e=clb.Ek(a.J,c);d=clb.Dk(a.J,c)}e!=-1&&e!=0&&(e|=d<<8);return e};clb.gd=function gd(a){var b,c,d,e,f;clb.Ms(a,2*a.Q);e=new clb.Sd;for(d=0;d<a.J.r;d++){b=clb.zk(a.J,0,d);c=clb.zk(a.J,1,d);if(clb.al(a.J,d)){e.a=clb.Mh(a.P,clb.rk(a.J,b));e.c=clb.Nh(a.P,clb.sk(a.J,b));e.b=clb.Mh(a.P,clb.rk(a.J,c));e.d=clb.Nh(a.P,clb.sk(a.J,c));clb.Kd(a,-2);f=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(e.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,f)}}};clb.hd=function hd(a){var b,c,d,e,f,g,h;if(a.J.K){g=a.U;clb.Kd(a,-7);for(b=0;b<a.J.f;b++)z1(e1(clb.pk(a.J,b),Bmb),0)&&clb.Js(a,clb.Mh(a.P,clb.rk(a.J,b))-g,clb.Nh(a.P,clb.sk(a.J,b))-g,2*g);clb.Ms(a,2*a.U);f=new clb.Sd;for(e=0;e<a.J.r;e++){c=clb.zk(a.J,0,e);d=clb.zk(a.J,1,e);if(z1(e1(e1(clb.pk(a.J,c),clb.pk(a.J,d)),Bmb),0)){f.a=clb.Mh(a.P,clb.rk(a.J,c));f.c=clb.Nh(a.P,clb.sk(a.J,c));f.b=clb.Mh(a.P,clb.rk(a.J,d));f.d=clb.Nh(a.P,clb.sk(a.J,d));h=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(f.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,h)}}}};clb.jd=function jd(a){var b,c,d,e;if(a.J.K){clb.Kd(a,320);if((a.D&8)!=0)for(b=0;b<a.J.f;b++)z1(e1(clb.pk(a.J,b),-536870913),0)&&clb.Js(a,clb.Mh(a.P,clb.rk(a.J,b))-a.X/2,clb.Nh(a.P,clb.sk(a.J,b))-a.X/2,a.X);for(e=0;e<a.J.g;e++){if(clb.Jk(a.J,e)!=0){c=clb.zk(a.J,0,e);d=clb.zk(a.J,1,e);clb.Js(a,(clb.Mh(a.P,clb.rk(a.J,c))+clb.Mh(a.P,clb.rk(a.J,d))-a.X)/2,(clb.Nh(a.P,clb.sk(a.J,c))+clb.Nh(a.P,clb.sk(a.J,d))-a.X)/2,a.X)}}}};clb.kd=function kd(a){a.H=1;a.P=new clb.Oh;a.Y=new dlb.Qi;a.S=new dlb.Qi;a.r=gW(Ykb.Z0,Amb,6,a.J.q,16,1);a.v=new plb.OF;a.O=0;a.A=-1;clb.Od(a)};clb.ld=function ld(a,b){var c;if(clb.gn(a.J,b)==0)return false;for(c=0;c<clb.gn(a.J,b);c++)if(!clb.cl(a.J,clb.xn(a.J,b,c)))return false;return true};clb.md=function md(a){var b;a.q=gW(Ykb.Z0,Amb,6,a.J.q,16,1);for(b=0;b<a.J.r;b++){a.q[clb.zk(a.J,0,b)]=true;a.q[clb.zk(a.J,1,b)]=true}};clb.nd=function nd(a,b){var c;if(clb.wn(a.J,b)!=2)return false;for(c=0;c<2;c++)if(clb.yn(a.J,b,c)!=2)return false;return true};clb.od=function od(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o;m=false;e.a=0;e.b=0;d>0?(f=Cmb):(f=Dmb);o=clb.yk(a.J,b,c);for(k=0;k<clb.wn(a.J,b);k++){g=clb.xn(a.J,b,k);h=o;clb.zk(a.J,0,g)==b?(l=clb.zk(a.J,1,g)):(l=clb.zk(a.J,0,g));if(l==c)continue;n=clb.yk(a.J,b,l);h<n&&(h+=Emb);i=h-n;if(d>0){i<Fmb&&(m=true);i>Cmb&&(i=Cmb);i<0.523598776&&(i=0.523598776);if(i<=f){f=i;j=a.R*$wnd.Math.tan(f-Gmb)/2;e.a=-(j*$wnd.Math.sin(h));e.b=-(j*$wnd.Math.cos(h))}}else{i>=Fmb&&(m=true);i<Dmb&&(i=Dmb);i>5.759586531&&(i=5.759586531);if(i>=f){f=i;j=a.R*$wnd.Math.tan(4.712388981-f)/2;e.a=-(j*$wnd.Math.sin(h));e.b=-(j*$wnd.Math.cos(h))}}}return m};clb.pd=function pd(a,b,c,d){var e;if(b==0){c<0?(d.a=a.R):(d.a=-a.R);d.b=0;return}e=$wnd.Math.atan(c/b);b<0&&(e+=Fmb);d.a=-(a.R*$wnd.Math.sin(e));d.b=a.R*$wnd.Math.cos(e)};clb.qd=function qd(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;e=new clb.Sd;i=new clb.Sd;k=new plb.OF;j=new plb.OF;g=clb.zk(a.J,0,c);h=clb.zk(a.J,1,c);if(d){m=b.a;b.a=b.b;b.b=m;m=b.c;b.c=b.d;b.d=m;n=g;g=h;h=n}if(!clb.Gd(a,b))return;if(clb.zo(a.J,c)){e.a=b.a;e.c=b.c;e.b=b.b;e.d=b.d;l=d?-clb.Wn(a.J,c):clb.Wn(a.J,c);l==0&&(l=1);clb.pd(a,b.b-b.a,b.d-b.c,k);if(l>0){i.a=b.a+k.a;i.c=b.c+k.b;i.b=b.b+k.a;i.d=b.d+k.b;if(clb.od(a,g,h,1,j)||clb.wn(a.J,g)>1){i.a+=j.a+k.b;i.c+=j.b-k.a}}else{i.a=b.a-k.a;i.c=b.c-k.b;i.b=b.b-k.a;i.d=b.d-k.b;if(clb.od(a,g,h,-1,j)||clb.wn(a.J,g)>1){i.a+=j.a+k.b;i.c+=j.b-k.a}}clb.Kk(a.J,c)==386&&clb.Fd(e,i);clb.Gd(a,e)&&clb.Zc(a,e,g,h);clb.Kk(a.J,c)==64?clb.Gd(a,i)&&clb.Xc(a,i,g,h):clb.Gd(a,i)&&clb.Zc(a,i,g,h)}else{clb.pd(a,b.b-b.a,b.d-b.c,k);o=k.a/2;p=k.b/2;f=false;e.a=b.a+o;e.c=b.c+p;e.b=b.b+o;e.d=b.d+p;if(clb.wn(a.J,g)>1){if(clb.od(a,g,h,1,j)){e.a+=j.a;e.c+=j.b;if(clb.wn(a.J,g)==2){if(j.a!=0||j.b!=0){e.a+=k.b;e.c-=k.a}}}else{a.o[g]=new plb.PF(e.a,e.c)}}i.a=b.a-o;i.c=b.c-p;i.b=b.b-o;i.d=b.d-p;if(clb.wn(a.J,g)>1){if(clb.od(a,g,h,0,j)){i.a+=j.a;i.c+=j.b;if(clb.wn(a.J,g)==2){if(j.a!=0||j.b!=0){i.a+=k.b;i.c-=k.a}}}else{a.o[g]=new plb.PF(i.a,i.c);f=true}}clb.Kk(a.J,c)==386&&clb.Fd(e,i);if(clb.Kk(a.J,c)==64){if(f){clb.Xc(a,e,g,h);clb.Zc(a,i,g,h)}else{clb.Zc(a,e,g,h);clb.Xc(a,i,g,h)}}else{clb.Zc(a,e,g,h);clb.Zc(a,i,g,h)}}};clb.rd=function rd(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;k=a.O;l=a.C;if((a.D&Hmb)!=0){a.O=-6;a.C=-8355712;clb.Kd(a,1)}a.o=gW(Ykb.QZ,Ulb,50,a.J.q,0,1);for(i=0;i<a.J.r;i++)(clb.Kk(a.J,i)==2||clb.Kk(a.J,i)==386||clb.Kk(a.J,i)==64)&&clb.ud(a,i);for(j=0;j<a.J.r;j++)clb.Kk(a.J,j)!=2&&clb.Kk(a.J,j)!=386&&clb.Kk(a.J,j)!=64&&clb.ud(a,j);if((a.D&64)==0){for(h=0;h<a.J.r;h++){if(clb.Ck(a.J,h)!=0){e=null;clb.Ck(a.J,h)==1||clb.Ck(a.J,h)==2?(clb.Hk(a.J,h)==2||clb.Ek(a.J,h)==0||b[clb.Ek(a.J,h)][clb.Dk(a.J,h)]>1)&&(clb.Ck(a.J,h)==1?(e=clb.Hk(a.J,h)==2?'E':clb.el(a.J,h)?'p':'P'):(e=clb.Hk(a.J,h)==2?'Z':clb.el(a.J,h)?'m':'M')):(e='?');if(e!=null){clb.Os(a,(a.V*2+1)/3|0);clb.Kd(a,clb.cl(a.J,h)?-3:a.J.O==1||(a.D&Imb)!=0?a.O:448);c=clb.zk(a.J,0,h);d=clb.zk(a.J,1,h);n=(clb.Mh(a.P,clb.rk(a.J,c))+clb.Mh(a.P,clb.rk(a.J,d)))/2;o=(clb.Nh(a.P,clb.sk(a.J,c))+clb.Nh(a.P,clb.sk(a.J,d)))/2;f=(clb.Mh(a.P,clb.rk(a.J,c))-clb.Mh(a.P,clb.rk(a.J,d)))/3;g=(clb.Nh(a.P,clb.sk(a.J,c))-clb.Nh(a.P,clb.sk(a.J,d)))/3;clb.xd(a,n+g,o-f,e,true);clb.Kd(a,a.O);clb.Os(a,a.V)}}}}if((a.D&4)!=0){clb.Os(a,(a.V*2+1)/3|0);clb.Kd(a,384);for(h=0;h<a.J.r;h++){c=clb.zk(a.J,0,h);d=clb.zk(a.J,1,h);m=clb.qo(a.J,h)?'d':clb.mo(a.J,h)?'a':'';n=(clb.Mh(a.P,clb.rk(a.J,c))+clb.Mh(a.P,clb.rk(a.J,d)))/2;o=(clb.Nh(a.P,clb.sk(a.J,c))+clb.Nh(a.P,clb.sk(a.J,d)))/2;clb.xd(a,n,o,m+(''+h),true)}clb.Kd(a,a.O);clb.Os(a,a.V)}if((a.D&Hmb)!=0){a.O=k;a.C=l}};clb.sd=function sd(a){var b,c;for(c=new dlb.Obb(a.S);c.a<c.c.a.length;){b=dlb.Nbb(c);clb.Kd(a,b.a);clb.Yc(a,b.b,b.c)}clb.Kd(a,a.O)};clb.td=function td(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$;a.I||clb.Ks(a,b,(clb.jk(a.J,b),clb.Mh(a.P,clb.rk(a.J,b))),clb.Nh(a.P,clb.sk(a.J,b)));M=null;if(clb.dk(a.J,b)!=0){U=$wnd.Math.abs(clb.dk(a.J,b))==1?'':''+$wnd.Math.abs(clb.dk(a.J,b));M=clb.dk(a.J,b)<0?U+'-':U+'+'}D=null;N=clb.pk(a.J,b);if(j1(N,0)!=0){z1(e1(N,Jmb),0)&&(D=D==null?'*':D+','+'*');z1(e1(N,Kmb),0)&&(D=D==null?'!*':D+','+'!*');z1(e1(N,Lmb),0)?(D=D==null?'ha':D+','+'ha'):z1(e1(N,2),0)?(D=D==null?'a':D+','+'a'):z1(e1(N,4),0)&&(D=D==null?'!a':D+','+'!a');z1(e1(N,Imb),0)&&(D=D==null?'s':D+','+'s');if(z1(e1(N,Mmb),0)){w=e1(N,Mmb);j1(w,1792)==0?(D=D==null?'h0':D+','+'h0'):j1(w,1664)==0?(D=D==null?'h1':D+','+'h1'):j1(w,1408)==0?(D=D==null?'h2':D+','+'h2'):j1(w,128)==0?(D=D==null?'h>0':D+','+'h>0'):j1(w,384)==0?(D=D==null?'h>1':D+','+'h>1'):j1(w,896)==0?(D=D==null?'h>2':D+','+'h>2'):j1(w,Nmb)==0?(D=D==null?'h<3':D+','+'h<3'):j1(w,1536)==0&&(D=D==null?'h<2':D+','+'h<2')}if(z1(e1(N,Omb),0)){i=e1(N,Omb);j1(i,Pmb)==0?(D=D==null?'c0':D+','+'c0'):j1(i,Qmb)==0?(D=D==null?'c+':D+','+'c+'):j1(i,Rmb)==0&&(D=D==null?'c-':D+','+'c-')}if(z1(e1(N,Smb),0)){L=e1(N,Smb);j1(L,98304)==0?(D=D==null?'pi0':D+','+'pi0'):j1(L,81920)==0?(D=D==null?'pi1':D+','+'pi1'):j1(L,49152)==0?(D=D==null?'pi2':D+','+'pi2'):j1(L,Hmb)==0&&(D=D==null?'pi>0':D+','+'pi>0')}if(z1(e1(N,Tmb),0)){K=e1(N,Tmb);j1(K,3801088)==0?(D=D==null?'n1':D+','+'n1'):j1(K,Umb)==0?(D=D==null?'n2':D+','+'n2'):j1(K,Vmb)==0?(D=D==null?'n3':D+','+'n3'):j1(K,3145728)==0?(D=D==null?'n<3':D+','+'n<3'):j1(K,Wmb)==0?(D=D==null?'n<4':D+','+'n<4'):j1(K,Xmb)==0?(D=D==null?'n>1':D+','+'n>1'):j1(K,Ymb)==0?(D=D==null?'n>2':D+','+'n>2'):j1(K,Zmb)==0&&(D=D==null?'n>3':D+','+'n>3')}if(z1(e1(N,$mb),0)){o=e1(N,$mb);j1(o,_mb)==0?(D=D==null?'e0':D+','+'e0'):j1(o,anb)==0?(D=D==null?'e1':D+','+'e1'):j1(o,bnb)==0?(D=D==null?'e2':D+','+'e2'):j1(o,cnb)==0?(D=D==null?'e3':D+','+'e3'):j1(o,15393162788864)==0?(D=D==null?'e<2':D+','+'e<2'):j1(o,13194139533312)==0?(D=D==null?'e<3':D+','+'e<3'):j1(o,dnb)==0?(D=D==null?'e<4':D+','+'e<4'):j1(o,enb)==0?(D=D==null?'e>0':D+','+'e>0'):j1(o,fnb)==0?(D=D==null?'e>1':D+','+'e>1'):j1(o,gnb)==0?(D=D==null?'e>2':D+','+'e>2'):j1(o,hnb)==0?(D=D==null?'e>3':D+','+'e>3'):j1(o,4947802324992)==0?(D=D==null?'e1-2':D+','+'e1-2'):j1(o,9345848836096)==0?(D=D==null?'e1-3':D+','+'e1-3'):j1(o,10445360463872)==0&&(D=D==null?'e2-3':D+','+'e2-3')}if(z1(e1(N,120),0)){Q=e1(N,120);j1(Q,112)==0?(D=D==null?'!r':D+','+'!r'):j1(Q,8)==0?(D=D==null?'r':D+','+'r'):j1(Q,96)==0?(D=D==null?'rb<3':D+','+'rb<3'):j1(Q,104)==0?(D=D==null?'rb2':D+','+'rb2'):j1(Q,88)==0?(D=D==null?'rb3':D+','+'rb3'):j1(Q,56)==0&&(D=D==null?'rb4':D+','+'rb4')}z1(e1(N,inb),0)&&(D=D==null?'r'+J1(D1(e1(N,inb),22)):D+','+('r'+J1(D1(e1(N,inb),22))));z1(e1(N,kmb),0)&&(D=clb.Tc(D,clb.Vc(N)));z1(e1(N,jnb),0)&&(D=D==null?'f':D+','+'f')}clb.nk(a.J,b)!=0&&(D=clb.Tc(D,''+clb.nk(a.J,b)));T=0;if(clb.qk(a.J,b)!=0){switch(clb.qk(a.J,b)){case 16:M=M==null?'|':M+','+'|';break;case 32:T=1;break;case 48:T=2;}}l=null;if((a.D&64)==0){if(clb.Xk(a.J,b))l='?';else if(clb.ck(a.J,b)!=0){if(clb.ik(a.J,b)==0||c==null||c[clb.ik(a.J,b)][clb.hk(a.J,b)]>1){if(clb.wn(a.J,b)==2){switch(clb.ck(a.J,b)){case 2:l=clb.Zk(a.J,b)?'p':'P';break;case 1:l=clb.Zk(a.J,b)?'m':'M';break;default:l='*';}}else{switch(clb.ck(a.J,b)){case 1:l=clb.Zk(a.J,b)?'r':'R';break;case 2:l=clb.Zk(a.J,b)?'s':'S';break;default:l='*';}}}}}(a.D&768)!=0&&(l=clb.Tc(l,''+clb.Rt(a.J,b)));I=null;(a.D&16)!=0&&clb.mk(a.J,b)!=0&&(I=''+clb.mk(a.J,b));q=null;if(clb._n(a.J,b)!=-1){p=clb.fd(a,b);p!=-1&&(q=p==0?'abs':((p&255)==1?'&':'or')+(1+(p>>8)))}A=0;(a.D&knb)==0&&(a.J.K?z1(e1(clb.pk(a.J,b),lnb),0)&&(A=clb.Kn(a.J,b)):(clb.uk(a.J,b)!=6||clb.nk(a.J,b)!=0||!a.q[b]||clb.qk(a.J,b)!=0)&&(A=clb.Kn(a.J,b)));H=false;f=clb.fk(a.J,b);if(f!=null&&Zkb.c5(alb.Pgb(f).substr(0,1),']')){D=clb.Tc((alb.Kgb(1,alb.Pgb(f).length+1),alb.Pgb(f).substr(1)),D);f=null;H=true}if(f!=null){A=0}else if(clb.kk(a.J,b)!=null){e=z1(e1(clb.pk(a.J,b),1),0)?'[!':'[';f=e+clb.lk(a.J,b)+']';alb.Pgb(f).length>5&&(f=e+clb.kk(a.J,b).length+']');z1(e1(clb.pk(a.J,b),lnb),0)&&(A=-1)}else if(z1(e1(clb.pk(a.J,b),1),0)){f='?';z1(e1(clb.pk(a.J,b),lnb),0)&&(A=-1)}else (clb.uk(a.J,b)!=6||M!=null||D!=null||A>0||!a.q[b])&&(f=clb.jk(a.J,b));G=0;!clb.nl(a.J,b)&z1(e1(clb.pk(a.J,b),Bmb),0)&&clb.Kd(a,-8);if(f!=null){G=(O=(V=ylb.h2(a.e,f),new zlb.n2(V)).b,O);clb.xd(a,clb.Mh(a.P,clb.rk(a.J,b)),clb.Nh(a.P,clb.sk(a.J,b)),f,true);a.r[b]=true}else clb.nd(a,b)&&clb.wd(a,clb.Mh(a.P,clb.rk(a.J,b)),clb.Nh(a.P,clb.sk(a.J,b)),b);if(M!=null){clb.Os(a,(a.V*2+1)/3|0);X=clb.Mh(a.P,clb.rk(a.J,b))+((G+(O=(V=ylb.h2(a.e,M),new zlb.n2(V)).b,O))/2+1);Z=clb.Nh(a.P,clb.sk(a.J,b))-((a.k*4-4)/8|0);clb.xd(a,X,Z,M,true);clb.Os(a,a.V)}(a.D&2)!=0&&(D=''+b);if(D!=null){H?clb.Os(a,(a.V*5+1)/6|0):clb.Os(a,(a.V*2+1)/3|0);X=clb.Mh(a.P,clb.rk(a.J,b))-(G+(O=(V=ylb.h2(a.e,D),new zlb.n2(V)).b,O))/2;Z=clb.Nh(a.P,clb.sk(a.J,b))-((a.k*4-4)/8|0);clb.xd(a,X,Z,D,true);clb.Os(a,a.V)}if(l!=null){clb.Os(a,(a.V*2+1)/3|0);X=clb.Mh(a.P,clb.rk(a.J,b))-(G+(O=(V=ylb.h2(a.e,l),new zlb.n2(V)).b,O))/2;Z=clb.Nh(a.P,clb.sk(a.J,b))+((a.k*4+4)/8|0);S=a.A;a.J.O!=1&&(a.D&Imb)==0&&clb.Kd(a,448);clb.xd(a,X,Z,l,false);clb.Kd(a,S);clb.Os(a,a.V)}if(I!=null){clb.Os(a,(a.V*2+1)/3|0);X=clb.Mh(a.P,clb.rk(a.J,b))+((G+(O=(V=ylb.h2(a.e,I),new zlb.n2(V)).b,O))/2+1);Z=clb.Nh(a.P,clb.sk(a.J,b))+((a.k*4+4)/8|0);S=a.A;clb.Kd(a,clb._k(a.J,b)?384:448);clb.xd(a,X,Z,I,true);clb.Kd(a,S);clb.Os(a,a.V)}if(q!=null){d=clb.Bd(a,b);clb.Os(a,(a.V*2+1)/3|0);X=clb.Mh(a.P,clb.rk(a.J,b))+0.7*a.k*$wnd.Math.sin(d);Z=clb.Nh(a.P,clb.sk(a.J,b))+0.7*a.k*$wnd.Math.cos(d);S=a.A;!a.I&&a.J.O!=1&&clb.Kd(a,clb.ed(a,b));clb.xd(a,X,Z,q,false);clb.Kd(a,S);clb.Os(a,a.V)}if(A==0&&T==0){a.A==-8&&clb.Kd(a,-9);return}u=gW(Ykb.yX,emb,6,4,15,1);for(C=0;C<clb.hn(a.J,b);C++){h=clb.xn(a.J,b,C);for(F=0;F<2;F++){if(clb.zk(a.J,F,h)==b){R=clb.yk(a.J,clb.zk(a.J,F,h),clb.zk(a.J,1-F,h));if(R<mnb){u[0]-=R+Gmb;u[3]+=R+Fmb}else if(R<0){u[2]+=R+Gmb;u[3]-=R}else if(R<Gmb){u[1]+=R;u[2]+=Gmb-R}else{u[0]+=R-Gmb;u[1]+=Fmb-R}}}}clb.wn(a.J,b)==0?clb.gl(a.J,b)?(u[3]-=0.2):(u[1]-=0.2):(u[1]-=0.1);(M!=null||I!=null)&&(u[1]+=10);(D!=null||l!=null)&&(u[3]+=10);s='';if(A!=0){v=(P=(W=ylb.h2(a.e,'H'),new zlb.n2(W)).b,P);t=0;r=a.k;if(A==-1){s='n';clb.Os(a,(a.V*2+1)/3|0);t=(O=(V=ylb.h2(a.e,s),new zlb.n2(V)).b,O)}else if(A>1){s=''+A;clb.Os(a,(a.V*2+1)/3|0);t=(O=(V=ylb.h2(a.e,s),new zlb.n2(V)).b,O)}if(u[1]<0.6||u[3]<0.6){k=clb.Nh(a.P,clb.sk(a.J,b));if(u[1]<=u[3]){u[1]+=10;j=clb.Mh(a.P,clb.rk(a.J,b))+(G+v)/2}else{u[3]+=10;j=clb.Mh(a.P,clb.rk(a.J,b))-(G+v)/2-t}}else{j=clb.Mh(a.P,clb.rk(a.J,b));if(u[0]<u[2]){u[0]+=10;k=clb.Nh(a.P,clb.sk(a.J,b))-r}else{u[2]+=10;k=clb.Nh(a.P,clb.sk(a.J,b))+r}}if(t>0){X=j+(v+t)/2;Z=k+((a.k*4+4)/8|0);clb.xd(a,X,Z,s,true);clb.Os(a,a.V)}clb.xd(a,j,k,'H',true)}g=0;if(T!=0){J=50;m=0;for(B=0;B<4;B++){n=B>1?B-2:B+2;if(u[B]<J){g=B;J=u[B];m=u[n]}else if(u[B]==J){if(u[n]>m){g=B;m=u[n]}}}switch(g){case 0:j=clb.Mh(a.P,clb.rk(a.J,b));k=clb.Nh(a.P,clb.sk(a.J,b))-a.T-G/2;break;case 1:j=clb.Mh(a.P,clb.rk(a.J,b))+a.T+G/2;k=clb.Nh(a.P,clb.sk(a.J,b));break;case 2:j=clb.Mh(a.P,clb.rk(a.J,b));k=clb.Nh(a.P,clb.sk(a.J,b))+a.T+G/2;break;default:j=clb.Mh(a.P,clb.rk(a.J,b))-a.T-G/2;k=clb.Nh(a.P,clb.sk(a.J,b));}if(T==1){dlb.wi(a.Y,new plb.YF(j-a.T,k-a.T,2*a.T,2*a.T));a.I||dlb.wi(a.S,new clb.Rd(j,k,clb.ld(a,b)?-3:a.p[b]))}else{switch(g){case 2:case 0:Y=2*a.T;$=0;j-=a.T;break;case 1:Y=0;$=2*a.T;k-=a.T;break;default:Y=0;$=2*a.T;k-=a.T;}dlb.wi(a.Y,new plb.YF(j-a.T,k-a.T,2*a.T,2*a.T));a.I||dlb.wi(a.S,new clb.Rd(j,k,clb.ld(a,b)?-3:a.p[b]));dlb.wi(a.Y,new plb.YF(j+Y-a.T,k+$-a.T,2*a.T,2*a.T));a.I||dlb.wi(a.S,new clb.Rd(j+Y,k+$,clb.ld(a,b)?-3:a.p[b]))}}a.A==-8&&clb.Kd(a,-9)};\nclb.ud=function ud(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;u=new clb.Sd;c=new clb.Sd;g=new clb.Sd;q=new plb.OF;p=new plb.OF;e=clb.zk(a.J,0,b);f=clb.zk(a.J,1,b);clb.Ls(a,b,clb.Mh(a.P,clb.rk(a.J,e)),clb.Nh(a.P,clb.sk(a.J,e)),clb.Mh(a.P,clb.rk(a.J,f)),clb.Nh(a.P,clb.sk(a.J,f)));!clb.nl(a.J,e)&&!clb.nl(a.J,f)&&z1(e1(B1(clb.pk(a.J,e),clb.pk(a.J,f)),Bmb),0)&&clb.Kd(a,-8);if(!a.o[e]){u.a=clb.Mh(a.P,clb.rk(a.J,e));u.c=clb.Nh(a.P,clb.sk(a.J,e))}else{u.a=a.o[e].a;u.c=a.o[e].b}if(!a.o[f]){u.b=clb.Mh(a.P,clb.rk(a.J,f));u.d=clb.Nh(a.P,clb.sk(a.J,f))}else{u.b=a.o[f].a;u.d=a.o[f].b}if((clb.Jk(a.J,b)&nnb)!=0){clb.Gd(a,u)&&clb.Gs(a,u);clb.Kd(a,-9);return}h=clb.Kk(a.J,b)==64?0:clb.Kk(a.J,b)==32?1:clb.Hk(a.J,b);switch(h){case 1:i=clb.Kk(a.J,b);if((a.D&128)!=0&&(i==257||i==129)){t=clb.zk(a.J,0,b);n=clb.ik(a.J,t);if(n!=0){m=clb.hk(a.J,t);l=0;for(d=0;d<a.J.f;d++)clb.ik(a.J,d)==n&&clb.hk(a.J,d)==m&&++l;l==1&&(i=1)}}switch(i){case 1:clb.Gd(a,u)&&clb.Zc(a,u,e,f);break;case 257:clb.Dd(a,u,e,f);break;case 129:v=u.b-u.a;w=u.d-u.c;if(clb.cl(a.J,clb.tn(a.J,e,f))){j=-3;k=-3}else{j=a.p[e];k=clb.ed(a,e);j==clb.ek(a.J,e)&&(j=k)}for(o=2;o<17;o+=2){c.a=u.a+o*v/17-o*w/128;c.c=u.c+o*w/17+o*v/128;c.b=u.a+o*v/17+o*w/128;c.d=u.c+o*w/17-o*v/128;if(clb.Gd(a,c)){clb.Kd(a,o<9?j:k);r=smb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(c.a),(Blb.f8(),Blb.b8))))+tmb+umb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(c.c),Blb.b8)))+tmb+vmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(c.b),Blb.b8)))+tmb+wmb+Zkb.O3(Blb.g6(Blb.d6(new Blb.h6(c.d),Blb.b8)))+tmb+xmb+a.d+tmb+ymb+a.j+zmb;clb.Rs(a,r);clb.Kd(a,a.O)}}break;case 32:clb.Gd(a,u)&&clb._c(a,u,e,f);}break;case 0:case 2:if((a.r[e]||clb.mn(a.J,e)==2)&&(a.r[f]||clb.mn(a.J,f)==2)&&!clb.zo(a.J,b)&&h==2){if(!clb.Gd(a,u))break;clb.pd(a,u.b-u.a,u.d-u.c,q);v=q.a/2;w=q.b/2;c.a=u.a+v;c.c=u.c+w;c.b=u.b+v;c.d=u.d+w;g.a=u.a-v;g.c=u.c-w;g.b=u.b-v;g.d=u.d-w;clb.Kk(a.J,b)==386&&clb.Fd(c,g);clb.Zc(a,c,e,f);h==2?clb.Zc(a,g,e,f):clb.Xc(a,g,e,f)}else if((a.r[f]||clb.mn(a.J,f)==2)&&h==2){clb.qd(a,u,b,false)}else if((a.r[e]||clb.mn(a.J,e)==2)&&h==2){clb.qd(a,u,b,true)}else{s=clb.Wn(a.J,b);s==0&&(s=1);c.a=u.a;c.c=u.c;c.b=u.b;c.d=u.d;clb.pd(a,u.b-u.a,u.d-u.c,q);if(s>0){g.a=u.a+q.a;g.c=u.c+q.b;g.b=u.b+q.a;g.d=u.d+q.b;if(clb.od(a,e,f,1,p)||clb.wn(a.J,e)>1){g.a+=p.a+q.b;g.c+=p.b-q.a}if(clb.od(a,f,e,-1,p)||clb.wn(a.J,f)>1){g.b+=p.a-q.b;g.d+=p.b+q.a}}else{g.a=u.a-q.a;g.c=u.c-q.b;g.b=u.b-q.a;g.d=u.d-q.b;if(clb.od(a,e,f,-1,p)||clb.wn(a.J,e)>1){g.a+=p.a+q.b;g.c+=p.b-q.a}if(clb.od(a,f,e,1,p)||clb.wn(a.J,f)>1){g.b+=p.a-q.b;g.d+=p.b+q.a}}clb.Kk(a.J,b)==386&&clb.Fd(c,g);clb.Gd(a,c)&&clb.Zc(a,c,e,f);h==2?clb.Gd(a,g)&&clb.Zc(a,g,e,f):clb.Gd(a,g)&&clb.Xc(a,g,e,f)}break;case 3:if(clb.Gd(a,u)){clb.Zc(a,u,e,f);clb.pd(a,u.b-u.a,u.d-u.c,q);clb.$c(a,u,e,f,q.a,q.b,c);clb.$c(a,u,e,f,-q.a,-q.b,c)}break;case 4:if(clb.Gd(a,u)){clb.pd(a,u.b-u.a,u.d-u.c,q);clb.$c(a,u,e,f,1.5*q.a,1.5*q.b,c);clb.$c(a,u,e,f,0.5*q.a,0.5*q.b,c);clb.$c(a,u,e,f,-0.5*q.a,-0.5*q.b,c);clb.$c(a,u,e,f,-1.5*q.a,-1.5*q.b,c)}break;case 5:if(clb.Gd(a,u)){clb.Zc(a,u,e,f);clb.pd(a,u.b-u.a,u.d-u.c,q);clb.$c(a,u,e,f,2*q.a,2*q.b,c);clb.$c(a,u,e,f,q.a,q.b,c);clb.$c(a,u,e,f,-q.a,-q.b,c);clb.$c(a,u,e,f,-2*q.a,-2*q.b,c)}}a.A==-8&&clb.Kd(a,-9)};clb.vd=function vd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;o=false;for(d=0;d<a.J.g;d++){j=null;if(clb.bl(a.J,d)){l=clb.Bk(a.J,d);k=clb.Ak(a.J,d);j=l==k?'['+l+']':'['+l+':'+k+']'}else (clb.Jk(a.J,d)&onb)!=0?(j=(clb.Jk(a.J,d)&onb)==Wmb?'a':(clb.Jk(a.J,d)&384)==256?'r!a':'!a'):(clb.Jk(a.J,d)&384)!=0&&(j=(clb.Jk(a.J,d)&384)==256?'r':'!r');n=(clb.Jk(a.J,d)&Ymb)>>17;n!=0&&(j=(j==null?'':j)+n);if(j!=null){b=clb.zk(a.J,0,d);c=clb.zk(a.J,1,d);if(!o){clb.Os(a,(a.V*2+1)/3|0);o=true}q=(clb.Mh(a.P,clb.rk(a.J,b))+clb.Mh(a.P,clb.rk(a.J,c)))/2;r=(clb.Nh(a.P,clb.sk(a.J,b))+clb.Nh(a.P,clb.sk(a.J,c)))/2;f=clb.Mh(a.P,clb.rk(a.J,c))-clb.Mh(a.P,clb.rk(a.J,b));g=clb.Nh(a.P,clb.sk(a.J,c))-clb.Nh(a.P,clb.sk(a.J,b));e=$wnd.Math.sqrt(f*f+g*g);i=(m=(p=ylb.h2(a.e,j),new zlb.n2(p)).b,0.6*m);h=0.55*a.k;e!=0&&(f>0?clb.xd(a,q+i*g/e,r-h*f/e,j,true):clb.xd(a,q-i*g/e,r+h*f/e,j,true))}}o&&clb.Os(a,a.V)};clb.wd=function wd(a,b,c,d){dlb.wi(a.Y,new plb.YF(b-a.T,c-a.T,2*a.T,2*a.T));a.I||dlb.wi(a.S,new clb.Rd(b,c,clb.ld(a,d)?-3:a.p[d]))};clb.xd=function xd(a,b,c,d,e){var f,g,h,i,j;if(e){g=(f=(h=ylb.h2(a.e,d),new zlb.n2(h)).b,f);i=g/2+(a.k/8|0);j=a.k/2|0;(d=='+'||d=='-')&&(j=j*2/3);dlb.wi(a.Y,new plb.YF(b-i,c-j,2*i,2*j))}a.I||clb.Is(a,d,b,c)};clb.yd=function yd(a){var b;b=a.a;a.a=a.b;a.b=b;b=a.c;a.c=a.d;a.d=b};clb.zd=function zd(a,b,c){var d;d=b==0?Emb+a[0]-a[a.length-1]:a[b]-a[b-1];c>-2.0943951023931953&&c<pnb?(d-=2*$wnd.Math.cos(c+qnb)):(d-=0.5*$wnd.Math.cos(c+qnb));return d};clb.Ad=function Ad(a){var b;b=new plb.XF;if(a.a<=a.b){b.c=a.a;b.b=a.b-a.a}else{b.c=a.b;b.b=a.a-a.b}if(a.c<=a.d){b.d=a.c;b.a=a.d-a.c}else{b.d=a.d;b.a=a.c-a.d}return b};clb.Bd=function Bd(a,b){var c,d,e,f,g,h,i;c=gW(Ykb.yX,emb,6,clb.gn(a.J,b),15,1);for(e=0;e<clb.gn(a.J,b);e++)c[e]=clb.yk(a.J,b,clb.vn(a.J,b,e));alb.jgb(c,alb.Pgb(X1(dlb.ocb.prototype.kc,dlb.ocb,[])));f=clb.Cd(c,0);g=clb.zd(c,0,f);for(d=1;d<c.length;d++){h=clb.Cd(c,d);i=clb.zd(c,d,h);if(g<i){g=i;f=h}}return f};clb.Cd=function Cd(a,b){var c;if(b>0)return (a[b]+a[b-1])/2;c=Fmb+(a[0]+a[a.length-1])/2;return c>Fmb?c-Emb:c};clb.Dd=function Dd(a,b,c,d){var e,f,g,h;h=new clb.Sd;if(b.a==b.b&&b.c==b.d)return;h.a=b.a;h.c=b.c;h.b=b.b;h.d=b.d;g=clb.Ad(h);for(e=0;e<a.Y.a.length;e++){f=dlb.Bi(a.Y,e);if(f.c>g.c+g.b||f.d>g.d+g.a||g.c>f.c+f.b||g.d>f.d+f.a)continue;if(clb.Ed(a,h.a,h.c,e)){if(clb.Ed(a,h.b,h.d,e))return;clb.Hd(a,h,0,e);clb.Dd(a,h,c,d);return}if(clb.Ed(a,h.b,h.d,e)){clb.Hd(a,h,1,e);clb.Dd(a,h,c,d);return}}clb.ad(a,h,c,d)};clb.Ed=function Ed(a,b,c,d){var e;if((a.D&1)!=0)return false;e=dlb.Bi(a.Y,d);return b>e.c&&b<e.c+e.b&&c>e.d&&c<e.d+e.a};clb.Fd=function Fd(a,b){var c;c=a.b;a.b=b.b;b.b=c;c=a.d;a.d=b.d;b.d=c};clb.Gd=function Gd(a,b){var c,d,e,f,g,h;if(b.a==b.b&&b.c==b.d){for(g=new dlb.Obb(a.Y);g.a<g.c.a.length;){f=dlb.Nbb(g);if(plb.TF(f,b.a,b.c))return false}return true}h=clb.Ad(b);c=false;if(b.a>b.b){clb.yd(b);c=true}for(d=0;d<a.Y.a.length;d++){f=dlb.Bi(a.Y,d);if(f.c>h.c+h.b||f.d>h.d+h.a||h.c>f.c+f.b||h.d>f.d+f.a)continue;if(clb.Ed(a,b.a,b.c,d)){if(clb.Ed(a,b.b,b.d,d)){c&&clb.yd(b);return false}clb.Hd(a,b,0,d);e=clb.Gd(a,b);c&&clb.yd(b);return e}if(clb.Ed(a,b.b,b.d,d)){clb.Hd(a,b,1,d);e=clb.Gd(a,b);c&&clb.yd(b);return e}}c&&clb.yd(b);return true};clb.Hd=function Hd(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o;if(c==0){l=b.a;n=b.c;m=b.b;o=b.d}else{l=b.b;n=b.d;m=b.a;o=b.c}k=dlb.Bi(a.Y,d);i=m>l?k.c+k.b:k.c;j=o>n?k.d+k.a:k.d;e=m-l;f=o-n;if($wnd.Math.abs(e)>$wnd.Math.abs(f)){if(n==o){g=i;h=n}else{g=l+e*(j-n)/f;if(m>l==i>g){h=j}else{g=i;h=n+f*(i-l)/e}}}else{if(l==m){g=l;h=j}else{h=n+f*(i-l)/e;if(o>n==j>h){g=i}else{g=l+e*(j-n)/f;h=j}}}if(c==0){b.a=g;b.c=h}else{b.b=g;b.d=h}};clb.Id=function Id(a){var b,c,d,e;if(a.J.q==0)return;clb.Gt(a.J,(a.D&256)!=0?63:(a.D&512)!=0?95:31);clb.Uc(a);c=clb.Lt(a.J);d=false;a.p=gW(Ykb.AX,gmb,6,a.J.q,15,1);for(b=0;b<a.J.q;b++){a.p[b]=clb.ek(a.J,b);a.p[b]!=0&&(d=true);clb.nl(a.J,b)&&(a.p[b]=128);clb.Sk(a.J,b)&&(a.D&lnb)==0&&(a.p[b]=256)}clb.Kd(a,-10);clb.hd(a);clb.gd(a);clb.jd(a);clb.Sc(a);clb.Os(a,a.V);clb.Ms(a,a.W);clb.Kd(a,a.O);clb.md(a);alb.igb(a.S.a,0);alb.igb(a.Y.a,0);if((a.D&1)!=0){clb.rd(a,c);clb.sd(a);clb.vd(a)}for(e=0;e<a.J.q;e++){if(clb.ld(a,e)){clb.Kd(a,-3);clb.td(a,e,c);clb.Kd(a,a.O)}else if(a.p[e]!=0){clb.Kd(a,a.p[e]);clb.td(a,e,c);clb.Kd(a,a.O)}else if(!d&&a.J.O!=1&&clb.uk(a.J,e)!=1&&clb.uk(a.J,e)!=6&&(a.D&Nmb)==0&&clb.kk(a.J,e)==null&&clb.uk(a.J,e)<clb.Pc.length){clb.Ld(a,clb.dd(a,clb.Pc[clb.uk(a.J,e)]));clb.td(a,e,c);clb.Kd(a,a.O)}else{clb.td(a,e,c)}}if((a.D&1)==0){clb.sd(a);clb.vd(a);clb.rd(a,c)}};clb.Jd=function Jd(a,b,c,d){var e;e=c/2;switch(d&rnb){case rnb:if(b){a.v.a=b.c+b.b/2;a.v.b=b.d+b.a-e;break}case 0:a.v.a=a.u.c+a.u.b/2;a.v.b=a.u.d+a.u.a+e;!!b&&a.v.b>b.d+b.a-e&&(a.v.b=b.d+b.a-e);break;case snb:if(b){a.v.a=b.c+b.b/2;a.v.b=b.d+e;break}case tnb:a.v.a=a.u.c+a.u.b/2;a.v.b=a.u.d-e;!!b&&a.v.b<b.d+e&&(a.v.b=b.d+e);}};clb.Kd=function Kd(a,b){if(a.I)return;if(b==-10){a.A=-999;b=a.O}b!=-2&&b!=-7&&a.L!=0&&(b=-4);if(b==a.A)return;if(a.A==-8&&b!=-9)return;b==-8&&(a.M=a.A);b==-9&&(b=a.M);a.A=b;switch(b){case 0:clb.Ns(a,a.C==0?unb:a.C);break;case -6:clb.Ns(a,a.C);break;case -4:clb.Ns(a,a.L);break;case -2:clb.Ns(a,a.s);break;case -3:clb.Ns(a,a.t);break;case -7:clb.Ns(a,a.F);break;case -8:clb.Ns(a,a.G);break;case -5:clb.Ns(a,a.N);break;case 64:a.d='rgb(32,96,255)';break;case 128:a.d='rgb(255,0,0)';break;case 256:a.d='rgb(192,0,255)';break;case 192:a.d='rgb(0,255,0)';break;case 320:a.d='rgb(255,160,0)';break;case 384:a.d='rgb(0,128,0)';break;case 448:a.d='rgb(160,0,0)';break;case 1:a.d='rgb(128,128,128)';break;default:a.d='rgb(0,0,0)';}};clb.Ld=function Ld(a,b){if(a.L!=0){if(a.A!=-4){a.A=-4;clb.Ns(a,a.L)}return}a.A=-5;a.N=b;a.d='rgb('+((b&vnb)>>16)+','+((b&imb)>>8)+','+(b&255)+')'};clb.Md=function Md(a){var b,c,d,e,f;e=clb.Mh(a.P,clb.rk(a.J,0));c=clb.Mh(a.P,clb.rk(a.J,0));f=clb.Nh(a.P,clb.sk(a.J,0));d=clb.Nh(a.P,clb.sk(a.J,0));for(b=0;b<a.J.q;b++){e>clb.Mh(a.P,clb.rk(a.J,b))&&(e=clb.Mh(a.P,clb.rk(a.J,b)));c<clb.Mh(a.P,clb.rk(a.J,b))&&(c=clb.Mh(a.P,clb.rk(a.J,b)));f>clb.Nh(a.P,clb.sk(a.J,b))&&(f=clb.Nh(a.P,clb.sk(a.J,b)));d<clb.Nh(a.P,clb.sk(a.J,b))&&(d=clb.Nh(a.P,clb.sk(a.J,b)))}return new plb.YF(e,f,c-e,d-f)};clb.Nd=function Nd(a,b){var c,d;if(a.J.q==0)return null;a.u=clb.Md(a);c=a.P.c*clb.vk(a.J);d=new clb.Ph(a.u,b,c);if(d.c==1&&d.a==0&&d.b==0){d=null}else{clb.Ih(d,a.P);clb.Kh(d,a.u)}clb.Jd(a,b,c,Ylb);return d};clb.Od=function Od(a){var b;b=a.K!=0?a.K:a.B!=0?a.B:-1;a.s=slb.GT(b);a.t=slb.FT(wnb,b);a.F=-24321;a.G=-6291392};clb.Pd=function Pd(a,b){var c,d,e,f;if(a.J.q==0)return null;e=clb.Ps(a,b);clb.Gt(a.J,(a.D&256)!=0?63:(a.D&512)!=0?95:31);clb.md(a);alb.igb(a.S.a,0);alb.igb(a.Y.a,0);clb.Uc(a);clb.Os(a,a.V);a.I=true;for(d=0;d<a.J.q;d++)clb.td(a,d,null);a.I=false;c=a.P.c*clb.vk(a.J);clb.bd(a,c);clb.Jd(a,b,c,Ylb);if(plb.UF(b,a.u))return e;f=new clb.Ph(a.u,b,c);clb.Ih(f,a.P);clb.Kh(f,a.u);clb.Jh(f,a.v);if(!e)return f;clb.Ih(f,e);return e};clb.Qd=function Qd(a,b){clb.Rc(this);this.J=a;this.D=b;clb.kd(this)};U1(244,1,{});_.s=0;_.t=0;_.w=0;_.A=0;_.B=0;_.C=0;_.D=0;_.F=0;_.G=0;_.H=0;_.I=false;_.K=0;_.L=0;_.M=0;_.N=0;_.O=0;_.Q=0;_.R=0;_.T=0;_.U=0;_.V=0;_.W=0;_.X=0;Ykb.FX=w3(244);clb.Rd=function Rd(a,b,c){this.b=a;this.c=b;this.a=c};U1(111,1,{111:1},clb.Rd);_.a=0;_.b=0;_.c=0;Ykb.DX=w3(111);clb.Sd=function Sd(){};U1(60,1,{},clb.Sd);_.a=0;_.b=0;_.c=0;_.d=0;Ykb.EX=w3(60);clb.Td=function Td(a){return xnb+a.ob()+'\"'+a.nb()+ynb};U1(153,1,{153:1});_.lb=function Ud(){var a;a=new Zkb.z5;Zkb.y5(a,xnb+this.ob()+'\"'+this.nb()+ynb);return a.a};_.d=false;Ykb.GX=w3(153);clb.Vd=function Vd(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X;J=gW(Ykb.Z0,Amb,6,b.i.a.length,16,1);A=gW(Ykb.AX,gmb,6,a.f.f,15,1);for(T=0;T<b.i.a.length;T++){J[T]=true;for(q=dlb.Bi(b.j,T),r=0,s=q.length;r<s;++r){t=q[r];if(!a.e[t]){J[T]=false;break}}if(J[T])for(d=dlb.Bi(b.i,T),g=0,j=d.length;g<j;++g){c=d[g];++A[c]}}I=gW(Ykb.Z0,Amb,6,a.f.f,16,1);for(U=0;U<b.i.a.length;U++){V=dlb.Bi(b.j,U).length;if(V==3||V==5||V==6||V==7){if(J[U]){for(e=dlb.Bi(b.i,U),h=0,k=e.length;h<k;++h){c=e[h];I[c]=true}Q=true;M=-1;N=0;for(f=dlb.Bi(b.i,U),i=0,l=f.length;i<l;++i){c=f[i];if(V==6||A[c]>1){if(!clb.Zd(a,c,false)){Q=false;break}}else{S=V==5?clb.Wd(a,c,false):clb.Xd(a,c,false);if(clb.Zd(a,c,false)){if(N<S){N=S;M=c}}else{if(N==10){Q=false;break}M=c;N=20}}}if(Q){for(d=dlb.Bi(b.i,U),g=0,j=d.length;g<j;++g){c=d[g];if(c==M){V==5?clb.Wd(a,c,true):clb.Xd(a,c,true);clb.ie(a,c)}else{clb.Zd(a,c,true)}}}}}}w=gW(Ykb.AX,gmb,6,a.f.f,15,1);C=gW(Ykb.Z0,Amb,6,a.f.f,16,1);for(p=0;p<a.f.g;p++){m=clb.zk(a.f,0,p);n=clb.zk(a.f,1,p);if(!I[m]&&!I[n]){if(a.e[p]){++w[m];++w[n]}if(clb.Kk(a.f,p)==32){C[m]=true;C[n]=true}}}R=gW(Ykb.AX,gmb,6,a.f.f,15,1);B=gW(Ykb.AX,gmb,6,a.f.f,15,1);for(X=0;X<a.f.f;X++){if(w[X]==1){B[0]=X;v=0;D=0;while(v<=D){for(F=0;F<clb.wn(a.f,B[v]);F++){if(a.e[clb.xn(a.f,B[v],F)]){u=clb.vn(a.f,B[v],F);if((v==0||u!=B[v-1])&&w[u]!=0){B[++D]=u;if((w[u]&1)!=0){for(L=1;L<D;L+=2)R[B[L]]=-1;D=0}break}}}++v}}}o=gW(Ykb.Z0,Amb,6,a.f.f,16,1);for(W=0;W<a.f.f;W++){if(!o[W]&&w[W]!=0){B[0]=W;o[W]=true;v=0;D=0;while(v<=D){for(F=0;F<clb.wn(a.f,B[v]);F++){if(a.e[clb.xn(a.f,B[v],F)]){u=clb.vn(a.f,B[v],F);if(!o[u]){B[++D]=u;o[u]=true}}}++v}if((D&1)==0){for(G=0;G<=D;G++)R[B[G]]==0&&(R[B[G]]=clb.Yd(a,B[G],false));K=true;for(H=0;H<=D;H++){if(R[B[H]]<=0){if(!clb.Zd(a,B[H],false)){K=false;break}}}if(K){P=0;O=-1;for(F=0;F<=D;F++){if(P<R[B[F]]){P=R[B[F]];O=B[F]}}if(P>0){clb.Yd(a,O,true);clb.ie(a,O)}}}}}};clb.Wd=function Wd(a,b,c){if(clb.uk(a.f,b)==7){if(clb.gn(a.f,b)==3)return 6;else if(clb.wn(a.f,b)==2)return 4}else if(clb.uk(a.f,b)==8){return 10}else if(clb.uk(a.f,b)==15||clb.uk(a.f,b)==33){if(clb.wn(a.f,b)==3)return 8}else if(clb.uk(a.f,b)==16||clb.uk(a.f,b)==34||clb.uk(a.f,b)==52){if(clb.wn(a.f,b)==2)return 12}else if(clb.uk(a.f,b)==6){c&&clb.Il(a.f,b,-1);return clb.gn(a.f,b)!=clb.hn(a.f,b)?2:3}return 0};clb.Xd=function Xd(a,b,c){if(a.a){if(clb.gn(a.f,b)!=3)return 0}else{if(clb.gn(a.f,b)>3)return 0}if(clb.uk(a.f,b)==6){c&&clb.Il(a.f,b,1);return 2}if(clb.uk(a.f,b)==5){return 4}return 0};clb.Yd=function Yd(a,b,c){if(clb.dk(a.f,b)!=0)return 0;if(a.a){if(clb.uk(a.f,b)==5){if(clb.Pn(a.f,b)!=2)return 0;c&&clb.Il(a.f,b,1);return 1}if(clb.uk(a.f,b)==7){if(clb.Pn(a.f,b)!=2)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?6:3}if(clb.uk(a.f,b)==8){if(clb.Pn(a.f,b)!=1)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?7:4}if(clb.uk(a.f,b)==16){if(clb.Pn(a.f,b)!=1)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?5:2}if(clb.uk(a.f,b)==34){if(clb.Pn(a.f,b)!=1)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?4:1}}else{if(clb.uk(a.f,b)==5){if(clb.Pn(a.f,b)>2)return 0;c&&clb.Il(a.f,b,1);return 1}if(clb.uk(a.f,b)==7){if(clb.Pn(a.f,b)>2)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?5:3}if(clb.uk(a.f,b)==8){if(clb.Pn(a.f,b)>1)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?7:4}if(clb.uk(a.f,b)==16){if(clb.Pn(a.f,b)>1)return 0;c&&clb.Il(a.f,b,-1);return clb._d(a,b)?5:2}}return 0};clb.Zd=function Zd(a,b,c){var d,e,f;d=clb.uk(a.f,b);if(d>=5&&d<=8||d==15||d==16||d==33||d==34||d==52){f=clb.Ln(a.f,b);if(f!=0)return true;e=clb.dk(a.f,b);if(d==5&&e>=0){c&&clb.Il(a.f,b,e-1);return true}if(d!=5&&e<=0){c&&clb.Il(a.f,b,e+1);return true}}return false};clb.$d=function $d(a,b,c,d){var e;for(e=0;e<clb.wn(a.f,b);e++)if(d[clb.xn(a.f,b,e)]==1&&clb.vn(a.f,b,e)!=c)return e;return -1};clb._d=function _d(a,b){var c;for(c=0;c<clb.wn(a.f,b);c++)if(clb.jl(a.f,clb.vn(a.f,b,c)))return true;return false};clb.ae=function ae(a,b,c){var d;for(d=0;d<clb.wn(a.f,b);d++)if(c[clb.xn(a.f,b,d)]>1)return true;return false};clb.be=function be(a,b){var c;for(c=0;c<clb.wn(a.f,b);c++)if(a.e[clb.xn(a.f,b,c)])return true;return false};clb.ce=function ce(a,b,c){var d,e,f,g,h,i,j,k,l,m;clb.Gt(a.f,1);if(b!=null){a.e=b}else{a.e=gW(Ykb.Z0,Amb,6,a.f.g,16,1);for(e=0;e<a.f.g;e++){if(clb.Kk(a.f,e)==64){a.e[e]=true;clb.jm(a.f,e,1)}}}a.g=0;a.d=gW(Ykb.Z0,Amb,6,a.f.f,16,1);for(f=0;f<a.f.g;f++){if(a.e[f]){++a.c;for(h=0;h<2;h++){if(!a.d[clb.zk(a.f,h,f)]){a.d[clb.zk(a.f,h,f)]=true;++a.b}}}}if(a.c==0)return true;a.a=false;clb.ke(a,c);a.f.K&&clb.ee(a);m=new clb.Fr(a.f,1);c&&clb.Vd(a,m);clb.le(a,m);clb.he(a,m);clb.je(a);clb.fe(a);while(clb.ge(a,m))clb.fe(a);while(a.c!=0){g=false;if(!g){for(k=0;k<m.i.a.length;k++){if(dlb.Bi(m.j,k).length==6){j=true;l=dlb.Bi(m.j,k);for(i=0;i<6;i++){if(!a.e[l[i]]){j=false;break}}if(j){for(h=0;h<6;h+=2)clb.de(a,l[h]);g=true;break}}}}if(!g){for(d=0;d<a.f.g;d++){if(a.e[d]){clb.de(a,d);clb.fe(a);g=true;break}}}}return a.b==a.g};clb.de=function de(a,b){var c,d,e,f;if(clb.Kk(a.f,b)==1){clb.jm(a.f,b,2);a.g+=2}for(e=0;e<2;e++){c=clb.zk(a.f,e,b);a.d[c]=false;for(f=0;f<clb.wn(a.f,c);f++){d=clb.xn(a.f,c,f);if(a.e[d]){a.e[d]=false;--a.c}}}};clb.ee=function ee(a){var b,c,d,e,f,g,h,i;for(c=0;c<a.f.g;c++){if(a.e[c]){for(e=0;e<2;e++){h=clb.zk(a.f,e,c);b=false;for(g=0;g<clb.wn(a.f,h);g++){if(c!=clb.xn(a.f,h,g)&&a.e[clb.xn(a.f,h,g)]){b=true;break}}if(!b){i=c;d=clb.zk(a.f,1-e,c);while(i!=-1){a.e[i]=false;--a.c;clb.jm(a.f,i,64);i=-1;h=d;for(f=0;f<clb.wn(a.f,h);f++){if(a.e[clb.xn(a.f,h,f)]){if(i==-1){i=clb.xn(a.f,h,f);d=clb.vn(a.f,h,f)}else{h=-1;i=-1;break}}}}break}}}}};clb.fe=function fe(a){var b,c,d,e,f,g,h;do{h=false;for(c=0;c<a.f.g;c++){if(a.e[c]){f=false;for(e=0;e<2;e++){d=clb.zk(a.f,e,c);b=false;for(g=0;g<clb.wn(a.f,d);g++){if(c!=clb.xn(a.f,d,g)&&a.e[clb.xn(a.f,d,g)]){b=true;break}}if(!b){f=true;break}}if(f){h=true;clb.de(a,c)}}}}while(h)};clb.ge=function ge(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;o=gW(Ykb.AX,gmb,6,a.f.g,15,1);for(m=0;m<b.i.a.length;m++){n=dlb.Bi(b.j,m);l=true;for(k=0;k<n.length;k++){if(!a.e[n[k]]){l=false;break}}if(l)for(j=0;j<n.length;j++)++o[n[j]]}i=a.c;for(f=0;f<a.f.g;f++){if(o[f]==1){for(j=0;j<2&&a.e[f];j++){c=clb.zk(a.f,j,f);d=clb.zk(a.f,1-j,f);if(clb.ae(a,c,o)&&!clb.ae(a,d,o)){while(-1!=(h=clb.$d(a,d,c,o))){e=clb.vn(a.f,d,h);g=clb.xn(a.f,d,h);if(!a.e[g])break;clb.de(a,g);h=clb.$d(a,e,d,o);if(h==-1)break;c=e;d=clb.vn(a.f,e,h)}}}}}return i!=a.c};clb.he=function he(a,b){var c;for(c=0;c<a.f.g;c++){if(a.e[c]&&clb.yr(b,c)){clb.ie(a,clb.zk(a.f,0,c));clb.ie(a,clb.zk(a.f,1,c))}}};clb.ie=function ie(a,b){var c,d;if(a.d[b]){a.d[b]=false;--a.b}for(d=0;d<clb.wn(a.f,b);d++){c=clb.xn(a.f,b,d);if(a.e[c]){a.e[c]=false;--a.c}}};clb.je=function je(a){var b,c,d,e,f;for(c=0;c<a.f.g;c++){if(clb.Hk(a.f,c)==2){for(e=0;e<2;e++){b=clb.zk(a.f,e,c);if(clb.uk(a.f,b)<=8){for(f=0;f<clb.wn(a.f,b);f++){d=clb.xn(a.f,b,f);if(a.e[d]){clb.ie(a,b);break}}}}}}};clb.ke=function ke(a,b){var c;for(c=0;c<a.f.f;c++)a.d[c]&&clb.Ln(a.f,c)==0&&(!b||clb.uk(a.f,c)==5&&clb.dk(a.f,c)<0||clb.uk(a.f,c)==6||clb.uk(a.f,c)==14||clb.gl(a.f,c)&&clb.dk(a.f,c)>0)&&clb.ie(a,c)};clb.le=function le(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;for(k=0;k<b.i.a.length;k++){n=dlb.Bi(b.j,k).length;if(n==3||n==5||n==7){l=dlb.Bi(b.i,k);for(d=0;d<n;d++){c=l[d];clb.be(a,c)&&(n==5?(clb.uk(a.f,c)==6&&clb.dk(a.f,c)==-1&&clb.gn(a.f,c)==3||clb.uk(a.f,c)==7&&clb.dk(a.f,c)==0&&clb.gn(a.f,c)==3||clb.uk(a.f,c)==8&&clb.dk(a.f,c)==0&&clb.wn(a.f,c)==2||clb.uk(a.f,c)==16&&clb.dk(a.f,c)==0&&clb.wn(a.f,c)==2||clb.uk(a.f,c)==34&&clb.dk(a.f,c)==0&&clb.wn(a.f,c)==2)&&clb.ie(a,c):(clb.uk(a.f,c)==5&&clb.dk(a.f,c)==0&&clb.gn(a.f,c)==3||clb.uk(a.f,c)==6&&clb.dk(a.f,c)==1)&&clb.ie(a,c))}}}for(j=0;j<b.i.a.length;j++){if(dlb.Bi(b.j,j).length==5){m=dlb.Bi(b.j,j);f=true;for(e=0;e<m.length;e++){if(!a.e[m[e]]){f=false;break}}if(f){l=dlb.Bi(b.i,j);h=0;g=-1;for(d=0;d<m.length;d++){if(clb.dk(a.f,l[d])==-1&&clb.uk(a.f,l[d])==6){i=clb.gn(a.f,l[d])==3?3:clb.hn(a.f,l[d])==3?2:1;if(h<i){h=i;g=l[d]}}}g!=-1&&clb.ie(a,g)}}}};clb.me=function me(a){this.f=a};U1(75,1,{},clb.me);_.a=false;_.b=0;_.c=0;_.g=0;Ykb.HX=w3(75);clb.ne=function ne(a,b){var c,d;c=0;for(d=0;d<a.j[b];d++)a.n[b][d]==2&&(clb.uk(a,a.i[b][d])==7||clb.uk(a,a.i[b][d])==8||clb.uk(a,a.i[b][d])==16)&&++c;return c};clb.oe=function oe(a,b){var c,d,e,f,g,h;if(a.s[b]==0){return false}h=true;c=a.s[b];f=a.j[b];g=0;for(d=0;d<f;d++){e=a.i[b][d];g+=a.s[e]}$wnd.Math.abs(c)<=$wnd.Math.abs(g)&&Zkb.M4(c)!=Zkb.M4(g)&&(h=false);return h};clb.pe=function pe(a,b){var c,d,e,f,g,h,i;if(a.C[b]!=8||a.s[b]!=0||a.j[b]!=1||a.n[b][0]!=1)return false;c=a.i[b][0];if(a.C[c]==6){g=a.j[c];for(d=0;d<g;d++){e=a.i[c][d];if(e==b){continue}if(a.C[e]!=8){continue}f=clb.tn(a,c,e);if(a.H[f]==2)return true}}else if(a.C[c]==7){if(a.s[c]==1)return true}else if(a.C[c]==16){h=a.j[c];i=0;for(d=0;d<h;d++){e=a.i[c][d];if(e==b)continue;if(a.C[e]!=8)continue;f=clb.tn(a,c,e);a.H[f]==2&&++i}if(i==2)return true}else if(clb.qe(a,b))return true;return false};clb.qe=function qe(a,b){var c,d,e,f,g;if(a.C[b]!=8)return false;if(a.j[b]!=1)return false;c=a.i[b][0];if(a.C[c]==15){g=a.j[c];for(d=0;d<g;d++){e=a.i[c][d];if(e==b)continue;if(a.C[e]!=8)continue;f=clb.tn(a,c,e);if(a.H[f]==2)return true}}return false};clb.re=function re(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;if(a.C[b]!=7||a.s[b]!=0||a.j[b]+a.o[b]>3)return false;if(b<a.f&&clb.rr(a.p,b)){if(a.o[b]!=1)return false;if(clb.pn(a,b,7)!=1)return false;u=(clb.Gt(a,7),a.p);for(s=0;s<u.i.a.length;s++){if(clb.tr(u,s,b)){if(dlb.Bi(u.j,s).length==5||dlb.Bi(u.j,s).length==6){v=dlb.Bi(u.i,s);q=-1;for(i=0;i<v.length;i++){if(v[i]==b){q=i;break}}e=0;r=null;p=null;if(v.length==5){r=gW(Ykb.AX,gmb,6,2,15,1);r[0]=v[q-1<0?q+4:q-1];r[1]=v[q-4<0?q+1:q-4];p=gW(Ykb.AX,gmb,6,2,15,1);p[0]=v[q-2<0?q+3:q-2];p[1]=v[q-3<0?q+2:q-3]}if(v.length==6){r=gW(Ykb.AX,gmb,6,3,15,1);r[0]=v[q-1<0?q+5:q-1];r[1]=v[q-3<0?q+3:q-3];r[2]=v[q-5<0?q+1:q-5];p=gW(Ykb.AX,gmb,6,2,15,1);p[0]=v[q-2<0?q+4:q-2];p[1]=v[q-4<0?q+2:q-4]}for(j=0;j<v.length;j++)b!=v[j]&&clb.uk(a,v[j])==7&&clb.mn(a,v[j])==1&&--e;for(k=0;k<r.length;k++){f=-1;g=-1;for(o=0;o<clb.wn(a,r[k]);o++){if(!clb.mo(a,clb.xn(a,r[k],o))){f=clb.vn(a,r[k],o);g=clb.xn(a,r[k],o);break}}if(f!=-1){if(a.C[f]==7&&a.o[f]==0&&a.j[f]+a.o[f]<=3&&!clb.se(a,f,false)){++e;continue}if(a.C[f]==8&&a.j[f]==1){e+=2;continue}if(g<a.g&&clb.sr(a.p,g)){for(w=0;w<u.i.a.length;w++){if(u.d[w]&&clb.tr(u,w,f)){t=dlb.Bi(u.i,w);for(n=0;n<t.length;n++){if(clb.uk(a,t[n])==7&&clb.mn(a,t[n])==1){--e;break}}break}}}}}for(l=0;l<p.length;l++){f=-1;for(n=0;n<clb.wn(a,p[l]);n++)clb.mo(a,clb.xn(a,p[l],n))||(f=clb.vn(a,p[l],n));clb.uk(a,p[l])==6?f!=-1&&clb.ne(a,f)!=0&&--e:clb.uk(a,p[l])==7&&clb.mn(a,p[l])==0&&(f==-1||!(f<a.f&&clb.rr(a.p,f))&&clb.ne(a,f)==0)&&++e}return e>0}break}}return false}if(a.o[b]>1)return false;if(a.o[b]==1){m=-1;A=0;for(i=0;i<a.j[b];i++){d=a.i[b][i];if(a.n[b][i]==2){if(a.C[d]!=6)return false;m=d;continue}if(a.C[d]==8)return false;if(a.C[d]==7){--A;clb.se(a,d,false)&&--A;continue}d<a.f&&clb.rr(a.p,d)&&--A}if(m==-1)return false;c=0;for(j=0;j<a.j[m];j++){if(a.n[m][j]==1){d=a.i[m][j];if(clb.ne(a,d)!=0)return false;d<a.f&&clb.rr(a.p,d)&&++c;a.C[d]==7&&!clb.se(a,d,true)&&++A;(a.C[d]==8||a.C[d]==16)&&--A}}c==2&&--A;return A>=0}for(h=0;h<a.j[b];h++){d=a.i[b][h];if(d<a.f&&clb.rr(a.p,d))return false;if(a.C[d]!=6)return false;if(clb.ne(a,d)!=0)return false;if(a.o[d]!=0&&clb.te(a,d))return false}return true};clb.se=function se(a,b,c){var d,e,f;d=false;for(f=0;f<a.j[b];f++){if(!clb.mo(a,a.k[b][f])&&a.n[b][f]==1){e=a.i[b][f];if(!(e<a.f&&clb.rr(a.p,e))&&(a.C[e]==6&&clb.ne(a,e)==1||a.C[e]==16&&clb.ne(a,e)==2)){if(d||!c)return true;d=true}}}return false};clb.te=function te(a,b){var c,d,e;for(d=0;d<a.j[b];d++){if(a.n[b][d]!=1){c=a.i[b][d];for(e=0;e<a.j[c];e++)if(a.n[c][e]==1&&clb.ne(a,a.i[c][e])!=0)return true}}return false};clb.we=function we(){clb.we=W1;clb.ue=oW(aW(Ykb.Y0,1),znb,6,15,[-1,-1,-1,0,0,1,2,3,4,5,-1,0,0,0,6,7,8,9,-1,0,0,10,10,10,10,10,10,10,10,10,10,1,11,11,12,13,-1,0,0,10,10,10,10,10,10,10,10,10,10,0,0,0,11,14,-1,0,0,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,10,10,10,10,10,10,10,1,1,1,1,-1,-1,-1,-1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]);clb.ve=oW(aW(Ykb.Y0,1),znb,6,15,[-1,-1,-1,0,0,0,2,5,5,5,-1,0,0,0,0,9,9,9,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1])};clb.xe=function xe(a,b,c){clb.we();var d,e,f,g,h,i,j,k,l,m,n,o,p,q;clb.Gt(a,7);n=gW(Ykb.BX,Anb,6,a.j[b],14,1);m=0;for(i=0;i<a.j[b];i++){e=a.i[b][i];if(a.C[e]==1)continue;g=0;if((c&32)!=0){f=q1(a.n[b][i]);c==32190?j1(f,3)<0&&clb.qo(a,a.k[b][i])&&a.o[b]==1&&(f=0):j1(f,3)<0&&clb.mo(a,a.k[b][i])&&(f=0);g=B1(g,C1(f,4))}if((c&128)!=0){if(clb.ue[a.C[e]]==-1)throw c1(new Zkb.rz(Bnb+a.C[e]));g=d1(g,q1(clb.ue[a.C[e]]))}else if((c&64)!=0){if(clb.ve[a.C[e]]==-1)throw c1(new Zkb.rz(Bnb+a.C[e]));g=d1(g,q1(clb.ve[a.C[e]]))}if((c&256)!=0){o=a.j[e]-1;o>3&&(o=3);(c&512)==0&&o>1&&(o=1);g=B1(g,Ykb.m1(o<<6))}(c&Nmb)!=0&&(a.u[e]&8)!=0&&(g=B1(g,256));(c&lnb)!=0&&e<a.f&&clb.rr(a.p,e)&&(g=B1(g,512));(c&Hmb)!=0&&(a.u[e]&knb)!=0&&(g=B1(g,Nmb));k=0;while(j1(g,n[k])<0)++k;for(l=i;l>k;l--)n[l]=n[l-1];n[k]=g;++m}m>4&&(m=4);d=0;for(j=0;j<m;j++){d=C1(d,11);d=B1(d,n[j])}d=C1(d,15);if(clb.ue[a.C[b]]==-1)throw c1(new Zkb.rz(Bnb+a.C[b]));d=B1(d,q1(clb.ue[a.C[b]]));if((c&2)!=0){q=!!a.p&&b<a.f?clb.gr(a.p,b):0;q>9&&(q=9);q>2&&(q-=2);d=B1(d,Ykb.m1(q<<4))}else (c&1)!=0&&(a.u[b]&8)!=0&&(d=B1(d,64));(c&4)!=0&&b<a.f&&clb.rr(a.p,b)&&(d=B1(d,Nmb));(c&8)!=0&&(a.u[b]&Imb)!=0&&(d=B1(d,lnb));(c&16)!=0&&(a.u[b]&knb)!=0&&(d=B1(d,Imb));if((c&Imb)!=0){clb.oe(a,b)&&(d=B1(d,knb));if(clb.re(a,b)){for(h=0;h<a.f;h++){if(clb.pe(a,h)){d=B1(d,Hmb);break}}}}if((c&knb)!=0){p=q1(clb.pn(a,b,10));d=B1(d,C1(p,7))}return d};clb.ye=function ye(a,b,c,d,e,f){var g,h,i,j;i=0;for(h=0;h<a.P.f;h++)z1(e1(clb.pk(a.P,a.w[h]),d),0)&&++i;if(i==0)return;clb.wf(a,b);clb.rf(a,Ykb.m1(i),c);for(g=0;g<a.P.f;g++){j=e1(clb.pk(a.P,a.w[g]),d);if(j1(j,0)!=0){clb.rf(a,Ykb.m1(g),c);e!=1&&clb.rf(a,D1(j,f),e)}}};clb.ze=function ze(a,b,c,d,e,f){var g,h,i,j;i=0;for(h=0;h<a.P.g;h++)(clb.Jk(a.P,a.A[h])&d)!=0&&++i;if(i==0)return;clb.wf(a,b);clb.rf(a,Ykb.m1(i),c);for(g=0;g<a.P.g;g++){j=clb.Jk(a.P,a.A[g])&d;if(j!=0){clb.rf(a,Ykb.m1(g),c);e!=1&&clb.rf(a,Ykb.m1(j>>f),e)}}};clb.Ae=function Ae(a){var b,c,d,e,f,g;while(true){f=gW(Ykb.Z0,Amb,6,a.S+1,16,1);d=-1;for(c=0;c<a.P.f;c++){if(clb.Ln(a.P,c)!=0){f[a.d[c]]&&d<a.d[c]&&(d=a.d[c]);f[a.d[c]]=true}}if(d==-1)break;e=0;for(b=0;b<a.P.f;b++){g=0;a.d[b]==d&&(g=++e);clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));clb.pg(a.c[b],8,Ykb.m1(g))}a.S=clb._e(a)}};clb.Be=function Be(a){var b,c,d,e;for(c=0;c<a.P.f;c++){clb.sg(a.c[c],c);clb.pg(a.c[c],2*a.b+4,C1(q1(a.d[c]),a.b+4))}e=false;for(b=0;b<a.P.f;b++)e=e|clb.Oe(a,b,3);for(d=0;d<a.P.g;d++)e=e|clb.Je(a,d,3);if(!e)return false;while(a.S<a.P.f){e=clb.Ye(a);if(!e)break;clb.$e(a);!!a.N&&clb.Ig(a.N,a.d)}return true};clb.Ce=function Ce(a){var b,c,d,e,f;for(c=0;c<a.P.f;c++){clb.sg(a.c[c],c);clb.pg(a.c[c],a.b+1,q1(2*a.d[c]))}f=gW(Ykb.AX,gmb,6,a.S+1,15,1);for(d=0;d<a.P.f;d++)++f[a.d[d]];e=1;while(f[e]==1)++e;for(b=0;b<a.P.f;b++){if(a.d[b]==e){clb.qg(a.c[b],1);break}}a.S=clb._e(a)};clb.De=function De(a,b,c){var d,e,f,g,h;if(clb.uk(a.P,b)!=6&&clb.uk(a.P,b)!=7)return false;e=clb.vn(a.P,b,0);f=clb.vn(a.P,b,1);if(clb.mn(a.P,e)!=1||clb.mn(a.P,f)!=1)return false;if(clb.wn(a.P,e)==1||clb.wn(a.P,f)==1)return false;if(clb.gn(a.P,e)>3||clb.gn(a.P,f)>3)return false;g=new clb.oj(a.P,a.d,b,e);if(g.f&&c==1)return false;h=new clb.oj(a.P,a.d,b,f);if(h.f&&c==1)return false;if(g.f&&h.f)return false;if(c==3){g.f&&g.c&&(a.U[b]=true);h.f&&h.c&&(a.U[b]=true)}d=a.hb?clb.Fe(a,g,h):clb.Ee(g,h);if(c==1){a.bb[b]=d}else if(c==2){g.f&&(d==1?clb.qg(a.c[g.b],q1(a.d[e])):clb.qg(a.c[g.d],q1(a.d[e])));h.f&&(d==2?clb.qg(a.c[h.b],q1(a.d[f])):clb.qg(a.c[h.d],q1(a.d[f])))}return true};clb.Ee=function Ee(a,b){var c,d,e;d=clb.nj(a);e=clb.nj(b);if(d==-1||e==-1||(d+e&1)==0)return 3;c=0;switch(d+e){case 3:case 7:c=2;break;case 5:c=1;}return c};clb.Fe=function Fe(a,b,c){var d,e;d=gW(Ykb.AX,gmb,6,4,15,1);d[0]=b.b;d[1]=b.a;d[2]=c.a;d[3]=c.b;e=clb.Jj(a.P,d);if($wnd.Math.abs(e)<0.3||$wnd.Math.abs(e)>Cnb)return 3;return e<0?2:1};clb.Ge=function Ge(a,b,c){var d,e,f,g,h;if(!clb.no(a.P,b))return false;d=clb.zk(a.P,0,b);e=clb.zk(a.P,1,b);g=new clb.oj(a.P,a.d,d,e);if(g.f&&c==1)return false;h=new clb.oj(a.P,a.d,e,d);if(h.f&&c==1)return false;if(g.f&&h.f)return false;if(c==3){g.f&&(a.T[b]=clb.Mf(a,e));h.f&&(a.T[b]=clb.Mf(a,d))}f=a.hb?clb.Ie(a,g,h):clb.He(g,h);if(c==1){a.k[b]=f}else if(c==2){g.f&&(f==2?clb.qg(a.c[g.b],q1(a.d[e])):clb.qg(a.c[g.d],q1(a.d[e])));h.f&&(f==2?clb.qg(a.c[h.b],q1(a.d[d])):clb.qg(a.c[h.d],q1(a.d[d])))}return true};clb.He=function He(a,b){var c,d,e;d=clb.nj(a);e=clb.nj(b);if(d==-1||e==-1||(d+e&1)==0)return 3;c=0;switch(d+e){case 3:case 7:c=1;break;case 5:c=2;}return c};clb.Ie=function Ie(a,b,c){var d,e;d=gW(Ykb.AX,gmb,6,4,15,1);d[0]=b.b;d[1]=b.a;d[2]=c.a;d[3]=c.b;e=clb.Jj(a.P,d);if($wnd.Math.abs(e)<0.3||$wnd.Math.abs(e)>Cnb)return 3;return e<0?1:2};clb.Je=function Je(a,b,c){var d,e,f,g,h;if(a.k[b]!=0)return false;if(clb.Hk(a.P,b)==1)return clb.Ge(a,b,c);if(clb.Hk(a.P,b)!=2)return false;if(clb.mo(a.P,b))return false;e=clb.zk(a.P,0,b);f=clb.zk(a.P,1,b);if(clb.wn(a.P,e)==1||clb.wn(a.P,f)==1)return false;if(clb.wn(a.P,e)>3||clb.wn(a.P,f)>3)return false;if(clb.mn(a.P,e)==2||clb.mn(a.P,f)==2)return false;g=new clb.oj(a.P,a.d,f,e);if(g.f&&c==1)return false;h=new clb.oj(a.P,a.d,e,f);if(h.f&&c==1)return false;if(g.f&&h.f)return false;if(c==3){g.f&&g.c&&(a.T[b]=true);h.f&&h.c&&(a.T[b]=true)}d=clb.fl(a.P,b)?3:a.hb?clb.Le(a,g,h):clb.Ke(g,h);if(c==1){a.k[b]=d}else if(c==2){g.f&&(d==1?clb.qg(a.c[g.b],q1(a.d[e])):d==2&&clb.qg(a.c[g.d],q1(a.d[e])));h.f&&(d==1?clb.qg(a.c[h.b],q1(a.d[f])):d==2&&clb.qg(a.c[h.d],q1(a.d[f])))}return true};clb.Ke=function Ke(a,b){if(clb.nj(a)==-1||clb.nj(b)==-1)return 3;if(((clb.nj(a)|clb.nj(b))&1)!=0)return 3;return clb.nj(a)==clb.nj(b)?1:2};\nclb.Le=function Le(a,b,c){var d,e,f,g,h,i,j;f=gW(Ykb.yX,emb,6,3,15,1);f[0]=clb.rk(a.P,c.a)-clb.rk(a.P,b.a);f[1]=clb.sk(a.P,c.a)-clb.sk(a.P,b.a);f[2]=clb.tk(a.P,c.a)-clb.tk(a.P,b.a);i=gW(Ykb.yX,emb,6,3,15,1);i[0]=clb.rk(a.P,b.b)-clb.rk(a.P,b.a);i[1]=clb.sk(a.P,b.b)-clb.sk(a.P,b.a);i[2]=clb.tk(a.P,b.b)-clb.tk(a.P,b.a);j=gW(Ykb.yX,emb,6,3,15,1);j[0]=clb.rk(a.P,c.b)-clb.rk(a.P,c.a);j[1]=clb.sk(a.P,c.b)-clb.sk(a.P,c.a);j[2]=clb.tk(a.P,c.b)-clb.tk(a.P,c.a);g=gW(Ykb.yX,emb,6,3,15,1);g[0]=f[1]*i[2]-f[2]*i[1];g[1]=f[2]*i[0]-f[0]*i[2];g[2]=f[0]*i[1]-f[1]*i[0];h=gW(Ykb.yX,emb,6,3,15,1);h[0]=f[1]*g[2]-f[2]*g[1];h[1]=f[2]*g[0]-f[0]*g[2];h[2]=f[0]*g[1]-f[1]*g[0];d=(i[0]*h[0]+i[1]*h[1]+i[2]*h[2])/($wnd.Math.sqrt(i[0]*i[0]+i[1]*i[1]+i[2]*i[2])*$wnd.Math.sqrt(h[0]*h[0]+h[1]*h[1]+h[2]*h[2]));e=(j[0]*h[0]+j[1]*h[1]+j[2]*h[2])/($wnd.Math.sqrt(j[0]*j[0]+j[1]*j[1]+j[2]*j[2])*$wnd.Math.sqrt(h[0]*h[0]+h[1]*h[1]+h[2]*h[2]));return d<0^e<0?1:2};clb.Me=function Me(a,b){var c,d,e,f;c=clb.bk(a.P,b);d=clb.Jn(a.P,b,false);e=clb.Jn(a.P,b,true);f=-1;if(d!=e){c!=-1&&c>d?(f=c<<24>>24):(f=d<<24>>24)}else if(c!=-1){(c>e||c<e&&c>=clb.Pn(a.P,b))&&(f=c<<24>>24)}else if(!clb.Ro(a.P,b)&&clb.An(a.P,b)!=0){f=clb.Pn(a.P,b);f-=clb.Ok(a.P,b,f)}clb.gf(a,b,f);return f};clb.Ne=function Ne(a){var b,c,d,e,f,g,h,i,j,k,l;d=gW(Ykb.AX,gmb,6,a.M,15,1);for(b=0;b<a.P.f;b++){k=clb.wn(a.P,b)+clb.Mn(a.P,b);j=0;for(f=0;f<clb.hn(a.P,b);f++){if(f<clb.wn(a.P,b)||f>=clb.gn(a.P,b)){l=2*a.d[clb.vn(a.P,b,f)];c=clb.xn(a.P,b,f);clb.Hk(a.P,c)==2&&(clb.mo(a.P,c)||++l);for(h=0;h<j;h++)if(l<d[h])break;for(i=j;i>h;i--)d[i]=d[i-1];d[h]=l;++j}}clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));for(g=k;g<a.M;g++)clb.pg(a.c[b],a.b+1,0);for(e=0;e<k;e++)clb.pg(a.c[b],a.b+1,Ykb.m1(d[e]))}};clb.Oe=function Oe(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;if(a.bb[b]!=0)return false;if(clb.uk(a.P,b)!=5&&clb.uk(a.P,b)!=6&&clb.uk(a.P,b)!=7&&clb.uk(a.P,b)!=14&&clb.uk(a.P,b)!=15&&clb.uk(a.P,b)!=16)return false;if(clb.mn(a.P,b)!=0){if(clb.oo(a.P,b))return clb.De(a,b,c);if(clb.uk(a.P,b)!=15&&clb.uk(a.P,b)!=16)return false}if(clb.wn(a.P,b)<3||clb.gn(a.P,b)>4)return false;if(clb.dk(a.P,b)>0&&clb.uk(a.P,b)==6)return false;if(clb.uk(a.P,b)==5&&clb.gn(a.P,b)!=4)return false;if(clb.uk(a.P,b)==7&&!a.Q[b])return false;n=gW(Ykb.AX,gmb,6,4,15,1);o=gW(Ykb.AX,gmb,6,4,15,1);j=gW(Ykb.Z0,Amb,6,4,16,1);for(h=0;h<clb.gn(a.P,b);h++){f=-1;e=0;for(i=0;i<clb.gn(a.P,b);i++){if(!j[i]){if(f<a.d[clb.vn(a.P,b,i)]){f=a.d[clb.vn(a.P,b,i)];e=i}}}n[h]=e;o[h]=f;j[e]=true}if(clb.gn(a.P,b)==4&&o[0]==o[1]&&o[2]==o[3])return false;if(clb.gn(a.P,b)==4&&(o[0]==o[2]||o[1]==o[3]))return false;if(clb.gn(a.P,b)==3&&o[0]==o[2])return false;k=0;l=0;m=false;for(g=1;g<clb.gn(a.P,b);g++){if(o[g-1]==o[g]){if(c==1||o[g]==0)return false;k=clb.vn(a.P,b,n[g-1]);l=clb.vn(a.P,b,n[g]);c==3&&clb.zo(a.P,clb.xn(a.P,b,n[g]))&&(a.U[b]=true);m=true}}if(c!=1&&!m)return false;d=a.hb?clb.Qe(a,b,n):clb.Pe(a,b,n);c==1?(a.bb[b]=d):c==2&&(d==1?clb.qg(a.c[k],q1(a.d[b])):d==2&&clb.qg(a.c[l],q1(a.d[b])));return true};clb.Pe=function Pe(a,b,c){var d,e,f,g,h,i,j,k,l,m;m=oW(aW(Ykb.AX,2),Dnb,7,0,[oW(aW(Ykb.AX,1),gmb,6,15,[2,1,2,1]),oW(aW(Ykb.AX,1),gmb,6,15,[1,2,2,1]),oW(aW(Ykb.AX,1),gmb,6,15,[1,1,2,2]),oW(aW(Ykb.AX,1),gmb,6,15,[2,1,1,2]),oW(aW(Ykb.AX,1),gmb,6,15,[2,2,1,1]),oW(aW(Ykb.AX,1),gmb,6,15,[1,2,1,2])]);d=gW(Ykb.yX,emb,6,clb.gn(a.P,b),15,1);for(g=0;g<clb.gn(a.P,b);g++)d[g]=clb.yk(a.P,clb.vn(a.P,b,c[g]),b);j=clb.Cn(a.P,b,c,d,null)<<24>>24;if(j!=3)return j;k=0;l=0;for(h=0;h<clb.gn(a.P,b);h++){e=clb.xn(a.P,b,c[h]);if(clb.zk(a.P,0,e)==b){if(clb.Kk(a.P,e)==129){l!=0&&clb.sm(a.P,b);k=h;l=1}if(clb.Kk(a.P,e)==257){l!=0&&clb.sm(a.P,b);k=h;l=2}}}if(l==0)return 3;for(f=1;f<clb.gn(a.P,b);f++)d[f]<d[0]&&(d[f]+=Emb);if(clb.gn(a.P,b)==3){switch(k){case 0:(d[1]<d[2]&&d[2]-d[1]<Fmb||d[1]>d[2]&&d[1]-d[2]>Fmb)&&(l=3-l);break;case 1:d[2]-d[0]>Fmb&&(l=3-l);break;case 2:d[1]-d[0]<Fmb&&(l=3-l);}return l==1?2:1}i=0;d[1]<=d[2]&&d[2]<=d[3]?(i=0):d[1]<=d[3]&&d[3]<=d[2]?(i=1):d[2]<=d[1]&&d[1]<=d[3]?(i=2):d[2]<=d[3]&&d[3]<=d[1]?(i=3):d[3]<=d[1]&&d[1]<=d[2]?(i=4):d[3]<=d[2]&&d[2]<=d[1]&&(i=5);return m[i][k]==l?2:1};clb.Qe=function Qe(a,b,c){var d,e,f,g,h,i;d=gW(Ykb.AX,gmb,6,4,15,1);for(h=0;h<clb.gn(a.P,b);h++)d[h]=clb.vn(a.P,b,c[h]);clb.gn(a.P,b)==3&&(d[3]=b);e=eW(Ykb.yX,[Llb,emb],[12,6],15,[3,3],2);for(g=0;g<3;g++){e[g][0]=clb.rk(a.P,d[g+1])-clb.rk(a.P,d[0]);e[g][1]=clb.sk(a.P,d[g+1])-clb.sk(a.P,d[0]);e[g][2]=clb.tk(a.P,d[g+1])-clb.tk(a.P,d[0])}i=gW(Ykb.yX,emb,6,3,15,1);i[0]=e[0][1]*e[1][2]-e[0][2]*e[1][1];i[1]=e[0][2]*e[1][0]-e[0][0]*e[1][2];i[2]=e[0][0]*e[1][1]-e[0][1]*e[1][0];f=(e[2][0]*i[0]+e[2][1]*i[1]+e[2][2]*i[2])/($wnd.Math.sqrt(e[2][0]*e[2][0]+e[2][1]*e[2][1]+e[2][2]*e[2][2])*$wnd.Math.sqrt(i[0]*i[0]+i[1]*i[1]+i[2]*i[2]));return f>0?1:2};clb.Re=function Re(a){var b,c;b=0;dlb.kcb(a.c);for(c=0;c<a.c.length;c++){(c==0||clb.rg(a.c[c],a.c[c-1])!=0)&&++b;a.d[a.c[c].a]=b}return b};clb.Se=function Se(a){var b,c,d,e,f,g,h,i,j,k,l,m;if(a.v)return;a.v=new dlb.Qi;k=0;l=gW(Ykb.AX,gmb,6,a.P.f,15,1);g=gW(Ykb.AX,gmb,6,a.P.f,15,1);i=gW(Ykb.AX,gmb,6,a.P.g,15,1);for(b=0;b<a.P.f;b++){if(l[b]==0&&(clb.yo(a.P,b)||clb.mn(a.P,b)==1)){g[0]=b;h=1;j=0;l[b]=++k;c=gW(Ykb.Z0,Amb,6,a.P.g,16,1);for(f=0;f<h;f++){for(m=0;m<clb.wn(a.P,g[f]);m++){e=clb.xn(a.P,g[f],m);if(clb.zo(a.P,e)||clb.Hk(a.P,e)==2||clb.no(a.P,e)){d=clb.vn(a.P,g[f],m);if(!c[e]){i[j++]=e;c[e]=true}if(l[d]==0){g[h++]=d;l[d]=k}}}}dlb.wi(a.v,new clb.yg(g,h,i,j))}}};clb.Te=function Te(a){var b;a.Q=gW(Ykb.Z0,Amb,6,a.P.f,16,1);for(b=0;b<a.P.f;b++){if(clb.uk(a.P,b)==7){if(clb.wn(a.P,b)==4){a.Q[b]=true;continue}if(clb.wn(a.P,b)==3){if(clb.qn(a.P,b)==3){a.Q[b]=true;continue}if(clb.dk(a.P,b)==1){a.Q[b]=true;continue}if(clb.so(a.P,b,true))continue;if((a.O&32)!=0){a.Q[b]=true;continue}if(clb.xo(a.P,b)){a.Q[b]=true;continue}}}}};clb.Ue=function Ue(a,b){var c,d,e,f;e=false;for(d=0;d<a.P.g;d++)if(clb.Je(a,d,1)){a.o[d]=a.J;b&&clb.hf(a,d);e=true}f=false;for(c=0;c<a.P.f;c++)if(clb.Oe(a,c,1)){a.gb[c]=a.J;b&&clb.jf(a,c);f=true}f&&(a.J=!a.J);return e||f};clb.Ve=function Ve(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;s=gW(Ykb.Z0,Amb,6,a.P.f,16,1);t=gW(Ykb.Z0,Amb,6,a.P.g,16,1);b=0;v=false;if((a.O&128)!=0){a.W=gW(Ykb.AX,gmb,6,a.P.f,15,1);a.V=gW(Ykb.AX,gmb,6,a.P.g,15,1)}for(d=0;d<a.P.f;d++){if(a.U[d]){if(!a.db[d]){if(clb.Oe(a,d,1)){a.db[d]=true;s[d]=true;++b}}}}for(f=0;f<a.P.g;f++){if(a.T[f]){if(!a.n[f]){if(clb.Je(a,f,1)){a.n[f]=true;t[f]=true;++b}}}}if(b==1){for(c=0;c<a.P.f;c++){if(s[c]){a.bb[c]=0;break}}for(e=0;e<a.P.g;e++){if(t[e]){a.k[e]=0;break}}}else if(b>1){clb.Se(a);a.R=0;for(h=new dlb.Obb(a.v);h.a<h.c.a.length;){g=dlb.Nbb(h);u=0;w=0;k=0;j=0;l=-1;i=-1;for(o=0;o<g.a.length;o++){if(s[g.a[o]]){++u;if(a.bb[g.a[o]]==1||a.bb[g.a[o]]==2){++w;v=true;if(l<a.d[g.a[o]]){l=a.d[g.a[o]];k=g.a[o]}}}}for(p=0;p<g.b.length;p++){if(t[g.b[p]]){++u;A=a.d[clb.zk(a.P,0,g.b[p])];B=a.d[clb.zk(a.P,1,g.b[p])];m=A>B?(A<<16)+B:(B<<16)+A;if(a.k[g.b[p]]==1||a.k[g.b[p]]==2){++w;v=true;if(i<m){i=m;j=g.b[p]}}}}if(u==0)continue;if(u==1){for(q=0;q<g.a.length;q++)s[g.a[q]]&&(a.bb[g.a[q]]=0);for(n=0;n<g.b.length;n++)t[g.b[n]]&&(a.k[g.b[n]]=0)}else{if(w==1){for(q=0;q<g.a.length;q++)s[g.a[q]]&&(a.bb[g.a[q]]=3);for(n=0;n<g.b.length;n++)t[g.b[n]]&&(a.k[g.b[n]]=3)}else{if((a.O&128)!=0){++a.R;for(q=0;q<g.a.length;q++)s[g.a[q]]&&(a.W[g.a[q]]=a.R);for(n=0;n<g.b.length;n++)t[g.b[n]]&&(a.V[g.b[n]]=a.R)}r=false;l!=-1?a.bb[k]==2&&(r=true):a.k[j]==2&&(r=true);if(r){for(q=0;q<g.a.length;q++){if(s[g.a[q]]){switch(a.bb[g.a[q]]){case 1:a.bb[g.a[q]]=2;break;case 2:a.bb[g.a[q]]=1;}}}for(n=0;n<g.b.length;n++){if(t[g.b[n]]){switch(a.k[g.b[n]]){case 1:a.k[g.b[n]]=2;break;case 2:a.k[g.b[n]]=1;}}}}}}}}return v};clb.We=function We(a,b){var c,d,e,f,g,h,i,j,k,l,m;f=eW(Ykb.AX,[Dnb,gmb],[7,6],15,[2,32],2);for(g=0;g<2;g++){c=gW(Ykb.AX,Dnb,7,32,0,2);m=0;for(e=0;e<32;e++){if(b[g][e]!=null){k=b[g][e].length;c[e]=gW(Ykb.AX,gmb,6,k,15,1);for(h=0;h<k;h++)c[e][h]=a.d[b[g][e][h]];alb.jgb(c[e],alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));++m}}for(l=m;l>0;l--){j=0;i=null;for(d=0;d<32;d++){if(c[d]!=null){if(i==null||i.length<c[d].length){i=c[d];j=d}else if(i.length==c[d].length){for(h=i.length-1;h>=0;h--){if(i[h]<c[d][h]){i=c[d];j=d;break}}}}}f[g][j]=l;c[j]=null}}return f};clb.Xe=function Xe(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;l=false;if(a.P.K){for(j=0;j<a.P.g;j++){if(clb.Jk(a.P,j)!=0){l=true;break}}}a.M=2;for(c=0;c<a.P.f;c++)a.M=$wnd.Math.max(a.M,clb.wn(a.P,c)+clb.Mn(a.P,c));i=$wnd.Math.max(2,l?(62+a.b+a.M*(a.b+23))/63|0:(62+a.b+a.M*(a.b+5))/63|0);a.d=gW(Ykb.AX,gmb,6,a.P.q,15,1);a.c=gW(Ykb.MX,Enb,110,a.P.f,0,1);for(d=0;d<a.P.f;d++)a.c[d]=new clb.tg(i);h=false;for(e=0;e<a.P.f;e++){clb.sg(a.c[e],e);z1(e1(clb.pk(a.P,e),1),0)||clb.kk(a.P,e)!=null?clb.pg(a.c[e],8,6):clb.pg(a.c[e],8,q1(clb.uk(a.P,e)));clb.pg(a.c[e],8,q1(clb.nk(a.P,e)));clb.pg(a.c[e],2,q1(clb.mn(a.P,e)));clb.pg(a.c[e],4,q1(clb.wn(a.P,e)+clb.Mn(a.P,e)));z1(e1(clb.pk(a.P,e),1),0)?clb.pg(a.c[e],4,8):clb.pg(a.c[e],4,q1(8+clb.dk(a.P,e)));clb.pg(a.c[e],5,q1($wnd.Math.min(31,clb.qn(a.P,e))));clb.pg(a.c[e],4,q1(clb.Me(a,e)+1));clb.pg(a.c[e],2,q1(clb.qk(a.P,e)>>4));if(a.P.K){clb.pg(a.c[e],46,clb.pk(a.P,e));clb.kk(a.P,e)!=null&&(h=true)}}a.S=clb._e(a);if(a.S<a.P.f){for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));m=gW(Ykb.AX,gmb,6,clb.wn(a.P,b),15,1);for(o=0;o<clb.wn(a.P,b);o++){m[o]=a.d[clb.vn(a.P,b,o)]<<5;m[o]|=$wnd.Math.min(31,clb.un(a.P,clb.xn(a.P,b,o)))}alb.jgb(m,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));for(p=a.M;p>m.length;p--)clb.pg(a.c[b],a.b+5,0);for(n=m.length-1;n>=0;n--)clb.pg(a.c[b],a.b+5,Ykb.m1(m[n]))}a.S=clb._e(a)}if(h&&a.S<a.P.f){for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));g=clb.kk(a.P,b);s=g==null?0:$wnd.Math.min(12,g.length);for(o=12;o>s;o--)clb.pg(a.c[b],8,0);for(n=s-1;n>=0;n--)clb.pg(a.c[b],8,Ykb.m1(g[n]))}a.S=clb._e(a)}if(l&&a.S<a.P.f){for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));k=gW(Ykb.BX,Anb,6,clb.wn(a.P,b)+clb.Mn(a.P,b),14,1);q=0;for(o=0;o<clb.hn(a.P,b);o++){if(o<clb.wn(a.P,b)||o>=clb.gn(a.P,b)){k[q]=q1(a.d[clb.vn(a.P,b,o)]);k[q]=C1(k[q],23);k[q]=B1(k[q],q1(clb.Jk(a.P,clb.xn(a.P,b,o))));++q}}alb.jgb(k,alb.Pgb(X1(dlb.rcb.prototype.lc,dlb.rcb,[])));for(p=a.M;p>k.length;p--)clb.pg(a.c[b],a.b+23,0);for(n=k.length-1;n>=0;n--)clb.pg(a.c[b],a.b+23,k[n])}a.S=clb._e(a)}if((a.O&8)!=0&&a.S<a.P.f){r=new clb.Dt;for(f=0;f<a.P.f;f++)clb.fk(a.P,f)!=null&&clb.Bt(r,clb.fk(a.P,f));for(b=0;b<a.P.f;b++){t=clb.fk(a.P,b)==null?0:1+clb.Ct(r,clb.fk(a.P,b));clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));clb.pg(a.c[b],a.b,Ykb.m1(t))}a.S=clb._e(a)}if((a.O&16)!=0&&a.S<a.P.f){for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));clb.pg(a.c[b],1,q1(clb.nl(a.P,b)?1:0))}a.S=clb._e(a)}(a.O&512)!=0&&a.P.K&&clb.Ae(a)};clb.Ye=function Ye(a){var b,c,d,e,f,g,h,i,j;for(c=0;c<a.P.f;c++){clb.sg(a.c[c],c);clb.pg(a.c[c],2*a.b+4,C1(q1(a.d[c]),a.b+4))}for(i=1;i<=a.S;i++){e=false;for(d=0;d<a.P.f;d++)a.d[d]==i&&(e=e|clb.Oe(a,d,2));if(e){h=a.S;a.S=clb._e(a);if(a.S!=h)return true;for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],2*a.b+4,C1(q1(a.d[b]),a.b+4))}}}j=gW(Ykb.NX,Enb,140,a.P.g,0,1);for(g=0;g<j.length;g++)j[g]=new clb.wg(a.d[clb.zk(a.P,0,g)],a.d[clb.zk(a.P,1,g)],g);dlb.icb(j,0,j.length,null);for(f=0;f<j.length;f++){if(clb.Je(a,j[f].a,2)){while(f+1<j.length&&clb.vg(j[f],j[f+1])==0)clb.Je(a,j[++f].a,2);h=a.S;a.S=clb._e(a);if(a.S!=h)return true;for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],2*a.b+4,C1(q1(a.d[b]),a.b+4))}}}return false};clb.Ze=function Ze(a){var b,c,d,e,f,g,h,i,j,k;f=0;for(c=0;c<a.P.f;c++)a._[c]!=0&&(a._[c]!=2||(a.O&256)==0)&&++f;if(f==0)return;k=gW(Ykb.AX,gmb,6,f,15,1);f=0;for(d=0;d<a.P.f;d++){if(a._[d]!=0&&(a._[d]!=2||(a.O&256)==0)){k[f]=a._[d]<<29|a.$[d]<<24|a.d[d]<<12|d;++f}}alb.jgb(k,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));g=0;j=0;h=k[0]&unb;while(true){++j;if(j==k.length||h!=(k[j]&unb)){e=gW(Ykb.AX,gmb,6,j-g,15,1);for(i=g;i<j;i++){b=k[i]&4095;e[i-g]=b;a.eb[b]=true}dlb.wi(a.fb,e);if(j==k.length)break;h=k[j]&unb;g=j}}};clb.$e=function $e(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;h=false;for(i=0;i<a.fb.a.length;i++){g=dlb.Bi(a.fb,i);b=true;n=-1;j=false;for(l=0;l<g.length;l++){c=g[l];if(a.bb[c]==0){b=false;break}if(a.bb[c]!=3){k=true;for(m=0;m<g.length;m++){if(m!=l&&a.d[c]==a.d[g[m]]){k=false;break}}if(k&&n<a.d[c]){n=a.d[c];j=a.bb[c]==1}}}if(b&&n!=-1){for(d=g,e=0,f=d.length;e<f;++e){c=d[e];(a.bb[c]==1||a.bb[c]==2)&&(a.cb[c]=j);a.eb[c]=false}dlb.Ji(a.fb,g);h=true;--i}}return h};clb._e=function _e(a){var b,c;b=clb.Re(a);do{c=b;clb.Ne(a);b=clb.Re(a)}while(c!=b);return b};clb.af=function af(a){(a.O&1)!=0&&(a.O&2)==0&&(a.e=dlb.Ubb(a.d,a.P.f));if((a.O&lnb)==0){a.U=gW(Ykb.Z0,Amb,6,a.P.f,16,1);a.T=gW(Ykb.Z0,Amb,6,a.P.g,16,1);if(a.S<a.P.f){clb.Be(a);if((a.O&lnb)==0){clb.$e(a);!!a.N&&clb.Ig(a.N,a.d)}}}a.e==null&&(a.O&1)!=0&&(a.O&2)!=0&&(a.e=dlb.Ubb(a.d,a.P.f));while(a.S<a.P.f){clb.Ce(a);if((a.O&lnb)==0){clb.$e(a);!!a.N&&clb.Ig(a.N,a.d)}}if((a.O&lnb)==0){clb.$e(a);clb.Ve(a);clb.zf(a)}};clb.bf=function bf(a){var b,c,d,e,f;f=a.S;e=dlb.Ubb(a.d,a.P.f);if(!a.P.K){clb.df(a);clb.Rf(a,f,e)}a._=gW(Ykb.wX,Fnb,6,a.P.f,15,1);a.$=gW(Ykb.wX,Fnb,6,a.P.f,15,1);for(c=0;c<a.P.f;c++){a._[c]=clb.ik(a.P,c)<<24>>24;a.$[c]=clb.hk(a.P,c)<<24>>24}a.j=gW(Ykb.wX,Fnb,6,a.P.g,15,1);a.i=gW(Ykb.wX,Fnb,6,a.P.g,15,1);for(d=0;d<a.P.g;d++){a.j[d]=clb.Ek(a.P,d)<<24>>24;a.i[d]=clb.Dk(a.P,d)<<24>>24}clb.cf(a);a.X=false;a.K=gW(Ykb.Z0,Amb,6,a.P.f,16,1);for(b=0;b<a.P.f;b++){if(a.bb[b]!=0){a.K[b]=true;a.X=true}}clb.ff(a);a.N=null;a.ab=gW(Ykb.Z0,Amb,6,a.P.f,16,1);if(a.X){a.N=new clb.Og(a.P,e,a.K,a.bb,a.k,a._,a.$,a.gb,a.o,a.ab);clb.Jg(a.N)}a.cb=gW(Ykb.Z0,Amb,6,a.P.f,16,1);a.eb=gW(Ykb.Z0,Amb,6,a.P.f,16,1);a.fb=new dlb.Qi;!!a.N&&clb.Ig(a.N,a.d);clb.Ze(a);clb.Rf(a,f,e);clb.ef(a);!!a.N&&(a.I=clb.Fg(a.N));clb.qf(a)};clb.cf=function cf(a){var b,c,d,e,f,g;a.J=true;f=clb.Ue(a,false);while(a.S<a.P.f&&f){for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));g=a.bb[b]<<7;if((a.bb[b]==1||a.bb[b]==2)&&a._[b]!=0){g|=a._[b]<<5;g|=a.$[b]}clb.pg(a.c[b],18,Ykb.m1(g<<9))}for(c=0;c<a.P.g;c++){d=a.k[c]<<7;if((a.k[c]==1||a.k[c]==2)&&clb.Kk(a.P,c)==1&&a.j[c]!=0){d|=a.j[c]<<5;d|=a.i[c]}clb.qg(a.c[clb.zk(a.P,0,c)],Ykb.m1(d));clb.qg(a.c[clb.zk(a.P,1,c)],Ykb.m1(d))}e=clb._e(a);if(a.S==e)break;a.S=e;f=clb.Ue(a,false)}};clb.df=function df(a){var b,c,d,e;a.J=true;a.Y=gW(Ykb.wX,Fnb,6,a.P.f,15,1);a.f=gW(Ykb.wX,Fnb,6,a.P.g,15,1);e=clb.Ue(a,true);while(a.S<a.P.f&&e){for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b+4,q1(a.d[b]<<4|a.bb[b]<<2))}for(c=0;c<a.P.g;c++){clb.qg(a.c[clb.zk(a.P,0,c)],q1(a.k[c]));clb.qg(a.c[clb.zk(a.P,1,c)],q1(a.k[c]))}d=clb._e(a);if(a.S==d)break;a.S=d;e=clb.Ue(a,true)}};clb.ef=function ef(a){var b,c,d,e,f,g,h;a.J=true;d=clb.pf(a);!!a.N&&clb.Ig(a.N,a.d)&&(d=clb.pf(a));clb.Ue(a,false)&&clb.$e(a);g=true;while(a.S<a.P.f&&g){e=clb.We(a,d);for(b=0;b<a.P.f;b++){clb.sg(a.c[b],b);clb.pg(a.c[b],a.b,q1(a.d[b]));clb.pg(a.c[b],20,0);!a.ab[b]&&a._[b]!=0&&clb.qg(a.c[b],q1((a._[b]<<18)+(e[a._[b]==1?0:1][a.$[b]]<<8)));h=a.bb[b];a.cb[b]&&(h==1?(h=2):h==2&&(h=1));clb.qg(a.c[b],Ykb.m1(h<<4))}for(c=0;c<a.P.g;c++){clb.qg(a.c[clb.zk(a.P,0,c)],q1(a.k[c]));clb.qg(a.c[clb.zk(a.P,1,c)],q1(a.k[c]))}f=clb._e(a);if(a.S==f)break;a.S=f;g=false;if(!!a.N&&clb.Ig(a.N,a.d)){g=true;d=clb.pf(a)}if(clb.Ue(a,false)){g=true;clb.$e(a)}}};clb.ff=function ff(a){var b,c;for(b=0;b<a.P.f;b++)(!a.K[b]||a.bb[b]==3)&&(a._[b]=0);for(c=0;c<a.P.g;c++)(clb.Kk(a.P,c)!=1||a.k[c]==0||a.k[c]==3)&&(a.j[c]=0)};clb.gf=function gf(a,b,c){if(a.a==null){a.a=gW(Ykb.wX,Fnb,6,a.P.f,15,1);dlb.Xbb(a.a)}a.a[b]=c<<24>>24};clb.hf=function hf(b,c){var d,e,f,g,h,i;if((b.k[c]==1||b.k[c]==2)&&!clb.Co(b.P,c)){h=false;try{for(g=0;g<2;g++){d=clb.zk(b.P,g,c);if(clb.wn(b.P,d)==3){e=gW(Ykb.AX,gmb,6,2,15,1);f=0;for(i=0;i<clb.wn(b.P,d);i++)clb.xn(b.P,d,i)!=c&&(e[f++]=clb.vn(b.P,d,i));b.d[e[0]]>b.d[e[1]]^clb.kf(b,d,e[0],e[1])&&(h=!h)}}}catch(a){a=b1(a);if(mX(a,15)){b.f[c]=3;return}else throw c1(a)}b.k[c]==1^h?(b.f[c]=1):(b.f[c]=2)}};clb.jf=function jf(b,c){var d,e,f,g,h,i,j;if(b.bb[c]==1||b.bb[c]==2){i=false;if(clb.mn(b.P,c)==2){try{for(h=0;h<2;h++){d=clb.vn(b.P,c,h);if(clb.wn(b.P,d)==3){f=gW(Ykb.AX,gmb,6,2,15,1);g=0;for(j=0;j<clb.wn(b.P,d);j++)clb.yn(b.P,d,j)==1&&(f[g++]=clb.vn(b.P,d,j));b.d[f[0]]>b.d[f[1]]^clb.kf(b,d,f[0],f[1])&&(i=!i)}}}catch(a){a=b1(a);if(mX(a,15)){b.Y[c]=3;return}else throw c1(a)}}else{try{e=clb.mf(b,c)}catch(a){a=b1(a);if(mX(a,15)){b.Y[c]=3;return}else throw c1(a)}for(h=1;h<e.length;h++)for(j=0;j<h;j++)b.d[e[h]]<b.d[e[j]]&&(i=!i)}b.bb[c]==1^i?(b.Y[c]=1):(b.Y[c]=2)}};clb.kf=function kf(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L;if(clb.uk(a.P,c)!=clb.uk(a.P,d))return clb.uk(a.P,c)>clb.uk(a.P,d);if(clb.nk(a.P,c)!=clb.nk(a.P,d)){H=clb.kl(a.P,c)?(clb.wj(),clb.uj)[clb.uk(a.P,c)]:clb.nk(a.P,c);I=clb.kl(a.P,d)?(clb.wj(),clb.uj)[clb.uk(a.P,d)]:clb.nk(a.P,d);return H>I}w=a.P.f;s=gW(Ykb.AX,gmb,6,w,15,1);u=gW(Ykb.AX,gmb,6,w,15,1);v=gW(Ykb.AX,gmb,6,w,15,1);t=gW(Ykb.Z0,Amb,6,w,16,1);i=gW(Ykb.Z0,Amb,6,a.P.q,16,1);s[0]=b;s[1]=c;s[2]=d;u[0]=-1;u[1]=0;u[2]=0;i[b]=true;i[c]=true;i[d]=true;m=1;A=2;G=gW(Ykb.AX,gmb,6,64,15,1);G[1]=1;G[2]=3;o=2;while(m<=A){while(m<G[o]){n=s[m];if(!t[m]){p=0;q=0;for(C=0;C<clb.wn(a.P,n);C++){k=clb.vn(a.P,n,C);if(A+clb.yn(a.P,n,C)+1>=w){w+=a.P.f;s=clb.Vf(s,w);u=clb.Vf(u,w);v=clb.Vf(v,w);t=clb.Wf(t,w)}if(clb.qo(a.P,clb.xn(a.P,n,C))){++p;q+=clb.uk(a.P,k)}else{for(F=1;F<clb.yn(a.P,n,C);F++){++A;s[A]=k;u[A]=m;t[A]=true}}K=u[m];if(k==s[K])continue;h=false;if(i[k]){J=u[K];while(J!=-1){if(k==s[J]){h=true;break}J=u[J]}}if(h){++A;s[A]=k;u[A]=m;t[A]=true}else{++A;s[A]=k;u[A]=m;i[k]=true}}if(p!=0){++A;v[A]=(q<<2)/p|0;u[A]=m;t[A]=true}}++m;if(m==$lb){throw c1(new Zkb.rz('Emergency break in while loop.'))}}G.length==o+1&&(G=clb.Vf(G,G.length+64));G[o+1]=A+1;for(B=G[o];B<G[o+1];B++){v[B]==0&&(v[B]=(clb.uk(a.P,s[B])==151?1:clb.uk(a.P,s[B])==152?1:clb.uk(a.P,s[B]))<<2);v[B]+=v[u[B]]<<16}clb.of(a,t,v,u,s,G,o);if(v[1]!=v[2])return v[1]>v[2];o>1&&clb.lf(v,u,G,o);++o}l=gW(Ykb.AX,gmb,6,a.P.f,15,1);D=false;for(f=0;f<a.P.f;f++){if(i[f]&&!clb.kl(a.P,f)){D=true;break}}if(D){for(g=0;g<a.P.f;g++)l[g]=clb.kl(a.P,g)?(clb.wj(),clb.uj)[clb.uk(a.P,g)]:clb.nk(a.P,g);if(clb.nf(a,t,v,u,s,l,G,o))return v[1]>v[2]}dlb.bcb(l,l.length,0);r=false;for(j=0;j<a.P.g;j++){if(i[clb.zk(a.P,0,j)]||i[clb.zk(a.P,1,j)]){if(a.f[j]==1){l[clb.zk(a.P,0,j)]=1;l[clb.zk(a.P,1,j)]=1;r=true}else if(a.f[j]==2){l[clb.zk(a.P,0,j)]=2;l[clb.zk(a.P,1,j)]=2;r=true}}}if(r&&clb.nf(a,t,v,u,s,l,G,o))return v[1]>v[2];dlb.bcb(l,l.length,0);L=false;for(e=0;e<a.P.f;e++){if(i[e]){if(a.Y[e]==2){l[e]=1;L=true}else if(a.Y[e]==1){l[e]=2;L=true}}}if(L&&clb.nf(a,t,v,u,s,l,G,o))return v[1]>v[2];throw c1(new Zkb.rz('no distinction applying CIP rules'))};clb.lf=function lf(a,b,c,d){var e,f,g,h,i,j,k,l,m;l=c[d];g=c[d+1]-l;m=gW(Ykb.KX,Ulb,142,g,0,1);for(i=0;i<g;i++){m[i]=new clb.og;m[i].c=a[i+l];m[i].b=b[i+l];m[i].a=i+l}e=new clb.lg;for(k=d;k>1;k--){for(j=0;j<g;j++){m[j].c+=a[m[j].b]<<16;m[j].b=b[m[j].b]}dlb.icb(m,0,m.length,e);f=1;for(h=0;h<g;h++){a[m[h].a]=f;h!=g-1&&clb.kg(m[h],m[h+1])!=0&&++f}}};clb.mf=function mf(a,b){var c,d,e,f,g,h,i;g=clb.gn(a.P,b);h=gW(Ykb.AX,gmb,6,g,15,1);for(e=0;e<g;e++)h[e]=clb.vn(a.P,b,e);for(d=g;d>1;d--){c=false;for(f=1;f<d;f++){if(clb.kf(a,b,h[f-1],h[f])){c=true;i=h[f-1];h[f-1]=h[f];h[f]=i}}if(!c)break}return h};clb.nf=function nf(a,b,c,d,e,f,g,h){var i,j;for(j=1;j<h;j++){for(i=g[j];i<g[j+1];i++)c[i]=f[e[i]]+(c[d[i]]<<8);clb.of(a,b,c,d,e,g,j);if(c[1]!=c[2])return true;j>1&&clb.lf(c,d,g,j)}return false};clb.of=function of(a,b,c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;for(l=g;l>1;l--){p=f[l]-f[l-1];r=gW(Ykb.IX,Ulb,141,p,0,1);h=f[l];for(o=0;o<p;o++){q=f[l-1]+o;m=h;while(m<f[l+1]&&d[m]==q)++m;r[o]=new clb.ig;r[o].c=q;r[o].d=c[q];r[o].b=b[q]?0:clb.Vn(a.P,e[q]);r[o].a=gW(Ykb.AX,gmb,6,m-h,15,1);for(k=h;k<m;k++)r[o].a[k-h]=c[k];alb.jgb(r[o].a,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));h=m}i=new clb.fg;dlb.icb(r,0,r.length,i);j=1;for(n=0;n<p;n++){c[r[n].c]=j;n!=p-1&&clb.eg(r[n],r[n+1])!=0&&++j}}};clb.pf=function pf(a){var b,c;c=eW(Ykb.AX,[Llb,Dnb],[26,7],0,[2,32],2);for(b=0;b<a.P.f;b++){a.K[b]&&(a._[b]==1?(c[0][a.$[b]]=clb.Pg(c[0][a.$[b]],b)):a._[b]==2&&(c[1][a.$[b]]=clb.Pg(c[0][a.$[b]],b)))}return c};clb.qf=function qf(a){var b,c,d,e,f,g,h,i,j,k,l,m;f=0;k=0;g=0;h=0;i=0;j=0;l=0;m=false;b=gW(Ykb.Z0,Amb,6,32,16,1);for(c=0;c<a.P.f;c++){if(a.bb[c]!=0){++f;if(a.bb[c]==3){++k}else{if(a._[c]==0){++g;!!a.N&&clb.Eg(a.N,c)&&++h}else if(a._[c]==2){a.$[c]==0&&++j}else if(a._[c]==1){e=a.$[c];if(!b[e]){++l;b[e]=true}a.$[c]==0&&++i;!!a.N&&clb.Eg(a.N,c)&&(m=true)}}}}for(d=0;d<a.P.g;d++){if(a.k[d]!=0&&clb.Kk(a.P,d)==1){++f;if(a.k[d]==3){++k}else{if(a.j[d]==0){++g;!!a.N&&clb.Eg(a.N,clb.zk(a.P,0,d))&&clb.Eg(a.N,clb.zk(a.P,1,d))&&++h}else if(a.j[d]==2){a.i[d]==0&&++j}else if(a.j[d]==1){e=a.i[d];if(!b[e]){++l;b[e]=true}a.i[d]==0&&++i;!!a.N&&clb.Eg(a.N,clb.zk(a.P,0,d))&&clb.Eg(a.N,clb.zk(a.P,1,d))&&(m=true)}}}}if(f==0){clb.km(a.P,Ylb);return}if(k!=0){clb.km(a.P,0);return}if(a.I){clb.km(a.P,Gnb+(1<<l));return}i+h==f&&!m?clb.km(a.P,196608):g==f?clb.km(a.P,tnb):j==f?clb.km(a.P,327680):g==f-1&&i==1?clb.km(a.P,Xmb):clb.km(a.P,458752+(1<<l))};clb.rf=function rf(a,b,c){while(c!=0){if(a.r==0){(!a.p||a.t!=63)&&(a.t+=64);Zkb.C5(a.s,a.t&Zlb);a.r=6;a.t=0}a.t<<=1;a.t=I1(B1(q1(a.t),e1(b,1)));b=D1(b,1);--c;--a.r}};clb.sf=function sf(a){a.t<<=a.r;(!a.p||a.t!=63)&&(a.t+=64);Zkb.C5(a.s,a.t&Zlb);return a.s.a};clb.tf=function tf(a,b){a.s=new Zkb.J5;a.r=6;a.t=0;a.p=b};clb.uf=function uf(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a.P.f==0){a.q='';return}l=false;if(a.hb&&a.P.q>a.P.f&&!a.P.K){l=true;for(i=0;i<a.P.f;i++){if(clb.Kn(a.P,i)!=0){l=false;break}}}q=a.hb?16:8;clb.tf(a,true);Zkb.C5(a.s,l?35:33);clb.rf(a,q1(a.hb?1:0),1);clb.rf(a,Ykb.m1(b?1:0),1);clb.rf(a,Ykb.m1(q/2|0),4);o=0;for(j=1;j<a.P.f;j++)o=clb.Hf(a,a.w[j],a.C[j]==-1?-1:a.w[a.C[j]],o,c);if(l){for(i=0;i<a.P.f;i++){d=a.w[i];for(n=clb.wn(a.P,d);n<clb.gn(a.P,d);n++)o=clb.Hf(a,clb.vn(a.P,d,n),d,o,c)}}if(a.P.f>1&&o==0){a.q='';return}g=1<<q;m=o/(g/2-1);p=o+m/2;for(k=1;k<a.P.f;k++)clb.vf(a,a.w[k],a.C[k]==-1?-1:a.w[a.C[k]],p,m,q,c);if(l){for(h=0;h<a.P.f;h++){d=a.w[h];for(n=clb.wn(a.P,d);n<clb.gn(a.P,d);n++)clb.vf(a,clb.vn(a.P,d,n),d,p,m,q,c)}}if(b){f=a.hb?1.5:(clb.wj(),clb.wj(),clb.vj);e=clb.xk(a.P,l?a.P.q:a.P.f,l?a.P.r:a.P.g,f,c);clb.rf(a,q1($wnd.Math.min(g-1,$wnd.Math.max(0,vX(0.5+$wnd.Math.log(e/0.1)*$wnd.Math.LOG10E/($wnd.Math.log(2000)*$wnd.Math.LOG10E)*(g-1))))),q);clb.rf(a,q1(clb.yf(c[a.w[0]].a/e,g)),q);clb.rf(a,q1(clb.yf(c[a.w[0]].b/e,g)),q);a.hb&&clb.rf(a,q1(clb.yf(c[a.w[0]].c/e,g)),q)}a.q=clb.sf(a)};clb.vf=function vf(a,b,c,d,e,f,g){var h,i,j;h=c==-1?(g[b].a-g[a.w[0]].a)/8:g[b].a-g[c].a;i=c==-1?(g[b].b-g[a.w[0]].b)/8:g[b].b-g[c].b;clb.rf(a,q1(vX((d+h)/e)),f);clb.rf(a,q1(vX((d+i)/e)),f);if(a.hb){j=c==-1?(g[b].c-g[a.w[0]].c)/8:g[b].c-g[c].c;clb.rf(a,q1(vX((d+j)/e)),f)}};clb.wf=function wf(a,b){var c;for(c=0;c<a.u;c++)b-=16;b<0&&(Zkb.O5(),String.fromCharCode(10));while(b>15){clb.rf(a,1,1);clb.rf(a,15,4);b-=16;++a.u}clb.rf(a,1,1);clb.rf(a,Ykb.m1(b),4)};clb.xf=function xf(a){var b,c,d,e,f,g;if(a.P.f==0){a.L='';return}f=0;d=false;e=false;for(c=0;c<a.P.f;c++){f<clb.mk(a.P,c)&&(f=clb.mk(a.P,c));clb._k(a.P,c)?(d=true):(e=true)}if(f==0){a.L='';return}g=clb.cg(f);clb.tf(a,true);clb.rf(a,Ykb.m1(g),4);clb.rf(a,Ykb.m1(d?1:0),1);clb.rf(a,Ykb.m1(e?1:0),1);for(b=0;b<a.P.f;b++){clb.rf(a,q1(clb.mk(a.P,a.w[b])),g);d&&e&&clb.rf(a,q1(clb._k(a.P,a.w[b])?1:0),1)}a.L=clb.sf(a)};clb.yf=function yf(a,b){var c,d,e,f;c=b/2|0;e=a<0;a=$wnd.Math.abs(a);f=b/32|0;d=$wnd.Math.min(c-1,I1(p1($wnd.Math.round(a*c/(a+f)))));return e?c+d:d};clb.zf=function zf(a){var b,c,d;for(b=0;b<a.P.f;b++){a.bb[b]==3&&!clb.Xk(a.P,b)&&clb.sm(a.P,b);(clb.ik(a.P,b)==1||clb.ik(a.P,b)==2)&&a.bb[b]==3&&clb.sm(a.P,b);clb.Xk(a.P,b)&&a.bb[b]!=3&&!clb.Tf(a,b)&&clb.sm(a.P,b)}for(d=0;d<a.P.r;d++)clb.pl(a.P,d)&&!clb.Sf(a,d)&&clb.sm(a.P,clb.zk(a.P,0,d));for(c=0;c<a.P.g;c++){if(clb.Hk(a.P,c)==2){if(clb.fl(a.P,c)&&(a.k[c]==1||a.k[c]==2)){a.k[c]=3;clb.jm(a.P,c,386)}if(a.k[c]==3&&!a.n[c]){if(clb.Kk(a.P,c)!=386){clb.sm(a.P,clb.zk(a.P,0,c));clb.sm(a.P,clb.zk(a.P,1,c))}}}if(clb.Kk(a.P,c)==1&&a.k[c]==3&&!clb.Xk(a.P,clb.zk(a.P,0,c))&&!clb.Xk(a.P,clb.zk(a.P,1,c))){clb.sm(a.P,clb.zk(a.P,0,c));clb.sm(a.P,clb.zk(a.P,1,c))}if((clb.Ek(a.P,c)==1||clb.Ek(a.P,c)==2)&&(clb.Kk(a.P,c)!=1||a.k[c]!=1&&a.k[c]!=2)){clb.sm(a.P,clb.zk(a.P,0,c));clb.sm(a.P,clb.zk(a.P,1,c))}}};clb.Af=function Af(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;if(a.P.f==0)return;if(a.D)return;a.G=0;v=0;for(c=1;c<a.P.f;c++)a.d[c]>a.d[v]&&(v=c);d=gW(Ykb.Z0,Amb,6,a.P.f,16,1);g=gW(Ykb.Z0,Amb,6,a.P.g,16,1);a.F=gW(Ykb.AX,gmb,6,a.P.f,15,1);a.w=gW(Ykb.AX,gmb,6,a.P.f,15,1);a.C=gW(Ykb.AX,gmb,6,a.P.f,15,1);a.A=gW(Ykb.AX,gmb,6,a.P.g,15,1);a.w[0]=v;a.F[v]=0;d[v]=true;e=1;i=0;j=1;k=0;while(i<a.P.f){if(i<j){while(true){o=0;p=0;m=-1;b=a.w[i];for(q=0;q<clb.hn(a.P,b);q++){if(q<clb.wn(a.P,b)||q>=clb.gn(a.P,b)){h=clb.vn(a.P,b,q);if(!d[h]&&a.d[h]>m){o=h;p=clb.xn(a.P,b,q);m=a.d[h]}}}if(m==-1)break;a.F[o]=j;a.C[j]=i;a.w[j++]=o;a.A[k++]=p;d[o]=true;g[p]=true}++i}else{n=0;m=-1;for(b=0;b<a.P.f;b++){if(!d[b]&&a.d[b]>m){n=b;m=a.d[b]}}++e;a.F[n]=j;a.C[j]=-1;a.w[j++]=n;d[n]=true}}a.B=gW(Ykb.AX,gmb,6,2*(a.P.g-k),15,1);while(true){s=a.P.M;t=a.P.M;u=-1;for(f=0;f<a.P.g;f++){if(!g[f]){if(a.F[clb.zk(a.P,0,f)]<a.F[clb.zk(a.P,1,f)]){r=a.F[clb.zk(a.P,0,f)];l=a.F[clb.zk(a.P,1,f)]}else{r=a.F[clb.zk(a.P,1,f)];l=a.F[clb.zk(a.P,0,f)]}if(r<s||r==s&&l<t){s=r;t=l;u=f}}}if(u==-1)break;g[u]=true;a.A[k++]=u;a.B[2*a.G]=s;a.B[2*a.G+1]=t;++a.G}a.D=true};clb.Bf=function Bf(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;i=null;o=clb.Xn(a.P);for(l=0;l<o.i.a.length;l++){if(o.e[l]){f=0;m=dlb.Bi(o.i,l);for(c=m,d=0,e=c.length;d<e;++d){b=c[d];clb.Nf(a,b)&&++f}if(f!=0){n=dlb.Bi(o.j,l);i==null&&(i=gW(Ykb.Z0,Amb,6,a.P.g,16,1));if(f==m.length){j=-1;k=Qlb;for(g=0;g<m.length;g++){if(k>a.w[n[g]]){k=a.w[n[g]];j=g}}while(f>0){i[n[j]]=true;j=clb._f(j+2,m.length);f-=2}}else{h=0;while(clb.Nf(a,m[h]))++h;while(!clb.Nf(a,m[h]))h=clb._f(h+1,m.length);while(f>0){i[n[h]]=true;h=clb._f(h+2,m.length);f-=2;while(!clb.Nf(a,m[h]))h=clb._f(h+1,m.length)}}}}}return i};clb.Cf=function Cf(a,b){return a.k[b]};clb.Df=function Df(a){return clb.Ef(a,a.hb)};clb.Ef=function Ef(a,b){if(a.q==null){clb.Af(a);clb.uf(a,b,a.P.J)}return a.q};clb.Ff=function Ff(a){if(a.L==null){clb.Af(a);clb.xf(a)}return a.L};clb.Gf=function Gf(a){if(a.H==null){clb.Af(a);if((a.O&lnb)==0){clb.Pf(a);clb.Qf(a,1);clb.Qf(a,2)}clb.Of(a)}return a.H};clb.Hf=function Hf(a,b,c,d,e){var f,g,h;f=c==-1?$wnd.Math.abs(e[b].a-e[a.w[0]].a)/8:$wnd.Math.abs(e[b].a-e[c].a);d<f&&(d=f);g=c==-1?$wnd.Math.abs(e[b].b-e[a.w[0]].b)/8:$wnd.Math.abs(e[b].b-e[c].b);d<g&&(d=g);if(a.hb){h=c==-1?$wnd.Math.abs(e[b].c-e[a.w[0]].c)/8:$wnd.Math.abs(e[b].c-e[c].c);d<h&&(d=h)}return d};clb.If=function If(a,b){return a.V[b]};clb.Jf=function Jf(a,b){return a.W[b]};clb.Kf=function Kf(a,b){return a.e==null?-1:a.e[b]};clb.Lf=function Lf(a,b){return a.bb[b]};clb.Mf=function Mf(a,b){var c,d,e,f,g,h,i;i=clb.Xn(a.P);for(c=0;c<i.i.a.length;c++){if(i.d[c]&&clb.tr(i,c,b)){for(e=dlb.Bi(i.i,c),f=0,g=e.length;f<g;++f){d=e[f];if(d!=b)for(h=0;h<clb.wn(a.P,d);h++)if(clb.no(a.P,clb.xn(a.P,d,h)))return true}return false}}return false};clb.Nf=function Nf(a,b){var c,d,e;if(clb.mn(a.P,b)<2)return false;if(clb.wn(a.P,b)==2)return true;c=0;for(e=0;e<clb.wn(a.P,b);e++){d=clb.xn(a.P,b,e);clb.mo(a.P,d)&&(c+=clb.Hk(a.P,d)-1)}return c>1};\nclb.Of=function Of(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X;clb.tf(a,false);clb.rf(a,9,4);T=$wnd.Math.max(clb.cg(a.P.f),clb.cg(a.P.g));clb.rf(a,Ykb.m1(T),4);if(T==0){clb.rf(a,q1(a.P.K?1:0),1);clb.rf(a,0,1);a.H=clb.sf(a);return}U=W=V=H=0;for(i=0;i<a.P.f;i++){if(o1(e1(clb.pk(a.P,i),1),0)){switch(clb.uk(a.P,i)){case 6:break;case 7:++U;break;case 8:++W;break;default:++V;}clb.dk(a.P,i)!=0&&++H}}clb.rf(a,q1(a.P.f),T);clb.rf(a,q1(a.P.g),T);clb.rf(a,Ykb.m1(U),T);clb.rf(a,Ykb.m1(W),T);clb.rf(a,Ykb.m1(V),T);clb.rf(a,Ykb.m1(H),T);for(j=0;j<a.P.f;j++)clb.uk(a.P,a.w[j])==7&&o1(e1(clb.pk(a.P,a.w[j]),1),0)&&clb.rf(a,Ykb.m1(j),T);for(m=0;m<a.P.f;m++)clb.uk(a.P,a.w[m])==8&&o1(e1(clb.pk(a.P,a.w[m]),1),0)&&clb.rf(a,Ykb.m1(m),T);for(n=0;n<a.P.f;n++)if(clb.uk(a.P,a.w[n])!=6&&clb.uk(a.P,a.w[n])!=7&&clb.uk(a.P,a.w[n])!=8&&o1(e1(clb.pk(a.P,a.w[n]),1),0)){clb.rf(a,Ykb.m1(n),T);clb.rf(a,q1(clb.uk(a.P,a.w[n])),8)}for(o=0;o<a.P.f;o++)if(clb.dk(a.P,a.w[o])!=0&&o1(e1(clb.pk(a.P,a.w[o]),1),0)){clb.rf(a,Ykb.m1(o),T);clb.rf(a,q1(8+clb.dk(a.P,a.w[o])),4)}S=0;v=0;for(p=1;p<a.P.f;p++){if(a.C[p]==-1){L=0}else{L=1+a.C[p]-v;v=a.C[p]}S<L&&(S=L)}K=clb.cg(S);clb.rf(a,Ykb.m1(K),4);v=0;for(q=1;q<a.P.f;q++){if(a.C[q]==-1){L=0}else{L=1+a.C[q]-v;v=a.C[q]}clb.rf(a,Ykb.m1(L),K)}for(N=0;N<2*a.G;N++)clb.rf(a,q1(a.B[N]),T);for(A=0;A<a.P.g;A++){G=(clb.Jk(a.P,a.A[A])&nnb)!=0||clb.Kk(a.P,a.A[A])==32?1:clb.qo(a.P,a.A[A])?0:$wnd.Math.min(3,clb.Hk(a.P,a.A[A]));clb.rf(a,Ykb.m1(G),2)}c=0;if((a.O&lnb)==0){for(r=0;r<a.P.f;r++)a.Z[a.w[r]]!=0&&a.Z[a.w[r]]!=3&&++c}clb.rf(a,Ykb.m1(c),T);if((a.O&lnb)==0){for(r=0;r<a.P.f;r++){if(a.Z[a.w[r]]!=0&&a.Z[a.w[r]]!=3){clb.rf(a,Ykb.m1(r),T);if(a._[a.w[r]]==0){clb.rf(a,q1(a.Z[a.w[r]]),3)}else{X=a.Z[a.w[r]]==1?a._[a.w[r]]==1?4:6:a._[a.w[r]]==1?5:7;clb.rf(a,Ykb.m1(X),3);clb.rf(a,q1(a.$[a.w[r]]),3)}}}}b=0;if((a.O&lnb)==0){for(B=0;B<a.P.g;B++)a.g[a.A[B]]!=0&&a.g[a.A[B]]!=3&&(!clb.Co(a.P,a.A[B])||clb.Kk(a.P,a.A[B])==1)&&++b}clb.rf(a,Ykb.m1(b),T);if((a.O&lnb)==0){for(B=0;B<a.P.g;B++){if(a.g[a.A[B]]!=0&&a.g[a.A[B]]!=3&&(!clb.Co(a.P,a.A[B])||clb.Kk(a.P,a.A[B])==1)){clb.rf(a,Ykb.m1(B),T);if(clb.Kk(a.P,a.A[B])==1){if(a.j[a.A[B]]==0){clb.rf(a,q1(a.g[a.A[B]]),3)}else{X=a.g[a.A[B]]==1?a.j[a.A[B]]==1?4:6:a.j[a.A[B]]==1?5:7;clb.rf(a,Ykb.m1(X),3);clb.rf(a,q1(a.i[a.A[B]]),3)}}else{clb.rf(a,q1(a.g[a.A[B]]),2)}}}}clb.rf(a,q1(a.P.K?1:0),1);I=0;for(s=0;s<a.P.f;s++)clb.nk(a.P,a.w[s])!=0&&++I;if(I!=0){clb.wf(a,1);clb.rf(a,Ykb.m1(I),T);for(r=0;r<a.P.f;r++){if(clb.nk(a.P,a.w[r])!=0){clb.rf(a,Ykb.m1(r),T);clb.rf(a,q1(clb.nk(a.P,a.w[r])),8)}}}a.u=0;if(a.P.K){clb.ye(a,0,T,lnb,1,-1);clb.ye(a,3,T,Imb,1,-1);clb.ye(a,4,T,120,4,3);clb.ye(a,5,T,Hnb,2,1);clb.ye(a,6,T,1,1,-1);clb.ye(a,7,T,Mmb,4,7);I=0;for(r=0;r<a.P.f;r++)clb.kk(a.P,a.w[r])!=null&&++I;if(I>0){clb.wf(a,8);clb.rf(a,Ykb.m1(I),T);for(t=0;t<a.P.f;t++){u=clb.kk(a.P,a.w[t]);if(u!=null){clb.rf(a,Ykb.m1(t),T);clb.rf(a,q1(u.length),4);for(e=u,f=0,g=e.length;f<g;++f){d=e[f];clb.rf(a,Ykb.m1(d),8)}}}}clb.ze(a,9,T,384,2,7);clb.ze(a,10,T,31,5,0);clb.ye(a,11,T,knb,1,-1);clb.ze(a,12,T,nnb,8,9);clb.ye(a,13,T,Smb,3,14);clb.ye(a,14,T,Tmb,5,17);clb.ye(a,16,T,inb,3,22)}I=0;for(k=0;k<a.P.f;k++)a.a!=null&&a.a[a.w[k]]!=-1&&++I;if(I!=0){clb.wf(a,17);clb.rf(a,Ykb.m1(I),T);for(r=0;r<a.P.f;r++){if(a.a!=null&&a.a[a.w[r]]!=-1){clb.rf(a,Ykb.m1(r),T);clb.rf(a,q1(a.a[a.w[r]]),4)}}}if((a.O&8)!=0||(a.O&Nmb)!=0){I=0;R=0;for(r=0;r<a.P.f;r++){P=clb.fk(a.P,a.w[r]);if(P!=null){++I;R=$wnd.Math.max(R,alb.Pgb(P).length)}}if(I!=0){Q=clb.cg(R);clb.wf(a,18);clb.rf(a,Ykb.m1(I),T);clb.rf(a,Ykb.m1(Q),4);for(t=0;t<a.P.f;t++){J=clb.fk(a.P,a.w[t]);if(J!=null){clb.rf(a,Ykb.m1(t),T);clb.rf(a,q1(alb.Pgb(J).length),Q);for(M=0;M<alb.Pgb(J).length;M++)clb.rf(a,(alb.Kgb(M,alb.Pgb(J).length),q1(alb.Pgb(J).charCodeAt(M))),7)}}}}if(a.P.K){clb.ye(a,19,T,Omb,3,25);clb.ze(a,20,T,Ymb,3,17)}I=0;for(l=0;l<a.P.f;l++)clb.qk(a.P,a.w[l])!=0&&++I;if(I!=0){clb.wf(a,21);clb.rf(a,Ykb.m1(I),T);for(h=0;h<a.P.f;h++){if(clb.qk(a.P,a.w[h])!=0){clb.rf(a,Ykb.m1(h),T);clb.rf(a,q1(clb.qk(a.P,a.w[h])>>4),2)}}}if(a.P.K){clb.ye(a,22,T,jnb,1,-1);clb.ze(a,23,T,Inb,1,-1);clb.ze(a,24,T,onb,2,21)}if((a.O&16)!=0){for(h=0;h<a.P.f;h++){if(clb.nl(a.P,a.w[h])){clb.wf(a,25);for(d=0;d<a.P.f;d++)clb.rf(a,q1(clb.nl(a.P,a.w[d])?1:0),1);break}}}O=clb.Bf(a);if(O!=null){I=0;for(B=0;B<a.P.g;B++)O[a.A[B]]&&++I;clb.wf(a,26);clb.rf(a,Ykb.m1(I),T);for(C=0;C<a.P.g;C++)O[a.A[C]]&&clb.rf(a,Ykb.m1(C),T)}a.P.K&&clb.ye(a,27,T,Bmb,1,-1);I=0;for(D=0;D<a.P.g;D++)clb.Kk(a.P,a.A[D])==32&&++I;if(I!=0){clb.wf(a,28);clb.rf(a,Ykb.m1(I),T);for(B=0;B<a.P.g;B++)clb.Kk(a.P,a.A[B])==32&&clb.rf(a,Ykb.m1(B),T)}if(a.P.K){clb.ye(a,29,T,Jnb,2,30);clb.ye(a,30,T,kmb,7,32);clb.ye(a,32,T,Knb,2,44);clb.ye(a,33,T,$mb,5,39);clb.ye(a,34,T,Lmb,1,-1);clb.ze(a,35,T,Lnb,1,-1);clb.ze(a,36,T,96,2,5)}I=0;for(F=0;F<a.P.g;F++)(clb.Kk(a.P,a.A[F])==8||clb.Kk(a.P,a.A[F])==16)&&++I;if(I!=0){clb.wf(a,37);clb.rf(a,Ykb.m1(I),T);for(w=0;w<a.P.g;w++){if(clb.Kk(a.P,a.A[w])==8||clb.Kk(a.P,a.A[w])==16){clb.rf(a,Ykb.m1(w),T);clb.rf(a,q1(clb.Kk(a.P,a.A[w])==8?0:1),1)}}}clb.rf(a,0,1);a.H=clb.sf(a)};clb.Pf=function Pf(a){var b,c,d,e,f,g,h,i,j,k,l;a.Z=gW(Ykb.wX,Fnb,6,a.P.f,15,1);for(b=0;b<a.P.f;b++){if(a.bb[b]==1||a.bb[b]==2){i=a.cb[b];if(clb.oo(a.P,b)){for(h=0;h<clb.wn(a.P,b);h++){e=clb.vn(a.P,b,h);l=0;k=gW(Ykb.AX,gmb,6,3,15,1);for(j=0;j<clb.wn(a.P,e);j++){k[l]=clb.vn(a.P,e,j);k[l]!=b&&++l}l==2&&a.d[k[0]]>a.d[k[1]]^a.F[k[0]]<a.F[k[1]]&&(i=!i)}}else{for(h=1;h<clb.wn(a.P,b);h++){for(j=0;j<h;j++){f=clb.vn(a.P,b,h);g=clb.vn(a.P,b,j);a.d[f]>a.d[g]&&(i=!i);a.F[f]<a.F[g]&&(i=!i)}}}a.Z[b]=a.bb[b]==1^i?1:2}else{a.Z[b]=a.bb[b]}}a.g=gW(Ykb.wX,Fnb,6,a.P.g,15,1);for(c=0;c<a.P.g;c++){if(a.k[c]==1||a.k[c]==2){i=false;for(h=0;h<2;h++){d=clb.zk(a.P,h,c);if(clb.wn(a.P,d)==3){k=gW(Ykb.AX,gmb,6,2,15,1);l=0;for(j=0;j<3;j++)clb.vn(a.P,d,j)!=clb.zk(a.P,1-h,c)&&(k[l++]=clb.vn(a.P,d,j));a.d[k[0]]>a.d[k[1]]&&(i=!i);a.F[k[0]]<a.F[k[1]]&&(i=!i)}}a.g[c]=a.k[c]==1^i?1:2}else{a.g[c]=a.k[c]}}};clb.Qf=function Qf(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;i=gW(Ykb.AX,gmb,6,32,15,1);j=0;for(d=0;d<a.P.f;d++){if((a.Z[d]==1||a.Z[d]==2)&&a._[d]==b){h=a.$[d];if(i[h]<a.d[d]){i[h]==0&&++j;i[h]=a.d[d]}}}for(f=0;f<a.P.g;f++){if((a.g[f]==1||a.g[f]==2)&&a.j[f]==b&&clb.Kk(a.P,f)==1){h=a.i[f];o=$wnd.Math.max(a.d[clb.zk(a.P,0,f)],a.d[clb.zk(a.P,1,f)]);if(i[h]<o){i[h]==0&&++j;i[h]=o}}}g=gW(Ykb.wX,Fnb,6,32,15,1);for(k=0;k<j;k++){m=-1;n=0;for(l=0;l<32;l++){if(n<i[l]){n=i[l];m=l}}i[m]=0;g[m]=k<<24>>24}for(c=0;c<a.P.f;c++)(a.Z[c]==1||a.Z[c]==2)&&a._[c]==b&&(a.$[c]=g[a.$[c]]);for(e=0;e<a.P.g;e++)(a.g[e]==1||a.g[e]==2)&&a.j[e]==b&&clb.Kk(a.P,e)==1&&(a.i[e]=g[a.i[e]])};clb.Rf=function Rf(a,b,c){var d,e;a.S=b;for(d=0;d<a.P.f;d++){a.d[d]=c[d];a.bb[d]=0;a.gb[d]=false}for(e=0;e<a.P.g;e++){a.k[e]=0;a.o[e]=false}};clb.Sf=function Sf(a,b){var c,d,e;c=clb.zk(a.P,0,b);if(c>=a.P.f)return false;if(a.bb[c]==1||a.bb[c]==2)return true;if(a.bb[c]==3)return false;d=clb.cn(a.P,c);if(d!=-1)return a.k[d]==1||a.k[d]==2;for(e=0;e<clb.wn(a.P,c);e++){if(clb.yn(a.P,c,e)==2){if(a.bb[clb.vn(a.P,c,e)]==1||a.bb[clb.vn(a.P,c,e)]==2)return true}}return false};clb.Tf=function Tf(a,b){var c;for(c=0;c<clb.wn(a.P,b);c++)if(a.k[clb.xn(a.P,b,c)]==3&&clb.yn(a.P,b,c)==1)return true;return false};clb.Uf=function Uf(a){var b,c,d,e,f,g,h;g=gW(Ykb.AX,gmb,6,a.S+1,15,1);for(c=0;c<a.P.f;c++){clb.ik(a.P,c)==0&&(a.bb[c]==1?++g[a.d[c]]:a.bb[c]==2&&--g[a.d[c]])}for(e=0;e<a.P.g;e++){if(clb.Hk(a.P,e)==1&&clb.Ek(a.P,e)==0){if(a.k[e]==1){++g[a.d[clb.zk(a.P,0,e)]];++g[a.d[clb.zk(a.P,1,e)]]}else if(a.k[e]==2){--g[a.d[clb.zk(a.P,0,e)]];--g[a.d[clb.zk(a.P,1,e)]]}}}for(h=1;h<=a.S;h++){if(g[h]!=0){f=g[h]<0;if(f){for(b=0;b<a.P.f;b++){clb.ik(a.P,b)==0&&(a.bb[b]==1?(a.bb[b]=2):a.bb[b]==2&&(a.bb[b]=1))}for(d=0;d<a.P.g;d++){clb.Hk(a.P,d)==1&&clb.Ek(a.P,d)==0&&(a.k[d]==1?(a.k[d]=2):a.k[d]==2&&(a.k[d]=1))}}return f}}return false};clb.Vf=function Vf(a,b){var c;c=gW(Ykb.AX,gmb,6,b,15,1);Zkb.P5(a,0,c,0,a.length);return c};clb.Wf=function Wf(a,b){var c;c=gW(Ykb.Z0,Amb,6,b,16,1);Zkb.P5(a,0,c,0,a.length);return c};clb.Xf=function Xf(a){var b,c;if(a.Y!=null)for(b=0;b<a.P.f;b++)clb.Hl(a.P,b,a.Y[b]);if(a.f!=null)for(c=0;c<a.P.g;c++)clb.cm(a.P,c,a.f[c])};clb.Yf=function Yf(a){var b,c,d,e,f,g,h,i,j,k,l;for(b=0;b<a.P.f;b++){if(a.bb[b]==1||a.bb[b]==2){i=false;if(clb.oo(a.P,b)){for(h=0;h<clb.wn(a.P,b);h++){e=clb.vn(a.P,b,h);l=0;k=gW(Ykb.AX,gmb,6,3,15,1);for(j=0;j<clb.wn(a.P,e);j++){k[l]=clb.vn(a.P,e,j);k[l]!=b&&++l}l==2&&a.d[k[0]]>a.d[k[1]]^k[0]<k[1]&&(i=!i)}}else{for(h=1;h<clb.wn(a.P,b);h++){for(j=0;j<h;j++){f=clb.vn(a.P,b,h);g=clb.vn(a.P,b,j);a.d[f]>a.d[g]&&(i=!i);f<g&&(i=!i)}}}clb.Tl(a.P,b,a.bb[b]==1^i?1:2,a.db[b])}else{clb.Tl(a.P,b,a.bb[b],a.db[b])}}for(c=0;c<a.P.g;c++){if(a.k[c]==1||a.k[c]==2){i=false;for(h=0;h<2;h++){d=clb.zk(a.P,h,c);if(clb.wn(a.P,d)==3){k=gW(Ykb.AX,gmb,6,2,15,1);l=0;for(j=0;j<3;j++)clb.vn(a.P,d,j)!=clb.zk(a.P,1-h,c)&&(k[l++]=clb.vn(a.P,d,j));a.d[k[0]]>a.d[k[1]]&&(i=!i);k[0]<k[1]&&(i=!i)}}clb.gm(a.P,c,a.k[c]==1^i?1:2,a.n[c])}else{clb.gm(a.P,c,a.k[c],a.n[c])}}};clb.Zf=function Zf(a){var b;for(b=0;b<a.P.f;b++){clb.Xl(a.P,b,a.K[b])}};clb.$f=function $f(a){var b,c,d;for(b=0;b<a.P.f;b++)!clb.Xk(a.P,b)&&a.bb[b]==3&&clb.Kl(a.P,b,true);for(c=0;c<a.P.g;c++){if(a.k[c]==3){d=clb.Hk(a.P,c);d==1?clb.Kl(a.P,clb.zk(a.P,0,c),true):d==2&&clb.jm(a.P,c,386)}}};clb._f=function _f(a,b){return a<b?a:a-b};clb.ag=function ag(a){clb.bg.call(this,a,0)};clb.bg=function bg(a,b){this.P=a;this.O=b;clb.Gt(this.P,7);this.b=clb.cg(this.P.f);(this.O&lnb)==0&&clb.Te(this);this.hb=(b&64)!=0||clb.Wk(this.P);if((this.O&lnb)==0){this.bb=gW(Ykb.wX,Fnb,6,this.P.f,15,1);this.db=gW(Ykb.Z0,Amb,6,this.P.f,16,1);this.gb=gW(Ykb.Z0,Amb,6,this.P.f,16,1);this.k=gW(Ykb.wX,Fnb,6,this.P.g,15,1);this.o=gW(Ykb.Z0,Amb,6,this.P.g,16,1);this.n=gW(Ykb.Z0,Amb,6,this.P.g,16,1)}clb.Xe(this);(this.O&lnb)==0&&clb.bf(this);clb.af(this)};clb.cg=function cg(a){var b;b=0;while(a>0){a>>=1;++b}return b};U1(28,1,{},clb.ag,clb.bg);_.b=0;_.p=false;_.r=0;_.t=0;_.u=0;_.D=false;_.G=0;_.I=false;_.J=false;_.M=0;_.O=0;_.R=0;_.S=0;_.X=false;_.hb=false;Ykb.SX=w3(28);clb.dg=function dg(a,b){var c,d,e,f;if(a.d!=b.d)return a.d>b.d?1:-1;e=a.a.length;f=b.a.length;c=$wnd.Math.min(e,f);for(d=0;d<c;d++){--e;--f;if(a.a[e]!=b.a[f])return a.a[e]>b.a[f]?1:-1}if(e!=f)return e>f?1:-1;if(a.b!=b.b)return a.b>b.b?1:-1;return 0};clb.eg=function eg(a,b){return clb.dg(a,b)};clb.fg=function fg(){};U1(238,1,{},clb.fg);_.pb=function gg(a,b){return clb.eg(a,b)};_.ib=function hg(a){return this===a};Ykb.JX=w3(238);clb.ig=function ig(){};U1(141,1,{141:1},clb.ig);_.b=0;_.c=0;_.d=0;Ykb.IX=w3(141);clb.jg=function jg(a,b){if(a.c!=b.c)return a.c>b.c?1:-1;return 0};clb.kg=function kg(a,b){return clb.jg(a,b)};clb.lg=function lg(){};U1(239,1,{},clb.lg);_.pb=function mg(a,b){return clb.kg(a,b)};_.ib=function ng(a){return this===a};Ykb.LX=w3(239);clb.og=function og(){};U1(142,1,{142:1},clb.og);_.a=0;_.b=0;_.c=0;Ykb.KX=w3(142);clb.pg=function pg(a,b,c){if(a.b==0){++a.c;a.b=63}if(a.b==63){a.d[a.c]=B1(a.d[a.c],c);a.b-=b}else{if(a.b>=b){a.d[a.c]=C1(a.d[a.c],b);a.d[a.c]=B1(a.d[a.c],c);a.b-=b}else{a.d[a.c]=C1(a.d[a.c],a.b);a.d[a.c]=B1(a.d[a.c],D1(c,b-a.b));b-=a.b;++a.c;a.b=63-b;a.d[a.c]=B1(a.d[a.c],e1(c,Ykb.m1((1<<b)-1)))}}};clb.qg=function qg(a,b){a.d[a.c]=d1(a.d[a.c],b)};clb.rg=function rg(a,b){var c;for(c=0;c<a.c;c++)if(z1(a.d[c],b.d[c]))return u1(a.d[c],b.d[c])?-1:1;return o1(a.d[a.c],b.d[a.c])?0:u1(a.d[a.c],b.d[a.c])?-1:1};clb.sg=function sg(a,b){a.a=b;a.c=0;a.b=63;dlb.Zbb(a.d)};clb.tg=function tg(a){this.d=gW(Ykb.BX,Anb,6,a,14,1)};U1(110,1,{110:1,27:1},clb.tg);_.qb=function ug(a){return clb.rg(this,a)};_.a=0;_.b=0;_.c=0;Ykb.MX=w3(110);clb.vg=function vg(a,b){if(a.b!=b.b)return a.b>b.b?-1:1;if(a.c!=b.c)return a.c>b.c?-1:1;return 0};clb.wg=function wg(a,b,c){this.b=$wnd.Math.max(a,b);this.c=$wnd.Math.min(a,b);this.a=c};U1(140,1,{140:1,27:1},clb.wg);_.qb=function xg(a){return clb.vg(this,a)};_.a=0;_.b=0;_.c=0;Ykb.NX=w3(140);clb.yg=function yg(a,b,c,d){this.a=(alb.Agb(b),dlb.Wbb(a,gW(Ykb.AX,gmb,6,b,15,1),b));this.b=(alb.Agb(d),dlb.Wbb(c,gW(Ykb.AX,gmb,6,d,15,1),d))};U1(172,1,{172:1},clb.yg);Ykb.OX=w3(172);clb.zg=function zg(a,b){var c,d;for(d=0;d<a.g[b].length;d++){c=a.g[b][d];if(a.f[c]&&(a.o[c]==1||a.o[c]==2)&&a.k[c]==0)return true}return false};clb.Ag=function Ag(a,b,c){var d,e,f,g,h;e=0;g=0;for(h=0;h<a.g[b].length;h++){d=a.g[b][h];if(a.k[d]==c){f=1<<a.j[d];if((g&f)==0){g|=f;++e}}}return e};clb.Bg=function Bg(a){var b,c,d,e,f,g,h,i,j,k,l,m;k=new dlb.hfb;for(l=0;l<a.i.f;l++){if(clb.mn(a.i,l)<2||clb.wn(a.i,l)>2){for(g=1;g<clb.wn(a.i,l);g++){b=clb.vn(a.i,l,g);for(h=0;h<g;h++){c=clb.vn(a.i,l,h);clb.Gg(a,b,c)&&(i=clb.Ng(a,b,c),!!i&&clb.Up(i,a.f)&&dlb.keb(k.a,i,(Zkb.L2(),K2))==null)}}}}for(m=0;m<a.i.g;m++){if(a.c[m]!=0){if(clb.Hk(a.i,m)!=2||a.c[m]!=2)continue}b=clb.zk(a.i,0,m);c=clb.zk(a.i,1,m);clb.Gg(a,b,c)&&(i=clb.Ng(a,b,c),!!i&&clb.Up(i,a.f)&&dlb.keb(k.a,i,(Zkb.L2(),K2))==null)}a.g=gW(Ykb.AX,Dnb,7,k.a.c,0,2);a.e=gW(Ykb.Z0,Amb,6,a.i.f,16,1);f=0;for(j=(e=new dlb.Ceb((new dlb.Heb((new dlb.Wab(k.a)).a)).b),new dlb.cbb(e));dlb.H9(j.a.a);){i=(d=dlb.Aeb(j.a),d.hc());a.g[f++]=i.b;for(g=0;g<i.b.length;g++)a.e[i.b[g]]=true}};clb.Cg=function Cg(a,b,c,d){var e,f,g,h,i,j,k;e=gW(Ykb.AX,gmb,6,clb.wn(a.i,c),15,1);h=0;for(g=0;g<clb.wn(a.i,c);g++){e[h]=clb.vn(a.i,c,g);!d[e[h]]&&clb.Gg(a,b,e[h])&&++h}if(h==0)return -1;if(h==1)return e[0];i=-1;j=Qlb;for(f=0;f<h;f++){k=clb.Un(a.i,b,e[f],Qlb,d);if(k<j){j=k;i=e[f]}}return i};clb.Dg=function Dg(a,b){return a.f[b]&&(a.o[b]==1||a.o[b]==2)};clb.Eg=function Eg(a,b){return a.e[b]};clb.Fg=function Fg(a){var b,c;c=true;for(b=0;b<a.i.f;b++){if(a.o[b]!=0&&!a.e[b]){c=false;break}}return c};clb.Gg=function Gg(a,b,c){var d,e,f,g,h;if(b==c)return false;if(a.a[b]!=a.a[c])return false;if(a.o[b]!=0){if(a.o[b]==3||a.o[c]==3)return false;if(a.p[b]^a.o[b]!==a.o[c])return false;if(a.k[b]!==a.k[c]||a.j[b]!==a.j[c])return false}d=clb.tn(a.i,b,c);if(d!=-1){if(clb.Hk(a.i,d)==1&&a.c[d]!=0)return false;if(clb.Hk(a.i,d)==2&&a.c[d]==1)return false}if(clb.mn(a.i,b)==1&&!clb.lo(a.i,b)){e=-1;for(h=0;h<clb.wn(a.i,b);h++){if(clb.vn(a.i,b,h)!=c&&clb.yn(a.i,b,h)==2){e=clb.xn(a.i,b,h);break}}f=-1;for(g=0;g<clb.wn(a.i,c);g++){if(clb.vn(a.i,c,g)!=b&&clb.yn(a.i,c,g)==2){f=clb.xn(a.i,c,g);break}}if(e!=-1&&a.c[e]!=0&&a.d[e]^a.c[e]===a.c[f])return false}return true};clb.Hg=function Hg(a,b,c,d,e){var f,g,h,i,j,k;i=null;f=null;for(k=0;k<a.g[b].length;k++){g=a.g[b][k];a.f[g]&&(a.o[g]==1||a.o[g]==2)&&(a.k[g]==0?(f=clb.Pg(f,(e[g]<<16)+g)):a.k[g]==d&&a.j[g]==c&&(i=clb.Pg(i,(e[g]<<16)+g)))}h=clb.bh(i,f);if(h==0)return false;if(h<0){for(j=0;j<a.g[b].length;j++){g=a.g[b][j];if(a.f[g]&&(a.o[g]==1||a.o[g]==2)){if(a.k[g]==0){a.k[g]=d<<24>>24;a.j[g]=c<<24>>24}else if(a.k[g]==d&&a.j[g]==c){a.k[g]=0;a.j[g]=-1}}}}return true};clb.Ig=function Ig(a,b){var c,d,e,f,g,h;if(!a.b)return false;e=false;for(f=a.b.a.length-1;f>=0;f--){d=false;g=dlb.Bi(a.b,f);g.a==2?(d=clb.Hg(a,g.b,g.c,g.d,b)):g.a==1&&(d=clb.Mg(a,g.b,b));if(d){dlb.Ji(a.b,g);for(h=0;h<a.g[g.b].length;h++){c=a.g[g.b][h];a.n[c]=false}e=true}}return e};clb.Jg=function Jg(a){var b,c,d,e,f,g,h,i;if(a.g!=null){g=new clb.ah(a);a.b=new dlb.Qi;for(e=0;e<a.g.length;e++){d=clb.Ug(g,e);if(d==0){clb.Qg(g,e);h=clb.Ag(a,e,2);b=clb.Ag(a,e,1);c=clb.zg(a,e);if(h==1&&b==1&&!c){clb.Lg(a,e,g.a+g.f++);dlb.wi(a.b,new clb.mj(e,1,-1,-1))}if(h>0){if(c){clb.Kg(a,e,g.i+g.g++,2);++h}dlb.wi(a.b,new clb.mj(e,1,-1,-1))}else if(b>0){c&&clb.Kg(a,e,g.a+g.f++,1);dlb.wi(a.b,new clb.mj(e,1,-1,-1))}else if(c){clb.Kg(a,e,g.a+g.f++,1);dlb.wi(a.b,new clb.mj(e,1,-1,-1))}}else if(d==1){if(clb.zg(a,e)){f=clb.Tg(g,e);i=clb.Vg(g,e);dlb.wi(a.b,new clb.mj(e,2,f,i))}else{clb.Qg(g,e);dlb.wi(a.b,new clb.mj(e,1,-1,-1))}}}}};clb.Kg=function Kg(a,b,c,d){var e,f;for(f=0;f<a.g[b].length;f++){e=a.g[b][f];if(a.f[e]&&(a.o[e]==1||a.o[e]==2)&&a.k[e]==0){a.k[e]=d<<24>>24;a.j[e]=c<<24>>24}}};clb.Lg=function Lg(a,b,c){var d,e;for(e=0;e<a.g[b].length;e++){d=a.g[b][e];if(a.k[d]==2){a.k[d]=1;a.j[d]=c<<24>>24}}};clb.Mg=function Mg(a,b,c){var d,e,f,g,h,i,j,k;f=a.g[b];e=1;for(i=0;i<f.length;i++){d=f[i];if(a.f[d]&&a.k[d]==2){e=2;break}}g=gW(Ykb.AX,Dnb,7,32,0,2);for(j=0;j<f.length;j++){d=f[j];a.f[d]&&a.k[d]==e&&(g[a.j[d]]=clb.Pg(g[a.j[d]],(c[d]<<16)+d))}for(k=0;k<32;k++)g[k]!=null&&alb.jgb(g[k],alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));dlb.mcb(g,new clb.dh);if(clb.bh(g[0],g[1])==0)return false;for(h=0;h<g[0].length;h++){d=g[0][h]&Zlb;a.k[d]=0;a.j[d]=-1}return true};clb.Ng=function Ng(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;i=gW(Ykb.AX,gmb,6,a.i.f,15,1);r=gW(Ykb.AX,gmb,6,a.i.f,15,1);o=gW(Ykb.Z0,Amb,6,a.i.f,16,1);j=gW(Ykb.Z0,Amb,6,a.i.f,16,1);s=new clb.Vp(a.i.f);i[0]=b;r[b]=c;r[c]=-2;s.a[b]=true;s.a[c]=true;f=0;k=0;while(f<=k){g=i[f];if(r[g]==g){for(l=0;l<clb.wn(a.i,g);l++){d=clb.vn(a.i,g,l);if(!s.a[d]){if(clb.yn(a.i,g,l)==2&&clb.uk(a.i,d)<10){i[++k]=d;r[d]=d;j[d]=j[g]||clb.mn(a.i,d)==2;o[d]=j[g]&&!o[g];s.a[d]=true}else if(j[g]&&o[g]){t=clb.Cg(a,d,r[g],s.a);if(t==-1)return null;i[++k]=d;r[d]=t;r[t]=-2;j[d]=false;s.a[d]=true;s.a[t]=true}else if(clb.zo(a.i,clb.xn(a.i,g,l))){i[++k]=d;r[d]=d;j[d]=false;s.a[d]=true;if((clb.uk(a.i,d)==6&&clb.mn(a.i,d)==0||clb.uk(a.i,d)==7&&clb.dk(a.i,d)==1||clb.uk(a.i,d)==14||clb.uk(a.i,d)==15&&clb.wn(a.i,d)>2||clb.uk(a.i,d)==16&&clb.wn(a.i,d)>2)&&clb.wn(a.i,d)>2){h=false;for(p=1;p<clb.wn(a.i,d);p++){u=clb.vn(a.i,d,p);if(!s.a[u]){for(q=0;q<p;q++){v=clb.vn(a.i,d,q);if(!s.a[v]){if(clb.Gg(a,u,v)){i[++k]=u;r[u]=v;r[v]=-2;j[u]=false;s.a[u]=true;s.a[v]=true;h=true}}}}}if(!h)return null}}}}}else{e=gW(Ykb.Z0,Amb,6,clb.wn(a.i,g),16,1);for(m=0;m<clb.wn(a.i,g);m++){d=clb.vn(a.i,g,m);if(s.a[d]){e[m]=r[d]==d}else{for(p=0;p<clb.wn(a.i,d);p++){if(clb.vn(a.i,d,p)==r[g]){e[m]=true;break}}}}for(n=0;n<clb.wn(a.i,g);n++){if(e[n]){d=clb.vn(a.i,g,n);if(s.a[d]){if(clb.tn(a.i,d,r[g])==-1)return null}else{i[++k]=d;r[d]=d;o[d]=false;j[d]=true;s.a[d]=true}}}for(l=0;l<clb.wn(a.i,g);l++){if(!e[l]){d=clb.vn(a.i,g,l);if(!s.a[d]){t=clb.Cg(a,d,r[g],s.a);if(t==-1)return null;i[++k]=d;r[d]=t;r[t]=-2;j[d]=false;s.a[d]=true;s.a[t]=true}}}}++f}return s};clb.Og=function Og(a,b,c,d,e,f,g,h,i,j){this.i=a;this.a=b;this.f=c;this.o=d;this.c=e;this.k=f;this.j=g;this.p=h;this.d=i;this.n=j;clb.Bg(this)};clb.Pg=function Pg(a,b){var c,d;d=gW(Ykb.AX,gmb,6,a==null?1:a.length+1,15,1);for(c=0;c<d.length-1;c++)d[c]=a[c];d[d.length-1]=b;return d};U1(263,1,{},clb.Og);Ykb.QX=w3(263);clb.Qg=function Qg(a,b){var c,d,e,f,g,h;for(e=0;e<a.b;e++){if(a.e[e][b]&&a.c[e]!=-3){for(d=0;d<=a.j.g.length;d++){if(d!=b&&a.e[e][d]){a.e[e][b]=false;h=e<a.a?e:e<a.b?e-a.a:-1;g=clb.$g(a,e<a.a?1:e<a.b?2:0);for(f=0;f<a.j.g[b].length;f++){c=a.j.g[b][f];clb.Dg(a.j,c)&&a.j.j[c]==h&&(a.j.j[c]=g<<24>>24)}}}}}};clb.Rg=function Rg(a,b,c){var d,e,f,g,h;h=false;g=1;b[c]=g;d=true;while(d){d=false;for(e=0;e<a.b;e++){if(b[e]==g){for(f=0;f<a.b;f++){if(b[f]==0&&clb.Zg(a,e,f)){if(a.c[f]==-2){b[f]=g+1;d=true}else if(a.c[f]!=a.c[c]){b[f]=g+1;h=true}}}}}++g}return h};clb.Sg=function Sg(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o;for(i=d+1;i<a.j.g.length;i++){if(i!=d&&a.e[b][i]&&a.e[c][i]){g=gW(Ykb.AX,gmb,6,2,15,1);g[0]=c;g[1]=b;return g}}o=gW(Ykb.AX,gmb,6,a.b,15,1);k=gW(Ykb.AX,gmb,6,a.b,15,1);j=gW(Ykb.AX,gmb,6,a.b,15,1);f=0;l=0;j[0]=b;k[b]=1;while(f<=l){for(m=0;m<a.d[j[f]].length;m++){e=a.d[j[f]][m];if(e==c){if(f==0)continue;h=k[j[f]]+1;g=gW(Ykb.AX,gmb,6,h,15,1);g[0]=e;g[1]=j[f];for(n=2;n<h;n++)g[n]=o[g[n-1]];return g}if(k[e]==0&&a.c[e]!=-3){k[e]=k[j[f]]+1;j[++l]=e;o[e]=j[f]}}++f}return null};clb.Tg=function Tg(a,b){var c;for(c=0;c<a.b;c++)if(a.e[c][b]&&a.c[c]==-3)return c<a.a?c:c<a.b?c-a.a:-1;return -1};clb.Ug=function Ug(a,b){var c,d;c=0;for(d=0;d<a.b;d++)a.e[d][b]&&a.c[d]==-3&&++c;return c};clb.Vg=function Vg(a,b){var c;for(c=0;c<a.b;c++)if(a.e[c][b]&&a.c[c]==-3)return c<a.a?1:c<a.b?2:0;return -1};clb.Wg=function Wg(a,b){return b<a.a?b:b<a.b?b-a.a:-1};clb.Xg=function Xg(a,b){return b<a.a?1:b<a.b?2:0};clb.Yg=function Yg(a,b){var c,d;d=a.j.k[b];c=a.j.j[b];return d==0?a.b:d==1?c:a.a+c};clb.Zg=function Zg(a,b,c){var d;for(d=0;d<a.j.g.length;d++)if(a.e[b][d]&&a.e[c][d])return true;return false};clb.$g=function $g(a,b){return b==1?a.a+a.f++:a.i+a.g++};clb._g=function _g(a,b){var c,d,e,f,g,h,i,j,k,l;k=Qlb;i=-1;l=-1;j=-1;for(d=0;d<a.j.i.f;d++){if(clb.Dg(a.j,d)&&a.j.k[d]!=0){for(h=0;h<b.length;h++){e=clb.Wg(a,b[h]);f=clb.Xg(a,b[h]);if(a.j.k[d]==f&&a.j.j[d]==e){if(k>a.j.a[d]+(f==1?Ylb:0)){k=a.j.a[d]+(f==1?Ylb:0);i=e;l=f;j=b[h]}}}}}for(c=0;c<a.j.i.f;c++){if(clb.Dg(a.j,c)&&a.j.k[c]==l&&a.j.j[c]==i){a.j.k[c]=0;a.j.j[c]=-1}}for(g=0;g<a.j.g.length;g++)a.e[j][g]=false};clb.ah=function ah(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;this.j=a;for(d=0;d<a.i.f;d++){a.f[d]&&(a.o[d]==1||a.o[d]==2)&&(a.k[d]==1?this.a<=a.j[d]&&(this.a=1+a.j[d]):a.k[d]==2&&this.i<=a.j[d]&&(this.i=1+a.j[d]))}this.b=this.a+this.i;this.e=eW(Ykb.Z0,[Llb,Amb],[11,6],16,[this.b+1,a.g.length+1],2);for(e=0;e<a.i.f;e++)a.f[e]&&(a.o[e]==1||a.o[e]==2)&&!a.e[e]&&(this.e[clb.Yg(this,e)][a.g.length]=true);for(i=0;i<a.g.length;i++){for(q=0;q<a.g[i].length;q++){c=a.g[i][q];a.f[c]&&(a.o[c]==1||a.o[c]==2)&&(this.e[clb.Yg(this,c)][i]=true)}}this.d=gW(Ykb.AX,Dnb,7,this.b,0,2);for(j=0;j<a.g.length;j++){for(n=1;n<this.b;n++){if(this.e[n][j]){for(o=0;o<n;o++){if(this.e[o][j]){this.d[n]=clb.Pg(this.d[n],o);this.d[o]=clb.Pg(this.d[o],n)}}}}}this.c=gW(Ykb.AX,gmb,6,this.b+1,15,1);for(m=0;m<this.b;m++){this.e[m][a.g.length]?(this.c[m]=-1):(this.c[m]=-2)}for(k=0;k<a.g.length;k++){if(this.e[this.b][k]){for(l=0;l<this.b;l++){this.e[l][k]&&this.c[l]!=k&&(this.c[l]==-2?(this.c[l]=k):(this.c[l]=-3))}}}for(b=0;b<this.b;b++){if(this.c[b]>=-1){f=gW(Ykb.AX,gmb,6,this.b,15,1);if(clb.Rg(this,f,b)){for(l=0;l<this.b;l++){f[l]!=0&&(this.c[l]=-3)}}}}for(h=0;h<a.g.length-1;h++){for(n=1;n<this.b;n++){if(this.e[n][h]&&this.c[n]!=-3){for(o=0;o<n;o++){if(this.e[o][h]&&this.c[o]!=-3){g=clb.Sg(this,n,o,h);if(g!=null){for(p=0;p<g.length;p++)this.c[g[p]]=-3;clb._g(this,g);break}}}}}}};U1(264,1,{},clb.ah);_.a=0;_.b=0;_.f=0;_.g=0;_.i=0;Ykb.PX=w3(264);clb.bh=function bh(a,b){var c,d;if(a==null)return b==null?0:1;if(b==null)return -1;c=$wnd.Math.min(a.length,b.length);for(d=0;d<c;d++)if((a[d]&Mnb)!=(b[d]&Mnb))return (a[d]&Mnb)<(b[d]&Mnb)?-1:1;return a.length==b.length?0:a.length<b.length?-1:1};clb.dh=function dh(){};U1(265,1,{},clb.dh);_.pb=function eh(a,b){return clb.bh(a,b)};_.ib=function fh(a){return this===a};Ykb.RX=w3(265);clb.gh=function gh(a,b){switch(b){case 0:return clb.hh(a,false);case 1:return clb.jh(a);case 2:return clb.ih(a);case 3:return clb.lh(a);case 4:return clb.kh(a);}return null};clb.hh=function hh(b,c){try{if(!c)return clb.Gf(new clb.ag(b));b=clb.Kt(b);clb.Qo(b,true);clb.fq(b);return clb.Gf(new clb.ag(b))}catch(a){a=b1(a);if(mX(a,22)){Zkb.O5();String.fromCharCode(10);return null}else throw c1(a)}};clb.ih=function ih(b){var c,d;try{b=clb.Kt(b);clb.Ut(b);c=b.r;for(d=0;d<c;d++){b.H[d]=1;b.T=0}return clb.Gf(new clb.ag(b))}catch(a){a=b1(a);if(mX(a,22)){Zkb.O5();String.fromCharCode(10);return null}else throw c1(a)}};clb.jh=function jh(b){try{b=clb.Kt(b);clb.Ut(b);return clb.Gf(new clb.ag(b))}catch(a){a=b1(a);if(mX(a,22)){Zkb.O5();String.fromCharCode(10);return null}else throw c1(a)}};clb.kh=function kh(b){var c;try{b=clb.Kt(b);clb.Ut(b);c=clb.ku(new clb.nu(b));return clb.Gf(new clb.bg(c,8))}catch(a){a=b1(a);if(mX(a,22)){Zkb.O5();String.fromCharCode(10);return null}else throw c1(a)}};clb.lh=function lh(b){var c;try{c=clb.ku(new clb.nu(b));return clb.Gf(new clb.bg(c,8))}catch(a){a=b1(a);if(mX(a,22)){Zkb.O5();String.fromCharCode(10);return null}else throw c1(a)}};clb.mh=function mh(a,b,c,d){a.a+=b;a.b+=c;a.c+=d};clb.nh=function nh(a,b){a.a+=b.a;a.b+=b.b;a.c+=b.c;return a};clb.oh=function oh(a,b){return new clb.Dh(a.a+b.a,a.b+b.b,a.c+b.c)};clb.ph=function ph(a,b){a.a=(a.a+b.a)/2;a.b=(a.b+b.b)/2;a.c=(a.c+b.c)/2;return a};clb.qh=function qh(a,b){if(a.a!=b.a)return a.a<b.a?-1:1;if(a.b!=b.b)return a.b<b.b?-1:1;if(a.c!=b.c)return a.c<b.c?-1:1;return 0};clb.rh=function rh(a,b){return new clb.Dh(a.b*b.c-a.c*b.b,-(a.a*b.c-a.c*b.a),a.a*b.b-a.b*b.a)};clb.sh=function sh(a,b){return $wnd.Math.sqrt((b.a-a.a)*(b.a-a.a)+(b.b-a.b)*(b.b-a.b)+(b.c-a.c)*(b.c-a.c))};clb.th=function th(a,b){var c;if(b==null||!mX(b,24))return false;c=b;return $wnd.Math.abs(c.a-a.a)+$wnd.Math.abs(c.b-a.b)+$wnd.Math.abs(c.c-a.c)<1.0E-6};clb.uh=function uh(a,b){var c,d,e;d=a.a*a.a+a.b*a.b+a.c*a.c;e=b.a*b.a+b.b*b.b+b.c*b.c;if(d==0||e==0)return 0;c=(a.a*b.a+a.b*b.b+a.c*b.c)/$wnd.Math.sqrt(d*e);if(c>=1)return 0;if(c<=-1)return Fmb;return $wnd.Math.acos(c)};clb.vh=function vh(a,b){var c,d,e;c=a.a;d=a.b;e=a.c;a.a=c*b[0][0]+d*b[1][0]+e*b[2][0];a.b=c*b[0][1]+d*b[1][1]+e*b[2][1];a.c=c*b[0][2]+d*b[1][2]+e*b[2][2];return a};clb.wh=function wh(a,b){a.a*=b;a.b*=b;a.c*=b;return a};clb.xh=function xh(a,b,c,d){a.a=b;a.b=c;a.c=d};clb.yh=function yh(a,b){clb.xh(a,b.a,b.b,b.c);return a};clb.zh=function zh(a,b){a.a-=b.a;a.b-=b.b;a.c-=b.c;return a};clb.Ah=function Ah(a,b){return new clb.Dh(a.a-b.a,a.b-b.b,a.c-b.c)};clb.Bh=function Bh(a){var b;b=$wnd.Math.sqrt(a.a*a.a+a.b*a.b+a.c*a.c);if(b==0){Zkb.O5();String.fromCharCode(10);a.a=1;a.b=0;a.c=0;return a}a.a/=b;a.b/=b;a.c/=b;return a};clb.Ch=function Ch(){};clb.Dh=function Dh(a,b,c){this.a=a;this.b=b;this.c=c};clb.Eh=function Eh(a){clb.Dh.call(this,a.a,a.b,a.c)};U1(24,1,{24:1,4:1,27:1},clb.Ch,clb.Dh,clb.Eh);_.qb=function Fh(a){return clb.qh(this,a)};_.ib=function Gh(a){return clb.th(this,a)};_.lb=function Hh(){var a;a=new Dlb.q8('0.00');return '['+Dlb.o8(a,this.a)+', '+Dlb.o8(a,this.b)+', '+Dlb.o8(a,this.c)+']'};_.a=0;_.b=0;_.c=0;Ykb.TX=w3(24);clb.Ih=function Ih(a,b){b.c*=a.c;b.a=b.a*a.c+a.a;b.b=b.b*a.c+a.b};clb.Jh=function Jh(a,b){b.a=b.a*a.c+a.a;b.b=b.b*a.c+a.b};clb.Kh=function Kh(a,b){b.c=b.c*a.c+a.a;b.d=b.d*a.c+a.b;b.b*=a.c;b.a*=a.c};clb.Lh=function Lh(a){a.a=0;a.b=0;a.c=1};clb.Mh=function Mh(a,b){return b*a.c+a.a};clb.Nh=function Nh(a,b){return b*a.c+a.b};clb.Oh=function Oh(){clb.Lh(this)};clb.Ph=function Ph(a,b,c){var d,e,f,g;clb.Lh(this);e=b.b/a.b;g=b.a/a.a;f=0;f==0&&(f=24);d=f/c;this.c=$wnd.Math.min(d,$wnd.Math.min(e,g));this.a=b.c+b.b/2-this.c*(a.c+a.b/2);this.b=b.d+b.a/2-this.c*(a.d+a.a/2)};U1(143,1,{},clb.Oh,clb.Ph);_.lb=function Qh(){return 'DepictorTransformation Offset: '+this.a+','+this.b+' Scaling: '+this.c};_.a=0;_.b=0;_.c=0;Ykb.UX=w3(143);clb.Rh=function Rh(a){var b,c,d,e;if(!Zkb.c5(alb.Pgb(a).substr(0,21),xnb)||(d=alb.Pgb(ynb).length,!Zkb.c5(alb.Pgb(a).substr(alb.Pgb(a).length-d,d),ynb)))return null;c=Zkb.h5(a,s5(34),21);if(c==-1)return null;e=(alb.Jgb(21,c,alb.Pgb(a).length),alb.Pgb(a).substr(21,c-21));b=Zkb.p5(a,21+alb.Pgb(e).length+1,alb.Pgb(a).length-17);if(Zkb.c5(e,'arrow'))return new nlb.XE(b);if(Zkb.c5(e,'text'))return new clb.Cu(b);return null};dlb.Sh=function Sh(a,b,c){var d,e;for(e=a.rb();e.ec();){d=e.fc();if(uX(b)===uX(d)||b!=null&&Zkb.Gc(b,d)){c&&e.gc();return true}}return false};dlb.Th=function Th(a,b){var c,d;alb.Egb(b);for(d=b.rb();d.ec();){c=d.fc();if(!a.contains(c)){return false}}return true};dlb.Uh=function Uh(a,b){var c,d,e;alb.Egb(b);c=false;for(d=a.rb();d.ec();){e=d.fc();if(b.contains(e)){d.gc();c=true}}return c};dlb.Vh=function Vh(a){var b,c,d;d=new dlb.aeb('[',']');for(c=a.rb();c.ec();){b=c.fc();dlb.$db(d,uX(b)===uX(a)?'(this Collection)':b==null?Slb:_1(b))}return !d.a?d.c:alb.Pgb(d.e).length==0?d.a.a:d.a.a+(''+d.e)};U1(39,1,Nnb);_.add=function Wh(a){throw c1(new Zkb.S5('Add not supported on this collection'))};_.addAll=function Xh(a){var b,c,d;alb.Egb(a);b=false;for(d=a.rb();d.ec();){c=d.fc();b=b|this.add(c)}return b};_.clear=function Yh(){var a;for(a=this.rb();a.ec();){a.fc();a.gc()}};_.contains=function Zh(a){return dlb.Sh(this,a,false)};_.containsAll=function $h(a){return dlb.Th(this,a)};_.isEmpty=function _h(){return this.size()==0};_.remove=function ai(a){return dlb.Sh(this,a,true)};_.removeAll=function bi(a){return dlb.Uh(this,a)};_.retainAll=function ci(a){var b,c,d;alb.Egb(a);b=false;for(c=this.rb();c.ec();){d=c.fc();if(!a.contains(d)){c.gc();b=true}}return b};_.toArray=function di(){return this.sb(gW(Ykb.f_,Ulb,1,this.size(),5,1))};_.sb=function ei(a){var b,c,d,e;e=this.size();a.length<e&&(a=alb.kgb(new Array(e),a));d=a;c=this.rb();for(b=0;b<e;++b){kW(d,b,c.fc())}a.length>e&&Ykb.jW(a,e,null);return a};_.lb=function fi(){return dlb.Vh(this)};Ykb.u_=w3(39);dlb.gi=function gi(a,b,c){return new dlb.R9(a,b,c)};U1(79,39,Onb);_.addAtIndex=function hi(a,b){throw c1(new Zkb.S5('Add not supported on this list'))};_.add=function ii(a){this.addAtIndex(this.size(),a);return true};_.addAllAtIndex=function ji(a,b){var c,d,e;alb.Egb(b);c=false;for(e=b.rb();e.ec();){d=e.fc();this.addAtIndex(a++,d);c=true}return c};_.clear=function ki(){this.tb(0,this.size())};_.ib=function li(a){var b,c,d,e,f;if(a===this){return true}if(!mX(a,98)){return false}f=a;if(this.size()!=f.size()){return false}e=f.rb();for(c=this.rb();c.ec();){b=c.fc();d=e.fc();if(!(uX(b)===uX(d)||b!=null&&Zkb.Gc(b,d))){return false}}return true};_.kb=function mi(){return dlb.xcb(this)};_.indexOf=function ni(a){var b,c;for(b=0,c=this.size();b<c;++b){if(dlb.Odb(a,this.getAtIndex(b))){return b}}return -1};_.rb=function oi(){return new dlb.K9(this)};_.lastIndexOf=function pi(a){var b;for(b=this.size()-1;b>-1;--b){if(dlb.Odb(a,this.getAtIndex(b))){return b}}return -1};_.removeAtIndex=function qi(a){throw c1(new Zkb.S5('Remove not supported on this list'))};_.tb=function ri(a,b){var c,d;d=new dlb.P9(this,a);for(c=a;c<b;++c){alb.Cgb(d.a<d.c.size());d.c.getAtIndex(d.b=d.a++);dlb.J9(d)}};_.setAtIndex=function si(a,b){throw c1(new Zkb.S5('Set not supported on this list'))};_.subList=function ti(a,b){return dlb.gi(this,a,b)};Ykb.B_=w3(79);function K3(a){if(a==null){return false}return a.$implements__java_lang_Cloneable||Array.isArray(a)}\ndlb.ui=function ui(a){a.a=gW(Ykb.f_,Ulb,1,0,5,1)};dlb.vi=function vi(a,b,c){alb.Ggb(b,a.a.length);alb.dgb(a.a,b,c)};dlb.wi=function wi(a,b){alb.ggb(a.a,b);return true};dlb.xi=function xi(a,b,c){var d,e;alb.Ggb(b,a.a.length);d=c.toArray();e=d.length;if(e==0){return false}alb.egb(a.a,b,d);return true};\ndlb.yi=function yi(a,b){var c,d;c=b.toArray();d=c.length;if(d==0){return false}alb.egb(a.a,a.a.length,c);return true};dlb.zi=function zi(a){alb.igb(a.a,0)};dlb.Ai=function Ai(a,b){return dlb.Di(a,b,0)!=-1};dlb.Bi=function Bi(a,b){alb.Dgb(b,a.a.length);return a.a[b]};dlb.Ci=function Ci(a,b){return dlb.Di(a,b,0)};dlb.Di=function Di(a,b,c){for(;c<a.a.length;++c){if(dlb.Odb(b,a.a[c])){return c}}return -1};dlb.Ei=function Ei(a){return a.a.length==0};dlb.Fi=function Fi(a){return new dlb.Obb(a)};dlb.Gi=function Gi(a,b){return dlb.Hi(a,b,a.a.length-1)};dlb.Hi=function Hi(a,b,c){for(;c>=0;--c){if(dlb.Odb(b,a.a[c])){return c}}return -1};dlb.Ii=function Ii(a,b){var c;c=(alb.Dgb(b,a.a.length),a.a[b]);alb.hgb(a.a,b,1);return c};dlb.Ji=function Ji(a,b){var c;c=dlb.Di(a,b,0);if(c==-1){return false}dlb.Ii(a,c);return true};dlb.Ki=function Ki(a,b,c){var d;alb.Hgb(b,c,a.a.length);d=c-b;alb.hgb(a.a,b,d)};dlb.Li=function Li(a,b,c){var d;d=(alb.Dgb(b,a.a.length),a.a[b]);a.a[b]=c;return d};dlb.Mi=function Mi(a){return a.a.length};dlb.Ni=function Ni(a,b){dlb.lcb(a.a,a.a.length,b)};dlb.Oi=function Oi(a){return alb.agb(a.a)};dlb.Pi=function Pi(a,b){var c,d;d=a.a.length;b.length<d&&(b=alb.kgb(new Array(d),b));for(c=0;c<d;++c){kW(b,c,a.a[c])}b.length>d&&Ykb.jW(b,d,null);return b};dlb.Qi=function Qi(){dlb.ui(this)};dlb.Ri=function Ri(a){dlb.ui(this);alb.ygb(a>=0,'Initial capacity must not be negative')};U1(18,79,Pnb,dlb.Qi,dlb.Ri);_.addAtIndex=function Si(a,b){dlb.vi(this,a,b)};_.add=function Ti(a){return dlb.wi(this,a)};_.addAllAtIndex=function Ui(a,b){return dlb.xi(this,a,b)};_.addAll=function Vi(a){return dlb.yi(this,a)};_.clear=function Wi(){dlb.zi(this)};_.contains=function Xi(a){return dlb.Ai(this,a)};_.getAtIndex=function Yi(a){return dlb.Bi(this,a)};_.indexOf=function Zi(a){return dlb.Ci(this,a)};_.isEmpty=function $i(){return dlb.Ei(this)};_.rb=function _i(){return dlb.Fi(this)};_.lastIndexOf=function aj(a){return dlb.Gi(this,a)};_.removeAtIndex=function bj(a){return dlb.Ii(this,a)};_.remove=function cj(a){return dlb.Ji(this,a)};_.tb=function dj(a,b){dlb.Ki(this,a,b)};_.setAtIndex=function ej(a,b){return dlb.Li(this,a,b)};_.size=function fj(){return dlb.Mi(this)};_.toArray=function gj(){return dlb.Oi(this)};_.sb=function hj(a){return dlb.Pi(this,a)};Ykb.S_=w3(18);clb.ij=function ij(a){var b,c;c=new Zkb.z5;for(b=0;b<a.a.length;b++)Zkb.y5(c,clb.Td((alb.Dgb(b,a.a.length),a.a[b]))+Klb);return c.a};clb.jj=function jj(b){var c;dlb.Qi.call(this);try{if(b){for(c=0;c<b.a.length;c++)dlb.wi(this,(alb.Dgb(c,b.a.length),b.a[c]).mb())}}catch(a){a=b1(a);if(!mX(a,15))throw c1(a)}};clb.kj=function kj(a){var b,c,d;dlb.Qi.call(this);if(a==null||alb.Pgb(a).length==0)return;b=0;c=Zkb.g5(a,s5(10));while(c!=-1){d=clb.Rh((alb.Jgb(b,c,alb.Pgb(a).length),alb.Pgb(a).substr(b,c-b)));!!d&&(alb.ggb(this.a,d),true);b=c+1;c=Zkb.h5(a,s5(10),b)}};U1(165,18,Pnb,clb.jj,clb.kj);_.lb=function lj(){return clb.ij(this)};Ykb.VX=w3(165);clb.mj=function mj(a,b,c,d){this.b=a;this.a=b;this.c=c;this.d=d};U1(82,1,{82:1},clb.mj);_.a=0;_.b=0;_.c=0;_.d=0;Ykb.WX=w3(82);clb.nj=function nj(a){var b,c,d,e,f,g;if(a.j!=0)return a.j;if(a.i&&clb.uk(a.e,a.a)!=15&&clb.uk(a.e,a.a)!=16){for(g=0;g<clb.gn(a.e,a.a);g++){f=clb.xn(a.e,a.a,g);if(clb.ql(a.e,f,a.a)){clb.vn(a.e,a.a,g)==a.b?(a.j=clb.Kk(a.e,f)==257?3:1):(a.j=clb.Kk(a.e,f)==257?1:3);return a.j}}}b=clb.yk(a.e,a.a,a.g);d=clb.yk(a.e,a.a,a.b);d<b&&(d+=Emb);if(clb.gn(a.e,a.a)==2){c=d-b;if(c>3.0915926535897933&&c<3.191592653589793){a.j=-1;return a.j}a.j=c<Fmb?4:2;return a.j}else{e=clb.yk(a.e,a.a,a.d);e<b&&(e+=Emb);a.j=e<d?2:4;return a.j}};clb.oj=function oj(a,b,c,d){var e,f,g,h;this.e=a;this.g=c;this.a=d;g=-1;for(h=0;h<clb.gn(this.e,this.a);h++){e=clb.vn(this.e,this.a,h);f=clb.xn(this.e,this.a,h);if(e==this.g){clb.Kk(this.e,f)==386&&(this.j=-1);continue}if(clb.ql(this.e,f,this.a)){this.i&&(a.u[d]|=Ylb);this.i=true}if(g==b[e]){this.d=e;this.f=true;this.c=clb.zo(this.e,f)}else if(g<b[e]){g=b[e];this.d=this.b;this.b=e}else{this.d=e}}};U1(96,1,{},clb.oj);_.a=0;_.b=0;_.c=false;_.d=0;_.f=false;_.g=0;_.i=false;_.j=0;Ykb.XX=w3(96);clb.wj=function wj(){clb.wj=W1;clb.qj=oW(aW(Ykb.l_,1),Xlb,2,6,['?','H','He','Li','Be','B','C','N','O','F','Ne','Na','Mg','Al','Si','P','S','Cl','Ar','K','Ca','Sc','Ti','V','Cr','Mn','Fe','Co','Ni','Cu','Zn','Ga','Ge','As','Se','Br','Kr','Rb','Sr','Y','Zr','Nb','Mo','Tc','Ru','Rh','Pd','Ag','Cd','In','Sn','Sb','Te','I','Xe','Cs','Ba','La','Ce','Pr','Nd','Pm','Sm','Eu','Gd','Tb','Dy','Ho','Er','Tm','Yb','Lu','Hf','Ta','W','Re','Os','Ir','Pt','Au','Hg','Tl','Pb','Bi','Po','At','Rn','Fr','Ra','Ac','Th','Pa','U','Np','Pu','Am','Cm','Bk','Cf','Es','Fm','Md','No','Lr','Rf','Db','Sg','Bh','Hs','Mt','Ds','Rg','Cn','Nh','Fl','Mc','Lv','Ts','Og',Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,'R4','R5','R6','R7','R8','R9','R10','R11','R12','R13','R14','R15','R16','R1','R2','R3','A','A1','A2','A3',Qnb,Qnb,'D','T','X','R','H2','H+','Nnn','HYD','Pol',Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,Qnb,'Ala','Arg','Asn','Asp','Cys','Gln','Glu','Gly','His','Ile','Leu','Lys','Met','Phe','Pro','Ser','Thr','Trp','Tyr','Val']);clb.uj=oW(aW(Ykb.Y0,1),znb,6,15,[0,1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,0,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,142,0,152,153,158,159,164,165,166,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,267,268,271,270,277,276,281,281,283,285,289,289,293,294,294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,156,114,115,103,128,129,57,137,113,113,128,131,147,97,87,101,186,163,99]);clb.tj=oW(aW(Ykb.wX,1),Fnb,6,15,[6]);clb.pj=oW(aW(Ykb.wX,1),Fnb,6,15,[2]);clb.rj=oW(aW(Ykb.wX,2),Llb,9,0,[null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[0]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[0]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,3,5,7]),oW(aW(Ykb.wX,1),Fnb,6,15,[0]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),null,null,null,null,null,null,null,null,null,null,oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,3,5,7]),oW(aW(Ykb.wX,1),Fnb,6,15,[0,2]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),null,null,null,null,null,null,null,null,null,null,oW(aW(Ykb.wX,1),Fnb,6,15,[1,2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,3,5,7]),oW(aW(Ykb.wX,1),Fnb,6,15,[0,2,4,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2])]);clb.sj=oW(aW(Ykb.wX,2),Llb,9,0,[null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),null,null,oW(aW(Ykb.wX,1),Fnb,6,15,[-3]),oW(aW(Ykb.wX,1),Fnb,6,15,[-2]),oW(aW(Ykb.wX,1),Fnb,6,15,[-1]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[-3]),oW(aW(Ykb.wX,1),Fnb,6,15,[-2]),oW(aW(Ykb.wX,1),Fnb,6,15,[-1]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3,4,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3,4,7]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,2]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[-3,3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[-2]),oW(aW(Ykb.wX,1),Fnb,6,15,[-1]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[6]),oW(aW(Ykb.wX,1),Fnb,6,15,[4,6,7]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[-3,3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[-2,4,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[-1]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[4]),oW(aW(Ykb.wX,1),Fnb,6,15,[5]),oW(aW(Ykb.wX,1),Fnb,6,15,[6]),oW(aW(Ykb.wX,1),Fnb,6,15,[4,6,7]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,2]),oW(aW(Ykb.wX,1),Fnb,6,15,[1,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[-2,2,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[-1,1]),null,oW(aW(Ykb.wX,1),Fnb,6,15,[1]),oW(aW(Ykb.wX,1),Fnb,6,15,[2]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[4]),oW(aW(Ykb.wX,1),Fnb,6,15,[4,5]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4,5,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4,5,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4,5,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4,5,6]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3,4]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[2,3]),oW(aW(Ykb.wX,1),Fnb,6,15,[3])])};clb.xj=function xj(a,b,c,d){var e;e=clb.yj(a,6);clb.xh(a.J[e],b,c,d);return e};clb.yj=function yj(a,b){a.q>=a.M&&clb.om(a,a.M*2);a.C[a.q]=0;clb._l(a,a.q,b);a.s[a.q]=0;a.u[a.q]=0;a.B[a.q]=0;a.w[a.q]=0;clb.xh(a.J[a.q],0,0,0);a.v!=null&&(a.v[a.q]=null);a.t!=null&&(a.t[a.q]=null);a.T=0;return a.q++};clb.zj=function zj(a,b,c){return clb.Aj(a,b,c,clb.jl(a,b)||clb.jl(a,c)?32:1)};clb.Aj=function Aj(a,b,c,d){var e;if(b==c)return -1;for(e=0;e<a.r;e++){if(a.D[0][e]==b&&a.D[1][e]==c||a.D[0][e]==c&&a.D[1][e]==b){a.H[e]<d&&(a.H[e]=d);return e}}a.r>=a.N&&clb.pm(a,a.N*2);a.D[0][a.r]=b;a.D[1][a.r]=c;a.H[a.r]=d;a.F[a.r]=0;a.G[a.r]=0;a.T=0;return a.r++};clb.Bj=function Bj(a,b){return clb.Cj(a,b,b.q,b.r)};clb.Cj=function Cj(a,b,c,d){var e,f,g,h,i;a.K=a.K|b.K;f=gW(Ykb.AX,gmb,6,b.q,15,1);h=clb.Cl(a,1);i=clb.Cl(a,2);for(e=0;e<c;e++){f[e]=clb.Pj(b,a,e,h,i)}for(g=0;g<d;g++){clb.Qj(b,a,g,h,i,f[b.D[0][g]],f[b.D[1][g]],false)}a.L=a.L&&b.L;a.I=0;a.T=0;return f};clb.Dj=function Dj(a,b,c,d,e,f,g,h){var i,j;i=clb._j(a,b,c);if(i==-1){a.q>=a.M&&clb.om(a,a.M*2);i=clb.yj(a,d);clb.xh(a.J[i],b,c,0);a.A[i]=e;clb.Gl(a,i,f);clb.Vl(a,i,g);clb.Ll(a,i,h);return true}j=clb.Kj(a,i,d,e,f,g);clb.Ll(a,i,h);return j};clb.Ej=function Ej(a,b,c,d){var e;for(e=0;e<a.r;e++){if(a.D[0][e]==b&&a.D[1][e]==c||a.D[0][e]==c&&a.D[1][e]==b){clb.Mj(a,e,d);a.T=0;return e}}a.r>=a.N&&clb.pm(a,a.N*2);a.D[0][a.r]=b;a.D[1][a.r]=c;a.H[a.r]=d;a.F[a.r]=0;a.G[a.r]=0;a.T=0;return a.r++};clb.Fj=function Fj(a,b,c,d,e,f){var g,h,i;while(a.q+d>a.M)clb.om(a,a.M*2);while(a.r+d>a.N)clb.pm(a,a.N*2);g=clb._j(a,b,c);if(g!=-1)return clb.Gj(a,g,d,e,f);h=clb.ak(a,b,c);if(h!=-1)return clb.Hj(a,h,d,e,f);g=clb.xj(a,b,c,0);i=Fmb*(d-2)/d;clb.ul(a,g,d,g,e,0,Fmb-i,f);a.T=0;return true};clb.Gj=function Gj(a,b,c,d,e){var f,g,h,i,j,k;if(d&&clb.Pn(a,b)>1||!d&&clb.Pn(a,b)>2)return false;g=0;f=gW(Ykb.yX,emb,6,4,15,1);for(i=0;i<a.r;i++){for(j=0;j<2;j++){if(a.D[j][i]==b){if(g==2){g=3;break}f[g++]=clb.yk(a,b,a.D[1-j][i])}}if(g==3)break}if(g==3)return false;k=g==1?f[0]+Fmb:$wnd.Math.abs(f[0]-f[1])>Fmb?(f[0]+f[1])/2:(f[0]+f[1])/2+Fmb;h=Fmb*(c-2)/c;clb.ul(a,b,c,b,d,k-h/2,Fmb-h,e);a.T=0;return true};clb.Hj=function Hj(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p;j=gW(Ykb.AX,gmb,6,2,15,1);i=gW(Ykb.yX,emb,6,2,15,1);j[0]=a.D[0][b];j[1]=a.D[1][b];if(clb.Pn(a,j[0])>3)return false;if(clb.Pn(a,j[1])>3)return false;g=0;f=gW(Ykb.yX,emb,6,4,15,1);for(m=0;m<a.r;m++){if(m==b)continue;for(n=0;n<2;n++){for(o=0;o<2;o++){if(a.D[n][m]==j[o]){if(g==4){g=5;break}f[g++]=clb.yk(a,j[o],a.D[1-n][m])}}if(g==5)break}if(g==5)break}if(g==5)return false;i[0]=clb.yk(a,j[0],j[1]);if(i[0]<0){i[1]=i[0]+Fmb;h=0}else{i[1]=i[0];i[0]=i[1]-Fmb;h=1}p=0;for(l=0;l<g;l++){f[l]>i[0]&&f[l]<i[1]?--p:++p}h=p>0?1-h:h;k=Fmb*(c-2)/c;clb.ul(a,j[h],c-1,j[1-h],d,i[p>0?0:1]+Fmb-k,Fmb-k,e);a.T=0;return true};clb.Ij=function Ij(a,b,c){var d,e,f,g,h;e=gW(Ykb.AX,gmb,6,b.q,15,1);g=clb.Cl(a,1);h=clb.Cl(a,2);for(d=0;d<b.q;d++){b.C[d]!=0?(e[d]=clb.Pj(b,a,d,g,h)):(e[d]=c)}for(f=0;f<b.r;f++){clb.Qj(b,a,f,g,h,e[b.D[0][f]],e[b.D[1][f]],false)}a.L=a.L&&b.L;a.I=0;a.T=0;return e};clb.Jj=function Jj(a,b){var c,d,e,f,g,h,i,j,k;c=a.J[b[0]];d=a.J[b[1]];e=a.J[b[2]];f=a.J[b[3]];i=new clb.Dh(d.a-c.a,d.b-c.b,d.c-c.c);j=new clb.Dh(e.a-d.a,e.b-d.b,e.c-d.c);k=new clb.Dh(f.a-e.a,f.b-e.b,f.c-e.c);g=new clb.Dh(i.b*j.c-i.c*j.b,-(i.a*j.c-i.c*j.a),i.a*j.b-i.b*j.a);h=new clb.Dh(j.b*k.c-j.c*k.b,-(j.a*k.c-j.c*k.a),j.a*k.b-j.b*k.a);return -$wnd.Math.atan2($wnd.Math.sqrt(j.a*j.a+j.b*j.b+j.c*j.c)*(i.a*h.a+i.b*h.b+i.c*h.c),g.a*h.a+g.b*h.b+g.c*h.c)};clb.Kj=function Kj(a,b,c,d,e,f){if((c==1||c==151||c==152)&&clb.Pn(a,b)>1)return false;a.B[b]=e1(a.B[b],-2);a.v!=null&&(a.v[b]=null);a.t!=null&&(a.t[b]=null);if(c==a.C[b]&&d==a.A[b]&&e==((a.u[b]&Rnb)>>>27)-1&&f==(a.u[b]&48))return false;if(c==151||c==152){d=c-149;c=1}a.u[b]&=960;a.C[b]=c;a.A[b]=d;a.s[b]=0;a.B[b]=0;clb.Gl(a,b,e);clb.Vl(a,b,f);clb.Al(a,a.w[b]);a.T=0;return true};clb.Lj=function Lj(a,b,c){if(c){if(a.s[b]>8)return false;++a.s[b]}else{if(a.s[b]<-8)return false;--a.s[b]}a.T=0;return true};clb.Mj=function Mj(a,b,c){var d,e,f,g,h;f=false;g=a.H[b];if(c==511){f=clb.Tk(a,b)}else if(clb.To(a,b,c)){if(c==257||c==129){d=clb.vl(a,b,a.D[0][b]);e=clb.vl(a,b,a.D[1][b]);if(c==g){if(d==e||e){h=a.D[0][b];a.D[0][b]=a.D[1][b];a.D[1][b]=h;f=true}}else{if(!d&&e){h=a.D[0][b];a.D[0][b]=a.D[1][b];a.D[1][b]=h}a.H[b]=c;f=true}}else{a.H[b]=c;f=true}}if(f){a.T=(g&127)==(c&127)?a.T&7:0;a.G[b]=0}return f};clb.Nj=function Nj(a){a.q=0;a.r=0;a.K=false;a.L=false;a.I=0;a.v=null;a.t=null;a.P=null;a.T=0};clb.Oj=function Oj(a){var b,c,d,e,f,g,h,i;for(g=0;g<a.r;g++){if(a.H[g]==512){c=a.D[0][g];d=a.D[1][g];if(a.C[c]==-1^a.C[d]==-1){if(a.s[c]!=0&&a.s[d]!=0){if(a.s[c]<0^a.s[d]<0){if(a.s[c]<0){++a.s[c];--a.s[d]}else{--a.s[c];++a.s[d]}}}}}}i=gW(Ykb.AX,gmb,6,a.q,15,1);e=0;for(b=0;b<a.q;b++){if(a.C[b]==-1){i[b]=-1;continue}if(e<b){a.C[e]=a.C[b];a.s[e]=a.s[b];a.A[e]=a.A[b];a.u[e]=a.u[b];a.B[e]=a.B[b];a.w[e]=a.w[b];clb.yh(a.J[e],a.J[b]);a.v!=null&&(a.v[e]=a.v[b]);a.t!=null&&(a.t[e]=a.t[b])}i[b]=e;++e}a.q=e;h=0;for(f=0;f<a.r;f++){if(a.H[f]==512)continue;a.H[h]=a.H[f];a.F[h]=a.F[f];a.G[h]=a.G[f];a.D[0][h]=i[a.D[0][f]];a.D[1][h]=i[a.D[1][f]];++h}a.r=h;return i};clb.Pj=function Pj(a,b,c,d,e){var f,g,h;f=b.q;f>=b.M&&clb.om(b,b.M*2);h=(a.u[c]&rnb)>>18;g=-1;h==1?d==-1?(g=clb.Cl(b,h)):(g=$wnd.Math.min(31,d+((a.u[c]&rnb)>>18!=1&&(a.u[c]&rnb)>>18!=2?-1:(a.u[c]&Snb)>>20))):h==2&&(e==-1?(g=clb.Cl(b,h)):(g=$wnd.Math.min(31,e+((a.u[c]&rnb)>>18!=1&&(a.u[c]&rnb)>>18!=2?-1:(a.u[c]&Snb)>>20))));b.C[f]=a.C[c];b.s[f]=a.s[c];b.A[f]=a.A[c];b.u[f]=a.u[c];b.B[f]=b.K?a.B[c]:0;clb.yh(b.J[f],a.J[c]);b.w[f]=a.w[c];b.v!=null&&(b.v[f]=null);if(a.v!=null&&a.v[c]!=null&&b.K){b.v==null&&(b.v=gW(Ykb.AX,Dnb,7,b.C.length,0,2));b.v[f]=dlb.Ubb(a.v[c],a.v[c].length)}b.t!=null&&(b.t[f]=null);if(a.t!=null&&a.t[c]!=null){b.t==null&&(b.t=gW(Ykb.wX,Llb,9,b.C.length,0,2));b.t[f]=dlb.Sbb(a.t[c],a.t[c].length)}if(g!=-1){b.u[f]&=-32505857;b.u[f]|=g<<20}++b.q;b.T=0;return f};clb.Qj=function Qj(a,b,c,d,e,f,g,h){var i,j,k,l;j=b.r;j>=b.N&&clb.pm(b,b.N*2);l=(a.F[c]&768)>>8;k=-1;l==1&&(d==-1?(k=clb.Cl(b,l)):(k=$wnd.Math.min(32,d+((a.F[c]&768)>>8!=1&&(a.F[c]&768)>>8!=2?-1:(a.F[c]&Tnb)>>10))));l==2&&(e==-1?(k=clb.Cl(b,l)):(k=$wnd.Math.min(32,e+((a.F[c]&768)>>8!=1&&(a.F[c]&768)>>8!=2?-1:(a.F[c]&Tnb)>>10))));b.D[0][j]=f;b.D[1][j]=g;i=h&&a.vb(c)?64:a.H[c];b.H[j]=i;b.F[j]=a.F[c];b.G[j]=b.K?a.G[c]:0;if(k!=-1){b.F[j]&=-31745;b.F[j]|=k<<10}++b.r;b.T=0;return j};clb.Rj=function Rj(a,b,c,d,e,f,g){return clb.Qj(a,b,c,d,e,f==null?a.D[0][c]:f[a.D[0][c]],f==null?a.D[1][c]:f[a.D[1][c]],g)};clb.Sj=function Sj(a,b){var c,d;b.v=null;b.t=null;b.K=a.K;b.q=0;for(c=0;c<a.q;c++)clb.Pj(a,b,c,0,0);b.r=0;for(d=0;d<a.r;d++)clb.Qj(a,b,d,0,0,a.D[0][d],a.D[1][d],false);a.ub(b)};clb.Tj=function Tj(a,b){b.K=a.K;b.L=a.L;b.S=a.S;b.I=a.I;b.P=a.P;b.T=a.T&24};clb.Uj=function Uj(a,b){var c,d,e,f;for(c=0;c<a.r;c++){for(e=0;e<2;e++){if(a.D[e][c]==b){a.H[c]=512;d=0;for(f=0;f<a.r;f++){if(f==c)continue;(a.D[0][f]===a.D[1-e][c]||a.D[1][f]===a.D[1-e][c])&&++d}if(d==0){clb.Al(a,a.w[a.D[1-e][c]]);a.C[a.D[1-e][c]]=-1}}}}clb.Al(a,a.w[b]);a.C[b]=-1;a.v!=null&&(a.v[b]=null);a.t!=null&&(a.t[b]=null);clb.Oj(a);a.T=0};clb.Vj=function Vj(a,b,c){var d,e;d=clb._j(a,b,c);if(d!=-1){(a.u[d]&512)!=0?clb.$j(a):clb.Uj(a,d);a.T=0;return true}e=clb.ak(a,b,c);if(e!=-1){(a.u[a.D[0][e]]&a.u[a.D[1][e]]&512)!=0?clb.$j(a):clb.Yj(a,e);a.T=0;return true}return false};clb.Wj=function Wj(a,b){var c,d,e,f;if(b.length==0)return null;for(d=b,e=0,f=d.length;e<f;++e){c=d[e];a.C[c]=-1}return clb.Zj(a)};clb.Xj=function Xj(a,b){a.H[b]=512;clb.Oj(a);a.T=0};clb.Yj=function Yj(a,b){var c,d,e;for(d=0;d<2;d++){c=0;for(e=0;e<a.r;e++){if(e==b)continue;(a.D[0][e]===a.D[d][b]||a.D[1][e]===a.D[d][b])&&++c}if(c==0){clb.Al(a,a.w[a.D[d][b]]);a.C[a.D[d][b]]=-1}}a.H[b]=512;clb.Oj(a);a.T=0};clb.Zj=function Zj(a){var b,c,d;d=false;for(b=0;b<a.q;b++){if(a.C[b]==-1){d=true;clb.Al(a,a.w[b])}}for(c=0;c<a.r;c++){if(a.H[c]==512){d=true}else if(a.C[a.D[0][c]]==-1||a.C[a.D[1][c]]==-1){a.H[c]=512;d=true}}if(d){a.T=0;return clb.Oj(a)}return null};clb.$j=function $j(a){var b,c;c=false;for(b=0;b<a.q;b++){if((a.u[b]&512)!=0){a.C[b]=-1;c=true}}return c&&clb.Zj(a)!=null};clb._j=function _j(a,b,c){var d,e,f,g,h,i,j,k;g=-1;e=clb.wk(a,a.q,a.r,clb.vj);h=Unb;i=e*e/12;for(d=0;d<a.q;d++){j=a.J[d].a;k=a.J[d].b;f=(b-j)*(b-j)+(c-k)*(c-k);if(f<i&&f<h){h=f;g=d}}return g};clb.ak=function ak(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;m=-1;o=clb.wk(a,a.q,a.r,clb.vj);n=Unb;for(d=0;d<a.r;d++){p=a.J[a.D[0][d]].a;r=a.J[a.D[0][d]].b;q=a.J[a.D[1][d]].a;s=a.J[a.D[1][d]].b;k=q-p;l=s-r;e=$wnd.Math.sqrt(k*k+l*l);f=(p+q)/2;g=(r+s)/2;k=b-f;l=c-g;if($wnd.Math.sqrt(k*k+l*l)>e/2)continue;if(q==p)j=$wnd.Math.abs(p-b);else{h=(s-r)/(p-q);i=-h*p-r;j=$wnd.Math.abs((h*b+c+i)/$wnd.Math.sqrt(h*h+1))}if(j<o&&j<n){n=j;m=d}}return m};clb.bk=function bk(a,b){return ((a.u[b]&Rnb)>>>27)-1};clb.ck=function ck(a,b){return (a.u[b]&49152)>>14};clb.dk=function dk(a,b){return a.s[b]};clb.ek=function ek(a,b){return a.u[b]&448};clb.fk=function fk(a,b){return a.t==null?null:a.t[b]==null?null:Zkb.a5(a.t[b])};clb.gk=function gk(a,b){return a.t==null?null:a.t[b]};clb.hk=function hk(a,b){return (a.u[b]&rnb)>>18!=1&&(a.u[b]&rnb)>>18!=2?-1:(a.u[b]&Snb)>>20};clb.ik=function ik(a,b){return (a.u[b]&rnb)>>18};clb.jk=function jk(a,b){return clb.qj[a.C[b]]};clb.kk=function kk(a,b){return a.v==null?null:a.v[b]};clb.lk=function lk(a,b){var c,d,e;if(a.v==null||a.v[b]==null)return z1(e1(a.B[b],1),0)?'':clb.qj[a.C[b]];e='';for(d=0;d<a.v[b].length;d++){d>0&&(e=(alb.Egb(e),e+(alb.Egb(','),',')));c=a.v[b][d];e=Zkb._4(e,clb.qj[c])}return e};clb.mk=function mk(a,b){return $wnd.Math.abs(a.w[b])};clb.nk=function nk(a,b){return a.A[b]};clb.ok=function ok(a,b){return a.u[b]&3};clb.pk=function pk(a,b){return a.B[b]};clb.qk=function qk(a,b){return a.u[b]&48};clb.rk=function rk(a,b){return a.J[b].a};clb.sk=function sk(a,b){return a.J[b].b};clb.tk=function tk(a,b){return a.J[b].c};clb.uk=function uk(a,b){return a.C[b]};clb.vk=function vk(a){return clb.wk(a,a.q,a.r,clb.vj)};clb.wk=function wk(a,b,c,d){return clb.xk(a,b,c,d,a.J)};clb.xk=function xk(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o;l=false;m=0;for(j=0;j<c;j++)a.H[j]!=32&&(a.G[j]&nnb)==0&&++m;if(m==0){for(k=0;k<c;k++)(a.G[k]&nnb)==0&&++m;l=true}if(m==0){if(b<2)return d;o=Unb;for(f=1;f<b;f++){for(g=0;g<f;g++){n=clb.sh(e[f],e[g]);n>0&&n<o&&(o=n)}}return o!=Unb?0.6*o:d}h=0;for(i=0;i<c;i++){(l||a.H[i]!=32)&&(a.G[i]&nnb)==0&&(h+=clb.sh(e[a.D[1][i]],e[a.D[0][i]]))}return h/m};clb.yk=function yk(a,b,c){return clb.Lm(a.J[b].a,a.J[b].b,a.J[c].a,a.J[c].b)};clb.zk=function zk(a,b,c){return a.D[b][c]};clb.Ak=function Ak(a,b){return ((a.G[b]&7680)>>9)+((a.G[b]&122880)>>13)};clb.Bk=function Bk(a,b){return (a.G[b]&7680)>>9};clb.Ck=function Ck(a,b){return (a.F[b]&48)>>4};clb.Dk=function Dk(a,b){return (a.F[b]&768)>>8!=1&&(a.F[b]&768)>>8!=2?-1:(a.F[b]&Tnb)>>10};clb.Ek=function Ek(a,b){return (a.F[b]&768)>>8};clb.Fk=function Fk(a,b){var c,d,e,f;c=a.D[0][b];d=a.D[1][b];e=a.J[d].a-a.J[c].a;f=a.J[d].b-a.J[c].b;return $wnd.Math.sqrt(e*e+f*f)};clb.Gk=function Gk(a,b,c){var d;for(d=0;d<a.r;d++)if(a.D[0][d]==b&&a.D[1][d]==c||a.D[0][d]==c&&a.D[1][d]==b)if(a.H[d]!=512)return d;return -1};clb.Hk=function Hk(a,b){switch(a.H[b]&127){case 1:case 64:return 1;case 2:return 2;case 4:return 3;case 8:return 4;case 16:return 5;default:return 0;}};clb.Ik=function Ik(a,b){return a.F[b]&3};clb.Jk=function Jk(a,b){return a.G[b]};clb.Kk=function Kk(a,b){return a.H[b]};clb.Lk=function Lk(a,b){return a.H[b]&127};clb.Mk=function Mk(a,b){var c,d,e,f,g;if(a.q==0)return null;d=a.J[0].a;f=a.J[0].b;e=a.J[0].a;g=a.J[0].b;for(c=1;c<a.q;c++){d>a.J[c].a?(d=a.J[c].a):e<a.J[c].a&&(e=a.J[c].a);f>a.J[c].b?(f=a.J[c].b):g<a.J[c].b&&(g=a.J[c].b)}if(!b){b=new plb.YF(d,f,e-d,g-f)}else{b.c=d;b.d=f;b.b=e-d;b.a=g-f}return b};clb.Nk=function Nk(a,b){var c;c=a.C[b]<clb.rj.length?clb.rj[a.C[b]]:null;return c==null?6:c[c.length-1]};clb.Ok=function Ok(a,b,c){var d,e;if(a.C[b]>=171&&a.C[b]<=190)return 0;e=0;(a.u[b]&48)==32&&(e-=1);((a.u[b]&48)==16||(a.u[b]&48)==48)&&(e-=2);d=a.s[b];if(d==0&&a.K){o1(e1(a.B[b],Omb),Rmb)&&(d=-1);o1(e1(a.B[b],Omb),Qmb)&&(d=1)}a.C[b]==7||a.C[b]==8||a.C[b]==9?(e+=d):a.C[b]==6||a.C[b]==14||a.C[b]==32?(e-=$wnd.Math.abs(d)):a.C[b]==15||a.C[b]==33?c-e-d<=3?(e+=d):(e-=d):a.C[b]==16||a.C[b]==34||a.C[b]==52?c-e-d<=4?(e+=d):(e-=$wnd.Math.abs(d)):a.C[b]==17||a.C[b]==35||a.C[b]==53?c-e-d<=5?(e+=d):(e-=$wnd.Math.abs(d)):(e-=d);return e};clb.Pk=function Pk(a,b){var c;c=clb.Qk(a,b);return c+clb.Ok(a,b,c)};clb.Qk=function Qk(a,b){var c,d;c=((a.u[b]&Rnb)>>>27)-1;c==-1&&(c=(d=a.C[b]<clb.rj.length?clb.rj[a.C[b]]:null,d==null?6:d[d.length-1]));return c};clb.Rk=function Rk(a,b){var c,d,e,f,g;f=clb.rl(a,a.D[0][b])||clb.rl(a,a.D[1][b])?5:3;for(d=0;d<2;d++){c=a.D[d][b];e=clb.Hk(a,b)+(g=clb.Qk(a,c),g+clb.Ok(a,c,g))-clb.Pn(a,c);f>e&&(f=e)}return f};clb.Sk=function Sk(a,b){return (a.u[b]&Ylb)!=0};clb.Tk=function Tk(a,b){var c,d,e;d=clb.Rk(a,b);c=clb.jl(a,a.D[0][b])||clb.jl(a,a.D[1][b]);e=c?32:1;if(a.H[b]==16){a.H[b]=e;a.T=0;return true}if(a.H[b]==8){a.H[b]=d>4?16:e;a.T=0;return true}if(a.H[b]==4){a.H[b]=d>3?8:e;a.T=0;return true}if(a.H[b]==2){a.H[b]=386;a.T&=7;if((a.F[b]&128)==0)return true}if(a.H[b]==386){d>2?(a.H[b]=4):(a.H[b]=e);a.T=0;return true}if((384&a.H[b])!=0){a.H[b]=1;a.T&=7;return true}if(!c&&d<2)return false;if(a.H[b]==1){a.H[b]=2;a.T=0;return true}if(d<1)return false;if(a.H[b]==32){a.H[b]=1;a.T=0;return true}return false};clb.Uk=function Uk(a){var b;a.T=0;a.C=gW(Ykb.AX,gmb,6,a.M,15,1);a.s=gW(Ykb.AX,gmb,6,a.M,15,1);a.w=gW(Ykb.AX,gmb,6,a.M,15,1);a.J=gW(Ykb.TX,Vnb,24,a.M,0,1);for(b=0;b<a.M;b++)a.J[b]=new clb.Ch;a.A=gW(Ykb.AX,gmb,6,a.M,15,1);a.u=gW(Ykb.AX,gmb,6,a.M,15,1);a.B=gW(Ykb.BX,Anb,6,a.M,14,1);a.v=null;a.t=null;a.D=eW(Ykb.AX,[Dnb,gmb],[7,6],15,[2,a.N],2);a.H=gW(Ykb.AX,gmb,6,a.N,15,1);a.F=gW(Ykb.AX,gmb,6,a.N,15,1);a.G=gW(Ykb.AX,gmb,6,a.N,15,1)};clb.Vk=function Vk(a,b){a.T&=~b};clb.Wk=function Wk(a){var b;for(b=0;b<a.q;b++)if(a.J[b].c!=0)return true;return false};clb.Xk=function Xk(a,b){return (a.u[b]&Wnb)!=0};clb.Yk=function Yk(a,b){return a.C[b]==-1};clb.Zk=function Zk(a,b){return (a.u[b]&4)!=0};clb.$k=function $k(a,b){return (a.u[b]&Xnb)!=0};clb._k=function _k(a,b){return a.w[b]<0};clb.al=function al(a,b){return (a.F[b]&Ynb)!=0};clb.bl=function bl(a,b){return (a.G[b]&nnb)!=0};clb.cl=function cl(a,b){return (a.F[b]&Ylb)!=0};clb.dl=function dl(a,b){return a.H[b]==512};clb.el=function el(a,b){return (a.F[b]&4)!=0};clb.fl=function fl(a,b){return (a.F[b]&Gnb)!=0};clb.gl=function gl(a,b){var c,d,e,f;if(a.K){if(z1(e1(a.B[b],1),0))return false;if(a.v!=null&&a.v[b]!=null)for(d=a.v[b],e=0,f=d.length;e<f;++e){c=d[e];if(!clb.Om(c))return false}}return clb.Om(a.C[b])};clb.hl=function hl(a,b){var c,d,e,f;if(a.K){if(z1(e1(a.B[b],1),0))return false;if(a.v!=null&&a.v[b]!=null)for(d=a.v[b],e=0,f=d.length;e<f;++e){c=d[e];if(!clb.Pm(c))return false}}return clb.Pm(a.C[b])};clb.il=function il(a,b){return (a.u[b]&Gnb)!=0};clb.jl=function jl(a,b){var c,d,e,f;if(a.K){if(z1(e1(a.B[b],1),0))return false;if(a.v!=null&&a.v[b]!=null)for(d=a.v[b],e=0,f=d.length;e<f;++e){c=d[e];if(!(c>=3&&c<=4||c>=11&&c<=13||c>=19&&c<=31||c>=37&&c<=51||c>=55&&c<=84||c>=87&&c<=103))return false}}return clb.Qm(a.C[b])};clb.kl=function kl(a,b){return a.A[b]==0};clb.ll=function ll(a,b){var c,d,e,f;if(a.K){if(z1(e1(a.B[b],1),0))return false;if(a.v!=null&&a.v[b]!=null)for(d=a.v[b],e=0,f=d.length;e<f;++e){c=d[e];if(!(c==1||c>=5&&c<=9||c>=14&&c<=17||c>=32&&c<=35||c>=52&&c<=53))return false}}return clb.Rm(a.C[b])};clb.ml=function ml(a){var b;for(b=0;b<a.q;b++){switch(a.C[b]){case 1:case 5:case 6:case 7:case 8:case 9:case 14:case 15:case 16:case 17:case 33:case 34:case 35:case 52:case 53:continue;default:return false;}}return true};clb.nl=function nl(a,b){return (a.u[b]&512)!=0};clb.ol=function ol(a,b){return (a.u[a.D[0][b]]&a.u[a.D[1][b]]&512)!=0};clb.pl=function pl(a,b){return a.H[b]==257||a.H[b]==129};clb.ql=function ql(a,b,c){return (a.H[b]==257||a.H[b]==129)&&a.D[0][b]==c};clb.rl=function rl(a,b){var c,d,e,f;if(a.K){if(z1(e1(a.B[b],1),0))return false;if(a.v!=null&&a.v[b]!=null)for(d=a.v[b],e=0,f=d.length;e<f;++e){c=d[e];if(!(c>=3&&c<=4||c>=11&&c<=13||c>=19&&c<=31||c>=37&&c<=51||c>=55&&c<=84||c>=87&&c<=103))return false}}return clb.Sm(a.C[b])};clb.sl=function sl(a,b){a.C[b]=-1};clb.tl=function tl(a,b){a.H[b]=512};clb.ul=function ul(a,b,c,d,e,f,g,h){var i,j,k,l,m,n,o,p,q,r;if(b!=d){q=a.J[b].a-a.J[d].a;r=a.J[b].b-a.J[d].b;h=$wnd.Math.sqrt(q*q+r*r)}i=b;k=clb.tm(a,b)!=3;for(p=1;p<c;p++){m=a.J[i].a+h*$wnd.Math.sin(f);n=a.J[i].b+h*$wnd.Math.cos(f);o=-1;for(l=0;l<a.q;l++){if($wnd.Math.abs(m-a.J[l].a)<4&&$wnd.Math.abs(n-a.J[l].b)<4){o=l;break}}if(o==-1){o=clb.xj(a,m,n,0);a.J[o].a=m;a.J[o].b=n;a.J[o].c=0}j=clb.Gk(a,i,o);if(j==-1){j=clb.Aj(a,i,o,clb.jl(a,i)||clb.jl(a,o)?32:1);if(e){k&&clb.tm(a,a.D[0][j])<4&&clb.tm(a,a.D[1][j])<3&&(a.H[j]=2);k=!k}}i=o;f+=g}j=clb.Gk(a,i,d);j==-1&&(j=clb.Aj(a,i,d,clb.jl(a,i)||clb.jl(a,d)?32:1));e&&k&&clb.tm(a,a.D[0][j])<4&&clb.tm(a,a.D[1][j])<4&&(a.H[j]=2)};clb.vl=function vl(a,b,c){var d,e;if(clb.Hk(a,b)!=1)return false;if((a.u[c]&3)!=0)return true;for(e=0;e<a.r;e++)if(e!=b&&a.H[e]==2&&(a.D[0][e]==c&&(a.u[a.D[1][e]]&3)!=0||a.D[1][e]==c&&(a.u[a.D[0][e]]&3)!=0))return true;for(d=0;d<a.r;d++)if(d!=b&&a.H[d]==1&&(a.D[0][d]==c||a.D[1][d]==c)&&(a.F[d]&3)!=0)return true;return false};clb.wl=function wl(a){var b;for(b=0;b<a.q;b++)a.u[b]&=-449};clb.xl=function xl(a){var b;for(b=0;b<a.q;b++)a.u[b]&=-131073};clb.yl=function yl(a){var b;for(b=0;b<a.q;b++)a.u[b]&=-513};clb.zl=function zl(a){var b;for(b=0;b<a.r;b++)a.F[b]&=-98305};clb.Al=function Al(a,b){var c;for(c=0;c<a.q;c++)$wnd.Math.abs(a.w[c])==$wnd.Math.abs(b)&&(a.w[c]=0)};clb.Bl=function Bl(a){var b,c,d,e;e=false;for(c=0;c<a.q;c++){if(z1(e1(a.B[c],Bmb),0)){a.C[c]=-1;e=true}}e&&clb.Zj(a);if(a.v!=null){a.v=null;e=true}for(b=0;b<a.q;b++){if(z1(a.B[b],0)){a.B[b]=0;e=true}}for(d=0;d<a.r;d++){if(a.G[d]!=0){a.G[d]=0;e=true}if(a.H[d]==64){a.H[d]=1;e=true}}e&&(a.T=0);return e};clb.Cl=function Cl(a,b){var c,d,e,f,g,h,i,j,k;if(b==0)return 0;h=null;for(d=0;d<a.q;d++){if((a.u[d]&rnb)>>18==b){h==null&&(h=gW(Ykb.Z0,Amb,6,32,16,1));h[(a.u[d]&rnb)>>18!=1&&(a.u[d]&rnb)>>18!=2?-1:(a.u[d]&Snb)>>20]=true}}for(f=0;f<a.r;f++){if((a.F[f]&768)>>8==b){h==null&&(h=gW(Ykb.Z0,Amb,6,32,16,1));h[(a.F[f]&768)>>8!=1&&(a.F[f]&768)>>8!=2?-1:(a.F[f]&Tnb)>>10]=true}}k=0;if(h!=null){j=gW(Ykb.AX,gmb,6,32,15,1);for(i=0;i<32;i++)h[i]&&(j[i]=k++);for(c=0;c<a.q;c++){if((a.u[c]&rnb)>>18==b){g=j[(a.u[c]&rnb)>>18!=1&&(a.u[c]&rnb)>>18!=2?-1:(a.u[c]&Snb)>>20];a.u[c]&=-32505857;a.u[c]|=g<<20}}for(e=0;e<a.r;e++){if((a.F[e]&768)>>8==b){g=j[(a.F[e]&768)>>8!=1&&(a.F[e]&768)>>8!=2?-1:(a.F[e]&Tnb)>>10];a.F[e]&=-31745;a.F[e]|=g<<10}}}return k};\nclb.Dl=function Dl(a,b){var c;for(c=0;c<a.q;c++){a.J[c].a*=b;a.J[c].b*=b}};clb.El=function El(a,b){a.q=b;a.T=0};clb.Fl=function Fl(a,b){a.r=b;a.T=0};clb.Gl=function Gl(a,b,c){if(c>=-1&&c<=14){a.u[b]&=-2013265921;a.u[b]|=1+c<<27;if(a.C[b]==6){if(c==-1||c==0||c==2||c==4){a.u[b]&=-49;c==2&&(a.u[b]|=16)}}}};clb.Hl=function Hl(a,b,c){a.u[b]&=-49153;a.u[b]|=c<<14};clb.Il=function Il(a,b,c){a.s[b]=c;a.T=0};clb.Jl=function Jl(a,b,c){a.u[b]&=-449;a.u[b]|=c};clb.Kl=function Kl(a,b,c){c?(a.u[b]|=Wnb):(a.u[b]&=Znb);a.T&=7};clb.Ll=function Ll(a,b,c){var d,e;if(c!=null){if(alb.Pgb(c).length==0)c=null;else{d=clb.Nm(c,321);if(d!=0&&Zkb.c5(c,clb.qj[d])||Zkb.c5(c,'?')){clb._l(a,b,d);c=null}}}if(c==null){a.t!=null&&(a.t[b]=null)}else{a.t==null&&(a.t=gW(Ykb.wX,Llb,9,a.M,0,2));a.t[b]=alb.qgb((e=c,alb.lgb(),e))}};clb.Ml=function Ml(a,b,c){c!=null&&c.length==0&&(c=null);if(c==null){a.t!=null&&(a.t[b]=null)}else{a.t==null&&(a.t=gW(Ykb.wX,Llb,9,a.M,0,2));a.t[b]=c}};clb.Nl=function Nl(a,b,c,d){var e,f,g;if(c==0){a.u[b]&=$nb;a.u[b]|=c<<18}else{if(d>=32)return;if(d==-1){g=-1;for(f=0;f<a.q;f++)f!=b&&c==(a.u[f]&rnb)>>18&&g<((a.u[f]&rnb)>>18!=1&&(a.u[f]&rnb)>>18!=2?-1:(a.u[f]&Snb)>>20)&&(g=(a.u[f]&rnb)>>18!=1&&(a.u[f]&rnb)>>18!=2?-1:(a.u[f]&Snb)>>20);for(e=0;e<a.r;e++)c==(a.F[e]&768)>>8&&g<((a.F[e]&768)>>8!=1&&(a.F[e]&768)>>8!=2?-1:(a.F[e]&Tnb)>>10)&&(g=(a.F[e]&768)>>8!=1&&(a.F[e]&768)>>8!=2?-1:(a.F[e]&Tnb)>>10);d=g+1;if(d>=32)return}a.u[b]&=$nb;a.u[b]|=c<<18|d<<20}a.T&=7};clb.Ol=function Ol(a,b,c){a.v==null&&(a.v=gW(Ykb.AX,Dnb,7,a.M,0,2));alb.jgb(c,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));a.v[b]=c;a.T=0;a.K=true};clb.Pl=function Pl(a,b,c,d){var e;if(c==null){a.v!=null&&(a.v[b]=null);return}if(c.length==1&&!d){e=c[0];a.C[b]!=e&&clb.Kj(a,b,e,0,-1,0);a.v!=null&&(a.v[b]=null);return}a.v==null&&(a.v=gW(Ykb.AX,Dnb,7,a.M,0,2));a.v[b]=c;d&&(a.B[b]=B1(a.B[b],1));a.T=0;a.K=true};clb.Ql=function Ql(a,b,c,d){a.w[b]=d?-c:c};clb.Rl=function Rl(a,b,c){c?(a.u[b]|=Gnb):(a.u[b]&=-131073)};clb.Sl=function Sl(a,b,c){a.A[b]=c;a.T&=7};clb.Tl=function Tl(a,b,c,d){a.u[b]&=-33554440;a.u[b]|=c;d&&(a.u[b]|=4)};clb.Ul=function Ul(a,b,c,d){d?(a.B[b]=B1(a.B[b],c)):(a.B[b]=e1(a.B[b],A1(c)));a.T=0;a.K=true};clb.Vl=function Vl(a,b,c){a.u[b]&=-49;a.u[b]|=c;a.T&=7};clb.Wl=function Wl(a,b,c){c?(a.u[b]|=512):(a.u[b]&=-513)};clb.Xl=function Xl(a,b,c){a.u[b]&=-67108865;c&&(a.u[b]|=Xnb)};clb.Yl=function Yl(a,b,c){a.J[b].a=c;a.T&=7};clb.Zl=function Zl(a,b,c){a.J[b].b=c;a.T&=7};clb.$l=function $l(a,b,c){a.J[b].c=c;a.T&=7};clb._l=function _l(a,b,c){if(c>=0&&c<=190){if(c==151||c==152){a.C[b]=1;a.A[b]=c-149}else{a.C[b]=c;a.A[b]=0}a.u[b]&=-2013265921;a.T=0}};clb.am=function am(a,b,c,d){a.D[b][c]=d;a.T=0};clb.bm=function bm(a,b,c){c?(a.F[b]|=Ynb):(a.F[b]&=-32769)};clb.cm=function cm(a,b,c){a.F[b]&=-49;a.F[b]|=c<<4};clb.dm=function dm(a,b,c,d){var e,f,g;if(c==0){a.F[b]&=-32513;a.F[b]|=c<<8}else{if(d>=32)return;if(d==-1){g=-1;for(f=0;f<a.q;f++)c==(a.u[f]&rnb)>>18&&g<((a.u[f]&rnb)>>18!=1&&(a.u[f]&rnb)>>18!=2?-1:(a.u[f]&Snb)>>20)&&(g=(a.u[f]&rnb)>>18!=1&&(a.u[f]&rnb)>>18!=2?-1:(a.u[f]&Snb)>>20);for(e=0;e<a.r;e++)e!=b&&c==(a.F[e]&768)>>8&&g<((a.F[e]&768)>>8!=1&&(a.F[e]&768)>>8!=2?-1:(a.F[e]&Tnb)>>10)&&(g=(a.F[e]&768)>>8!=1&&(a.F[e]&768)>>8!=2?-1:(a.F[e]&Tnb)>>10);d=g+1;if(d>=32)return}a.F[b]&=-32513;a.F[b]|=c<<8|d<<10}a.T&=7};clb.em=function em(a,b,c){c?(a.F[b]|=Ylb):(a.F[b]&=-65537)};clb.fm=function fm(a,b,c){a.H[b]=c==1?1:c==2?2:c==3?4:32;a.T=0};clb.gm=function gm(a,b,c,d){a.F[b]&=-131080;a.F[b]|=c;d&&(a.F[b]|=4)};clb.hm=function hm(a,b){a.F[b]|=Gnb};clb.im=function im(a,b,c,d){d?(a.G[b]|=c):(a.G[b]&=~c);a.T=0;a.K=true};clb.jm=function jm(a,b,c){a.H[b]=c;a.T=0};clb.km=function km(a,b){a.I=b};clb.lm=function lm(a,b){if(a.K!=b){a.K=b;b||clb.Bl(a);a.T=0}};clb.mm=function mm(a,b){a.T=b};clb.nm=function nm(a,b){a.S=b};clb.om=function om(a,b){var c,d;a.C=clb.Fm(a.C,b);a.s=clb.Fm(a.s,b);a.w=clb.Fm(a.w,b);d=a.J.length;a.J=clb.Hm(a.J,b);for(c=d;c<b;c++)a.J[c]=new clb.Ch;a.A=clb.Fm(a.A,b);a.u=clb.Fm(a.u,b);a.B=clb.Gm(a.B,b);a.v!=null&&(a.v=clb.Jm(a.v,b));a.t!=null&&(a.t=clb.Im(a.t,b));a.M=b};clb.pm=function pm(a,b){a.D[0]=clb.Fm(a.D[0],b);a.D[1]=clb.Fm(a.D[1],b);a.H=clb.Fm(a.H,b);a.F=clb.Fm(a.F,b);a.G=clb.Fm(a.G,b);a.N=b};clb.qm=function qm(a,b){a.O=b};clb.rm=function rm(a,b){a.P=b};clb.sm=function sm(a,b){a.u[b]|=Ylb};clb.tm=function tm(a,b){var c,d;d=0;for(c=0;c<a.r;c++)(a.D[0][c]==b||a.D[1][c]==b)&&(d+=clb.Hk(a,c));return d};clb.um=function um(a){var b,c,d;c=false;d=false;for(b=0;b<a.q;b++){if(a.A[b]!=0){a.A[b]=0;c=true;a.C[b]==1&&(d=true)}}d&&(a.T=0);return c};clb.vm=function vm(a,b,c){return clb.jl(a,b)||clb.jl(a,c)?32:1};clb.wm=function wm(a,b,c){var d,e,f,g,h,i;g=a.C[b];a.C[b]=a.C[c];a.C[c]=g;g=a.s[b];a.s[b]=a.s[c];a.s[c]=g;g=a.A[b];a.A[b]=a.A[c];a.A[c]=g;g=a.u[b];a.u[b]=a.u[c];a.u[c]=g;i=a.B[b];a.B[b]=a.B[c];a.B[c]=i;g=a.w[b];a.w[b]=a.w[c];a.w[c]=g;f=a.J[b];a.J[b]=a.J[c];a.J[c]=f;if(a.v!=null){h=a.v[b];a.v[b]=a.v[c];a.v[c]=h}if(a.t!=null){h=a.t[b];a.t[b]=a.t[c];a.t[c]=h}for(d=0;d<a.r;d++){for(e=0;e<2;e++){a.D[e][d]==b?(a.D[e][d]=c):a.D[e][d]==c&&(a.D[e][d]=b)}}a.T=0};clb.xm=function xm(a,b,c){var d;d=a.D[0][b];a.D[0][b]=a.D[0][c];a.D[0][c]=d;d=a.D[1][b];a.D[1][b]=a.D[1][c];a.D[1][c]=d;d=a.H[b];a.H[b]=a.H[c];a.H[c]=d;d=a.F[b];a.F[b]=a.F[c];a.F[c]=d;d=a.G[b];a.G[b]=a.G[c];a.G[c]=d;a.T=0};clb.ym=function ym(a,b,c){var d;for(d=0;d<a.q;d++){a.J[d].a+=b;a.J[d].b+=c}a.U+=b;a.V+=c};clb.zm=function zm(a,b,c){var d,e;e=c&127;d=clb.Rk(a,b);switch(e){case 1:case 64:return d>=1;case 2:return d>=2;case 4:return d>=3;case 8:return d>=4;case 16:return d>=5;case 32:return true;default:return false;}};clb.Am=function Am(a,b,c,d){var e,f,g;for(e=0;e<a.q;e++){if(!d||(a.u[e]&512)!=0){g=a.R[e]*b;f=a.Q[e]-c;a.J[e].a=a.U+g*$wnd.Math.sin(f);a.J[e].b=a.V+g*$wnd.Math.cos(f)}}d&&(a.T&=7)};clb.Bm=function Bm(a,b,c){var d,e,f;a.U=b;a.V=c;a.Q=gW(Ykb.yX,emb,6,a.q,15,1);a.R=gW(Ykb.yX,emb,6,a.q,15,1);for(d=0;d<a.q;d++){e=b-a.J[d].a;f=c-a.J[d].b;a.R[d]=$wnd.Math.sqrt(e*e+f*f);a.Q[d]=clb.Lm(b,c,a.J[d].a,a.J[d].b)}};clb.Cm=function Cm(){this.M=this.N=256;clb.Uk(this)};clb.Dm=function Dm(a,b){this.M=$wnd.Math.max(1,a);this.N=$wnd.Math.max(1,b);clb.Uk(this)};clb.Fm=function Fm(a,b){var c;c=gW(Ykb.AX,gmb,6,b,15,1);Zkb.P5(a,0,c,0,$wnd.Math.min(a.length,b));return c};clb.Gm=function Gm(a,b){var c;c=gW(Ykb.BX,Anb,6,b,14,1);Zkb.P5(a,0,c,0,$wnd.Math.min(a.length,b));return c};clb.Hm=function Hm(a,b){var c,d;c=gW(Ykb.TX,Vnb,24,b,0,1);for(d=0;d<a.length;d++)!!a[d]&&(c[d]=new clb.Eh(a[d]));return c};clb.Im=function Im(a,b){var c,d;c=gW(Ykb.wX,Llb,9,b,0,2);for(d=0;d<a.length;d++){if(a[d]!=null){c[d]=gW(Ykb.wX,Fnb,6,a[d].length,15,1);Zkb.P5(a[d],0,c[d],0,a[d].length)}}return c};clb.Jm=function Jm(a,b){var c,d;c=gW(Ykb.AX,Dnb,7,b,0,2);for(d=0;d<a.length;d++){if(a[d]!=null){c[d]=gW(Ykb.AX,gmb,6,a[d].length,15,1);Zkb.P5(a[d],0,c[d],0,a[d].length)}}return c};clb.Km=function Km(a){clb.wj();return a>=0&&a<clb.rj.length&&clb.rj[a]!=null?clb.rj[a]:a>=171&&a<=190?clb.pj:clb.tj};clb.Lm=function Lm(a,b,c,d){clb.wj();var e,f,g;f=c-a;g=d-b;if(g!=0){e=$wnd.Math.atan(f/g);g<0&&(f<0?(e-=Fmb):(e+=Fmb))}else e=f>0?Gmb:mnb;return e};clb.Mm=function Mm(a,b){clb.wj();var c;c=a-b;while(c<_nb)c+=Emb;while(c>Fmb)c-=Emb;return c};clb.Nm=function Nm(a,b){clb.wj();var c,d,e,f,g;if((b&256)!=0&&Zkb.c5(a,'?'))return 0;for(d=1;d<=128;d++)if(!Zkb.c5(a,Qnb)&&Zkb.d5(a,clb.qj[d]))return d;if((b&2)!=0)for(e=129;e<=144;e++)if(Zkb.d5(a,clb.qj[e]))return e;if((b&4)!=0)for(f=146;f<=148;f++)if(Zkb.d5(a,clb.qj[f]))return f;if((b&1)!=0)for(g=151;g<=152;g++)if(Zkb.d5(a,clb.qj[g]))return g;if((b&32)!=0)if(Zkb.d5(a,clb.qj[153]))return 153;if((b&8)!=0)if(Zkb.d5(a,clb.qj[154]))return 154;if((b&16)!=0)if(Zkb.d5(a,clb.qj[145]))return 145;if((b&128)!=0)if(Zkb.d5(a,clb.qj[159]))return 159;if((b&64)!=0)for(c=171;c<=190;c++)if(Zkb.d5(a,clb.qj[c]))return c;return 0};clb.Om=function Om(a){clb.wj();switch(a){case 7:case 8:case 9:case 15:case 16:case 17:case 33:case 34:case 35:case 52:case 53:return true;}return false};clb.Pm=function Pm(a){clb.wj();if(a==1||a==6)return false;if(clb.Om(a))return false;if(a==2||a==10||a==18||a==36||a==54)return false;if(a>103)return false;return true};clb.Qm=function Qm(a){return a>=3&&a<=4||a>=11&&a<=13||a>=19&&a<=31||a>=37&&a<=51||a>=55&&a<=84||a>=87&&a<=103};clb.Rm=function Rm(a){return a==1||a>=5&&a<=9||a>=14&&a<=17||a>=32&&a<=35||a>=52&&a<=53};clb.Sm=function Sm(a){return a>=21&&a<=30||a>=39&&a<=48||a==57||a>=72&&a<=80||a==89||a>=104&&a<=112};U1(74,1,{74:1,4:1});_.ub=function Em(a){clb.Tj(this,a)};_.vb=function Tm(a){return this.H[a]==64};_.q=0;_.r=0;_.I=0;_.K=false;_.L=false;_.M=0;_.N=0;_.O=0;_.S=false;_.T=0;_.U=0;_.V=0;clb.vj=24;Ykb.dY=w3(74);clb.Um=function Um(a,b,c,d){var e,f,g,h,i,j,k,l,m;clb.Gt(b,1);d==null&&(d=gW(Ykb.AX,gmb,6,b.q,15,1));h=clb.Cl(a,1);i=clb.Cl(a,2);m=gW(Ykb.Z0,Amb,6,b.q,16,1);j=gW(Ykb.AX,gmb,6,b.q,15,1);j[0]=c;m[c]=true;d[c]=clb.Pj(b,a,c,h,i);g=0;k=0;while(g<=k){for(l=0;l<clb.gn(b,j[g]);l++){f=b.i[j[g]][l];if(!m[f]){j[++k]=f;m[f]=true;d[f]=clb.Pj(b,a,f,h,i)}}++g}for(e=0;e<b.r;e++)m[b.D[0][e]]&&clb.Qj(b,a,e,h,i,d==null?b.D[0][e]:d[b.D[0][e]],d==null?b.D[1][e]:d[b.D[1][e]],false);clb.Cl(a,1);clb.Cl(a,2);a.T=0};clb.Vm=function Vm(a){var b,c,d,e,f,g,h,i,j,k,l,m;a.j=gW(Ykb.AX,gmb,6,a.q,15,1);a.e=gW(Ykb.AX,gmb,6,a.q,15,1);a.i=gW(Ykb.AX,Dnb,7,a.q,0,2);a.k=gW(Ykb.AX,Dnb,7,a.q,0,2);a.n=gW(Ykb.AX,Dnb,7,a.q,0,2);a.o=gW(Ykb.AX,gmb,6,a.f,15,1);j=gW(Ykb.AX,gmb,6,a.q,15,1);for(g=0;g<a.r;g++){++j[a.D[0][g]];++j[a.D[1][g]]}for(d=0;d<a.q;d++){a.i[d]=gW(Ykb.AX,gmb,6,j[d],15,1);a.k[d]=gW(Ykb.AX,gmb,6,j[d],15,1);a.n[d]=gW(Ykb.AX,gmb,6,j[d],15,1)}l=false;for(h=0;h<a.g;h++){m=clb.Hk(a,h);if(m==0){l=true;continue}for(k=0;k<2;k++){c=a.D[k][h];b=a.e[c];a.n[c][b]=m;a.i[c][b]=a.D[1-k][h];a.k[c][b]=h;++a.e[c];++a.j[c];c<a.f&&(m>1?(a.o[c]+=m-1):a.H[h]==64&&(a.o[c]=1))}}for(i=a.g;i<a.r;i++){m=clb.Hk(a,i);if(m==0){l=true;continue}for(k=0;k<2;k++){c=a.D[k][i];b=a.e[c];a.n[c][b]=m;a.i[c][b]=a.D[1-k][i];a.k[c][b]=i;++a.e[c];a.D[1-k][i]<a.f&&++a.j[c]}}if(l){b=gW(Ykb.AX,gmb,6,a.q,15,1);for(e=0;e<a.q;e++)b[e]=a.e[e];for(f=0;f<a.r;f++){m=clb.Hk(a,f);if(m==0){for(k=0;k<2;k++){c=a.D[k][f];a.n[c][b[c]]=m;a.i[c][b[c]]=a.D[1-k][f];a.k[c][b[c]]=f;++b[c]}}}}};clb.Wm=function Wm(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;clb.Gt(a,1);c&&(b=true);for(i=0;i<a.r;i++){j=clb.Hk(a,i);if(j==1||j==2){if(a.s[a.D[0][i]]>0&&a.s[a.D[1][i]]<0){f=a.D[0][i];g=a.D[1][i]}else if(a.s[a.D[0][i]]<0&&a.s[a.D[1][i]]>0){f=a.D[1][i];g=a.D[0][i]}else continue;if(clb.jl(a,f)||clb.jl(a,g))continue;if(a.C[f]<9&&clb.Pn(a,f)>3||a.C[g]<9&&clb.Pn(a,g)>3)continue;l=clb.Kn(a,f)!=0;a.s[f]-=1;a.s[g]+=1;if(!l){s=a.H[i];j==1?(a.H[i]=2):(a.H[i]=4);if(s==129||s==257){w=a.D[0][i];r=clb.Io(a,w,false);if(a.D[0][r]!=w){a.D[1][r]=a.D[0][r];a.D[1][r]=w}}}a.T=0}}t=0;p=0;n=0;for(e=0;e<a.q;e++){t+=a.s[e];if(a.s[e]<0&&!clb.ho(a,e)){++p;clb.gl(a,e)&&(n-=a.s[e])}}if(!b&&t!=0)throw c1(new Zkb.rz(\"molecule's overall charges are not balanced\"));clb.Gt(a,1);u=0;v=c?t+n:n;for(h=0;h<a.q;h++){if(a.s[h]>0){if(!clb.go(a,h)&&clb.gl(a,h)){k=$wnd.Math.min(clb.Kn(a,h),a.s[h]);if(k!=0&&v>=k){t-=k;u-=k;v-=k;a.s[h]-=k;a.T&=1}}}}q=c?t:u;if(q<0){o=gW(Ykb.AX,gmb,6,p,15,1);p=0;for(f=0;f<a.q;f++){a.s[f]<0&&!clb.ho(a,f)&&(o[p++]=(a.C[f]<<22)+f)}alb.jgb(o,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));for(m=o.length-1;q<0&&m>=o.length-p;m--){d=o[m]&aob;if(clb.gl(a,d)){k=$wnd.Math.min(-q,-a.s[d]);t+=k;q+=k;a.s[d]+=k;a.T&=1}}}return t};clb.Xm=function Xm(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;if(!a.K)return false;for(c=0;c<a.q;c++){n=clb.Qk(a,c);n+clb.Ok(a,c,n)-clb.Pn(a,c)<=0&&!(a.s[c]==0&&(a.C[c]==5||(e=a.C[c],e==7||e==15||e==33)||(d=a.C[c],d==8||d==16||d==34||d==52)))&&(a.B[c]=e1(a.B[c],-6145))}g=false;for(b=0;b<a.f;b++){h=a.e[b]-a.j[b];if(!a.S&&h>0){if(o1(e1(a.B[b],lnb),0)){k=o1(e1(a.B[b],Mmb),896)?3:o1(e1(a.B[b],Mmb),384)?2:o1(e1(a.B[b],128),128)?1:0;i=(n=clb.Qk(a,b),n+clb.Ok(a,b,n)-clb.Pn(a,b));a.s[b]==0&&o1(e1(a.B[b],Omb),0)&&a.C[b]!=6&&++i;l=h;l>3-k&&(l=3-k);l>i+h-k&&(l=i+h-k);if(l>0){m=k==0?0:C1(e1(a.B[b],Mmb),l);m=B1(m,Ykb.m1((l==3?7:h==2?3:1)<<7));a.B[b]=e1(a.B[b],-1921);a.B[b]=B1(a.B[b],e1(Mmb,m))}}for(j=a.j[b];j<a.e[b];j++){f=a.k[b][j];if(a.H[f]==1){a.C[a.i[b][j]]=-1;a.H[f]=512;g=true}}}}g&&clb.Oj(a);return g};clb.Ym=function Ym(a,b){var c,d,e,f;if(a.o[b]==2&&a.j[b]==2&&a.n[b][0]==2){for(e=0;e<2;e++){c=clb.bn(a,b,a.i[b][e]);if(c!=-1){for(f=0;f<a.j[c];f++){d=a.k[c][f];(a.H[d]==257||a.H[d]==129)&&a.D[0][d]==c&&(a.H[a.k[c][f]]=1)}}}return}if(a.o[b]==0||a.C[b]>=15){for(e=0;e<a.e[b];e++){d=a.k[b][e];(a.H[d]==257||a.H[d]==129)&&a.D[0][d]==b&&a.D[0][d]==b&&(a.H[d]=1)}}};clb.Zm=function Zm(a,b,c,d,e){var f,g,h,i,j;d&&clb.Gt(a,7);b.v=null;a.K&&clb.lm(b,true);i=c.length;e==null&&(e=gW(Ykb.AX,gmb,6,i,15,1));b.q=0;for(f=0;f<i;f++)e[f]=c[f]?clb.Pj(a,b,f,0,0):-1;b.r=0;for(j=0;j<a.r;j++){g=a.D[0][j];h=a.D[1][j];if(g<i&&h<i){if(c[g]&&c[h])clb.Qj(a,b,j,0,0,e==null?a.D[0][j]:e[a.D[0][j]],e==null?a.D[1][j]:e[a.D[1][j]],d);else if(a.s[g]!=0&&a.s[h]!=0&&a.s[g]<0^a.s[h]<0){c[g]&&(b.s[e[g]]+=a.s[g]<0?1:-1);c[h]&&(b.s[e[h]]+=a.s[h]<0?1:-1)}}}clb.Tj(a,b);!!a.d&&(b.T=0);b.T=0;clb.Cl(b,1);clb.Cl(b,2);b.q!=i&&clb.lm(b,true);d&&clb.ce(new clb.me(b),null,false)};clb.$m=function $m(a,b,c,d,e){var f,g,h,i,j;d&&clb.Gt(a,7);b.v=null;a.K&&clb.lm(b,true);e==null&&(e=gW(Ykb.AX,gmb,6,a.q,15,1));b.q=0;for(f=0;f<a.q;f++){e[f]=-1;for(j=0;j<a.j[f];j++){if(c[a.k[f][j]]){e[f]=clb.Pj(a,b,f,0,0);break}}}b.r=0;for(i=0;i<a.r;i++)if(c[i]){clb.Qj(a,b,i,0,0,e==null?a.D[0][i]:e[a.D[0][i]],e==null?a.D[1][i]:e[a.D[1][i]],d)}else{g=a.D[0][i];h=a.D[1][i];if(e[g]==-1^e[h]==-1){if(a.s[g]!=0&&a.s[h]!=0&&a.s[g]<0^a.s[h]<0){e[g]!=-1&&(b.s[e[g]]+=a.s[g]<0?1:-1);e[h]!=-1&&(b.s[e[h]]+=a.s[h]<0?1:-1)}}}clb.Tj(a,b);!!a.d&&(b.T=0);b.T=0;clb.Cl(b,1);clb.Cl(b,2);b.q!=a.q&&clb.lm(b,true);d&&clb.ce(new clb.me(b),null,false);return e};clb._m=function _m(a,b){var c,d,e,f,g,h,i,j,k,l;if((b&~a.T)==0)return;if((a.T&1)==0){clb.fo(a);clb.Vm(a);a.T|=1;if(clb.Xm(a)){clb.fo(a);clb.Vm(a)}}if((b&~a.T)==0)return;if((a.T&-7)!=0){for(d=0;d<a.f;d++)a.u[d]&=-15369;for(f=0;f<a.g;f++)a.F[f]&=-705;if((b&4)==0){clb.en(a,1);a.T|=2;return}clb.en(a,7);for(e=0;e<a.f;e++){for(k=0;k<a.j[e];k++){i=a.k[e][k];if(i<a.g&&clb.sr(a.p,i))continue;h=a.i[e][k];for(l=0;l<a.j[h];l++){if(a.k[h][l]==i)continue;a.n[h][l]>1&&(a.C[a.i[h][l]]==6?(a.u[e]|=Imb):!clb.mo(a,a.k[h][l])&&clb.gl(a,a.i[h][l])&&(a.u[e]|=knb))}}}while(true){j=false;for(c=0;c<a.f;c++){if(a.o[c]>0&&(a.u[c]&knb)!=0&&!clb.rr(a.p,c)){for(k=0;k<a.j[c];k++){if(a.n[c][k]>1){h=a.i[c][k];i=a.k[c][k];for(l=0;l<a.j[h];l++){if(a.k[h][l]!=i){g=a.i[h][l];if((a.u[g]&knb)==0){a.u[g]|=knb;j=true}}}}}}}if(!j)break}}a.T|=6};clb.an=function an(a,b){var c,d,e,f,g;c=-1;if(a.o[b]==1){for(f=0;f<a.j[b];f++){if(a.n[b][f]==2){d=a.i[b][f];if(a.j[d]==2&&a.o[d]==2){for(g=0;g<2;g++){e=a.i[d][g];if(e!=b&&a.o[e]==1){c=d;break}}}break}}}return c};clb.bn=function bn(a,b,c){var d,e;d=b;while(a.j[c]==2&&a.o[c]==2&&c!=d){e=c;c=a.i[c][0]==b?a.i[c][1]:a.i[c][0];b=e}return c==d?-1:c};clb.cn=function cn(a,b){var c;if(a.j[b]==3&&b<a.f&&clb.rr(a.p,b)&&(!!a.p&&b<a.f?clb.gr(a.p,b):0)>=5)for(c=0;c<a.j[b];c++)if(clb.no(a,a.k[b][c]))return a.k[b][c];return -1};clb.dn=function dn(a,b,c,d,e){var f,g,h,i,j,k;clb.Gt(a,7);if((a.u[b]&bob)==0||c&&!(b<a.f&&clb.rr(a.p,b)))return;i=gW(Ykb.AX,gmb,6,a.f,15,1);i[0]=b;d[b]=true;h=0;j=0;while(h<=j){for(k=0;k<a.j[i[h]];k++){g=a.k[i[h]][k];if(!e[g]&&(a.F[g]&64)!=0&&(!c||g<a.g&&clb.sr(a.p,g))){e[g]=true;f=a.i[i[h]][k];if(!d[f]){d[f]=true;i[++j]=f}}}++h}};clb.en=function en(a,b){var c,d,e,f,g,h,i,j;a.p=new clb.Fr(a,b);d=gW(Ykb.AX,gmb,6,a.f,15,1);for(e=0;e<a.g;e++){if(clb.ir(a.p,e)!=0){a.F[e]|=64;++d[a.D[0][e]];++d[a.D[1][e]]}}for(c=0;c<a.f;c++){d[c]==2?(a.u[c]|=Nmb):d[c]==3?(a.u[c]|=lnb):d[c]>3&&(a.u[c]|=bob)}for(j=0;j<a.p.i.a.length;j++){g=clb.kr(a.p,j);i=clb.lr(a.p,j);h=g.length;for(f=0;f<h;f++){a.u[g[f]]|=8;a.F[i[f]]|=128;a.H[i[f]]==386&&(a.H[i[f]]=2)}}};clb.fn=function fn(a){var b,c,d,e,f,g,h,i;h=gW(Ykb.Z0,Amb,6,a.q,16,1);for(c=0;c<a.q;c++)h[c]=a.C[c]==1&&a.A[c]==0&&a.s[c]==0&&(a.t==null||a.t[c]==null);i=gW(Ykb.Z0,Amb,6,a.q,16,1);for(g=0;g<a.r;g++){d=a.D[0][g];e=a.D[1][g];if(clb.Hk(a,g)!=1){h[d]=false;h[e]=false;continue}i[d]&&(h[d]=false);i[e]&&(h[e]=false);h[d]&&clb.jl(a,e)&&a.C[e]!=13&&(h[d]=false);h[e]&&clb.jl(a,d)&&a.C[d]!=13&&(h[e]=false);i[d]=true;i[e]=true}for(f=0;f<a.r;f++){if(h[a.D[0][f]]&&h[a.D[1][f]]){h[a.D[0][f]]=false;h[a.D[1][f]]=false}}for(b=0;b<a.q;b++)i[b]||(h[b]=false);return h};clb.gn=function gn(a,b){return a.e[b]};clb.hn=function hn(a,b){return a.i[b].length};clb.jn=function jn(a,b){return a.e[b]-clb.On(a,b)+clb.Kn(a,b)};clb.kn=function kn(a){var b,c;clb.Gt(a,7);b=0;for(c=0;c<a.p.i.a.length;c++)clb.qr(a.p,c)&&++b;return b};clb.ln=function ln(a,b){var c,d;c=0;for(d=0;d<a.j[b];d++)clb.gl(a,a.i[b][d])&&!clb.bl(a,a.k[b][d])&&++c;return c};clb.mn=function mn(a,b){return a.o[b]};clb.nn=function nn(a,b){clb.Gt(a,7);return a.o[b]==2&&a.j[b]==2?clb.Go(a,b,false):clb.Io(a,b,false)};clb.on=function on(a,b){var c;c=a.u[b]&bob;return c==0?0:c==Nmb?2:c==lnb?3:4};clb.pn=function pn(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;clb.Gt(a,7);f=gW(Ykb.Z0,Amb,6,a.g,16,1);l=gW(Ykb.Z0,Amb,6,a.g,16,1);o=gW(Ykb.AX,gmb,6,a.f,15,1);g=0;for(h=1;h<a.j[b];h++){d=a.k[b][h];if((a.F[d]&64)!=0){for(j=0;j<h;j++){e=a.k[b][j];if((a.F[e]&64)!=0){l[d]=true;l[e]=true;n=clb.Rn(a,o,a.i[b][h],a.i[b][j],c-2,null,l);l[d]=false;l[e]=false;if(n!=-1){i=false;m=gW(Ykb.AX,gmb,6,n,15,1);clb.Sn(a,o,m,n);for(k=0;k<n;k++){if(!f[m[k]]){f[m[k]]=true;i=true}}i&&++g}}}}}return g};clb.qn=function qn(a,b){return !!a.p&&b<a.f?clb.gr(a.p,b):0};clb.rn=function rn(a,b){if(b){clb.Gt(a,1);return clb.wk(a,a.f,a.g,clb.vj)}else{return clb.wk(a,a.q,a.r,clb.vj)}};clb.sn=function sn(a){var b,c,d,e,f,g,h,i;clb.Gt(a,1);h=gW(Ykb.zX,cob,6,a.f,15,1);d=gW(Ykb.AX,gmb,6,a.f,15,1);for(i=0;i<a.f;i++){d[0]=i;e=gW(Ykb.AX,gmb,6,a.f,15,1);e[i]=1;c=0;f=0;while(c<=f){for(g=0;g<a.j[d[c]];g++){b=a.i[d[c]][g];if(e[b]==0){e[b]=e[d[c]]+1;d[++f]=b;h[i]+=e[b]-1}}++c}h[i]/=f}return h};clb.tn=function tn(a,b,c){var d;for(d=0;d<a.i[b].length;d++)if(a.i[b][d]==c)return a.k[b][d];return -1};clb.un=function un(a,b){return !!a.p&&b<a.g?clb.ir(a.p,b):0};clb.vn=function vn(a,b,c){return a.i[b][c]};clb.wn=function wn(a,b){return a.j[b]};clb.xn=function xn(a,b,c){return a.k[b][c]};clb.yn=function yn(a,b,c){return a.n[b][c]};clb.zn=function zn(a,b){var c,d;c=0;for(d=0;d<a.j[b];d++)z1(e1(a.B[d],Bmb),0)&&++c;return c};clb.An=function An(a,b){return a.e[b]-a.j[b]};clb.Bn=function Bn(a,b,c,d,e){var f,g,h,i;g=a.e[b];if(a.o[b]!=0||b<a.f&&clb.rr(a.p,b)||a.j[b]<3||g>4)return false;i=gW(Ykb.Z0,Amb,6,4,16,1);for(h=0;h<g;h++){f=3.9269908169872414-d[h];if($wnd.Math.abs(dob-f%Gmb)>0.0872664675116539)return false;e[h]=3&vX(f/Gmb);if(i[e[h]])return false;i[e[h]]=true;if((e[h]&1)==0){if(a.H[a.k[b][c[h]]]!=1)return false}else{if(!clb.ql(a,a.k[b][c[h]],b))return false}}return i[0]&&i[2]};clb.Cn=function Cn(a,b,c,d,e){var f,g,h,i,j,k,l,m;if((!!a.p&&b<a.f?clb.gr(a.p,b):0)>24)return 3;f=a.e[b];e==null&&(e=gW(Ykb.AX,gmb,6,f,15,1));if(!clb.Bn(a,b,c,d,e))return 3;i=-1;for(j=0;j<f;j++){if((e[j]&1)==1){g=a.H[a.k[b][c[j]]];if(i!=-1&&i!=g)return 3;i=g}}k=$wnd.Math.abs(e[0]-e[1])==2?1:0;h=e[k]-e[k+1];m=$wnd.Math.abs(h)==3^e[k]<e[k+1];l=f==3||(e[3]&1)==1;return m^l^i==129?1:2};clb.Dn=function Dn(a,b,c){var d,e,f,g,h,i,j,k,l,m;clb.Gt(a,1);m=gW(Ykb.Z0,Amb,6,a.q,16,1);j=gW(Ykb.AX,gmb,6,a.q,15,1);j[0]=b;m[b]=true;g=0;k=0;i=1;while(g<=k){f=c?clb.hn(a,j[g]):a.e[j[g]];for(l=0;l<f;l++){e=a.i[j[g]][l];if(!m[e]){j[++k]=e;m[e]=true;++i}}++g}h=gW(Ykb.AX,gmb,6,i,15,1);i=0;for(d=0;d<a.q;d++)m[d]&&(h[i++]=d);return h};clb.En=function En(a,b,c,d){var e,f,g,h,i,j,k,l,m;clb.Gt(a,1);for(f=0;f<a.q;f++)b[f]=-1;j=0;for(e=0;e<a.q;e++){if(b[e]==-1&&(!c||(a.u[e]&Gnb)!=0)){b[e]=j;k=gW(Ykb.AX,gmb,6,a.q,15,1);k[0]=e;i=0;l=0;while(i<=l){h=d?clb.hn(a,k[i]):a.e[k[i]];for(m=0;m<h;m++){g=a.i[k[i]][m];if(b[g]==-1&&(!c||(a.u[g]&Gnb)!=0)){k[++l]=g;b[g]=j}}++i}++j}}return j};clb.Fn=function Fn(a,b,c,d){var e,f,g,h,i,j,k,l,m;clb.Gt(a,1);for(f=0;f<a.q;f++)b[f]=-1;j=0;for(e=0;e<a.q;e++){if(b[e]==-1){b[e]=j;k=gW(Ykb.AX,gmb,6,a.q,15,1);k[0]=e;i=0;l=0;while(i<=l){h=d?clb.hn(a,k[i]):a.e[k[i]];for(m=0;m<h;m++){g=a.i[k[i]][m];if(b[g]==-1&&!c[a.k[k[i]][m]]){k[++l]=g;b[g]=j}}++i}++j}}return j};clb.Gn=function Gn(a,b){var c;return c=clb.Qk(a,b),c+clb.Ok(a,b,c)-clb.Pn(a,b)};clb.Hn=function Hn(a,b){var c,d,e,f,g,h;f=gW(Ykb.AX,gmb,6,a.q,15,1);for(d=0;d<a.q;d++)f[d]=d;e=a.q;do --e;while(e>=0&&b[e]);for(c=0;c<e;c++){if(b[f[c]]){h=f[c];f[c]=f[e];f[e]=h;g=b[c];b[c]=b[e];b[e]=g;do --e;while(b[e])}}return f};clb.In=function In(a){return clb.Hn(a,clb.fn(a))};clb.Jn=function Jn(a,b,c){var d,e,f;e=clb.Pn(a,b);e-=clb.Ok(a,b,e);c&&(e-=a.e[b]-a.j[b]);f=clb.Km(a.C[b]);if(e<=f[0])return -1;for(d=1;d<f.length;d++)if(f[d]>=e)return f[d];return e};clb.Kn=function Kn(a,b){var c,d,e,f,g,h;if(a.K&&o1(e1(a.B[b],lnb),0))return 0;if(!clb.Ro(a,b))return 0;clb.Gt(a,1);g=0;for(e=0;e<a.e[b];e++)g+=a.n[b][e];if(a.K){c=1;for(d=0;d<a.j[b];d++)a.H[a.k[b][d]]==64&&++c;g+=c>>1}g-=clb.Ok(a,b,g);f=((a.u[b]&Rnb)>>>27)-1;if(f==-1){h=clb.Km(a.C[b]);f=h[0];for(d=1;f<g&&d<h.length;d++)f=h[d]}return $wnd.Math.max(0,f-g)};clb.Ln=function Ln(a,b){var c,d,e,f,g;e=clb.Pn(a,b);c=clb.Ok(a,b,e);f=((a.u[b]&Rnb)>>>27)-1;if(f==-1){g=clb.Km(a.C[b]);d=0;while(e>g[d]+c&&d<g.length-1)++d;f=g[d]}return f+c-e};clb.Mn=function Mn(a,b){return a.i[b].length-a.e[b]};clb.Nn=function Nn(a){var b,c,d,e;clb.Gt(a,1);e=0;for(b=0;b<a.q;b++){d=a.A[b]!=0?a.A[b]:clb.uj[a.C[b]];e+=d+clb.Kn(a,b)*clb.uj[1];if(a.C[b]>=171&&a.C[b]<=190){c=a.e[b];c>2&&(e-=(c-2)*clb.uj[1])}}return e};clb.On=function On(a,b){var c,d;c=a.j[b];for(d=0;d<a.j[b];d++)a.C[a.i[b][d]]==1&&--c;return c};clb.Pn=function Pn(a,b){var c,d,e,f,g,h;a.wb(1);g=false;d=false;h=0;for(e=0;e<a.e[b];e++){if(!a.K||o1(e1(a.B[a.i[b][e]],Bmb),0)){f=a.n[b][e];h+=f;f>1&&(g=true);c=a.k[b][e];a.H[c]==64&&(d=true)}}d&&!g&&++h;return h};clb.Qn=function Qn(a,b,c){var d,e,f;e=0;for(f=0;f<a.j[b];f++){d=a.i[b][f];d!=c&&a.j[d]>2&&++e}return e};clb.Rn=function Rn(a,b,c,d,e,f,g){var h,i,j,k,l,m,n,o,p;if(c==d){b[0]=c;return 0}a.wb(1);k=gW(Ykb.AX,gmb,6,a.q,15,1);j=gW(Ykb.AX,gmb,6,a.q,15,1);p=gW(Ykb.AX,gmb,6,a.q,15,1);j[0]=c;k[c]=1;i=0;l=0;while(i<=l&&k[j[i]]<=e){o=j[i];for(m=0;m<a.e[o];m++){if(g==null||g.length<=a.k[o][m]||!g[a.k[o][m]]){h=a.i[o][m];if(h==d){n=k[o];b[n]=h;b[--n]=o;while(n>0){b[n-1]=p[b[n]];--n}return k[o]}if(k[h]==0&&(f==null||f.length<=h||!f[h])){j[++l]=h;k[h]=k[o]+1;p[h]=o}}}++i}return -1};clb.Sn=function Sn(a,b,c,d){var e,f;clb.Gt(a,1);for(e=0;e<d;e++){for(f=0;f<a.e[b[e]];f++){if(a.i[b[e]][f]==b[e+1]){c[e]=a.k[b[e]][f];break}}}};clb.Tn=function Tn(a,b,c){var d,e,f,g,h,i;if(b==c)return 0;clb.Gt(a,1);g=gW(Ykb.AX,gmb,6,a.q,15,1);f=gW(Ykb.AX,gmb,6,a.q,15,1);f[0]=b;g[b]=1;e=0;h=0;while(e<=h){for(i=0;i<a.e[f[e]];i++){d=a.i[f[e]][i];if(d==c)return g[f[e]];if(g[d]==0){f[++h]=d;g[d]=g[f[e]]+1}}++e}return -1};clb.Un=function Un(a,b,c,d,e){var f,g,h,i,j,k;if(b==c)return 0;a.wb(1);i=gW(Ykb.AX,gmb,6,a.q,15,1);h=gW(Ykb.AX,gmb,6,a.q,15,1);h[0]=b;i[b]=1;g=0;j=0;while(g<=j&&i[h[g]]<=d){for(k=0;k<a.e[h[g]];k++){f=a.i[h[g]][k];if(f==c)return i[h[g]];if(i[f]==0&&(e==null||e.length<=f||!e[f])){h[++j]=f;i[f]=i[h[g]]+1}}++g}return -1};clb.Vn=function Vn(a,b){return a.e[b]-a.j[b]+clb.Kn(a,b)};clb.Wn=function Wn(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;o=gW(Ykb.AX,gmb,6,16,15,1);c=gW(Ykb.yX,emb,6,16,15,1);f=gW(Ykb.yX,emb,6,2,15,1);d=0;for(k=0;k<2;k++){e=a.D[k][b];for(l=0;l<a.j[e];l++){i=a.k[e][l];if(i==b)continue;if(d==4)return 0;h=a.i[e][l];o[d]=16;a.o[h]!=0&&(o[d]+=(a.u[h]&bob)!=0?1:4);if((a.F[b]&64)!=0&&(a.F[i]&64)!=0){m=clb.or(a.p,b,i);m!=-1&&(o[d]+=clb.qr(a.p,m)?64:6)}c[d++]=clb.Lm(a.J[e].a,a.J[e].b,a.J[h].a,a.J[h].b)}}f[0]=clb.yk(a,a.D[0][b],a.D[1][b]);if(f[0]<0){f[1]=f[0]+Fmb;g=false}else{f[1]=f[0];f[0]=f[1]-Fmb;g=true}n=0;for(j=0;j<d;j++){c[j]>f[0]&&c[j]<f[1]?(n-=o[j]):(n+=o[j])}return g?-n:n};clb.Xn=function Xn(a){clb.Gt(a,7);return a.p};clb.Yn=function Yn(a){var b,c,d,e,f,g,h,i,j;j=0;clb.Gt(a,7);for(d=0;d<a.g;d++){if(clb.Hk(a,d)==1&&(a.F[d]&64)==0){h=true;for(g=0;g<2;g++){b=a.D[g][d];if(a.j[b]==1){h=false;break}if(a.C[b]==7&&!(b<a.f&&clb.rr(a.p,b))){c=a.D[1-g][d];for(i=0;i<a.j[c];i++){e=a.i[c][i];f=a.k[c][i];if(f!=d&&clb.Hk(a,f)>1&&!(e<a.f&&clb.rr(a.p,e))&&clb.gl(a,e)){h=false;break}}}}h&&!clb.vo(a,d)&&++j}}return j};clb.Zn=function Zn(a,b,c){var d,e,f,g,h,i;e=0;for(f=0;f<a.j[b];f++){d=a.i[b][f];if(d!=c){g=0;for(h=0;h<a.j[d];h++){i=a.i[d][h];i!=b&&clb.mo(a,a.k[d][h])&&a.j[i]>2&&++g}g==2&&++e}}return e};clb.$n=function $n(a,b){var c,d,e,f;c=a.e[b];f=gW(Ykb.AX,gmb,6,c,15,1);for(e=0;e<c;e++)f[e]=(a.i[b][e]<<16)+e;alb.jgb(f,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));for(d=0;d<c;d++)f[d]&=Zlb;return f};clb._n=function _n(a,b){var c,d;clb.Gt(a,1);if(a.j[b]==2&&a.n[b][0]==2&&a.n[b][1]==2){for(c=0;c<2;c++)for(d=0;d<a.e[a.i[b][c]];d++)if(clb.ql(a,a.k[a.i[b][c]][d],a.i[b][c]))return a.k[a.i[b][c]][d]}else{for(c=0;c<a.e[b];c++)if(clb.ql(a,a.k[b][c],b))return a.k[b][c]}return -1};clb.ao=function ao(a,b,c){if(clb.Hk(a,b)!=1)return 0;return 16-a.e[c]+((a.H[b]&384)==0||a.D[0][b]!=c?Ynb:0)+(a.C[c]==1?Imb:0)+(a.e[c]==1?lnb:0)+((a.u[c]&3)==0?Nmb:0)+((a.F[b]&64)!=0?0:512)+(a.C[c]!=6?256:0)};clb.bo=function bo(a,b,c,d,e,f){var g,h,i,j,k;clb.Gt(a,1);if(e){clb.Nj(e);e.K=false}i=gW(Ykb.AX,gmb,6,a.q,15,1);d==null?(d=gW(Ykb.Z0,Amb,6,a.q,16,1)):dlb.ecb(d,d.length);i[0]=b;i[1]=c;d[b]=true;d[c]=true;h=1;j=1;while(h<=j){for(k=0;k<a.e[i[h]];k++){g=a.i[i[h]][k];if(g==b){if(h!=1)return -1}if(!d[g]){d[g]=true;i[++j]=g}}++h}if(e){f==null&&(f=gW(Ykb.AX,gmb,6,d.length,15,1));clb.Zm(a,e,d,false,f);clb.Kj(e,f[b],0,0,-1,0)}d[b]=false;return j};clb.co=function co(a,b,c){var d,e,f,g,h,i;clb.Gt(a,1);f=gW(Ykb.AX,gmb,6,a.f,15,1);i=gW(Ykb.Z0,Amb,6,a.f,16,1);f[0]=b;f[1]=c;i[b]=true;i[c]=true;e=1;g=1;while(e<=g){for(h=0;h<a.j[f[e]];h++){d=a.i[f[e]][h];if(d==b){if(e!=1)return -1}if(!i[d]){i[d]=true;f[++g]=d}}++e}return g};clb.eo=function eo(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;if(clb.Hk(a,c)!=2&&!(c<a.g&&clb.sr(a.p,c)))return -1;n=a.F[c]&3;if(n!=1&&n!=2)return -1;for(i=0;i<2;i++){d=a.D[i][c];e=a.D[1-i][c];m=-1;g=false;for(k=0;k<a.j[d];k++){f=a.i[d][k];f!=e&&(f==b?(g=true):(m=f))}if(g){l=-1;h=-1;for(j=0;j<a.j[e];j++){f=a.i[e][j];if(f!=d){if(l==-1)l=f;else if(f>l)h=f;else{h=l;l=f}}}if(a.j[d]==2){if(a.j[e]==2)return n==2?l:-1;return n==2?l:h}else{if(a.j[e]==2)return n==2^b<m?-1:l;return n==2^b<m?h:l}}}return -1};clb.fo=function fo(a){var b,c,d,e,f,g,h,i,j,k;g=clb.fn(a);i=a.q;do --i;while(i>=0&&g[i]);for(b=0;b<i;b++){if(g[b]){clb.wm(a,b,i);k=g[b];g[b]=g[i];g[i]=k;do --i;while(g[i])}}a.f=i+1;if(a.q==a.f){a.g=a.r;return}h=gW(Ykb.Z0,Amb,6,a.r,16,1);for(f=0;f<a.r;f++){c=a.D[0][f];d=a.D[1][f];(g[c]||g[d])&&(h[f]=true)}j=a.r;do --j;while(j>=0&&h[j]);for(e=0;e<j;e++){if(h[e]){clb.xm(a,e,j);h[e]=false;do --j;while(h[j])}}a.g=j+1};clb.go=function go(a,b){var c;for(c=0;c<a.j[b];c++)if(a.s[a.i[b][c]]<0)return true;return false};clb.ho=function ho(a,b){var c;for(c=0;c<a.j[b];c++)if(a.s[a.i[b][c]]>0)return true;return false};clb.io=function io(a,b){var c;c=a.C[b];return c==3||c==11||c==19||c==37||c==55};clb.jo=function jo(a,b){return (a.u[b]&Imb)!=0};clb.ko=function ko(a,b){var c,d,e,f,g,h;clb.Gt(a,1);for(g=0;g<2;g++){c=a.D[g][b];if(a.C[c]==7){d=a.D[1-g][b];for(h=0;h<a.j[d];h++){e=a.i[d][h];f=a.k[d][h];if((a.C[e]==7||a.C[e]==8||a.C[e]==16)&&clb.Hk(a,f)>=2)return true}}}return false};clb.lo=function lo(a,b){return b<a.f&&clb.rr(a.p,b)};clb.mo=function mo(a,b){return b<a.g&&clb.sr(a.p,b)};clb.no=function no(a,b){var c,d,e,f,g,h;if(a.H[b]!=1||b<a.g&&clb.sr(a.p,b)||(a.F[b]&64)!=0&&(!!a.p&&b<a.g?clb.ir(a.p,b):0)<7)return false;c=a.D[0][b];if(!(c<a.f&&clb.rr(a.p,c))||(!!a.p&&c<a.f?clb.gr(a.p,c):0)<5)return false;d=a.D[1][b];if(!(d<a.f&&clb.rr(a.p,d))||(!!a.p&&d<a.f?clb.gr(a.p,d):0)<5)return false;e=clb.Qn(a,c,d);f=clb.Qn(a,d,c);if((!!a.p&&c<a.f?clb.gr(a.p,c):0)>5&&(!!a.p&&d<a.f?clb.gr(a.p,d):0)>5)return e+f>2;g=clb.Zn(a,c,d);h=clb.Zn(a,d,c);if(e==2&&h>=1)return true;if(f==2&&g>=1)return true;if(g==2&&(f>=1||h>=1))return true;if(h==2&&(e>=1||g>=1))return true;return false};clb.oo=function oo(a,b){return a.o[b]==2&&a.j[b]==2&&a.n[b][0]==2&&a.n[b][1]==2&&a.C[b]<=7};clb.po=function po(a,b){var c;c=a.C[b];return c==8||c==16||c==34||c==52};clb.qo=function qo(a,b){return b<a.g&&(clb.wr(a.p,b)||a.H[b]==64)};clb.ro=function ro(a,b){var c;c=a.C[b];return c==12||c==20||c==38||c==56};clb.so=function so(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(a.C[b]!=7||a.j[b]==4)return false;if(b<a.f&&clb.rr(a.p,b)||a.o[b]!=0||z1(e1(a.B[b],jnb),0))return true;if(a.s[b]==1)return false;for(i=0;i<a.j[b];i++)if(clb.un(a,a.k[b][i])==3)return false;g=0;for(j=0;j<a.j[b];j++){if(a.n[b][j]==1){d=a.C[a.i[b][j]];(d==8||d==9||d==17)&&++g}}if(g==0){for(h=0;h<a.j[b];h++){e=a.i[b][h];if(a.o[e]!=0){if(e<a.f&&clb.rr(a.p,e)){if((!!a.p&&e<a.f?clb.gr(a.p,e):0)>=5){p=0;for(m=0;m<a.j[e];m++){o=a.i[e][m];o!=b&&clb.On(a,o)>=3&&++p}n=clb.On(a,b);if(p==2&&n>=2||p==1&&n==3)continue}return !c||!clb.xo(a,b)}for(l=0;l<a.j[e];l++){if(a.n[e][l]==2||clb.mo(a,a.k[e][l]))return !c||!clb.xo(a,b)}}}}if(g<2){for(h=0;h<a.j[b];h++){e=a.i[b][h];k=false;f=false;for(l=0;l<a.j[e];l++){if(a.i[e][l]!=b){a.n[e][l]!=1&&(a.C[a.i[e][l]]==7||a.C[a.i[e][l]]==8||a.C[a.i[e][l]]==16)&&(k=true);a.n[e][l]==1&&a.C[a.i[e][l]]==7&&(f=true)}}if(k&&(!f||g==0))return !c||!clb.xo(a,b)}}return false};clb.to=function to(a,b){var c;c=a.C[b];return c==9||c==17||c==35||c==53};clb.uo=function uo(a,b){var c;c=a.C[b];return c==7||c==15||c==33};clb.vo=function vo(a,b){var c,d,e,f,g,h;if(clb.Hk(a,b)!=1)return false;for(f=0;f<2;f++){c=a.D[f][b];h=a.D[1-f][b];while(a.o[c]==2&&a.j[c]==2&&a.C[c]<10){for(g=0;g<2;g++){d=a.i[c][g];if(d!=h){if(a.j[d]==1)return true;e=a.k[c][g];if(clb.Hk(a,e)==1&&e<b)return true;h=c;c=d;break}}}if(a.j[c]==1)return true}return false};\nclb.wo=function wo(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s;m=gW(Ykb.Z0,Amb,6,a.g,16,1);m[e]=true;n=gW(Ykb.AX,gmb,6,11,15,1);o=clb.Rn(a,n,d,b,10,null,m);if(o==-1)return false;g=1;while(!clb.tr(a.p,c,n[g]))++g;f=o-g;h=n[g];s=clb.nr(a.p,c);if(s==6&&f==2&&g==3){if(clb.on(a,n[1])>=3){r=clb.kr(a.p,c);for(l=0;l<6;l++){if(b==r[l]){q=clb.Er(a.p,c,h==r[clb.Er(a.p,c,l+2)]?l-2:l+2);p=r[q];k=a.u[p]&bob;if((k==0?0:k==Nmb?2:k==lnb?3:4)>=3&&clb.Un(a,n[1],p,2,null)==2)return true;break}}}}i=a.o[h]==1||h<a.f&&clb.rr(a.p,h)||clb.so(a,h,false);j=!i&&a.C[h]==7&&a.s[h]!=1;if(f==1&&!i&&!j&&s<=4&&g<=3)return true;switch(s){case 4:if(!i&&!j&&g<=4)return true;break;case 5:if(j){if(g<=3)return true}else if(!i){if(g<=4)return true}break;case 6:if(f==2){if(i){if(g<=4)return true}else if(!j){if(g<=3)return true}}else if(f==3){if(i){if(g<=6)return true}else{if(g<=4)return true}}break;case 7:if(f==3){if(g<=3)return true}}return false};clb.xo=function xo(a,b){var c,d,e,f,g;if(b<a.f&&clb.rr(a.p,b)||a.o[b]!=0||z1(e1(a.B[b],jnb),0)||(d=a.u[b]&bob,(d==0?0:d==Nmb?2:d==lnb?3:4)<3))return false;g=!!a.p&&b<a.f?clb.gr(a.p,b):0;if(g>7)return false;f=0;while(f<a.p.i.a.length){if(clb.nr(a.p,f)==g&&clb.tr(a.p,f,b))break;++f}if(f>=Nmb&&f==a.p.i.a.length)return false;for(e=0;e<a.j[b];e++){c=a.k[b][e];if(!clb.ur(a.p,f,c)&&clb.wo(a,b,f,a.i[b][e],c))return true}return false};clb.yo=function yo(a,b){return (a.u[b]&bob)!=0};clb.zo=function zo(a,b){return (a.F[b]&64)!=0};clb.Ao=function Ao(a,b){return a.C[b]==1&&a.A[b]==0&&a.s[b]==0&&(a.t==null||a.t[b]==null)};clb.Bo=function Bo(a,b){return (a.u[b]&8)!=0};clb.Co=function Co(a,b){return (a.F[b]&128)!=0};clb.Do=function Do(a,b){return (a.u[b]&knb)!=0};clb.Eo=function Eo(a){var b,c,d,e,f,g,h,i,j,k,l;clb.Gt(a,1);clb.Fo(a);j=false;for(c=0;c<a.f;c++){if(a.C[c]==7&&a.s[c]==0){l=clb.Pn(a,c);if(l==4){for(k=0;k<a.j[c];k++){h=a.i[c][k];if(a.n[c][k]==1&&a.C[h]==8&&a.j[h]==1&&a.s[h]==0){j=true;++a.s[c];--a.s[h];break}}}else if(l==5){for(k=0;k<a.j[c];k++){h=a.i[c][k];i=a.k[c][k];if(a.n[c][k]==2&&a.C[h]==8){j=true;++a.s[c];--a.s[h];a.H[i]=1;break}if(a.n[c][k]==3&&a.C[h]==7){j=true;++a.s[c];--a.s[h];a.H[i]=2;break}}}}}g=false;for(f=0;f<a.g;f++){for(k=0;k<2;k++){if(clb.gl(a,a.D[k][f])){b=a.D[1-k][f];e=a.C[b];if(e==3||e==11||e==19||e==37||e==55||(d=a.C[b],d==12||d==20||d==38||d==56)){if(clb.Hk(a,f)==1){++a.s[b];--a.s[a.D[k][f]];a.H[f]=512;g=true}else if(a.H[f]==32){a.H[f]=512;g=true}}break}}}if(g){clb.Oj(a);j=true}j&&(a.T=0);return j};clb.Fo=function Fo(a){var b;for(b=0;b<a.g;b++)if(a.H[b]==64)return clb.ce(new clb.me(a),null,false);return false};clb.Go=function Go(a,b,c){var d,e,f,g,h,i,j,k;j=-1;e=0;for(h=0;h<2;h++){d=a.i[b][h];for(i=0;i<a.e[d];i++){f=a.i[d][i];if(f!=b){g=a.k[d][i];k=clb.ao(a,g,f);if(e<k&&(!c||!(a.H[g]==257||a.H[g]==129))){e=k;j=g}}}}return j};clb.Ho=function Ho(a,b){var c,d,e,f,g,h,i,j;i=-1;d=0;for(g=0;g<2;g++){c=a.D[g][b];for(h=0;h<a.e[c];h++){e=a.i[c][h];if(e!=a.D[1-g][b]){f=a.k[c][h];j=clb.ao(a,f,e);if(d<j){d=j;i=f}}}}return i};clb.Io=function Io(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;d=a.e[b];e=gW(Ykb.yX,emb,6,d,15,1);for(q=0;q<d;q++)e[q]=clb.yk(a,b,a.i[b][q]);for(r=1;r<d;r++){for(u=0;u<r;u++){f=$wnd.Math.abs(clb.Mm(e[r],e[u]));if(f<0.08||f>eob){g=0;h=0;for(v=0;v<d;v++){if(v!=r&&v!=u){g+=$wnd.Math.abs(slb.zT(e[r],e[v]));h+=$wnd.Math.abs(slb.zT(e[u],e[v]))}}j=g<h?a.k[b][r]:a.k[b][u];if(clb.Hk(a,j)==1&&(!c||!(a.H[j]==257||a.H[j]==129)))return j}}}t=gW(Ykb.Z0,Amb,6,d,16,1);for(s=0;s<d;s++){k=-10;l=10;for(u=0;u<d;u++){if(u!=s){o=slb.zT(e[s],e[u]);o<0?k<o&&(k=o):l>o&&(l=o)}t[s]=l-k<Fmb}}w=-1;i=0;for(p=0;p<d;p++){m=a.i[b][p];n=a.k[b][p];A=clb.ao(a,n,m);t[p]&&(A+=Hmb);if(i<A&&(!c||!(a.H[n]==257||a.H[n]==129))){i=A;w=n}}return w};clb.Jo=function Jo(a,b){var c,d,e,f;clb.Gt(a,b?15:1);a.q=a.f;a.r=a.g;for(d=0;d<a.f;d++){if(a.e[d]!=a.j[d]){c=clb.Jn(a,d,false);a.e[d]=a.j[d];if(c!=-1){f=clb.Jn(a,d,true);if(c!=f){e=((a.u[d]&Rnb)>>>27)-1;(e==-1||e<c)&&clb.Gl(a,d,c)}}}}b&&clb.Po(a);a.T=0};clb.Ko=function Ko(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;if(a.j[b]!=2||a.n[b][0]!=2||a.n[b][1]!=2||a.j[a.i[b][0]]<2||a.j[a.i[b][1]]<2||a.o[a.i[b][0]]!=1||a.o[a.i[b][1]]!=1){clb.Tl(a,b,0,false);return}v=-1;u=-1;t=-1;q=-1;f=0;for(l=0;l<2;l++){d=a.i[b][l];for(o=0;o<a.e[d];o++){g=a.i[d][o];if(g!=b){h=a.k[d][o];w=clb.ao(a,h,g);if(f<w){f=w;u=g;v=h;t=d;q=a.i[b][1-l]}}}}if(u==-1)return;for(m=0;m<2;m++){d=a.i[b][m];for(o=0;o<a.e[d];o++){g=a.i[d][o];h=a.k[d][o];g!=b&&a.D[0][h]==d&&(a.H[h]=1)}}if(a.D[1][v]!=u){a.D[0][v]=a.D[1][v];a.D[1][v]=u}i=Qlb;for(n=0;n<a.j[t];n++){g=a.i[t][n];g!=b&&i>g&&(i=g)}r=gW(Ykb.AX,gmb,6,2,15,1);s=0;for(k=0;k<a.j[q];k++){g=a.i[q][k];g!=b&&(r[s++]=g)}c=clb.Lm(a.J[b].a,a.J[b].b,a.J[q].a,a.J[q].b);e=0;if(s==2){if(r[0]>r[1]){A=r[0];r[0]=r[1];r[1]=A}j=clb.Mm(c,clb.yk(a,q,r[0]));p=clb.Mm(c,clb.yk(a,q,r[1]));e=j-p}else{e=clb.Mm(c,clb.yk(a,q,r[0]))}e<0^(a.u[b]&3)==1^i==u?(a.H[v]=257):(a.H[v]=129)};clb.Lo=function Lo(a,b,c,d){var e,f,g,h,i,j;e=a.e[b];h=gW(Ykb.AX,gmb,6,e,15,1);j=clb.Cn(a,b,c,d,h);if(j==3)return false;g=(a.u[b]&3)==j?257:129;for(i=0;i<e;i++){if((h[i]&1)==1){f=a.k[b][c[i]];a.H[f]=g;if(a.D[0][f]!=b){a.D[1][f]=a.D[0][f];a.D[0][f]=b}}}return true};clb.Mo=function Mo(a,b){a.T|=248&(8|b)};clb.No=function No(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;clb.Ym(a,b);if((a.u[b]&3)==0||(a.u[b]&3)==3)return;if(a.o[b]==2&&a.j[b]==2){clb.Ko(a,b);return}if(a.j[b]<3||a.j[b]>4){clb.Tl(a,b,0,false);return}c=a.e[b];o=false;for(g=0;g<c;g++){if(clb.Hk(a,a.k[b][g])==1){o=true;break}}if(!o)return;p=clb.$n(a,b);d=gW(Ykb.yX,emb,6,c,15,1);for(h=0;h<c;h++)d[h]=clb.yk(a,a.i[b][p[h]],b);for(i=0;i<c;i++)a.D[0][a.k[b][i]]==b&&clb.Hk(a,a.k[b][i])==1&&(a.H[a.k[b][i]]=1);if((!!a.p&&b<a.f?clb.gr(a.p,b):0)<=24&&clb.Lo(a,b,p,d))return;m=clb.Io(a,b,true);if(a.D[0][m]!=b){a.D[1][m]=a.D[0][m];a.D[0][m]=b}n=-1;for(j=0;j<c;j++){if(m==a.k[b][p[j]]){n=j;break}}q=oW(aW(Ykb.AX,2),Dnb,7,0,[oW(aW(Ykb.AX,1),gmb,6,15,[2,1,2,1]),oW(aW(Ykb.AX,1),gmb,6,15,[1,2,2,1]),oW(aW(Ykb.AX,1),gmb,6,15,[1,1,2,2]),oW(aW(Ykb.AX,1),gmb,6,15,[2,1,1,2]),oW(aW(Ykb.AX,1),gmb,6,15,[2,2,1,1]),oW(aW(Ykb.AX,1),gmb,6,15,[1,2,1,2])]);for(f=1;f<c;f++)d[f]<d[0]&&(d[f]+=Emb);if(c==3){k=false;switch(n){case 0:k=d[1]<d[2]&&d[2]-d[1]<Fmb||d[1]>d[2]&&d[1]-d[2]>Fmb;break;case 1:k=d[2]-d[0]>Fmb;break;case 2:k=d[1]-d[0]<Fmb;}e=(a.u[b]&3)==1^k?257:129}else{l=0;d[1]<=d[2]&&d[2]<=d[3]?(l=0):d[1]<=d[3]&&d[3]<=d[2]?(l=1):d[2]<=d[1]&&d[1]<=d[3]?(l=2):d[2]<=d[3]&&d[3]<=d[1]?(l=3):d[3]<=d[1]&&d[1]<=d[2]?(l=4):d[3]<=d[2]&&d[2]<=d[1]&&(l=5);e=(a.u[b]&3)==1^q[l][n]==1?129:257}a.H[m]=e};clb.Oo=function Oo(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;if((a.F[b]&3)==0||(a.F[b]&3)==3||!clb.no(a,b))return;v=-1;t=-1;u=-1;s=-1;e=0;for(l=0;l<2;l++){d=a.D[l][b];for(o=0;o<a.e[d];o++){h=a.k[d][o];if(h!=b&&clb.Hk(a,h)==1){g=a.i[d][o];w=clb.ao(a,h,g);if(e<w){e=w;t=g;v=h;u=d;s=a.D[1-l][b]}}}}if(t==-1)return;for(m=0;m<2;m++){for(o=0;o<a.e[a.D[m][b]];o++){h=a.k[a.D[m][b]][o];h!=b&&clb.Hk(a,h)==1&&(a.H[h]=1)}}if(a.D[1][v]!=t){a.D[0][v]=a.D[1][v];a.D[1][v]=t}i=Qlb;for(n=0;n<a.j[u];n++){g=a.i[u][n];a.k[u][n]!=b&&i>g&&(i=g)}q=gW(Ykb.AX,gmb,6,2,15,1);r=0;for(k=0;k<a.j[s];k++)a.k[s][k]!=b&&(q[r++]=a.i[s][k]);f=clb.Lm(a.J[u].a,a.J[u].b,a.J[s].a,a.J[s].b);c=0;if(r==2){if(q[0]>q[1]){A=q[0];q[0]=q[1];q[1]=A}j=clb.Mm(f,clb.yk(a,s,q[0]));p=clb.Mm(f,clb.yk(a,s,q[1]));c=j-p}else{c=clb.Mm(f,clb.yk(a,s,q[0]))}c<0^(a.F[b]&3)==2^i==t?(a.H[v]=257):(a.H[v]=129)};clb.Po=function Po(a){var b,c,d,e;clb.Gt(a,7);for(d=0;d<a.g;d++)(a.H[d]==257||a.H[d]==129)&&(a.H[d]=1);for(b=0;b<a.f;b++)clb.No(a,b);for(e=0;e<a.g;e++)clb.Oo(a,e);for(c=0;c<a.g;c++)a.H[c]==2&&(a.F[c]&3)==3&&(a.H[c]=386)};clb.Qo=function Qo(b,c){var d,e,f,g,h,i,j,k,l,m;i=gW(Ykb.AX,gmb,6,b.q,15,1);h=clb.En(b,i,false,c);if(h<=1)return null;j=gW(Ykb.AX,gmb,6,h,15,1);for(e=0;e<b.f;e++)++j[i[e]];l=0;m=j[0];for(k=1;k<h;k++){if(m<j[k]){m=j[k];l=k}}for(d=0;d<b.q;d++)i[d]!=l&&(b.C[d]=-1);for(g=0;g<b.r;g++)(!c&&b.H[g]==32||i[b.D[0][g]]!=l)&&(b.H[g]=512);f=clb.Oj(b);b.T=0;try{clb.Wm(b,true,true)}catch(a){a=b1(a);if(!mX(a,15))throw c1(a)}return f};clb.Ro=function Ro(a,b){if((a.u[b]&Rnb)!=0)return true;if(a.C[b]==1)return false;return clb.ll(a,b)||a.C[b]==13||a.C[b]>=171};clb.So=function So(a){var b,c,d,e,f,g,h,i,j,k;f=clb.wk(a,a.q,a.r,clb.vj);g=f*f/16;for(d=1;d<a.q;d++){for(e=0;e<d;e++){i=a.J[e].a-a.J[d].a;j=a.J[e].b-a.J[d].b;k=a.J[e].c-a.J[d].c;if(i*i+j*j+k*k<g)throw c1(new Zkb.rz('The distance between two atoms is too close.'))}}clb.Gt(a,1);b=0;for(c=0;c<a.f;c++){if(clb.Pn(a,c)>(h=clb.Qk(a,c),h+clb.Ok(a,c,h)))throw c1(new Zkb.rz('atom valence exceeded'));b+=a.s[c]}if(b!=0)throw c1(new Zkb.rz('unbalanced atom charge'))};clb.To=function To(a,b,c){var d;d=clb.zm(a,b,c);if(d&&c==386){clb.Gt(a,7);d=d&(a.F[b]&128)==0}return d};clb.Uo=function Uo(){clb.Cm.call(this)};clb.Vo=function Vo(a,b){clb.Dm.call(this,a,b)};clb.Wo=function Wo(a){clb.Dm.call(this,!a?256:a.M,!a?256:a.N);!!a&&clb.Sj(a,this)};U1(91,74,{91:1,74:1,4:1});_.wb=function Xo(a){clb._m(this,a)};_.vb=function Yo(a){return clb.qo(this,a)};_.f=0;_.g=0;Ykb.YX=w3(91);clb.Zo=function Zo(a,b){return $wnd.Math.pow(10,$wnd.Math.log(2000)*$wnd.Math.LOG10E*a/(b-1)-1)};clb.$o=function $o(a,b){var c,d;c=b;d=0;while(b!=0){if(a.d==0){a.f=(a.c[++a.e]&63)<<11;a.d=6}d|=(Ylb&a.f)>>16-c+b;a.f<<=1;--b;--a.d}return d};clb._o=function _o(a,b,c){a.d=6;a.e=c;a.c=b;a.f=(b[a.e]&63)<<11};clb.ap=function ap(a,b){var c,d,e,f;d=b/2|0;e=a>=d;e&&(a-=d);f=b/32|0;c=f*a/(d-a);return e?-c:c};clb.bp=function bp(a,b){var c;return b==null||alb.Pgb(b).length==0?null:clb.dp(a,alb.qgb((c=b,alb.lgb(),c)),null)};clb.cp=function cp(a,b,c){var d,e;return b==null?null:clb.dp(a,alb.qgb((e=b,alb.lgb(),e)),c==null?null:alb.qgb((d=c,d)))};clb.dp=function dp(a,b,c){var d,e,f,g,h;clb._o(a,b,0);d=clb.$o(a,4);g=clb.$o(a,4);d>8&&(d=g);e=clb.$o(a,d);f=clb.$o(a,g);h=new clb.Zt(e,f);clb.gp(a,h,b,c,0);return h};clb.ep=function ep(a,b,c){var d,e,f,g;if(c==null||alb.Pgb(c).length==0){clb.fp(a,b,null,null);return}d=Zkb.g5(c,s5(32));d>0&&d<alb.Pgb(c).length-1?clb.fp(a,b,alb.qgb((f=(alb.Jgb(0,d,alb.Pgb(c).length),alb.Pgb(c).substr(0,d)),alb.lgb(),f)),alb.qgb((g=(alb.Kgb(d+1,alb.Pgb(c).length+1),alb.Pgb(c).substr(d+1)),g))):clb.fp(a,b,alb.qgb((e=c,alb.lgb(),e)),null)};clb.fp=function fp(a,b,c,d){if(c==null||c.length==0){clb.Nj(b);return}clb.gp(a,b,c,d,0)};clb.gp=function gp(b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb,mb,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab,Bb,Cb,Db,Eb,Fb,Gb,Hb,Ib,Jb,Kb,Lb,Mb,Nb,Ob,Pb,Qb,Rb,Sb,Tb,Ub,Vb,Wb,Xb,Yb,Zb,$b,_b,ac,bc,cc,dc,ec,fc,gc,hc,ic,jc,kc,lc,mc,nc,oc,pc,qc,rc,sc,tc,uc,vc,wc,xc,yc,zc,Ac;clb.Nj(c);if(d==null||0>=d.length)return;b.g=c;uc=8;e!=null&&(f<0||f>=e.length)&&(e=null);clb._o(b,d,0);i=clb.$o(b,4);B=clb.$o(b,4);if(i>8){uc=i;i=B}if(i==0){clb.lm(b.g,clb.$o(b,1)==1);return}j=clb.$o(b,i);k=clb.$o(b,B);ic=clb.$o(b,i);mc=clb.$o(b,i);lc=clb.$o(b,i);O=clb.$o(b,i);for(o=0;o<j;o++)clb.yj(b.g,6);for(kb=0;kb<ic;kb++)clb._l(b.g,clb.$o(b,i),7);for(lb=0;lb<mc;lb++)clb._l(b.g,clb.$o(b,i),8);for(wb=0;wb<lc;wb++)clb._l(b.g,clb.$o(b,i),clb.$o(b,8));for(Hb=0;Hb<O;Hb++)clb.Il(b.g,clb.$o(b,i),clb.$o(b,4)-8);P=1+k-j;V=clb.$o(b,4);A=0;clb.Yl(b.g,0,0);clb.Zl(b.g,0,0);clb.$l(b.g,0,0);W=e!=null&&e[f]>=39;tc=0;wc=0;yc=0;Ac=0;R=false;S=false;if(W){if(e.length>2*j-2&&e[2*j-2]==39||e.length>3*j-3&&e[3*j-3]==39){S=true;R=e.length==3*j-3+9;_b=R?3*j-3:2*j-2;w=86*(e[_b+1]-40)+e[_b+2]-40;tc=$wnd.Math.pow(10,w/2000-1);_b+=2;vc=86*(e[_b+1]-40)+e[_b+2]-40;wc=$wnd.Math.pow(10,vc/1500-1);_b+=2;xc=86*(e[_b+1]-40)+e[_b+2]-40;yc=$wnd.Math.pow(10,xc/1500-1);if(R){_b+=2;zc=86*(e[_b+1]-40)+e[_b+2]-40;Ac=$wnd.Math.pow(10,zc/1500-1)}}else{R=e.length==3*j-3}}if(b.xb()&&R){e=null;W=false}for(Sb=1;Sb<j;Sb++){X=clb.$o(b,V);if(X==0){if(W){clb.Yl(b.g,Sb,clb.rk(b.g,0)+8*(e[Sb*2-2]-83));clb.Zl(b.g,Sb,clb.sk(b.g,0)+8*(e[Sb*2-1]-83));R&&clb.$l(b.g,Sb,clb.tk(b.g,0)+8*(e[2*j-3+Sb]-83))}++P;continue}A+=X-1;if(W){clb.Yl(b.g,Sb,clb.rk(b.g,A)+e[Sb*2-2]-83);clb.Zl(b.g,Sb,clb.sk(b.g,A)+e[Sb*2-1]-83);R&&clb.$l(b.g,Sb,clb.tk(b.g,A)+(e[2*j-3+Sb]-83))}clb.Aj(b.g,A,Sb,1)}for(Wb=0;Wb<P;Wb++)clb.Aj(b.g,clb.$o(b,i),clb.$o(b,i),1);ac=gW(Ykb.Z0,Amb,6,k,16,1);for(I=0;I<k;I++){J=clb.$o(b,2);switch(J){case 0:ac[I]=true;break;case 2:clb.jm(b.g,I,2);break;case 3:clb.jm(b.g,I,4);}}h=clb.$o(b,i);for(Xb=0;Xb<h;Xb++){n=clb.$o(b,i);if(uc==8){nc=clb.$o(b,2);if(nc==3){clb.Nl(b.g,n,1,0);clb.Tl(b.g,n,1,false)}else{clb.Tl(b.g,n,nc,false)}}else{nc=clb.$o(b,3);switch(nc){case 4:clb.Tl(b.g,n,1,false);clb.Nl(b.g,n,1,clb.$o(b,3));break;case 5:clb.Tl(b.g,n,2,false);clb.Nl(b.g,n,1,clb.$o(b,3));break;case 6:clb.Tl(b.g,n,1,false);clb.Nl(b.g,n,2,clb.$o(b,3));break;case 7:clb.Tl(b.g,n,2,false);clb.Nl(b.g,n,2,clb.$o(b,3));break;default:clb.Tl(b.g,n,nc,false);}}}uc==8&&clb.$o(b,1)==0&&(b.g.L=true);g=clb.$o(b,B);for(Yb=0;Yb<g;Yb++){D=clb.$o(b,B);if(clb.Kk(b.g,D)==1){nc=clb.$o(b,3);switch(nc){case 4:clb.gm(b.g,D,1,false);clb.dm(b.g,D,1,clb.$o(b,3));break;case 5:clb.gm(b.g,D,2,false);clb.dm(b.g,D,1,clb.$o(b,3));break;case 6:clb.gm(b.g,D,1,false);clb.dm(b.g,D,2,clb.$o(b,3));break;case 7:clb.gm(b.g,D,2,false);clb.dm(b.g,D,2,clb.$o(b,3));break;default:clb.gm(b.g,D,nc,false);}}else{clb.gm(b.g,D,clb.$o(b,2),false)}}clb.lm(b.g,clb.$o(b,1)==1);m=null;kc=0;while(clb.$o(b,1)==1){U=kc+clb.$o(b,4);switch(U){case 0:jc=clb.$o(b,i);for(Zb=0;Zb<jc;Zb++){n=clb.$o(b,i);clb.Ul(b.g,n,lnb,true)}break;case 1:jc=clb.$o(b,i);for($b=0;$b<jc;$b++){n=clb.$o(b,i);gc=clb.$o(b,8);clb.Sl(b.g,n,gc)}break;case 2:jc=clb.$o(b,B);for(mb=0;mb<jc;mb++){clb.$o(b,B)}break;case 3:jc=clb.$o(b,i);for(nb=0;nb<jc;nb++){n=clb.$o(b,i);clb.Ul(b.g,n,Imb,true)}break;case 4:jc=clb.$o(b,i);for(ob=0;ob<jc;ob++){n=clb.$o(b,i);rc=C1(q1(clb.$o(b,4)),3);clb.Ul(b.g,n,rc,true)}break;case 5:jc=clb.$o(b,i);for(pb=0;pb<jc;pb++){n=clb.$o(b,i);l=C1(q1(clb.$o(b,2)),1);clb.Ul(b.g,n,l,true)}break;case 6:jc=clb.$o(b,i);for(qb=0;qb<jc;qb++){n=clb.$o(b,i);clb.Ul(b.g,n,1,true)}break;case 7:jc=clb.$o(b,i);for(rb=0;rb<jc;rb++){n=clb.$o(b,i);hb=C1(q1(clb.$o(b,4)),7);clb.Ul(b.g,n,hb,true)}break;case 8:jc=clb.$o(b,i);for(sb=0;sb<jc;sb++){n=clb.$o(b,i);t=clb.$o(b,4);r=gW(Ykb.AX,gmb,6,t,15,1);for(bc=0;bc<t;bc++){s=clb.$o(b,8);r[bc]=s}clb.Ol(b.g,n,r)}break;case 9:jc=clb.$o(b,B);for(tb=0;tb<jc;tb++){D=clb.$o(b,B);rc=clb.$o(b,2)<<7;clb.im(b.g,D,rc,true)}break;case 10:jc=clb.$o(b,B);for(ub=0;ub<jc;ub++){D=clb.$o(b,B);L=clb.$o(b,5);clb.im(b.g,D,L,true)}break;case 11:jc=clb.$o(b,i);for(vb=0;vb<jc;vb++){n=clb.$o(b,i);clb.Ul(b.g,n,knb,true)}break;case 12:jc=clb.$o(b,B);for(xb=0;xb<jc;xb++){D=clb.$o(b,B);M=clb.$o(b,8)<<9;clb.im(b.g,D,M,true)}break;case 13:jc=clb.$o(b,i);for(yb=0;yb<jc;yb++){n=clb.$o(b,i);oc=C1(q1(clb.$o(b,3)),14);clb.Ul(b.g,n,oc,true)}break;case 14:jc=clb.$o(b,i);for(zb=0;zb<jc;zb++){n=clb.$o(b,i);hc=C1(q1(clb.$o(b,5)),17);clb.Ul(b.g,n,hc,true)}break;case 15:case 31:kc+=16;break;case 16:jc=clb.$o(b,i);for(Ab=0;Ab<jc;Ab++){n=clb.$o(b,i);qc=C1(q1(clb.$o(b,3)),22);clb.Ul(b.g,n,qc,true)}break;case 17:jc=clb.$o(b,i);for(Bb=0;Bb<jc;Bb++){n=clb.$o(b,i);clb.Gl(b.g,n,clb.$o(b,4))}break;case 18:jc=clb.$o(b,i);fc=clb.$o(b,4);for(Cb=0;Cb<jc;Cb++){n=clb.$o(b,i);T=clb.$o(b,fc);cc=gW(Ykb.wX,Fnb,6,T,15,1);for(bc=0;bc<T;bc++)cc[bc]=clb.$o(b,7)<<24>>24;clb.Ll(b.g,n,Zkb.u5(alb.ogb(cc,0,(dc=cc.length,alb.lgb(),dc))))}break;case 19:jc=clb.$o(b,i);for(Db=0;Db<jc;Db++){n=clb.$o(b,i);N=C1(q1(clb.$o(b,3)),25);clb.Ul(b.g,n,N,true)}break;case 20:jc=clb.$o(b,B);for(Eb=0;Eb<jc;Eb++){D=clb.$o(b,B);qc=clb.$o(b,3)<<17;clb.im(b.g,D,qc,true)}break;case 21:jc=clb.$o(b,i);for(Fb=0;Fb<jc;Fb++){n=clb.$o(b,i);clb.Vl(b.g,n,clb.$o(b,2)<<4)}break;case 22:jc=clb.$o(b,i);for(Gb=0;Gb<jc;Gb++){n=clb.$o(b,i);clb.Ul(b.g,n,jnb,true)}break;case 23:jc=clb.$o(b,B);for(Ib=0;Ib<jc;Ib++){D=clb.$o(b,B);clb.im(b.g,D,Inb,true)}break;case 24:jc=clb.$o(b,B);for(Jb=0;Jb<jc;Jb++){D=clb.$o(b,B);l=clb.$o(b,2)<<21;clb.im(b.g,D,l,true)}break;case 25:for(Kb=0;Kb<j;Kb++)clb.$o(b,1)==1&&clb.Wl(b.g,Kb,true);break;case 26:jc=clb.$o(b,B);m=gW(Ykb.AX,gmb,6,jc,15,1);for(Lb=0;Lb<jc;Lb++)m[Lb]=clb.$o(b,B);break;case 27:jc=clb.$o(b,i);for(Mb=0;Mb<jc;Mb++){n=clb.$o(b,i);clb.Ul(b.g,n,Bmb,true)}break;case 28:jc=clb.$o(b,B);for(Nb=0;Nb<jc;Nb++)clb.jm(b.g,clb.$o(b,B),32);break;case 29:jc=clb.$o(b,i);for(Ob=0;Ob<jc;Ob++){n=clb.$o(b,i);gb=C1(q1(clb.$o(b,2)),30);clb.Ul(b.g,n,gb,true)}break;case 30:jc=clb.$o(b,i);for(Pb=0;Pb<jc;Pb++){n=clb.$o(b,i);qc=C1(q1(clb.$o(b,7)),32);clb.Ul(b.g,n,qc,true)}break;case 32:jc=clb.$o(b,i);for(Qb=0;Qb<jc;Qb++){n=clb.$o(b,i);sc=C1(q1(clb.$o(b,2)),44);clb.Ul(b.g,n,sc,true)}break;case 33:jc=clb.$o(b,i);for(Rb=0;Rb<jc;Rb++){n=clb.$o(b,i);bb=C1(q1(clb.$o(b,5)),39);clb.Ul(b.g,n,bb,true)}break;case 34:jc=clb.$o(b,i);for(Tb=0;Tb<jc;Tb++){n=clb.$o(b,i);clb.Ul(b.g,n,Lmb,true)}break;case 35:jc=clb.$o(b,B);for(Ub=0;Ub<jc;Ub++){D=clb.$o(b,B);clb.im(b.g,D,Lnb,true)}break;case 36:jc=clb.$o(b,B);for(Vb=0;Vb<jc;Vb++){D=clb.$o(b,B);K=clb.$o(b,2)<<5;clb.im(b.g,D,K,true)}break;case 37:jc=clb.$o(b,B);for(jb=0;jb<jc;jb++){D=clb.$o(b,B);K=clb.$o(b,1)==0?8:16;clb.jm(b.g,D,K)}}}clb.ce(new clb.me(b.g),ac,false);if(m!=null)for(F=m,G=0,H=F.length;G<H;++G){D=F[G];clb.jm(b.g,D,clb.Kk(b.g,D)==2?4:2)}if(e==null&&!b.i&&d.length>b.e+1&&(d[b.e+1]==32||d[b.e+1]==9)){e=d;f=b.e+2}if(e!=null){try{if(e[f]==33||e[f]==35){clb._o(b,e,f+1);R=clb.$o(b,1)==1;S=clb.$o(b,1)==1;pc=2*clb.$o(b,4);C=1<<pc;eb=0;D=0;for(p=1;p<j;p++){if(D<k&&clb.zk(b.g,1,D)==p){eb=clb.zk(b.g,0,D++);db=1}else{eb=0;db=8}clb.Yl(b.g,p,clb.rk(b.g,eb)+db*(clb.$o(b,pc)-(C/2|0)));clb.Zl(b.g,p,clb.sk(b.g,eb)+db*(clb.$o(b,pc)-(C/2|0)));R&&clb.$l(b.g,p,clb.tk(b.g,eb)+db*(clb.$o(b,pc)-(C/2|0)))}if(e[f]==35){ib=0;fb=gW(Ykb.AX,gmb,6,j,15,1);for(q=0;q<j;q++)ib+=fb[q]=clb.Kn(b.g,q);for(n=0;n<j;n++){for(jb=0;jb<fb[n];jb++){hb=clb.yj(b.g,1);clb.Aj(b.g,n,hb,1);clb.Yl(b.g,hb,clb.rk(b.g,n)+(clb.$o(b,pc)-(C/2|0)));clb.Zl(b.g,hb,clb.sk(b.g,n)+(clb.$o(b,pc)-(C/2|0)));R&&clb.$l(b.g,hb,clb.tk(b.g,n)+(clb.$o(b,pc)-(C/2|0)))}}j+=ib;k+=ib}v=R?1.5:(clb.wj(),clb.wj(),clb.vj);u=clb.wk(b.g,j,k,v);if(S){tc=clb.Zo(clb.$o(b,pc),C);wc=tc*clb.ap(clb.$o(b,pc),C);yc=tc*clb.ap(clb.$o(b,pc),C);R&&(Ac=tc*clb.ap(clb.$o(b,pc),C));db=tc/u;for(n=0;n<j;n++){clb.Yl(b.g,n,wc+db*clb.rk(b.g,n));clb.Zl(b.g,n,yc+db*clb.sk(b.g,n));R&&clb.$l(b.g,n,Ac+db*clb.tk(b.g,n))}}else{tc=1.5;db=tc/u;for(n=0;n<j;n++){clb.Yl(b.g,n,db*clb.rk(b.g,n));clb.Zl(b.g,n,db*clb.sk(b.g,n));R&&clb.$l(b.g,n,db*clb.tk(b.g,n))}}}else{R&&!S&&tc==0&&(tc=1.5);if(tc!=0&&b.g.r!=0){u=0;for(D=0;D<b.g.r;D++){Y=clb.rk(b.g,clb.zk(b.g,0,D))-clb.rk(b.g,clb.zk(b.g,1,D));Z=clb.sk(b.g,clb.zk(b.g,0,D))-clb.sk(b.g,clb.zk(b.g,1,D));$=R?clb.tk(b.g,clb.zk(b.g,0,D))-clb.tk(b.g,clb.zk(b.g,1,D)):0;u+=$wnd.Math.sqrt(Y*Y+Z*Z+$*$)}u/=b.g.r;cb=tc/u;for(n=0;n<b.g.q;n++){clb.Yl(b.g,n,clb.rk(b.g,n)*cb+wc);clb.Zl(b.g,n,clb.sk(b.g,n)*cb+yc);R&&clb.$l(b.g,n,clb.tk(b.g,n)*cb+Ac)}}}}catch(a){a=b1(a);if(mX(a,15)){ab=a;Zkb._y(ab,(Zkb.O5(),Zkb.N5),'');'Faulty id-coordinates:'+Zkb.dz(ab,ab.Gb())+' '+Zkb.u5(alb.ogb(d,0,(ec=d.length,alb.lgb(),ec)))+' '+Zkb.u5(alb.ogb(e,0,(dc=e.length,dc)));String.fromCharCode(10);e=null;R=false}else throw c1(a)}}Q=e!=null&&!R;if(Q||b.xb()){clb.Gt(b.g,7);for(D=0;D<b.g.g;D++)clb.Hk(b.g,D)==2&&!clb.Co(b.g,D)&&clb.Ik(b.g,D)==0&&clb.hm(b.g,D)}clb.Mo(b.g,0);if(!Q&&b.xb()){try{b.yb(b.g);Q=true}catch(a){a=b1(a);if(mX(a,15)){ab=a;Zkb._y(ab,(Zkb.O5(),Zkb.N5),'');'2D-coordinate creation failed:'+Zkb.dz(ab,ab.Gb())+' '+Zkb.u5(alb.ogb(d,0,(dc=d.length,alb.lgb(),dc)));String.fromCharCode(10)}else throw c1(a)}}if(Q){clb.Po(b.g);clb.Tt(b.g)}else R||clb.Mo(b.g,0)};clb.hp=function hp(a,b){var c,d,e,f,g,h;if(b.length<=0||b[0]<64)return;clb._o(a,b,0);h=clb.$o(a,4);e=clb.$o(a,1)==1;f=clb.$o(a,1)==1;for(c=0;c<a.g.f;c++){g=clb.$o(a,h);d=e;e&&f&&(d=clb.$o(a,1)==1);clb.Ql(a.g,c,g,d)}};clb.ip=function ip(){};U1(245,1,{},clb.ip);_.xb=function jp(){return false};_.yb=function kp(a){throw c1(new Zkb.rz('Unexpected request to invent coordinates. Check source code logic!'))};_.d=0;_.e=0;_.f=0;_.i=false;Ykb.ZX=w3(245);clb.lp=function lp(a){};clb.mp=function mp(a){clb.lp(this);this.b=a};U1(48,245,{},clb.mp);_.xb=function np(){return this.b};_.yb=function op(a){var b;b=new glb.Rx(this.a);b.g=new dlb.Zdb(78187493520);glb.yx(b,a)};_.a=2;_.b=false;Ykb.$X=w3(48);clb.pp=function pp(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;e=b.a;n=b.g;j=z1(e1(clb.pk(a.k,e),1),0);f=clb.kk(a.k,e);l=f!=null?clb.wp(a,e,f,d):j?'*':clb.jk(a.k,e);!j&&f==null&&clb.lo(a.k,e)&&(a.j&4)==0&&(clb.mn(a.k,e)!=0||clb.bk(a.k,e)==-1&&clb.qk(a.k,e)==0)&&(l=alb.Pgb(l).toLowerCase());b.f&&(c.a+='(',c);n!=-1&&clb.tp(a,clb.tn(a.k,b.a,b.g),b.g,c);g=clb.dk(a.k,e);if(g==0&&(a.j&1)!=0){h=e1(clb.pk(a.k,e),Omb);j1(h,Rmb)==0?(g=-1):j1(h,Qmb)==0&&(g=1)}k=clb.nk(a.k,e);m=(a.j&2)!=0?clb.mk(a.k,e):0;o=(a.j&1)!=0?clb.Cp(a,e,d):null;r=!j&&!clb.Jp(clb.uk(a.k,e))||f!=null||(clb.ok(a.k,e)==1||clb.ok(a.k,e)==2)&&(q=clb.ik(a.k,e)-1,!(q!=-1&&a.i[q][clb.hk(a.k,e)]<=1))&&(clb.uk(a.k,e)!=7||clb.dk(a.k,e)>0)||clb.lo(a.k,e)&&clb.mn(a.k,e)==0&&(a.j&4)==0||g!=0||k!=0||m!=0||clb.bk(a.k,e)!=-1||clb.qk(a.k,e)!=0||o!=null;r&&(c.a+='[',c);k!=0&&(c.a+=k,c);c.a+=''+l;(clb.ok(a.k,e)==1||clb.ok(a.k,e)==2)&&(p=clb.ik(a.k,e)-1,!(p!=-1&&a.i[p][clb.hk(a.k,e)]<=1))&&(clb.uk(a.k,e)!=7||clb.dk(a.k,e)>0)&&Zkb.G5(c,clb.Bp(a,e,n));if((a.j&1)==0&&r){i=clb.Vn(a.k,e);i==1?(c.a+='H',c):i>1&&(c.a+='H'+i,c)}if(g!=0){c.a+=String.fromCharCode(g>0?43:45);$wnd.Math.abs(g)>1&&Zkb.D5(c,$wnd.Math.abs(g))}o!=null&&(c.a+=''+o,c);if(m!=0){c.a+=':';c.a+=m}r&&(c.a+=']',c);clb.up(a,b,c);b.e&&(c.a+=')',c)};clb.qp=function qp(a,b,c){var d,e,f,g,h;f=true;h=dlb.Bi(a.g,b).a;g=clb.Fp(a,h);while(g!=-1){d=clb.vn(a.k,h,g);e=clb.xn(a.k,h,g);g=clb.Fp(a,d);clb.sp(a,new clb.Vs(d,e,h,c&&f,c&&g==-1),++b);h=d;f=false}};clb.rp=function rp(a,b,c){var d,e,f,g;for(e=b,f=0,g=e.length;f<g;++f){d=e[f];a.f[d&1073741823]=(d&fob)!=0^c?2:1}};clb.sp=function sp(a,b,c){dlb.vi(a.g,c,b);a.b[b.a]=true;b.g!=-1&&(a.c[clb.tn(a.k,b.a,b.g)]=true)};clb.tp=function tp(a,b,c,d){var e,f,g,h,i;i=alb.Pgb(d.a).length;a.f[b]!=0&&Zkb.C5(d,a.f[b]==1?47:92);if(a.j==1){f=clb.Jk(a.k,127);if(f!=0){(f&1)!=0&&a.f[b]==0&&(d.a+='-',d);if((f&2)!=0){alb.Pgb(d.a).length!=i&&(d.a+=',',d);d.a+='='}if((f&4)!=0){alb.Pgb(d.a).length!=i&&(d.a+=',',d);d.a+='#'}if((f&8)!=0){alb.Pgb(d.a).length!=i&&(d.a+=',',d);d.a+='$'}if((f&16)!=0){alb.Pgb(d.a).length!=i&&(d.a+=',',d);d.a+='$'}if((f&64)!=0){alb.Pgb(d.a).length!=i&&(d.a+=',',d);d.a+=':'}if((f&32)!=0){alb.Pgb(d.a).length!=i&&(d.a+=',',d);Zkb.G5(d,clb.jl(a.k,c)?'<-':'->')}}}if(i==alb.Pgb(d.a).length&&(!clb.mo(a.k,b)||(a.j&4)!=0)){e=clb.Kk(a.k,b)&127;e==1?clb.lo(a.k,clb.zk(a.k,0,b))&&clb.lo(a.k,clb.zk(a.k,1,b))&&(a.j&4)==0&&a.f[b]==0&&(d.a+='-',d):e==2?(d.a+='=',d):e==4?(d.a+='#',d):e==8?(d.a+='$',d):e==16?(d.a+='$',d):e==64?(d.a+=':',d):e==32&&Zkb.G5(d,clb.jl(a.k,c)?'<-':'->')}if(a.j==1){g=i==alb.Pgb(d.a).length?'':';';h=clb.Jk(a.k,b)&384;h==256?(d.a+=g+'@',d):h==128&&(d.a+=g+'!@',d)}};clb.up=function up(a,b,c){var d,e,f;if(b.c!=null){for(e=0;e<b.c.length;e++){for(f=0;f<clb.wn(a.k,b.a);f++){if(b.c[e]==clb.vn(a.k,b.a,f)){d=clb.xn(a.k,b.a,f);b.d[e]||clb.tp(a,d,b.a,c);a.e[d]>9&&(c.a+='%',c);Zkb.D5(c,a.e[d])}}}}};clb.vp=function vp(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O;M=new dlb.Qi;for(r=new dlb.Obb(a.g);r.a<r.c.a.length;){q=dlb.Nbb(r);if(q.g!=-1){t=clb.tn(a.k,q.a,q.g);if(!clb.no(a.k,t)&&!clb.Co(a.k,t)&&(clb.Ik(a.k,t)==1||clb.Ik(a.k,t)==2)){K=dlb.Bi(a.g,a.q[q.g]);c=gW(Ykb.AX,gmb,6,clb.wn(a.k,q.a)+clb.wn(a.k,K.a)-2,15,1);B=0;L=false;if(K.g!=-1){c[B++]=K.b}else{u=-1;N=-1;v=Qlb;for(D=0;D<clb.wn(a.k,K.a);D++){l=clb.vn(a.k,K.a,D);if(l!=q.a){if(u==-1){u=D;v=a.q[l]}else{if(v<a.q[l]){N=D}else{N=u;u=D}}}}if(N==-1){H=clb.vn(a.k,K.a,u);I=clb.xn(a.k,K.a,u);c[B++]=I|(clb.Hp(a,K.a,H)?fob:0)}else{m=clb.vn(a.k,K.a,u);o=clb.xn(a.k,K.a,u);n=clb.vn(a.k,K.a,N);p=clb.xn(a.k,K.a,N);c[B++]=o|(clb.Hp(a,K.a,m)?fob:0);c[B++]=p|(clb.Hp(a,K.a,n)?0:fob)}}if(clb.wn(a.k,K.a)==3&&K.g!=-1){for(D=0;D<clb.wn(a.k,K.a);D++){l=clb.vn(a.k,K.a,D);if(l!=K.g&&l!=q.a){d=clb.xn(a.k,K.a,D);c[B++]=d|(clb.Hp(a,K.a,l)?fob:0);l<K.g&&(L=!L);break}}}clb.Ik(a.k,t)==2&&(L=!L);for(C=0;C<clb.wn(a.k,q.a);C++){i=clb.vn(a.k,q.a,C);if(i!=q.g){A=L;if(clb.wn(a.k,q.a)==3){for(G=0;G<clb.wn(a.k,q.a);G++){l=clb.vn(a.k,q.a,G);if(l!=q.g&&l!=i){l<i&&(A=!A);break}}}if(clb.el(a.k,t)){w=clb.If(a.d,t);if(!a.n[w]){a.n[w]=true;a.o[w]=A}a.o[w]&&(A=!A)}j=clb.tn(a.k,q.a,i);c[B++]=j|(A^clb.Hp(a,q.a,i)?0:fob)}}alb.ggb(M.a,c)}}}a.f=gW(Ykb.AX,gmb,6,a.k.g,15,1);M.a.length!=0&&clb.rp(a,dlb.Ii(M,0),false);while(M.a.length!=0){O=M.a.length;for(C=M.a.length-1;C>=0;C--){c=(alb.Dgb(C,M.a.length),M.a[C]);J=0;F=false;k=false;for(f=c,g=0,h=f.length;g<h;++g){e=f[g];b=e&1073741823;if(a.f[b]!=0){s=(e&fob)!=0^a.f[b]==2;J==0?(F=s):F!=s&&(k=true);++J}}if(J!=0){c=dlb.Ii(M,C);k||clb.rp(a,c,F)}}O==M.a.length&&clb.rp(a,dlb.Ii(M,0),false)}};clb.wp=function wp(a,b,c,d){var e,f,g,h,i,j,k;k=alb.Pgb(d.a).length;0<k?(d.a=Zkb.p5(d.a,0,0)):0>k&&(d.a+=Zkb.u5(gW(Ykb.xX,Anb,6,-k,15,1)));i=clb.lo(a.k,b)&&(a.j&4)==0;for(f=c,g=0,h=f.length;g<h;++g){e=f[g];alb.Pgb(d.a).length!=0&&(d.a+=',',d);j=(clb.wj(),clb.qj)[e];Zkb.G5(d,i?alb.Pgb(j).toLowerCase():j)}return d.a};clb.xp=function xp(a){var b,c,d,e,f,g,h,i;if(!a.k||a.k.q==0)return '';clb.Gt(a.k,15);a.d=new clb.bg(a.k,129);e=a.d.R;a.o=gW(Ykb.Z0,Amb,6,e+1,16,1);a.n=gW(Ykb.Z0,Amb,6,e+1,16,1);a.i=eW(Ykb.AX,[Dnb,gmb],[7,6],15,[2,32],2);for(b=0;b<a.k.f;b++){i=clb.ik(a.k,b)-1;i!=-1&&++a.i[i][clb.hk(a.k,b)]}clb.Ap(a);clb.yp(a);clb.vp(a);d=new Zkb.J5;c=new Zkb.J5;f=true;for(h=new dlb.Obb(a.g);h.a<h.c.a.length;){g=dlb.Nbb(h);g.g==-1&&(f?(f=false):(d.a+='.',d));clb.pp(a,g,d,c)}return d.a};clb.yp=function yp(a){var b,c,d,e,f,g,h,i,j,k,l;for(l=new dlb.Obb(a.g);l.a<l.c.a.length;){j=dlb.Nbb(l);c=0;for(f=0;f<clb.wn(a.k,j.a);f++)a.c[clb.xn(a.k,j.a,f)]||++c;if(c!=0){j.c=gW(Ykb.AX,gmb,6,c,15,1);c=0;for(g=0;g<clb.wn(a.k,j.a);g++){if(!a.c[clb.xn(a.k,j.a,g)]){i=clb.vn(a.k,j.a,g);j.c[c++]=a.q[i]<<16|i}}alb.jgb(j.c,alb.Pgb(X1(dlb.ucb.prototype.kc,dlb.ucb,[])));for(e=0;e<j.c.length;e++)j.c[e]=Zlb&j.c[e]}}d=gW(Ykb.Z0,Amb,6,a.k.g,16,1);a.e=gW(Ykb.AX,gmb,6,a.k.g,15,1);for(k=new dlb.Obb(a.g);k.a<k.c.a.length;){j=dlb.Nbb(k);if(j.c!=null){j.d=gW(Ykb.Z0,Amb,6,j.c.length,16,1);for(e=0;e<j.c.length;e++){for(h=0;h<clb.wn(a.k,j.a);h++){if(j.c[e]==clb.vn(a.k,j.a,h)){b=clb.xn(a.k,j.a,h);if(a.c[b]){d[a.e[b]]=false}else{a.c[b]=true;j.d[e]=true;a.e[b]=1;while(d[a.e[b]])++a.e[b];d[a.e[b]]=true}}}}}}};clb.zp=function zp(a){var b,c,d,e;d=-1;e=Qlb;for(b=0;b<a.k.f;b++){if(!a.b[b]){c=a.a[b];z1(e1(clb.pk(a.k,b),Bmb),0)&&(c+=fob);clb.wn(a.k,b)==0?(c+=1056964608):(c+=clb.wn(a.k,b)<<24);if(e>c){e=c;d=b}}}return d};clb.Ap=function Ap(a){var b,c,d,e,f;a.a=a.d.d;a.b=gW(Ykb.Z0,Amb,6,a.k.f,16,1);a.c=gW(Ykb.Z0,Amb,6,a.k.g,16,1);a.g=new dlb.Qi;b=clb.zp(a);while(b!=-1){c=a.g.a.length;clb.sp(a,new clb.Vs(b,-1,-1,false,false),c);if(clb.wn(a.k,b)!=0){clb.qp(a,c,false);while(c<a.g.a.length-1){while(clb.Gp(a,dlb.Bi(a.g,c).a))clb.qp(a,c,true);++c}}b=clb.zp(a)}a.q=gW(Ykb.AX,gmb,6,a.k.f,15,1);d=0;for(f=new dlb.Obb(a.g);f.a<f.c.a.length;){e=dlb.Nbb(f);a.q[e.a]=d++}};clb.Bp=function Bp(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;h=false;if(clb.mn(a.k,b)!=0&&clb.wn(a.k,b)==2&&clb.yn(a.k,b,0)==2&&clb.yn(a.k,b,1)==2){for(f=0;f<clb.wn(a.k,b);f++){d=clb.vn(a.k,b,f);n=0;m=gW(Ykb.AX,gmb,6,3,15,1);for(j=0;j<clb.wn(a.k,d);j++){m[n]=clb.vn(a.k,d,j);m[n]!=b&&++n}n==2&&a.q[m[0]]<a.q[m[1]]^m[0]<m[1]&&(h=!h)}}else{k=gW(Ykb.AX,gmb,6,4,15,1);l=gW(Ykb.AX,gmb,6,4,15,1);g=0;if(c!=-1){k[g]=c;l[g++]=8*a.q[c]}if(clb.Kn(a.k,b)!=0){k[g]=Qlb;l[g++]=8*a.q[b]}else if(clb.wn(a.k,b)==3){k[g]=Qlb;l[g++]=8*a.q[b]}for(f=0;f<clb.wn(a.k,b);f++){d=clb.vn(a.k,b,f);if(d!=c){k[g]=d;l[g++]=clb.Ep(a,b,f)}}h=clb.Ip(k,l)}i=clb.ok(a.k,b)==1^h;if(clb.Zk(a.k,b)){e=clb.Jf(a.d,b);if(!a.n[e]){a.n[e]=true;a.o[e]=i}a.o[e]&&(i=!i)}return i?'@@':'@'};clb.Cp=function Cp(a,b,c){var d,e,f,g,h,i,j,k;h=alb.Pgb(c.a).length;0<h?(c.a=Zkb.p5(c.a,0,0)):0>h&&(c.a+=Zkb.u5(gW(Ykb.xX,Anb,6,-h,15,1)));i=clb.pk(a.k,b);e=I1(D1(e1(i,Omb),3));switch(e){case 20971520:c.a+='+0';break;case 25165824:clb.dk(a.k,b)==0&&(c.a+='-',c);break;case 12582912:clb.dk(a.k,b)==0&&(c.a+='+',c);}d=e1(i,Hnb);j1(d,2)==0?(c.a+=';a',c):j1(d,4)==0&&(c.a+=';A',c);f=e1(i,Mmb);j1(f,0)!=0&&(j1(f,1792)==0?(c.a+=';H0',c):j1(f,1664)==0?(c.a+=';H1',c):j1(f,1408)==0?(c.a+=';H2',c):j1(f,896)==0?(c.a+=';H3',c):j1(f,128)==0?(c.a+=';!H0',c):j1(f,384)==0?(c.a+=';!H0;!H1',c):j1(f,1536)==0?(c.a+=';!H2;!H3',c):j1(f,Nmb)==0&&(c.a+=';!H3',c));k=e1(i,120);j1(k,8)==0?(c.a+=';!R0',c):j1(k,16)==0?(c.a+=';!R1',c):j1(k,32)==0?(c.a+=';!R2',c):j1(k,64)==0?(c.a+=';!R3',c):j1(k,112)==0?(c.a+=';R0',c):j1(k,104)==0?(c.a+=';R1',c):j1(k,88)==0?(c.a+=';R2',c):j1(k,56)==0&&(c.a+=';R3',c);j=e1(i,kmb);if(j1(j,lmb)==0)c.a+=';!r'+J1(j);else if(j1(j,gob)==0)c.a+=';r'+J1(j);else if(j1(j,0)!=0){if(z1(e1(j,rmb),0)){o1(e1(j,lmb),0)&&(c.a+=';!r0'+J1(j),c);o1(e1(j,mmb),0)&&(c.a+=';!r3'+J1(j),c);o1(e1(j,nmb),0)&&(c.a+=';!r4'+J1(j),c);o1(e1(j,omb),0)&&(c.a+=';!r5'+J1(j),c);o1(e1(j,pmb),0)&&(c.a+=';!r6'+J1(j),c);o1(e1(j,qmb),0)&&(c.a+=';!r7'+J1(j),c)}else{c.a+=';';z1(e1(j,lmb),0)&&(c.a+='r0,'+J1(j),c);z1(e1(j,mmb),0)&&(c.a+='r3,'+J1(j),c);z1(e1(j,nmb),0)&&(c.a+='r4,'+J1(j),c);z1(e1(j,omb),0)&&(c.a+='r5,'+J1(j),c);z1(e1(j,pmb),0)&&(c.a+='r6,'+J1(j),c);z1(e1(j,qmb),0)&&(c.a+='r7,'+J1(j),c);Zkb.B2(c,alb.Pgb(c.a).length-1)}}if(j1(j,0)==0){j=D1(e1(i,inb),22);j1(j,0)!=0&&(c.a+=';r'+J1(j),c)}g=e1(i,Tmb);j1(g,3801088)==0&&(c.a+=';D1',c);j1(g,Umb)==0&&(c.a+=';D2',c);j1(g,Vmb)==0&&(c.a+=';D3',c);j1(g,3145728)==0&&(c.a+=';!D3;!D4',c);j1(g,Wmb)==0&&(c.a+=';!D4',c);j1(g,Xmb)==0&&(c.a+=';!D0;!D1',c);j1(g,Ymb)==0&&(c.a+=';!D0;!D1;!D2',c);j1(g,Zmb)==0&&(c.a+=';!D0;!D1;!D2;!D3',c);z1(e1(i,lnb),0)&&Zkb.G5(c,';D'+clb.wn(a.k,b));z1(e1(i,Imb),0)&&Zkb.G5(c,';!D'+clb.wn(a.k,b));return alb.Pgb(c.a).length==0?null:c.a};clb.Dp=function Dp(a){a.p==null&&(a.p=clb.xp(a));return a.p};clb.Ep=function Ep(a,b,c){var d,e,f,g,h;d=clb.xn(a.k,b,c);g=clb.vn(a.k,b,c);if(a.e[d]!=0){h=8*a.q[b]+1;e=dlb.Bi(a.g,a.q[b]).c;for(f=0;f<e.length&&g!=e[f];f++)++h;return h}return 8*a.q[g]};\nclb.Fp=function Fp(a,b){var c,d,e,f,g;c=-1;d=-1;for(f=0;f<clb.wn(a.k,b);f++){e=clb.vn(a.k,b,f);g=(clb.yn(a.k,b,f)<<24)+a.a[e];if(!a.b[e]&&(c==-1||d<g)){c=f;d=g}}return c};clb.Gp=function Gp(a,b){var c;for(c=0;c<clb.wn(a.k,b);c++)if(!a.b[clb.vn(a.k,b,c)])return true;return false};clb.Hp=function Hp(a,b,c){var d,e;d=dlb.Bi(a.g,a.q[b]);if(d.g==c)return false;e=dlb.Bi(a.g,a.q[c]);if(e.g==b)return true;return clb.Us(e,b)};clb.Ip=function Ip(a,b){var c,d,e;d=false;for(c=1;c<4;c++){for(e=0;e<c;e++){a[e]>a[c]&&(d=!d);b[e]>b[c]&&(d=!d)}}return d};clb.Jp=function Jp(a){return a>=5&&a<=9||a>=15&&a<=17||a==35||a==53};clb.Kp=function Kp(a){clb.Mp.call(this,a,false)};clb.Lp=function Lp(a,b){this.k=a;this.j=b};clb.Mp=function Mp(a,b){clb.Lp.call(this,a,b?2:0)};clb.Np=function Np(a){var b,c,d,e;e=new Zkb.J5;for(c=0;c<a.g.a.length;c++){c!=0&&(e.a+='.',e);Zkb.G5(e,clb.Dp(new clb.Lp(dlb.Bi(a.g,c),2)))}e.a+='>';for(d=0;d<a.a.a.length;d++){d!=0&&(e.a+='.',e);Zkb.G5(e,clb.Dp(new clb.Kp(dlb.Bi(a.a,d))))}e.a+='>';for(b=0;b<a.f.a.length;b++){b!=0&&(e.a+='.',e);Zkb.G5(e,clb.Dp(new clb.Lp(dlb.Bi(a.f,b),2)))}return e.a};U1(89,1,{},clb.Kp,clb.Lp,clb.Mp);_.j=0;Ykb._X=w3(89);clb.Op=function Op(a,b){this.b=a;this.a=b};U1(3,1,{3:1},clb.Op);_.a=0;_.b=0;Ykb.aY=w3(3);\nclb.Qp=function Qp(){clb.Qp=W1;clb.Pp=oW(aW(Ykb.aY,2),Llb,14,0,[null,oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(0,1.007825032),new clb.Op(1,2.014101778),new clb.Op(2,3.016049268),new clb.Op(3,4.027834627),new clb.Op(4,5.039542911),new clb.Op(5,6.044942608)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(1,3.01602931),new clb.Op(2,4.00260325),new clb.Op(3,5.012223628),new clb.Op(4,6.018888072),new clb.Op(5,7.028030527),new clb.Op(6,8.033921838),new clb.Op(7,9.043820323),new clb.Op(8,10.052399713)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(1,4.027182329),new clb.Op(2,5.012537796),new clb.Op(3,6.015122281),new clb.Op(4,7.016004049),new clb.Op(5,8.02248667),new clb.Op(6,9.026789122),new clb.Op(7,10.035480884),new clb.Op(8,11.043796166),new clb.Op(9,12.05378)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(1,5.04079),new clb.Op(2,6.019725804),new clb.Op(3,7.016929246),new clb.Op(4,8.005305094),new clb.Op(5,9.012182135),new clb.Op(6,10.01353372),new clb.Op(7,11.021657653),new clb.Op(8,12.026920631),new clb.Op(9,13.036133834),new clb.Op(10,14.042815522)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(2,7.029917389),new clb.Op(3,8.024606713),new clb.Op(4,9.013328806),new clb.Op(5,10.012937027),new clb.Op(6,11.009305466),new clb.Op(7,12.014352109),new clb.Op(8,13.017780267),new clb.Op(9,14.025404064),new clb.Op(10,15.031097291),new clb.Op(11,16.039808836),new clb.Op(12,17.046931399),new clb.Op(13,18.05617),new clb.Op(14,19.06373)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(2,8.037675026),new clb.Op(3,9.031040087),new clb.Op(4,10.01685311),new clb.Op(5,11.011433818),new clb.Op(6,12),new clb.Op(7,13.003354838),new clb.Op(8,14.003241988),new clb.Op(9,15.010599258),new clb.Op(10,16.014701243),new clb.Op(11,17.022583712),new clb.Op(12,18.026757058),new clb.Op(13,19.035248094),new clb.Op(14,20.040322395),new clb.Op(15,21.04934),new clb.Op(16,22.05645)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(3,10.042618),new clb.Op(4,11.026796226),new clb.Op(5,12.018613202),new clb.Op(6,13.005738584),new clb.Op(7,14.003074005),new clb.Op(8,15.000108898),new clb.Op(9,16.006101417),new clb.Op(10,17.008449673),new clb.Op(11,18.014081827),new clb.Op(12,19.017026896),new clb.Op(13,20.023367295),new clb.Op(14,21.027087574),new clb.Op(15,22.034440259),new clb.Op(16,23.04051),new clb.Op(17,24.0505)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(4,12.034404776),new clb.Op(5,13.0248104),new clb.Op(6,14.008595285),new clb.Op(7,15.003065386),new clb.Op(8,15.994914622),new clb.Op(9,16.999131501),new clb.Op(10,17.999160419),new clb.Op(11,19.00357873),new clb.Op(12,20.00407615),new clb.Op(13,21.008654631),new clb.Op(14,22.009967157),new clb.Op(15,23.015691325),new clb.Op(16,24.020369922),new clb.Op(17,25.02914),new clb.Op(18,26.03775)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(5,14.03608),new clb.Op(6,15.018010856),new clb.Op(7,16.01146573),new clb.Op(8,17.002095238),new clb.Op(9,18.000937667),new clb.Op(10,18.998403205),new clb.Op(11,19.999981324),new clb.Op(12,20.999948921),new clb.Op(13,22.00299925),new clb.Op(14,23.003574385),new clb.Op(15,24.008099371),new clb.Op(16,25.012094963),new clb.Op(17,26.019633157),new clb.Op(18,27.026892316),new clb.Op(19,28.03567),new clb.Op(20,29.04326)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(6,16.025756907),new clb.Op(7,17.017697565),new clb.Op(8,18.005697066),new clb.Op(9,19.001879839),new clb.Op(10,19.992440176),new clb.Op(11,20.993846744),new clb.Op(12,21.99138551),new clb.Op(13,22.994467337),new clb.Op(14,23.993615074),new clb.Op(15,24.997789899),new clb.Op(16,26.000461498),new clb.Op(17,27.0076152),new clb.Op(18,28.012108072),new clb.Op(19,29.019345902),new clb.Op(20,30.023872),new clb.Op(21,31.03311),new clb.Op(22,32.03991)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(7,18.02718),new clb.Op(8,19.01387945),new clb.Op(9,20.00734826),new clb.Op(10,20.997655099),new clb.Op(11,21.994436782),new clb.Op(12,22.989769675),new clb.Op(13,23.990963332),new clb.Op(14,24.989954352),new clb.Op(15,25.992589898),new clb.Op(16,26.994008702),new clb.Op(17,27.99889041),new clb.Op(18,29.002811301),new clb.Op(19,30.009226487),new clb.Op(20,31.013595108),new clb.Op(21,32.019649792),new clb.Op(22,33.027386),new clb.Op(23,34.0349),new clb.Op(24,35.04418)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(8,20.018862744),new clb.Op(9,21.011714174),new clb.Op(10,21.999574055),new clb.Op(11,22.99412485),new clb.Op(12,23.985041898),new clb.Op(13,24.985837023),new clb.Op(14,25.98259304),new clb.Op(15,26.984340742),new clb.Op(16,27.983876703),new clb.Op(17,28.988554743),new clb.Op(18,29.990464529),new clb.Op(19,30.996548459),new clb.Op(20,31.999145889),new clb.Op(21,33.005586975),new clb.Op(22,34.00907244),new clb.Op(23,35.018669),new clb.Op(24,36.02245),new clb.Op(25,37.03124)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(8,21.02804),new clb.Op(9,22.01952),new clb.Op(10,23.0072649),new clb.Op(11,23.999940911),new clb.Op(12,24.990428555),new clb.Op(13,25.986891659),new clb.Op(14,26.981538441),new clb.Op(15,27.981910184),new clb.Op(16,28.980444848),new clb.Op(17,29.982960304),new clb.Op(18,30.983946023),new clb.Op(19,31.988124379),new clb.Op(20,32.990869587),new clb.Op(21,33.996927255),new clb.Op(22,34.99993765),new clb.Op(23,36.006351501),new clb.Op(24,37.01031),new clb.Op(25,38.0169),new clb.Op(26,39.0219)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(8,22.03453),new clb.Op(9,23.02552),new clb.Op(10,24.011545711),new clb.Op(11,25.00410664),new clb.Op(12,25.992329935),new clb.Op(13,26.986704764),new clb.Op(14,27.976926533),new clb.Op(15,28.976494719),new clb.Op(16,29.973770218),new clb.Op(17,30.975363275),new clb.Op(18,31.974148129),new clb.Op(19,32.97800052),new clb.Op(20,33.978575745),new clb.Op(21,34.984584158),new clb.Op(22,35.986687363),new clb.Op(23,36.99299599),new clb.Op(24,37.99598),new clb.Op(25,39.0023),new clb.Op(26,40.0058),new clb.Op(27,41.0127),new clb.Op(28,42.0161)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(9,24.03435),new clb.Op(10,25.02026),new clb.Op(11,26.01178),new clb.Op(12,26.999191645),new clb.Op(13,27.99231233),new clb.Op(14,28.981801376),new clb.Op(15,29.978313807),new clb.Op(16,30.973761512),new clb.Op(17,31.973907163),new clb.Op(18,32.971725281),new clb.Op(19,33.973636381),new clb.Op(20,34.973314249),new clb.Op(21,35.978259824),new clb.Op(22,36.979608338),new clb.Op(23,37.98447),new clb.Op(24,38.98642),new clb.Op(25,39.99105),new clb.Op(26,40.9948),new clb.Op(27,42.00009),new clb.Op(28,43.00331),new clb.Op(29,44.00988),new clb.Op(30,45.01514),new clb.Op(31,46.02383)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(10,26.02788),new clb.Op(11,27.018795),new clb.Op(12,28.004372661),new clb.Op(13,28.996608805),new clb.Op(14,29.984902954),new clb.Op(15,30.979554421),new clb.Op(16,31.97207069),new clb.Op(17,32.971458497),new clb.Op(18,33.967866831),new clb.Op(19,34.96903214),new clb.Op(20,35.96708088),new clb.Op(21,36.971125716),new clb.Op(22,37.971163443),new clb.Op(23,38.975135275),new clb.Op(24,39.97547),new clb.Op(25,40.98003),new clb.Op(26,41.98149),new clb.Op(27,42.9866),new clb.Op(28,43.98832),new clb.Op(29,44.99482),new clb.Op(30,45.99957),new clb.Op(31,47.00762),new clb.Op(32,48.01299),new clb.Op(33,49.02201)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(11,28.02851),new clb.Op(12,29.01411),new clb.Op(13,30.00477),new clb.Op(14,30.992416014),new clb.Op(15,31.985688908),new clb.Op(16,32.977451798),new clb.Op(17,33.973761967),new clb.Op(18,34.968852707),new clb.Op(19,35.968306945),new clb.Op(20,36.9659026),new clb.Op(21,37.96801055),new clb.Op(22,38.968007677),new clb.Op(23,39.970415555),new clb.Op(24,40.970650212),new clb.Op(25,41.973174994),new clb.Op(26,42.974203385),new clb.Op(27,43.978538712),new clb.Op(28,44.9797),new clb.Op(29,45.98412),new clb.Op(30,46.98795),new clb.Op(31,47.99485),new clb.Op(32,48.99989),new clb.Op(33,50.00773),new clb.Op(34,51.01353)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(12,30.02156),new clb.Op(13,31.012126),new clb.Op(14,31.99766066),new clb.Op(15,32.989928719),new clb.Op(16,33.980270118),new clb.Op(17,34.975256726),new clb.Op(18,35.967546282),new clb.Op(19,36.966775912),new clb.Op(20,37.962732161),new clb.Op(21,38.964313413),new clb.Op(22,39.962383123),new clb.Op(23,40.964500828),new clb.Op(24,41.963046386),new clb.Op(25,42.965670701),new clb.Op(26,43.965365269),new clb.Op(27,44.968094979),new clb.Op(28,45.968093467),new clb.Op(29,46.972186238),new clb.Op(30,47.97507),new clb.Op(31,48.98218),new clb.Op(32,49.98594),new clb.Op(33,50.99324),new clb.Op(34,51.99817),new clb.Op(35,53.006227)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(13,32.02192),new clb.Op(14,33.00726),new clb.Op(15,33.99841),new clb.Op(16,34.988011615),new clb.Op(17,35.981293405),new clb.Op(18,36.973376915),new clb.Op(19,37.969080107),new clb.Op(20,38.963706861),new clb.Op(21,39.963998672),new clb.Op(22,40.961825972),new clb.Op(23,41.962403059),new clb.Op(24,42.960715746),new clb.Op(25,43.961556146),new clb.Op(26,44.960699658),new clb.Op(27,45.961976203),new clb.Op(28,46.961677807),new clb.Op(29,47.965512946),new clb.Op(30,48.967450084),new clb.Op(31,49.972782832),new clb.Op(32,50.97638),new clb.Op(33,51.98261),new clb.Op(34,52.98712),new clb.Op(35,53.99399),new clb.Op(36,54.999388)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(14,34.01412),new clb.Op(15,35.004765),new clb.Op(16,35.993087234),new clb.Op(17,36.985871505),new clb.Op(18,37.976318637),new clb.Op(19,38.970717729),new clb.Op(20,39.962591155),new clb.Op(21,40.962278349),new clb.Op(22,41.958618337),new clb.Op(23,42.958766833),new clb.Op(24,43.955481094),new clb.Op(25,44.956185938),new clb.Op(26,45.953692759),new clb.Op(27,46.954546459),new clb.Op(28,47.952533512),new clb.Op(29,48.955673302),new clb.Op(30,49.957518286),new clb.Op(31,50.961474238),new clb.Op(32,51.9651),new clb.Op(33,52.97005),new clb.Op(34,53.97468),new clb.Op(35,54.98055),new clb.Op(36,55.98579),new clb.Op(37,56.992356)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(15,36.01492),new clb.Op(16,37.00305),new clb.Op(17,37.9947),new clb.Op(18,38.984790009),new clb.Op(19,39.977964014),new clb.Op(20,40.969251316),new clb.Op(21,41.965516761),new clb.Op(22,42.96115098),new clb.Op(23,43.959403048),new clb.Op(24,44.955910243),new clb.Op(25,45.95517025),new clb.Op(26,46.952408027),new clb.Op(27,47.952234991),new clb.Op(28,48.950024065),new clb.Op(29,49.952187008),new clb.Op(30,50.9536027),new clb.Op(31,51.95665),new clb.Op(32,52.95817),new clb.Op(33,53.963),new clb.Op(34,54.9694),new clb.Op(35,55.97266),new clb.Op(36,56.97704),new clb.Op(37,57.98307),new clb.Op(38,58.988041)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(16,38.00977),new clb.Op(17,39.001323),new clb.Op(18,39.990498907),new clb.Op(19,40.983131),new clb.Op(20,41.973031622),new clb.Op(21,42.968523342),new clb.Op(22,43.959690235),new clb.Op(23,44.958124349),new clb.Op(24,45.952629491),new clb.Op(25,46.951763792),new clb.Op(26,47.947947053),new clb.Op(27,48.947870789),new clb.Op(28,49.944792069),new clb.Op(29,50.946616017),new clb.Op(30,51.946898175),new clb.Op(31,52.949731709),new clb.Op(32,53.95087),new clb.Op(33,54.95512),new clb.Op(34,55.95799),new clb.Op(35,56.9643),new clb.Op(36,57.96611),new clb.Op(37,58.97196),new clb.Op(38,59.97564),new clb.Op(39,60.982018)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(17,40.01109),new clb.Op(18,40.99974),new clb.Op(19,41.99123),new clb.Op(20,42.98065),new clb.Op(21,43.9744),new clb.Op(22,44.965782286),new clb.Op(23,45.960199491),new clb.Op(24,46.954906918),new clb.Op(25,47.95225448),new clb.Op(26,48.948516914),new clb.Op(27,49.947162792),new clb.Op(28,50.943963675),new clb.Op(29,51.944779658),new clb.Op(30,52.944342517),new clb.Op(31,53.946444381),new clb.Op(32,54.947238194),new clb.Op(33,55.95036),new clb.Op(34,56.95236),new clb.Op(35,57.95665),new clb.Op(36,58.9593),new clb.Op(37,59.9645),new clb.Op(38,60.96741),new clb.Op(39,61.97314),new clb.Op(40,62.97675)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(18,42.00643),new clb.Op(19,42.997707),new clb.Op(20,43.98547),new clb.Op(21,44.97916),new clb.Op(22,45.968361649),new clb.Op(23,46.962906512),new clb.Op(24,47.954035861),new clb.Op(25,48.951341135),new clb.Op(26,49.946049607),new clb.Op(27,50.944771767),new clb.Op(28,51.940511904),new clb.Op(29,52.940653781),new clb.Op(30,53.938884921),new clb.Op(31,54.940844164),new clb.Op(32,55.940645238),new clb.Op(33,56.9437538),new clb.Op(34,57.94425),new clb.Op(35,58.94863),new clb.Op(36,59.94973),new clb.Op(37,60.95409),new clb.Op(38,61.9558),new clb.Op(39,62.96186),new clb.Op(40,63.9642),new clb.Op(41,64.97037)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(19,44.00687),new clb.Op(20,44.99451),new clb.Op(21,45.98672),new clb.Op(22,46.9761),new clb.Op(23,47.96887),new clb.Op(24,48.959623415),new clb.Op(25,49.95424396),new clb.Op(26,50.948215487),new clb.Op(27,51.945570079),new clb.Op(28,52.941294702),new clb.Op(29,53.940363247),new clb.Op(30,54.938049636),new clb.Op(31,55.938909366),new clb.Op(32,56.938287458),new clb.Op(33,57.939986451),new clb.Op(34,58.940447166),new clb.Op(35,59.943193998),new clb.Op(36,60.94446),new clb.Op(37,61.94797),new clb.Op(38,62.94981),new clb.Op(39,63.95373),new clb.Op(40,64.9561),new clb.Op(41,65.96082),new clb.Op(42,66.96382)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(19,45.01456),new clb.Op(20,46.00081),new clb.Op(21,46.99289),new clb.Op(22,47.98056),new clb.Op(23,48.97361),new clb.Op(24,49.962993316),new clb.Op(25,50.956824936),new clb.Op(26,51.948116526),new clb.Op(27,52.945312282),new clb.Op(28,53.939614836),new clb.Op(29,54.938298029),new clb.Op(30,55.934942133),new clb.Op(31,56.935398707),new clb.Op(32,57.933280458),new clb.Op(33,58.934880493),new clb.Op(34,59.934076943),new clb.Op(35,60.936749461),new clb.Op(36,61.936770495),new clb.Op(37,62.940118442),new clb.Op(38,63.94087),new clb.Op(39,64.94494),new clb.Op(40,65.94598),new clb.Op(41,66.95),new clb.Op(42,67.95251),new clb.Op(43,68.9577)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(21,48.00176),new clb.Op(22,48.98972),new clb.Op(23,49.98154),new clb.Op(24,50.97072),new clb.Op(25,51.96359),new clb.Op(26,52.954224985),new clb.Op(27,53.948464147),new clb.Op(28,54.942003149),new clb.Op(29,55.939843937),new clb.Op(30,56.936296235),new clb.Op(31,57.935757571),new clb.Op(32,58.933200194),new clb.Op(33,59.933822196),new clb.Op(34,60.932479381),new clb.Op(35,61.934054212),new clb.Op(36,62.933615218),new clb.Op(37,63.935813523),new clb.Op(38,64.936484581),new clb.Op(39,65.939825412),new clb.Op(40,66.94061),new clb.Op(41,67.94436),new clb.Op(42,68.9452),new clb.Op(43,69.94981),new clb.Op(44,70.95173),new clb.Op(45,71.95641)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(22,49.99593),new clb.Op(23,50.98772),new clb.Op(24,51.97568),new clb.Op(25,52.96846),new clb.Op(26,53.957910508),new clb.Op(27,54.951336329),new clb.Op(28,55.942136339),new clb.Op(29,56.939800489),new clb.Op(30,57.935347922),new clb.Op(31,58.934351553),new clb.Op(32,59.930790633),new clb.Op(33,60.931060442),new clb.Op(34,61.928348763),new clb.Op(35,62.929672948),new clb.Op(36,63.927969574),new clb.Op(37,64.930088013),new clb.Op(38,65.929115232),new clb.Op(39,66.931569638),new clb.Op(40,67.931844932),new clb.Op(41,68.935181837),new clb.Op(42,69.93614),new clb.Op(43,70.94),new clb.Op(44,71.9413),new clb.Op(45,72.94608),new clb.Op(46,73.94791),new clb.Op(47,74.95297),new clb.Op(48,75.95533),new clb.Op(49,76.96083),new clb.Op(50,77.9638)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(23,51.99718),new clb.Op(24,52.98555),new clb.Op(25,53.97671),new clb.Op(26,54.96605),new clb.Op(27,55.95856),new clb.Op(28,56.949215695),new clb.Op(29,57.944540734),new clb.Op(30,58.939504114),new clb.Op(31,59.937368123),new clb.Op(32,60.933462181),new clb.Op(33,61.932587299),new clb.Op(34,62.929601079),new clb.Op(35,63.929767865),new clb.Op(36,64.927793707),new clb.Op(37,65.928873041),new clb.Op(38,66.927750294),new clb.Op(39,67.929637875),new clb.Op(40,68.929425281),new clb.Op(41,69.932409287),new clb.Op(42,70.932619818),new clb.Op(43,71.93552),new clb.Op(44,72.93649),new clb.Op(45,73.9402),new clb.Op(46,74.9417),new clb.Op(47,75.94599),new clb.Op(48,76.94795),new clb.Op(49,77.95281),new clb.Op(50,78.95528),new clb.Op(51,79.96189)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(24,53.99295),new clb.Op(25,54.98398),new clb.Op(26,55.97238),new clb.Op(27,56.96491),new clb.Op(28,57.954596465),new clb.Op(29,58.949267074),new clb.Op(30,59.941832031),new clb.Op(31,60.939513907),new clb.Op(32,61.934334132),new clb.Op(33,62.933215563),new clb.Op(34,63.929146578),new clb.Op(35,64.929245079),new clb.Op(36,65.926036763),new clb.Op(37,66.927130859),new clb.Op(38,67.924847566),new clb.Op(39,68.926553538),new clb.Op(40,69.92532487),new clb.Op(41,70.927727195),new clb.Op(42,71.926861122),new clb.Op(43,72.929779469),new clb.Op(44,73.929458261),new clb.Op(45,74.932937379),new clb.Op(46,75.933394207),new clb.Op(47,76.937085857),new clb.Op(48,77.938569576),new clb.Op(49,78.942095175),new clb.Op(50,79.944414722),new clb.Op(51,80.95048),new clb.Op(52,81.95484)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(25,55.99491),new clb.Op(26,56.98293),new clb.Op(27,57.97425),new clb.Op(28,58.96337),new clb.Op(29,59.95706),new clb.Op(30,60.94917),new clb.Op(31,61.944179608),new clb.Op(32,62.939141527),new clb.Op(33,63.936838307),new clb.Op(34,64.932739322),new clb.Op(35,65.931592355),new clb.Op(36,66.928204915),new clb.Op(37,67.927983497),new clb.Op(38,68.925580912),new clb.Op(39,69.926027741),new clb.Op(40,70.92470501),new clb.Op(41,71.92636935),new clb.Op(42,72.925169832),new clb.Op(43,73.926940999),new clb.Op(44,74.926500645),new clb.Op(45,75.928928262),new clb.Op(46,76.929281189),new clb.Op(47,77.93165595),new clb.Op(48,78.932916371),new clb.Op(49,79.936588154),new clb.Op(50,80.937752955),new clb.Op(51,81.94316),new clb.Op(52,82.94687),new clb.Op(53,83.95234)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(26,57.99101),new clb.Op(27,58.98175),new clb.Op(28,59.97019),new clb.Op(29,60.96379),new clb.Op(30,61.95465),new clb.Op(31,62.94964),new clb.Op(32,63.941572638),new clb.Op(33,64.939440762),new clb.Op(34,65.933846798),new clb.Op(35,66.932738415),new clb.Op(36,67.928097266),new clb.Op(37,68.927972002),new clb.Op(38,69.924250365),new clb.Op(39,70.924953991),new clb.Op(40,71.922076184),new clb.Op(41,72.923459361),new clb.Op(42,73.921178213),new clb.Op(43,74.922859494),new clb.Op(44,75.921402716),new clb.Op(45,76.923548462),new clb.Op(46,77.922852886),new clb.Op(47,78.92540156),new clb.Op(48,79.925444764),new clb.Op(49,80.928821065),new clb.Op(50,81.929550326),new clb.Op(51,82.93451),new clb.Op(52,83.93731),new clb.Op(53,84.94269),new clb.Op(54,85.94627)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(27,59.99313),new clb.Op(28,60.98062),new clb.Op(29,61.9732),new clb.Op(30,62.96369),new clb.Op(31,63.957572),new clb.Op(32,64.949484),new clb.Op(33,65.944099147),new clb.Op(34,66.939190417),new clb.Op(35,67.936792976),new clb.Op(36,68.932280154),new clb.Op(37,69.930927811),new clb.Op(38,70.927114724),new clb.Op(39,71.926752647),new clb.Op(40,72.923825288),new clb.Op(41,73.923929076),new clb.Op(42,74.921596417),new clb.Op(43,75.922393933),new clb.Op(44,76.920647703),new clb.Op(45,77.921828577),new clb.Op(46,78.920948498),new clb.Op(47,79.922578162),new clb.Op(48,80.922132884),new clb.Op(49,81.924504668),new clb.Op(50,82.924980625),new clb.Op(51,83.92906),new clb.Op(52,84.93181),new clb.Op(53,85.93623),new clb.Op(54,86.93958),new clb.Op(55,87.94456),new clb.Op(56,88.94923)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(31,64.96466),new clb.Op(32,65.95521),new clb.Op(33,66.95009),new clb.Op(34,67.94187),new clb.Op(35,68.939562155),new clb.Op(36,69.933504),new clb.Op(37,70.931868378),new clb.Op(38,71.927112313),new clb.Op(39,72.9267668),new clb.Op(40,73.922476561),new clb.Op(41,74.922523571),new clb.Op(42,75.919214107),new clb.Op(43,76.91991461),new clb.Op(44,77.917309522),new clb.Op(45,78.918499802),new clb.Op(46,79.916521828),new clb.Op(47,80.917992931),new clb.Op(48,81.9167),new clb.Op(49,82.919119072),new clb.Op(50,83.918464523),new clb.Op(51,84.922244678),new clb.Op(52,85.924271165),new clb.Op(53,86.928520749),new clb.Op(54,87.931423982),new clb.Op(55,88.93602),new clb.Op(56,89.93942),new clb.Op(57,90.94537),new clb.Op(58,91.94933)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(32,66.96479),new clb.Op(33,67.958248),new clb.Op(34,68.950178),new clb.Op(35,69.944208),new clb.Op(36,70.939246),new clb.Op(37,71.936496876),new clb.Op(38,72.931794889),new clb.Op(39,73.929891152),new clb.Op(40,74.92577641),new clb.Op(41,75.924541974),new clb.Op(42,76.921380123),new clb.Op(43,77.92114613),new clb.Op(44,78.918337647),new clb.Op(45,79.918529952),new clb.Op(46,80.91629106),new clb.Op(47,81.916804666),new clb.Op(48,82.915180219),new clb.Op(49,83.916503685),new clb.Op(50,84.915608027),new clb.Op(51,85.918797162),new clb.Op(52,86.920710713),new clb.Op(53,87.924065908),new clb.Op(54,88.92638726),new clb.Op(55,89.930634988),new clb.Op(56,90.9339653),new clb.Op(57,91.939255258),new clb.Op(58,92.9431),new clb.Op(59,93.94868)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(33,68.96532),new clb.Op(34,69.95601),new clb.Op(35,70.95051),new clb.Op(36,71.94190754),new clb.Op(37,72.938931115),new clb.Op(38,73.933258225),new clb.Op(39,74.931033794),new clb.Op(40,75.925948304),new clb.Op(41,76.92466788),new clb.Op(42,77.920386271),new clb.Op(43,78.920082992),new clb.Op(44,79.91637804),new clb.Op(45,80.916592419),new clb.Op(46,81.913484601),new clb.Op(47,82.914135952),new clb.Op(48,83.911506627),new clb.Op(49,84.912526954),new clb.Op(50,85.910610313),new clb.Op(51,86.913354251),new clb.Op(52,87.914446951),new clb.Op(53,88.917632505),new clb.Op(54,89.919523803),new clb.Op(55,90.923442418),new clb.Op(56,91.926152752),new clb.Op(57,92.931265246),new clb.Op(58,93.934362),new clb.Op(59,94.93984),new clb.Op(60,95.94307),new clb.Op(61,96.94856)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(34,70.96532),new clb.Op(35,71.95908),new clb.Op(36,72.950366),new clb.Op(37,73.944470376),new clb.Op(38,74.938569199),new clb.Op(39,75.935071448),new clb.Op(40,76.930406599),new clb.Op(41,77.928141485),new clb.Op(42,78.923996719),new clb.Op(43,79.922519322),new clb.Op(44,80.918994165),new clb.Op(45,81.918207691),new clb.Op(46,82.915111951),new clb.Op(47,83.914384676),new clb.Op(48,84.911789341),new clb.Op(49,85.91116708),new clb.Op(50,86.909183465),new clb.Op(51,87.911318556),new clb.Op(52,88.912279939),new clb.Op(53,89.914808941),new clb.Op(54,90.91653416),new clb.Op(55,91.919725442),new clb.Op(56,92.922032765),new clb.Op(57,93.926407326),new clb.Op(58,94.92931926),new clb.Op(59,95.934283962),new clb.Op(60,96.937342863),new clb.Op(61,97.941703557),new clb.Op(62,98.945420616),new clb.Op(63,99.94987),new clb.Op(64,100.953195994),new clb.Op(65,101.95921)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(35,72.96597),new clb.Op(36,73.95631),new clb.Op(37,74.94992),new clb.Op(38,75.94161),new clb.Op(39,76.937761511),new clb.Op(40,77.932179362),new clb.Op(41,78.929707076),new clb.Op(42,79.924524588),new clb.Op(43,80.923213095),new clb.Op(44,81.918401258),new clb.Op(45,82.917555029),new clb.Op(46,83.913424778),new clb.Op(47,84.912932689),new clb.Op(48,85.909262351),new clb.Op(49,86.908879316),new clb.Op(50,87.905614339),new clb.Op(51,88.907452906),new clb.Op(52,89.907737596),new clb.Op(53,90.910209845),new clb.Op(54,91.911029895),new clb.Op(55,92.91402241),new clb.Op(56,93.915359856),new clb.Op(57,94.919358213),new clb.Op(58,95.921680473),new clb.Op(59,96.926148757),new clb.Op(60,97.928471177),new clb.Op(61,98.933315038),new clb.Op(62,99.935351729),new clb.Op(63,100.940517434),new clb.Op(64,101.943018795),new clb.Op(65,102.94895),new clb.Op(66,103.95233)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(38,76.94962),new clb.Op(39,77.9435),new clb.Op(40,78.937350712),new clb.Op(41,79.931982402),new clb.Op(42,80.929128719),new clb.Op(43,81.926792071),new clb.Op(44,82.922352572),new clb.Op(45,83.920387768),new clb.Op(46,84.916427076),new clb.Op(47,85.914887724),new clb.Op(48,86.910877833),new clb.Op(49,87.909503361),new clb.Op(50,88.905847902),new clb.Op(51,89.907151443),new clb.Op(52,90.907303415),new clb.Op(53,91.908946832),new clb.Op(54,92.909581582),new clb.Op(55,93.911594008),new clb.Op(56,94.912823709),new clb.Op(57,95.915897787),new clb.Op(58,96.918131017),new clb.Op(59,97.922219525),new clb.Op(60,98.924634736),new clb.Op(61,99.927756402),new clb.Op(62,100.930313395),new clb.Op(63,101.933555501),new clb.Op(64,102.93694),new clb.Op(65,103.94145),new clb.Op(66,104.94509),new clb.Op(67,105.95022)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(39,78.94916),new clb.Op(40,79.94055),new clb.Op(41,80.936815296),new clb.Op(42,81.931086249),new clb.Op(43,82.92865213),new clb.Op(44,83.92325),new clb.Op(45,84.92146522),new clb.Op(46,85.916472851),new clb.Op(47,86.914816578),new clb.Op(48,87.910226179),new clb.Op(49,88.908888916),new clb.Op(50,89.904703679),new clb.Op(51,90.905644968),new clb.Op(52,91.905040106),new clb.Op(53,92.906475627),new clb.Op(54,93.906315765),new clb.Op(55,94.908042739),new clb.Op(56,95.908275675),new clb.Op(57,96.910950716),new clb.Op(58,97.912746366),new clb.Op(59,98.916511084),new clb.Op(60,99.917761704),new clb.Op(61,100.921139958),new clb.Op(62,101.922981089),new clb.Op(63,102.926597062),new clb.Op(64,103.92878),new clb.Op(65,104.93305),new clb.Op(66,105.93591),new clb.Op(67,106.94086),new clb.Op(68,107.94428)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(40,80.94905),new clb.Op(41,81.94313),new clb.Op(42,82.936703713),new clb.Op(43,83.93357),new clb.Op(44,84.927906486),new clb.Op(45,85.925037588),new clb.Op(46,86.920361435),new clb.Op(47,87.91833144),new clb.Op(48,88.913495503),new clb.Op(49,89.911264109),new clb.Op(50,90.906990538),new clb.Op(51,91.907193214),new clb.Op(52,92.906377543),new clb.Op(53,93.907283457),new clb.Op(54,94.906835178),new clb.Op(55,95.908100076),new clb.Op(56,96.908097144),new clb.Op(57,97.91033069),new clb.Op(58,98.911617864),new clb.Op(59,99.914181434),new clb.Op(60,100.915251567),new clb.Op(61,101.918037417),new clb.Op(62,102.919141297),new clb.Op(63,103.922459464),new clb.Op(64,104.923934023),new clb.Op(65,105.92819),new clb.Op(66,106.93031),new clb.Op(67,107.93501),new clb.Op(68,108.93763),new clb.Op(69,109.94268)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(41,82.94874),new clb.Op(42,83.94009),new clb.Op(43,84.93659),new clb.Op(44,85.930695167),new clb.Op(45,86.92732683),new clb.Op(46,87.921952728),new clb.Op(47,88.919480562),new clb.Op(48,89.913936161),new clb.Op(49,90.911750754),new clb.Op(50,91.90681048),new clb.Op(51,92.906812213),new clb.Op(52,93.905087578),new clb.Op(53,94.905841487),new clb.Op(54,95.904678904),new clb.Op(55,96.906021033),new clb.Op(56,97.905407846),new clb.Op(57,98.907711598),new clb.Op(58,99.907477149),new clb.Op(59,100.910346543),new clb.Op(60,101.910297162),new clb.Op(61,102.913204596),new clb.Op(62,103.913758387),new clb.Op(63,104.916972087),new clb.Op(64,105.918134284),new clb.Op(65,106.921694724),new clb.Op(66,107.923973837),new clb.Op(67,108.92781),new clb.Op(68,109.92973),new clb.Op(69,110.93451),new clb.Op(70,111.93684),new clb.Op(71,112.94203)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(42,84.94894),new clb.Op(43,85.94288),new clb.Op(44,86.93653),new clb.Op(45,87.93283),new clb.Op(46,88.92754288),new clb.Op(47,89.92355583),new clb.Op(48,90.9184282),new clb.Op(49,91.915259655),new clb.Op(50,92.910248473),new clb.Op(51,93.909656309),new clb.Op(52,94.907656454),new clb.Op(53,95.907870803),new clb.Op(54,96.906364843),new clb.Op(55,97.907215692),new clb.Op(56,98.906254554),new clb.Op(57,99.907657594),new clb.Op(58,100.90731438),new clb.Op(59,101.909212938),new clb.Op(60,102.909178805),new clb.Op(61,103.911444898),new clb.Op(62,104.911658043),new clb.Op(63,105.914355408),new clb.Op(64,106.915081691),new clb.Op(65,107.918479973),new clb.Op(66,108.919980998),new clb.Op(67,109.92339),new clb.Op(68,110.92505),new clb.Op(69,111.92924),new clb.Op(70,112.93133),new clb.Op(71,113.93588),new clb.Op(72,114.93828)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(43,86.94918),new clb.Op(44,87.94042),new clb.Op(45,88.93611),new clb.Op(46,89.92978),new clb.Op(47,90.926377434),new clb.Op(48,91.92012),new clb.Op(49,92.917051523),new clb.Op(50,93.911359569),new clb.Op(51,94.910412729),new clb.Op(52,95.907597681),new clb.Op(53,96.907554546),new clb.Op(54,97.905287111),new clb.Op(55,98.905939307),new clb.Op(56,99.904219664),new clb.Op(57,100.905582219),new clb.Op(58,101.904349503),new clb.Op(59,102.906323677),new clb.Op(60,103.905430145),new clb.Op(61,104.907750341),new clb.Op(62,105.907326913),new clb.Op(63,106.909907207),new clb.Op(64,107.910192211),new clb.Op(65,108.913201565),new clb.Op(66,109.913966185),new clb.Op(67,110.91756),new clb.Op(68,111.918821673),new clb.Op(69,112.92254),new clb.Op(70,113.923891981),new clb.Op(71,114.92831),new clb.Op(72,115.93016),new clb.Op(73,116.93479),new clb.Op(74,117.93703)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(44,88.94938),new clb.Op(45,89.94287),new clb.Op(46,90.93655),new clb.Op(47,91.93198),new clb.Op(48,92.92574),new clb.Op(49,93.921698),new clb.Op(50,94.915898541),new clb.Op(51,95.914518212),new clb.Op(52,96.911336643),new clb.Op(53,97.910716431),new clb.Op(54,98.908132101),new clb.Op(55,99.90811663),new clb.Op(56,100.906163526),new clb.Op(57,101.906842845),new clb.Op(58,102.905504182),new clb.Op(59,103.906655315),new clb.Op(60,104.905692444),new clb.Op(61,105.907284615),new clb.Op(62,106.90675054),new clb.Op(63,107.908730768),new clb.Op(64,108.908735621),new clb.Op(65,109.910949525),new clb.Op(66,110.91166),new clb.Op(67,111.913969253),new clb.Op(68,112.91542),new clb.Op(69,113.91734336),new clb.Op(70,114.920124676),new clb.Op(71,115.922746643),new clb.Op(72,116.92535),new clb.Op(73,117.92943),new clb.Op(74,118.93136),new clb.Op(75,119.93578),new clb.Op(76,120.93808)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(45,90.94948),new clb.Op(46,91.94042),new clb.Op(47,92.93591),new clb.Op(48,93.92877),new clb.Op(49,94.92469),new clb.Op(50,95.91822194),new clb.Op(51,96.916478921),new clb.Op(52,97.912720751),new clb.Op(53,98.911767757),new clb.Op(54,99.908504596),new clb.Op(55,100.908289144),new clb.Op(56,101.905607716),new clb.Op(57,102.906087204),new clb.Op(58,103.904034912),new clb.Op(59,104.905084046),new clb.Op(60,105.903483087),new clb.Op(61,106.905128453),new clb.Op(62,107.903894451),new clb.Op(63,108.905953535),new clb.Op(64,109.905152385),new clb.Op(65,110.907643952),new clb.Op(66,111.907313277),new clb.Op(67,112.910151346),new clb.Op(68,113.910365322),new clb.Op(69,114.91368341),new clb.Op(70,115.914158288),new clb.Op(71,116.91784),new clb.Op(72,117.918983915),new clb.Op(73,118.92268),new clb.Op(74,119.92403),new clb.Op(75,120.92818),new clb.Op(76,121.9298),new clb.Op(77,122.93426)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(47,93.94278),new clb.Op(48,94.93548),new clb.Op(49,95.93068),new clb.Op(50,96.924),new clb.Op(51,97.921759995),new clb.Op(52,98.917597103),new clb.Op(53,99.916069387),new clb.Op(54,100.912802135),new clb.Op(55,101.911999996),new clb.Op(56,102.908972453),new clb.Op(57,103.908628228),new clb.Op(58,104.906528234),new clb.Op(59,105.906666431),new clb.Op(60,106.90509302),new clb.Op(61,107.905953705),new clb.Op(62,108.904755514),new clb.Op(63,109.90611046),new clb.Op(64,110.905294679),new clb.Op(65,111.907004132),new clb.Op(66,112.906565708),new clb.Op(67,113.908807907),new clb.Op(68,114.908762282),new clb.Op(69,115.911359558),new clb.Op(70,116.911684187),new clb.Op(71,117.914582383),new clb.Op(72,118.915666045),new clb.Op(73,119.918788609),new clb.Op(74,120.919851074),new clb.Op(75,121.92332),new clb.Op(76,122.9249),new clb.Op(77,123.92853),new clb.Op(78,124.93054),new clb.Op(79,125.9345),new clb.Op(80,126.93688)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(48,95.93977),new clb.Op(49,96.93494),new clb.Op(50,97.927579),new clb.Op(51,98.92501),new clb.Op(52,99.920230232),new clb.Op(53,100.918681442),new clb.Op(54,101.914777255),new clb.Op(55,102.913418952),new clb.Op(56,103.909848091),new clb.Op(57,104.909467818),new clb.Op(58,105.906458007),new clb.Op(59,106.906614232),new clb.Op(60,107.904183403),new clb.Op(61,108.904985569),new clb.Op(62,109.903005578),new clb.Op(63,110.904181628),new clb.Op(64,111.902757226),new clb.Op(65,112.904400947),new clb.Op(66,113.903358121),new clb.Op(67,114.905430553),new clb.Op(68,115.904755434),new clb.Op(69,116.907218242),new clb.Op(70,117.906914144),new clb.Op(71,118.909922582),new clb.Op(72,119.909851352),new clb.Op(73,120.91298039),new clb.Op(74,121.9135),new clb.Op(75,122.917003675),new clb.Op(76,123.917648302),new clb.Op(77,124.92124717),new clb.Op(78,125.922353996),new clb.Op(79,126.926434822),new clb.Op(80,127.927760617),new clb.Op(81,128.93226),new clb.Op(82,129.93398)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(49,97.94224),new clb.Op(50,98.93461),new clb.Op(51,99.931149033),new clb.Op(52,100.92656),new clb.Op(53,101.924707541),new clb.Op(54,102.919913896),new clb.Op(55,103.918338416),new clb.Op(56,104.914673434),new clb.Op(57,105.913461134),new clb.Op(58,106.910292195),new clb.Op(59,107.909719683),new clb.Op(60,108.907154078),new clb.Op(61,109.907168783),new clb.Op(62,110.905110677),new clb.Op(63,111.905533338),new clb.Op(64,112.904061223),new clb.Op(65,113.904916758),new clb.Op(66,114.903878328),new clb.Op(67,115.905259995),new clb.Op(68,116.904515731),new clb.Op(69,117.906354623),new clb.Op(70,118.905846334),new clb.Op(71,119.907961505),new clb.Op(72,120.907848847),new clb.Op(73,121.910277103),new clb.Op(74,122.910438951),new clb.Op(75,123.913175916),new clb.Op(76,124.913601387),new clb.Op(77,125.916464532),new clb.Op(78,126.917344048),new clb.Op(79,127.920170658),new clb.Op(80,128.921657958),new clb.Op(81,129.924854941),new clb.Op(82,130.926767408),new clb.Op(83,131.932919005),new clb.Op(84,132.93834),new clb.Op(85,133.94466)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(50,99.938954),new clb.Op(51,100.93606),new clb.Op(52,101.93049),new clb.Op(53,102.92813),new clb.Op(54,103.923185469),new clb.Op(55,104.921390409),new clb.Op(56,105.916880472),new clb.Op(57,106.915666702),new clb.Op(58,107.911965339),new clb.Op(59,108.911286879),new clb.Op(60,109.907852688),new clb.Op(61,110.907735404),new clb.Op(62,111.90482081),new clb.Op(63,112.905173373),new clb.Op(64,113.902781816),new clb.Op(65,114.903345973),new clb.Op(66,115.901744149),new clb.Op(67,116.902953765),new clb.Op(68,117.901606328),new clb.Op(69,118.90330888),new clb.Op(70,119.902196571),new clb.Op(71,120.904236867),new clb.Op(72,121.903440138),new clb.Op(73,122.905721901),new clb.Op(74,123.90527463),new clb.Op(75,124.907784924),new clb.Op(76,125.907653953),new clb.Op(77,126.91035098),new clb.Op(78,127.910534953),new clb.Op(79,128.913439976),new clb.Op(80,129.913852185),new clb.Op(81,130.916919144),new clb.Op(82,131.917744455),new clb.Op(83,132.923814085),new clb.Op(84,133.928463576),new clb.Op(85,134.93473),new clb.Op(86,135.93934),new clb.Op(87,136.94579)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(52,102.94012),new clb.Op(53,103.936287),new clb.Op(54,104.931528593),new clb.Op(55,105.928183134),new clb.Op(56,106.92415),new clb.Op(57,107.92216),new clb.Op(58,108.918136092),new clb.Op(59,109.917533911),new clb.Op(60,110.912534147),new clb.Op(61,111.91239464),new clb.Op(62,112.909377941),new clb.Op(63,113.909095876),new clb.Op(64,114.906598812),new clb.Op(65,115.906797235),new clb.Op(66,116.90483959),new clb.Op(67,117.905531885),new clb.Op(68,118.90394646),new clb.Op(69,119.905074315),new clb.Op(70,120.903818044),new clb.Op(71,121.905175415),new clb.Op(72,122.904215696),new clb.Op(73,123.905937525),new clb.Op(74,124.905247804),new clb.Op(75,125.907248153),new clb.Op(76,126.906914564),new clb.Op(77,127.90916733),new clb.Op(78,128.909150092),new clb.Op(79,129.911546459),new clb.Op(80,130.911946487),new clb.Op(81,131.914413247),new clb.Op(82,132.915236466),new clb.Op(83,133.920551554),new clb.Op(84,134.925167962),new clb.Op(85,135.93066),new clb.Op(86,136.93531),new clb.Op(87,137.94096),new clb.Op(88,138.94571)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(54,105.937702),new clb.Op(55,106.935036),new clb.Op(56,107.929486838),new clb.Op(57,108.927456483),new clb.Op(58,109.922407164),new clb.Op(59,110.921120589),new clb.Op(60,111.917061617),new clb.Op(61,112.915452551),new clb.Op(62,113.912498025),new clb.Op(63,114.911578627),new clb.Op(64,115.908420253),new clb.Op(65,116.90863418),new clb.Op(66,117.905825187),new clb.Op(67,118.90640811),new clb.Op(68,119.904019891),new clb.Op(69,120.904929815),new clb.Op(70,121.903047064),new clb.Op(71,122.904272951),new clb.Op(72,123.902819466),new clb.Op(73,124.904424718),new clb.Op(74,125.903305543),new clb.Op(75,126.90521729),new clb.Op(76,127.904461383),new clb.Op(77,128.906595593),new clb.Op(78,129.906222753),new clb.Op(79,130.90852188),new clb.Op(80,131.908523782),new clb.Op(81,132.910939068),new clb.Op(82,133.911540546),new clb.Op(83,134.916450782),new clb.Op(84,135.920103155),new clb.Op(85,136.925324769),new clb.Op(86,137.92922),new clb.Op(87,138.93473),new clb.Op(88,139.9387),new clb.Op(89,140.94439),new clb.Op(90,141.9485)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(55,107.943291),new clb.Op(56,108.938191658),new clb.Op(57,109.934634181),new clb.Op(58,110.930276),new clb.Op(59,111.92797),new clb.Op(60,112.923644245),new clb.Op(61,113.92185),new clb.Op(62,114.918272),new clb.Op(63,115.916735014),new clb.Op(64,116.913647692),new clb.Op(65,117.91337523),new clb.Op(66,118.910180837),new clb.Op(67,119.910047843),new clb.Op(68,120.907366063),new clb.Op(69,121.907592451),new clb.Op(70,122.905597944),new clb.Op(71,123.906211423),new clb.Op(72,124.90462415),new clb.Op(73,125.905619387),new clb.Op(74,126.90446842),new clb.Op(75,127.905805254),new clb.Op(76,128.904987487),new clb.Op(77,129.906674018),new clb.Op(78,130.906124168),new clb.Op(79,131.907994525),new clb.Op(80,132.907806465),new clb.Op(81,133.909876552),new clb.Op(82,134.91005031),new clb.Op(83,135.914655105),new clb.Op(84,136.917872653),new clb.Op(85,137.922383666),new clb.Op(86,138.926093402),new clb.Op(87,139.93121),new clb.Op(88,140.93483),new clb.Op(89,141.94018),new clb.Op(90,142.94407),new clb.Op(91,143.94961)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(56,109.944476),new clb.Op(57,110.941632),new clb.Op(58,111.93566535),new clb.Op(59,112.933382836),new clb.Op(60,113.928145),new clb.Op(61,114.926979032),new clb.Op(62,115.921394197),new clb.Op(63,116.920564355),new clb.Op(64,117.91657092),new clb.Op(65,118.915554295),new clb.Op(66,119.91215199),new clb.Op(67,120.911386497),new clb.Op(68,121.908548396),new clb.Op(69,122.908470748),new clb.Op(70,123.905895774),new clb.Op(71,124.906398236),new clb.Op(72,125.904268868),new clb.Op(73,126.905179581),new clb.Op(74,127.903530436),new clb.Op(75,128.904779458),new clb.Op(76,129.903507903),new clb.Op(77,130.90508192),new clb.Op(78,131.904154457),new clb.Op(79,132.90590566),new clb.Op(80,133.905394504),new clb.Op(81,134.907207499),new clb.Op(82,135.907219526),new clb.Op(83,136.911562939),new clb.Op(84,137.913988549),new clb.Op(85,138.918786859),new clb.Op(86,139.921635665),new clb.Op(87,140.926646282),new clb.Op(88,141.929702981),new clb.Op(89,142.93489),new clb.Op(90,143.93823),new clb.Op(91,144.94367),new clb.Op(92,145.9473),new clb.Op(93,146.95301)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(57,111.950331),new clb.Op(58,112.944535512),new clb.Op(59,113.940841319),new clb.Op(60,114.935939),new clb.Op(61,115.932914152),new clb.Op(62,116.928639484),new clb.Op(63,117.926554883),new clb.Op(64,118.922370879),new clb.Op(65,119.920678219),new clb.Op(66,120.917183637),new clb.Op(67,121.916121946),new clb.Op(68,122.912990168),new clb.Op(69,123.912245731),new clb.Op(70,124.909724871),new clb.Op(71,125.909447953),new clb.Op(72,126.9074176),new clb.Op(73,127.907747919),new clb.Op(74,128.906063369),new clb.Op(75,129.906706163),new clb.Op(76,130.905460232),new clb.Op(77,131.906429799),new clb.Op(78,132.90544687),new clb.Op(79,133.906713419),new clb.Op(80,134.905971903),new clb.Op(81,135.907305741),new clb.Op(82,136.907083505),new clb.Op(83,137.911010537),new clb.Op(84,138.913357921),new clb.Op(85,139.917277075),new clb.Op(86,140.920043984),new clb.Op(87,141.924292317),new clb.Op(88,142.927330292),new clb.Op(89,143.932027373),new clb.Op(90,144.935388226),new clb.Op(91,145.940162028),new clb.Op(92,146.943864435),new clb.Op(93,147.948899539),new clb.Op(94,148.95272),new clb.Op(95,149.95797),new clb.Op(96,150.962)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(58,113.950941),new clb.Op(59,114.94771),new clb.Op(60,115.94168),new clb.Op(61,116.937700229),new clb.Op(62,117.93344),new clb.Op(63,118.931051927),new clb.Op(64,119.926045941),new clb.Op(65,120.924485908),new clb.Op(66,121.92026),new clb.Op(67,122.91885),new clb.Op(68,123.915088437),new clb.Op(69,124.914620234),new clb.Op(70,125.911244146),new clb.Op(71,126.911121328),new clb.Op(72,127.90830887),new clb.Op(73,128.908673749),new clb.Op(74,129.906310478),new clb.Op(75,130.906930798),new clb.Op(76,131.905056152),new clb.Op(77,132.906002368),new clb.Op(78,133.904503347),new clb.Op(79,134.905682749),new clb.Op(80,135.904570109),new clb.Op(81,136.905821414),new clb.Op(82,137.905241273),new clb.Op(83,138.908835384),new clb.Op(84,139.910599485),new clb.Op(85,140.914406439),new clb.Op(86,141.916448175),new clb.Op(87,142.920617184),new clb.Op(88,143.922940468),new clb.Op(89,144.926923807),new clb.Op(90,145.930106645),new clb.Op(91,146.933992519),new clb.Op(92,147.937682377),new clb.Op(93,148.94246),new clb.Op(94,149.94562),new clb.Op(95,150.9507),new clb.Op(96,151.95416),new clb.Op(97,152.95961)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(60,116.95001),new clb.Op(61,117.94657),new clb.Op(62,118.94099),new clb.Op(63,119.93807),new clb.Op(64,120.93301),new clb.Op(65,121.93071),new clb.Op(66,122.92624),new clb.Op(67,123.92453),new clb.Op(68,124.92067),new clb.Op(69,125.91937),new clb.Op(70,126.91616),new clb.Op(71,127.91544794),new clb.Op(72,128.912667334),new clb.Op(73,129.91232),new clb.Op(74,130.910108489),new clb.Op(75,131.910110399),new clb.Op(76,132.908396372),new clb.Op(77,133.908489607),new clb.Op(78,134.906971003),new clb.Op(79,135.907651181),new clb.Op(80,136.906465656),new clb.Op(81,137.907106826),new clb.Op(82,138.90634816),new clb.Op(83,139.909472552),new clb.Op(84,140.910957016),new clb.Op(85,141.914074489),new clb.Op(86,142.916058646),new clb.Op(87,143.919591666),new clb.Op(88,144.92163837),new clb.Op(89,145.925700146),new clb.Op(90,146.927819639),new clb.Op(91,147.932191197),new clb.Op(92,148.93437),new clb.Op(93,149.93857),new clb.Op(94,150.94156),new clb.Op(95,151.94611),new clb.Op(96,152.94945),new clb.Op(97,153.9544),new clb.Op(98,154.95813)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(61,118.95276),new clb.Op(62,119.94664),new clb.Op(63,120.94367),new clb.Op(64,121.93801),new clb.Op(65,122.93551),new clb.Op(66,123.93052),new clb.Op(67,124.92854),new clb.Op(68,125.9241),new clb.Op(69,126.92275),new clb.Op(70,127.91887),new clb.Op(71,128.918679183),new clb.Op(72,129.914339361),new clb.Op(73,130.914424137),new clb.Op(74,131.91149),new clb.Op(75,132.91155),new clb.Op(76,133.909026379),new clb.Op(77,134.909145555),new clb.Op(78,135.907143574),new clb.Op(79,136.907777634),new clb.Op(80,137.905985574),new clb.Op(81,138.906646605),new clb.Op(82,139.905434035),new clb.Op(83,140.908271103),new clb.Op(84,141.909239733),new clb.Op(85,142.912381158),new clb.Op(86,143.913642686),new clb.Op(87,144.917227871),new clb.Op(88,145.918689722),new clb.Op(89,146.922510962),new clb.Op(90,147.924394738),new clb.Op(91,148.928289207),new clb.Op(92,149.930226399),new clb.Op(93,150.93404),new clb.Op(94,151.93638),new clb.Op(95,152.94058),new clb.Op(96,153.94332),new clb.Op(97,154.94804),new clb.Op(98,155.95126),new clb.Op(99,156.95634)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(62,120.955364),new clb.Op(63,121.95165),new clb.Op(64,122.94596),new clb.Op(65,123.94296),new clb.Op(66,124.93783),new clb.Op(67,125.93531),new clb.Op(68,126.93083),new clb.Op(69,127.9288),new clb.Op(70,128.92486),new clb.Op(71,129.92338),new clb.Op(72,130.920060245),new clb.Op(73,131.91912),new clb.Op(74,132.9162),new clb.Op(75,133.915672),new clb.Op(76,134.91313914),new clb.Op(77,135.912646935),new clb.Op(78,136.910678351),new clb.Op(79,137.910748891),new clb.Op(80,138.908932181),new clb.Op(81,139.909071204),new clb.Op(82,140.907647726),new clb.Op(83,141.910039865),new clb.Op(84,142.910812233),new clb.Op(85,143.913300595),new clb.Op(86,144.914506897),new clb.Op(87,145.917588016),new clb.Op(88,146.918979001),new clb.Op(89,147.922183237),new clb.Op(90,148.923791056),new clb.Op(91,149.926995031),new clb.Op(92,150.928227869),new clb.Op(93,151.9316),new clb.Op(94,152.93365),new clb.Op(95,153.93739),new clb.Op(96,154.93999),new clb.Op(97,155.94412),new clb.Op(98,156.94717),new clb.Op(99,157.95178),new clb.Op(100,158.95523)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(66,125.94307),new clb.Op(67,126.9405),new clb.Op(68,127.93539),new clb.Op(69,128.932385),new clb.Op(70,129.92878),new clb.Op(71,130.927102697),new clb.Op(72,131.92312),new clb.Op(73,132.92221),new clb.Op(74,133.918645),new clb.Op(75,134.91824),new clb.Op(76,135.915020542),new clb.Op(77,136.91463973),new clb.Op(78,137.91291745),new clb.Op(79,138.91192415),new clb.Op(80,139.909309824),new clb.Op(81,140.9096048),new clb.Op(82,141.907718643),new clb.Op(83,142.909809626),new clb.Op(84,143.910082629),new clb.Op(85,144.912568847),new clb.Op(86,145.913112139),new clb.Op(87,146.916095794),new clb.Op(88,147.916888516),new clb.Op(89,148.92014419),new clb.Op(90,149.920886563),new clb.Op(91,150.923824739),new clb.Op(92,151.924682428),new clb.Op(93,152.927694534),new clb.Op(94,153.929483295),new clb.Op(95,154.932629551),new clb.Op(96,155.9352),new clb.Op(97,156.93927),new clb.Op(98,157.94187),new clb.Op(99,158.94639),new clb.Op(100,159.94939),new clb.Op(101,160.95433)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(67,127.94826),new clb.Op(68,128.94316),new clb.Op(69,129.94045),new clb.Op(70,130.9358),new clb.Op(71,131.93375),new clb.Op(72,132.92972),new clb.Op(73,133.92849),new clb.Op(74,134.924617),new clb.Op(75,135.923447865),new clb.Op(76,136.920713),new clb.Op(77,137.920432261),new clb.Op(78,138.916759814),new clb.Op(79,139.915801649),new clb.Op(80,140.913606636),new clb.Op(81,141.912950738),new clb.Op(82,142.910927571),new clb.Op(83,143.912585768),new clb.Op(84,144.912743879),new clb.Op(85,145.914692165),new clb.Op(86,146.915133898),new clb.Op(87,147.917467786),new clb.Op(88,148.918329195),new clb.Op(89,149.920979477),new clb.Op(90,150.921202693),new clb.Op(91,151.923490557),new clb.Op(92,152.924113189),new clb.Op(93,153.926547019),new clb.Op(94,154.928097047),new clb.Op(95,155.931060357),new clb.Op(96,156.9332),new clb.Op(97,157.93669),new clb.Op(98,158.93913),new clb.Op(99,159.94299),new clb.Op(100,160.94586),new clb.Op(101,161.95029),new clb.Op(102,162.95352)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(68,129.94863),new clb.Op(69,130.94589),new clb.Op(70,131.94082),new clb.Op(71,132.93873),new clb.Op(72,133.93402),new clb.Op(73,134.93235),new clb.Op(74,135.9283),new clb.Op(75,136.927046709),new clb.Op(76,137.92354),new clb.Op(77,138.922302),new clb.Op(78,139.918991),new clb.Op(79,140.918468512),new clb.Op(80,141.915193274),new clb.Op(81,142.914623555),new clb.Op(82,143.91199473),new clb.Op(83,144.913405611),new clb.Op(84,145.91303676),new clb.Op(85,146.914893275),new clb.Op(86,147.914817914),new clb.Op(87,148.917179521),new clb.Op(88,149.917271454),new clb.Op(89,150.919928351),new clb.Op(90,151.919728244),new clb.Op(91,152.922093907),new clb.Op(92,153.922205303),new clb.Op(93,154.92463594),new clb.Op(94,155.925526236),new clb.Op(95,156.928354506),new clb.Op(96,157.929987938),new clb.Op(97,158.9332),new clb.Op(98,159.93514),new clb.Op(99,160.93883),new clb.Op(100,161.94122),new clb.Op(101,162.94536),new clb.Op(102,163.94828),new clb.Op(103,164.95298)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(69,131.95416),new clb.Op(70,132.9489),new clb.Op(71,133.94632),new clb.Op(72,134.94172),new clb.Op(73,135.9395),new clb.Op(74,136.93521),new clb.Op(75,137.93345),new clb.Op(76,138.92882915),new clb.Op(77,139.928083921),new clb.Op(78,140.924885867),new clb.Op(79,141.923400033),new clb.Op(80,142.920286634),new clb.Op(81,143.918774116),new clb.Op(82,144.916261285),new clb.Op(83,145.917199714),new clb.Op(84,146.916741206),new clb.Op(85,147.918153775),new clb.Op(86,148.917925922),new clb.Op(87,149.919698294),new clb.Op(88,150.919846022),new clb.Op(89,151.921740399),new clb.Op(90,152.921226219),new clb.Op(91,153.922975386),new clb.Op(92,154.922889429),new clb.Op(93,155.924750855),new clb.Op(94,156.925419435),new clb.Op(95,157.927841923),new clb.Op(96,158.9290845),new clb.Op(97,159.931460406),new clb.Op(98,160.93368),new clb.Op(99,161.93704),new clb.Op(100,162.93921),new clb.Op(101,163.94299),new clb.Op(102,164.94572),new clb.Op(103,165.94997),new clb.Op(104,166.95305)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(72,135.94707),new clb.Op(73,136.94465),new clb.Op(74,137.93997),new clb.Op(75,138.93808),new clb.Op(76,139.933236934),new clb.Op(77,140.93221),new clb.Op(78,141.927908919),new clb.Op(79,142.926738636),new clb.Op(80,143.923390357),new clb.Op(81,144.921687498),new clb.Op(82,145.918305344),new clb.Op(83,146.919089446),new clb.Op(84,147.918109771),new clb.Op(85,148.919336427),new clb.Op(86,149.918655455),new clb.Op(87,150.920344273),new clb.Op(88,151.919787882),new clb.Op(89,152.921746283),new clb.Op(90,153.920862271),new clb.Op(91,154.922618801),new clb.Op(92,155.922119552),new clb.Op(93,156.923956686),new clb.Op(94,157.924100533),new clb.Op(95,158.926385075),new clb.Op(96,159.927050616),new clb.Op(97,160.929665688),new clb.Op(98,161.930981211),new clb.Op(99,162.93399),new clb.Op(100,163.93586),new clb.Op(101,164.93938),new clb.Op(102,165.9416),new clb.Op(103,166.94557),new clb.Op(104,167.94836),new clb.Op(105,168.95287)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(73,137.95287),new clb.Op(74,138.94803),new clb.Op(75,139.945367985),new clb.Op(76,140.94116),new clb.Op(77,141.939073781),new clb.Op(78,142.93475),new clb.Op(79,143.93253),new clb.Op(80,144.92888),new clb.Op(81,145.927180629),new clb.Op(82,146.924037176),new clb.Op(83,147.924298636),new clb.Op(84,148.92324163),new clb.Op(85,149.923654158),new clb.Op(86,150.923098169),new clb.Op(87,151.924071324),new clb.Op(88,152.923430858),new clb.Op(89,153.924686236),new clb.Op(90,154.923500411),new clb.Op(91,155.924743749),new clb.Op(92,156.924021155),new clb.Op(93,157.92541026),new clb.Op(94,158.925343135),new clb.Op(95,159.927164021),new clb.Op(96,160.927566289),new clb.Op(97,161.929484803),new clb.Op(98,162.930643942),new clb.Op(99,163.933347253),new clb.Op(100,164.93488),new clb.Op(101,165.93805),new clb.Op(102,166.94005),new clb.Op(103,167.94364),new clb.Op(104,168.94622),new clb.Op(105,169.95025),new clb.Op(106,170.9533)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(74,139.95379),new clb.Op(75,140.95119),new clb.Op(76,141.946695946),new clb.Op(77,142.94383),new clb.Op(78,143.93907),new clb.Op(79,144.936717),new clb.Op(80,145.932720118),new clb.Op(81,146.930878496),new clb.Op(82,147.927177882),new clb.Op(83,148.927333981),new clb.Op(84,149.925579728),new clb.Op(85,150.92617963),new clb.Op(86,151.924713874),new clb.Op(87,152.925760865),new clb.Op(88,153.924422046),new clb.Op(89,154.92574895),new clb.Op(90,155.924278273),new clb.Op(91,156.925461256),new clb.Op(92,157.924404637),new clb.Op(93,158.92573566),new clb.Op(94,159.925193718),new clb.Op(95,160.926929595),new clb.Op(96,161.926794731),new clb.Op(97,162.928727532),new clb.Op(98,163.929171165),new clb.Op(99,164.931699828),new clb.Op(100,165.932803241),new clb.Op(101,166.935649025),new clb.Op(102,167.93723),new clb.Op(103,168.940303648),new clb.Op(104,169.94267),new clb.Op(105,170.94648),new clb.Op(106,171.94911),new clb.Op(107,172.95344)]),oW(aW(Ykb.aY,1),hob,3,0,[new clb.Op(75,141.95986),new clb.Op(76,142.95469),new clb.Op(77,143.95164),new clb.Op(78,144.94688),new clb.Op(79,145.9441),new clb.Op(80,146.93984),new clb.Op(81,147.937269),new clb.Op(82,148.933789944),new clb.Op(83,149.932760914),new clb.Op(84,150.931680791),new clb.Op(85,151.931740598),new clb.Op(86,152.930194506),new clb.Op(87,153.930596268),new clb.Op(88,154.929079084),new clb.Op(89,155.929001869),new clb.Op(90,156.928188059),new clb.Op(91,157.92894573),new clb.Op(92,158.927708537),new clb.Op(93,159.928725679),new clb.Op(94,160.927851662),new clb.Op(95,161.92909242),new clb.Op(9