@datagrok/helm 2.1.9 → 2.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +2 -2
- package/src/cell-renderer.ts +11 -5
- package/src/package.ts +47 -46
package/dist/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"DG\"","webpack://helm/./src/helm-web-editor.ts","webpack://helm/./src/utils.ts","webpack://helm/external var \"wu\"","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://helm/./src/cell-renderer.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://helm/./src/package.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport class HelmWebEditor {\n host: any;\n editor: any;\n w = 200;\n h = 100;\n constructor() {\n this.host = ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});\n this.editor = new JSDraw2.Editor(this.host, {width: this.w, height: this.h, viewonly: true});\n }\n\n resizeEditor(w: number, h: number) {\n this.editor.setSize(w, h);\n }\n\n createWebEditor(value: string) {\n const editorView = ui.div();\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const webEditor = new scil.helm.App(editorView, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = webEditor.calculateSizes();\n webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(webEditor.sequence.style, s);\n //@ts-ignore\n scil.apply(webEditor.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(webEditor.properties.parent.style, s);\n webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);\n webEditor.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n webEditor.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n return {editorDiv: editorView, webEditor: webEditor};\n }\n}\n\n","import * as DG from 'datagrok-api/dg';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements =[firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n/* this function returns names of monomers that are NOT in the monomer library */\nexport function findMonomers(helmString: string) {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n const splitString = parseHelm(helmString);\n return new Set(splitString.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxNQUFNLE9BQU8sY0FBYztJQTJCZixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQXdCLEVBQ25ELFVBQVUsR0FBRyxLQUFLLEVBQUUsY0FBcUMsY0FBYztRQUV2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBSUQsWUFBWSxPQUFnQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7O0FBaERhLDZCQUFjLEdBQUcsa0JBQWtCLENBQUM7QUFFbEQsNENBQTRDO0FBQzlCLDRCQUFhLEdBQWdDO0lBQ3pELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8vIFRoZXJlIGFyZSB0b28gbXVjaCBwcm9ibGVtIHdpdGggaW5kZXhlciBwcm9wZXJ0eSBpbiB0eXBlc2NyaXB0LlxuICAvLyAvKipcbiAgLy8gICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lciBjaGFyYWN0ZXJcbiAgLy8gICogQHJldHVybiB7c3RyaW5nfSBDb2xvclxuICAvLyAgKi9cbiAgLy8gW206IHN0cmluZ106IHN0cmluZztcbiAgLyoqIE1vbm9tZXIgY29sb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lclxuICAgKi9cbiAgZ2V0KG06IHN0cmluZyk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcVBhbGV0dGVCYXNlIGltcGxlbWVudHMgU2VxUGFsZXR0ZSB7XG4gIHB1YmxpYyBzdGF0aWMgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5cbiAgLyoqIFBhbGV0dGUgd2l0aCBzaGFkZXMgb2YgcHJpbWFyeSBjb2xvcnMgKi9cbiAgcHVibGljIHN0YXRpYyBjb2xvdXJQYWxldHRlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG4gICAgJ29yYW5nZSc6IFsncmdiKDI1NSwxODcsMTIwKScsICdyZ2IoMjQ1LDE2NywxMDApJywgJ3JnYigyMzUsMTM3LDcwKScsICdyZ2IoMjA1LCAxMTEsIDcxKSddLFxuICAgICdhbGxfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJywgJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJyxcbiAgICAgICdyZ2IoMjQsMTEwLDc5KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnYWxsX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDEyMiwgMTAyLCAxODkpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDE0MSwgMTI0LCAyMTcpJyxcbiAgICAgICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdtYWdlbnRhJzogWydyZ2IoMTYyLDEwNiwxOTIpJywgJ3JnYigxOTcsMTY1LDIyNCknLCAncmdiKDIwOCwxMTMsMjE4KSddLFxuICAgICdyZWQnOiBbJ3JnYigyMTQsMzksNDApJywgJ3JnYigyNTUsMTUyLDE1MCknXSxcbiAgICAnc3RfYmx1ZSc6IFsncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDMxLDExOSwxODApJ10sXG4gICAgJ2RhcmtfYmx1ZSc6IFsncmdiKDMxLDExOSwxODApJywgJ3JnYigzMSwgMTIwLCAxNTApJ10sXG4gICAgJ2xpZ2h0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxMDgsIDIxOCwgMjI5KScsICdyZ2IoMjMsMTkwLDIyNyknXSxcbiAgICAnbGlsYWNfYmx1ZSc6IFsncmdiKDEyNCwxMDIsMjExKScsICdyZ2IoMTQ5LDEzNCwyMTcpJywgJ3JnYig5NywgODEsIDE1MCknXSxcbiAgICAnZGFya19ncmVlbic6IFsncmdiKDIzLDEwMyw1NyknLCAncmdiKDMwLDExMCw5NiknLCAncmdiKDYwLDEzMSw5NSknLCAncmdiKDI0LDExMCw3OSknXSxcbiAgICAnZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJ10sXG4gICAgJ2xpZ2h0X2dyZWVuJzogWydyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnc3RfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYigxNTIsMjIzLDEzOCknLCAncmdiKDM5LCAxNzQsIDk2KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdwaW5rJzogWydyZ2IoMjQ3LDE4MiwyMTApJ10sXG4gICAgJ2Jyb3duJzogWydyZ2IoMTQwLDg2LDc1KScsICdyZ2IoMTAyLCA2MiwgNTQpJ10sXG4gICAgJ2dyYXknOiBbJ3JnYigxMjcsMTI3LDEyNyknLCAncmdiKDE5OSwxOTksMTk5KScsICdyZ2IoMTk2LDE1NiwxNDgpJywgJ3JnYigyMjIsIDIyMiwgMTgwKSddLFxuICAgICd5ZWxsb3cnOiBbJ3JnYigxODgsMTg5LDM0KSddLFxuICAgICd3aGl0ZSc6IFsncmdiKDIzMCwyMzAsMjMwKSddLFxuICB9O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbWFrZVBhbGV0dGUoZHQ6IFtzdHJpbmdbXSwgc3RyaW5nXVtdLFxuICAgIHNpbXBsaWZpZWQgPSBmYWxzZSwgUGFsZXR0ZVR5cGU6IHR5cGVvZiBTZXFQYWxldHRlQmFzZSA9IFNlcVBhbGV0dGVCYXNlXG4gICkge1xuICAgIGNvbnN0IHBhbGV0dGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBkdC5mb3JFYWNoKChjcCkgPT4ge1xuICAgICAgY29uc3Qgb2JqTGlzdCA9IGNwWzBdO1xuICAgICAgY29uc3QgY29sb3VyID0gY3BbMV07XG4gICAgICBvYmpMaXN0LmZvckVhY2goKG9iaiwgaW5kKSA9PiB7XG4gICAgICAgIHBhbGV0dGVbb2JqXSA9IHRoaXMuY29sb3VyUGFsZXR0ZVtjb2xvdXJdW3NpbXBsaWZpZWQgPyAwIDogaW5kXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgUGFsZXR0ZVR5cGUocGFsZXR0ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihwYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX3BhbGV0dGUgPSBwYWxldHRlO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYWxldHRlW21dO1xuICB9XG59XG4iXX0=","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n var _a, _b, _c;\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBSU0sTUFBTSxLQUFLLFVBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7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QUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0sIGZhbHNlLCBBbWlub2FjaWRzUGFsZXR0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSwgZmFsc2UsIEFtaW5vYWNpZHNQYWxldHRlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IG5ldyBBbWlub2FjaWRzUGFsZXR0ZXMoe1xuICAgICAgICAvLyBodHRwOi8vYWNjZXMuZW5zLWx5b24uZnIvYmlvdGljL3Jhc3RvcC9oZWxwL2NvbG91ci5odG1cbiAgICAgICAgJ0QnOiAnI0U2MEEwQScsIC8vIGFzcCwgYXNwYXJ0aWMgYWNpZCwgYXNwXG4gICAgICAgICdFJzogJyNFNjBBMEEnLCAvLyBnbHUsIGdsdXRhbWljIGFjaWRcbiAgICAgICAgJ0MnOiAnI0U2RTYwMCcsIC8vIGN5cywgY3lzdGVpbmVcbiAgICAgICAgJ00nOiAnI0U2RTYwMCcsIC8vIG1ldCwgbWV0aGlvbmluZVxuICAgICAgICAnSyc6ICcjMTQ1QUZGJywgLy8gbHlzLCBseXNpbmVcbiAgICAgICAgJ1InOiAnIzE0NUFGRicsIC8vIGFyZywgYXJnaW5pbmVcbiAgICAgICAgJ1MnOiAnI0ZBOTYwMCcsIC8vIHNlciwgc2VyaW5lXG4gICAgICAgICdUJzogJyNGQTk2MDAnLCAvLyB0aHIsIHRocmVvbmluZVxuICAgICAgICAnRic6ICcjMzIzMkFBJywgLy8gcGhlLCBwaGVueWxhbGFuaW5lXG4gICAgICAgICdZJzogJyMzMjMyQUEnLCAvLyB0eXIsIHR5cm9zaW5lXG4gICAgICAgICdOJzogJyMwMERDREMnLCAvLyBhc24sIGFzcGFyYWdpbmVcbiAgICAgICAgJ1EnOiAnIzAwRENEQycsIC8vIGdsbiwgZ2x1dGFtaW5lXG4gICAgICAgICdHJzogJyNFQkVCRUInLCAvLyBnbHksIGdseWNpbmVcbiAgICAgICAgJ0wnOiAnIzBGODIwRicsIC8vIGxldSwgbGV1Y2luZVxuICAgICAgICAnVic6ICcjMEY4MjBGJywgLy8gdmFsLCB2YWxpbmVcbiAgICAgICAgJ0knOiAnIzBGODIwRicsIC8vIGlsZSwgaXNvbGV1Y2luZVxuICAgICAgICAnQSc6ICcjQzhDOEM4JywgLy8gYWxhLCBhbGFuaW5lXG4gICAgICAgICdXJzogJyNCNDVBQjQnLCAvLyB0cnAsIHRyeXB0b3BoYW5cbiAgICAgICAgJ0gnOiAnIzgyODJEMicsIC8vIGhpcywgaGlzdGlkaW5lXG4gICAgICAgICdQJzogJyNEQzk2ODInLCAvLyBwcm8sIHByb2xpbmVcbiAgICAgICAgJ290aGVycyc6ICcjQkVBMDZFJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0KG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzTSA9IG0gaW4gQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXMgPyBBbWlub2FjaWRzUGFsZXR0ZXMuYWFTeW5vbnltc1ttXSA6IG07XG4gICAgY29uc3QgcmVzID0gc3VwZXIuZ2V0KHJlc00pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdNZU5sZSc6ICdMJywgLy8gTmxlIC0gbm9ybGV1Y2luZVxuICAgICdNZUEnOiAnQScsXG4gICAgJ01lRyc6ICdHJyxcbiAgICAnTWVGJzogJ0YnLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQW1pbm9hY2lkcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnQW1pbm9hY2lkcyc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDogc3RyaW5nID0gJ0FtaW5vYWNpZHNNdWx0aXBsZUFsaWdubWVudCc7XG5cbiAgc3RhdGljIHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIHB1YmxpYyBzdGF0aWMgTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnR2x5Y2luZScsXG4gICAgJ0wnOiAnTGV1Y2luZScsXG4gICAgJ1knOiAnVHlyb3NpbmUnLFxuICAgICdTJzogJ1NlcmluZScsXG4gICAgJ0UnOiAnR2x1dGFtaWMgYWNpZCcsXG4gICAgJ1EnOiAnR2x1dGFtaW5lJyxcbiAgICAnRCc6ICdBc3BhcnRpYyBhY2lkJyxcbiAgICAnTic6ICdBc3BhcmFnaW5lJyxcbiAgICAnRic6ICdQaGVueWxhbGFuaW5lJyxcbiAgICAnQSc6ICdBbGFuaW5lJyxcbiAgICAnSyc6ICdMeXNpbmUnLFxuICAgICdSJzogJ0FyZ2luaW5lJyxcbiAgICAnSCc6ICdIaXN0aWRpbmUnLFxuICAgICdDJzogJ0N5c3RlaW5lJyxcbiAgICAnVic6ICdWYWxpbmUnLFxuICAgICdQJzogJ1Byb2xpbmUnLFxuICAgICdXJzogJ1RyeXB0b3BoYW4nLFxuICAgICdJJzogJ0lzb2xldWNpbmUnLFxuICAgICdNJzogJ01ldGhpb25pbmUnLFxuICAgICdUJzogJ1RocmVvbmluZScsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlczogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICdOQ0MoPU8pTycsXG4gICAgJ0wnOiAnTltDQEhdKENDKEMpQylDKD1PKU8nLFxuICAgICdZJzogJ05DKENDMT1DQz1DKE8pQz1DMSlDKD1PKU8nLFxuICAgICdTJzogJ05DKENPKUMoPU8pTycsXG4gICAgJ0UnOiAnTltDQEBIXShDQ0MoTyk9TylDKD1PKU8nLFxuICAgICdRJzogJ05bQ0BASF0oQ0NDKE4pPU8pQyg9TylPJyxcbiAgICAnRCc6ICdOW0NAQEhdKENDKE8pPU8pQyg9TylPJyxcbiAgICAnTic6ICdOW0NAQEhdKENDKE4pPU8pQyg9TylPJyxcbiAgICAnRic6ICdOQyhDQzE9Q0M9Q0M9QzEpQyg9TylPJyxcbiAgICAnQSc6ICdOW0NASF0oQylDKD1PKU8nLFxuICAgICdLJzogJ05DKENDQ0NOKUMoPU8pTycsXG4gICAgJ1InOiAnTltDQEhdKENDQ05DKD1OKUMpQyg9TylPJyxcbiAgICAnSCc6ICdOQyhDQzE9Q049Q1tOXTEpQyg9TylPJyxcbiAgICAnQyc6ICdOW0NAQEhdKENTKUMoPU8pTycsXG4gICAgJ1YnOiAnTkMoQyhDKUMpQyg9TylPJyxcbiAgICAnUCc6ICdOKENDQzEpQzFDKD1PKU8nLFxuICAgICdXJzogJ05bQ0BASF0oQ2MxYzJjY2NjYzJuKFtIXSljMSlDKD1PKU8nLFxuICAgICdJJzogJ05bQ0BIXShbQ0BIXShDKUNDKUMoPU8pTycsXG4gICAgJ00nOiAnTkMoQ0NTQylDKD1PKU8nLFxuICAgICdUJzogJ05DKEMoTylDKUMoPU8pTycsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlc1RydW5jYXRlZDogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICcqQyonLFxuICAgICdMJzogJ0NDKEMpQ1tDQEhdKCopKicsXG4gICAgJ1knOiAnQzE9Q0MoPUNDPUMxQ0MoKikqKU8nLFxuICAgICdTJzogJ09DQygqKUMqJyxcbiAgICAnRSc6ICcqW0NAQEhdKENDQyhPKT1PKSonLFxuICAgICdRJzogJypOW0NAQEhdKENDQyhOKT1PKSonLFxuICAgICdEJzogJypbQ0BASF0oQ0MoTyk9TykqJyxcbiAgICAnTic6ICcqW0NAQEhdKENDKE4pPU8pKicsXG4gICAgJ0YnOiAnQzE9Q0M9QyhDPUMxKUNDKCopKicsXG4gICAgJ0EnOiAnQ1tDQEhdKCopKicsXG4gICAgJ0snOiAnQyhDQ04pQ0MoKikqJyxcbiAgICAnUic6ICcqW0NASF0oQ0NDTkMoPU4pQykqJyxcbiAgICAnSCc6ICdDMT1DKE5DPU4xKUNDKCopKicsXG4gICAgJ0MnOiAnQyhbQ0BASF0oKikqKVMnLFxuICAgICdWJzogJ0NDKEMpQygqKSonLFxuICAgICdQJzogJ0MxQ0NOKCopQzEqJyxcbiAgICAnVyc6ICcqW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpKicsXG4gICAgJ0knOiAnQ0NbQ0BIXShDKVtDQEhdKCopKicsXG4gICAgJ00nOiAnQ1NDQ0MoKikqJyxcbiAgICAnVCc6ICdDQyhPKUMoKikqJyxcbiAgfTtcblxuICAvKiogVE9ETzogRnVsbD9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgQUFGdWxsTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0FsYSc6ICdBJyxcbiAgICAnQXJnJzogJ1InLFxuICAgICdBc24nOiAnTicsXG4gICAgJ0FzcCc6ICdEJyxcbiAgICAnQ3lzJzogJ0MnLFxuICAgICdHbG4nOiAnUScsXG4gICAgJ0dsdSc6ICdFJyxcbiAgICAnR2x5JzogJ0cnLFxuICAgICdIaXMnOiAnSCcsXG4gICAgJ0lsZSc6ICdJJyxcbiAgICAnTGV1JzogJ0wnLFxuICAgICdMeXMnOiAnSycsXG4gICAgJ01ldCc6ICdNJyxcbiAgICAnUGhlJzogJ0YnLFxuICAgICdQcm8nOiAnUCcsXG4gICAgJ1Nlcic6ICdTJyxcbiAgICAnVGhyJzogJ1QnLFxuICAgICdUcnAnOiAnVycsXG4gICAgJ1R5cic6ICdZJyxcbiAgICAnVmFsJzogJ1YnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGFsZXR0ZShzY2hlbWU6IHN0cmluZyA9ICdncm9rJyk6IFNlcVBhbGV0dGUge1xuICAgIHN3aXRjaCAoc2NoZW1lKSB7XG4gICAgY2FzZSAnZ3Jvayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgY2FzZSAnbGVzayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkxlc2s7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlbVBhbGV0dGU6IHNjaGVtZSBcXGAke3NjaGVtZX1cXGAgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkaXZpZGVkIGFtaW5vIGFjaWQgd2l0aCBpdHMgY29udGVudCBpbiB0aGUgYnJhY2tldCwgaWYgdGhlIGNvbnRlbnQgaXMgbnVtYmVyLCB0aGVuIGl0cyBvbWl0dGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjIHJhdyBhbWlub1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nLCBzdHJpbmddfSBvdXRlciBhbmQgaW5uZXIgY29udGVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbm5lck91dGVyKGM6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGxldCBpc0lubmVyID0gMDtcbiAgICBsZXQgaW5uZXIgPSAnJztcbiAgICBsZXQgb3V0ZXIgPSAnJztcblxuICAgIGZvciAoY29uc3QgY2hhciBvZiBjKSB7XG4gICAgICBpZiAoY2hhciA9PSAnKCcpXG4gICAgICAgIGlzSW5uZXIrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyknKVxuICAgICAgICBpc0lubmVyLS07XG4gICAgICBlbHNlIGlmIChpc0lubmVyKVxuICAgICAgICBpbm5lciArPSBjaGFyO1xuICAgICAgZWxzZVxuICAgICAgICBvdXRlciArPSBjaGFyO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoaW5uZXIpKSA/IFtvdXRlciwgJyddIDogW291dGVyLCBpbm5lcl07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldENvbG9yQUFQaXZvdChtb25vbWVyOiBzdHJpbmcgPSAnJywgc2NoZW1lOiAnZ3JvaycgPSAnZ3JvaycpOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgbnVtYmVyXSB7XG4gICAgLy9jb25zdCBjaGVtUGFsZXR0ZUluc3RhbmNlID0gQUFQYWxldHRlcy5Hcm9rR3JvdXBzKCk7XG4gICAgY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IHRoaXMuZ2V0UGFsZXR0ZShzY2hlbWUpO1xuICAgIGxldCBbb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXJdID0gdGhpcy5nZXRJbm5lck91dGVyKG1vbm9tZXIpO1xuICAgIG91dGVyTW9ub21lciA9IChvdXRlck1vbm9tZXIubGVuZ3RoID4gNiA/IGAke291dGVyTW9ub21lci5zbGljZSgwLCAzKX0uLi5gIDogb3V0ZXJNb25vbWVyKTtcbiAgICBpbm5lck1vbm9tZXIgPSAoaW5uZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtpbm5lck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IGlubmVyTW9ub21lcik7XG5cbiAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMSB8fCBtb25vbWVyWzFdID09ICcoJykge1xuICAgICAgY29uc3QgYW1pbm8gPSBtb25vbWVyWzBdPy50b1VwcGVyQ2FzZSgpITtcbiAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMl0gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDAsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgIGlmIChtb25vbWVyLmxlbmd0aCA9PSAzIHx8IG1vbm9tZXJbM10gPT0gJygnKSB7XG4gICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygwLCAzKV07XG4gICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCAzXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAzXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lclswXT8udG9Mb3dlckNhc2UoKSA9PSBtb25vbWVyWzBdKSB7XG4gICAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMSwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gNCB8fCBtb25vbWVyWzRdID09ICcoJykge1xuICAgICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygxLCAzKV07XG4gICAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztnQkFDMUMsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLE1BQU07Z0JBQ1gsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFdBQVc7O0FBQ04sbUJBQU8sR0FBVyxhQUFhLENBQUM7QUFFaEMsb0NBQXdCLEdBQVcsOEJBQThCLENBQUM7QUFFcEUsaUJBQUssR0FBcUI7SUFDdEMsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsUUFBUTtDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIE51Y2xlb3RpZGVzUGFsZXR0ZXMgZXh0ZW5kcyBTZXFQYWxldHRlQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGNocm9tYXRvZ3JhbTogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBDaHJvbWF0b2dyYW0oKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuY2hyb21hdG9ncmFtID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY2hyb21hdG9ncmFtID0gbmV3IE51Y2xlb3RpZGVzUGFsZXR0ZXMoe1xuICAgICAgICAnQSc6ICdncmVlbicsXG4gICAgICAgICdDJzogJ2JsdWUnLFxuICAgICAgICAnRyc6ICdibGFjaycsIC8vIG9yYW5nZSA/XG4gICAgICAgICdUJzogJ3JlZCcsXG4gICAgICAgICdVJzogJ3JlZCcsXG4gICAgICAgICdvdGhlcnMnOiAnZ3JheScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTnVjbGVvdGlkZXMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5rbm93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVua25vd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0Qzs7S0FFSztBQUNMLFNBQVMsWUFBWSxDQUFDLEtBQW9CO0lBQ3hDLElBQUksS0FBSyxJQUFJLElBQUk7UUFDZixPQUFPLGtCQUFrQixDQUFDO0lBRTVCLE1BQU0sT0FBTyxHQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLHdDQUF3QztJQUN4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUYseUJBQXlCO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQzlCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRTtRQUNyQixPQUFPLE9BQU8sS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUM1RDtJQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFTO1FBQzlCLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxHQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE9BQU8sRUFBYSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRCxNQUFNLE9BQWdCLGlCQUFpQjtDQUV0QztBQUVELE1BQU0sT0FBTyxjQUFlLFNBQVEsaUJBQWlCO0lBQzVDLEdBQUcsQ0FBQyxDQUFTO1FBQ2xCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFHaEQsTUFBTSxDQUFDLFlBQVk7UUFDekIsTUFBTSxHQUFHLEdBQUksRUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEYsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsTUFBTSxJQUFJLEdBQVcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQVhhLDJCQUFPLEdBQWEsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7QUFjdkUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGNBQWM7SUFHN0MsTUFBTSxLQUFLLElBQUk7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFJTSxNQUFNLEtBQUssS0FBSztRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG4vKiogbWFrZXMgdGhlIGNvbG9yIGxlc3Mgd2hpdGUsIG1ha2VzIHRoZSB0cmFuc3BhcmVuY3kgZWZmZWN0IGFsd2F5cyBwZXJjZXB0aWJsZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIHggY29vcmRpbmF0ZS5cbiAqICovXG5mdW5jdGlvbiBjb3JyZWN0Q29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoY29sb3IgPT0gbnVsbClcbiAgICByZXR1cm4gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIGNvbnN0IGRnQ29sb3I6IG51bWJlciA9IERHLkNvbG9yLmZyb21IdG1sKGNvbG9yKTtcbiAgY29uc3QgZyA9IERHLkNvbG9yLmcoZGdDb2xvcik7XG4gIGNvbnN0IHIgPSBERy5Db2xvci5yKGRnQ29sb3IpO1xuICBjb25zdCBiID0gREcuQ29sb3IuYihkZ0NvbG9yKTtcbiAgLy8gY2FsY3VsYXRlIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byB3aGl0ZVxuICBjb25zdCBkaXN0VG9CbGFjayA9IE1hdGguc3FydChNYXRoLnBvdygwIC0gciwgMikgKyBNYXRoLnBvdygwIC0gZywgMikgKyBNYXRoLnBvdygwIC0gYiwgMikpO1xuICAvLyBub3JtYWxpemUgdmVjdG9yIHIgZyBiXG4gIGNvbnN0IG5vcm1SID0gciAvIGRpc3RUb0JsYWNrO1xuICBjb25zdCBub3JtRyA9IGcgLyBkaXN0VG9CbGFjaztcbiAgY29uc3Qgbm9ybUIgPSBiIC8gZGlzdFRvQmxhY2s7XG4gIGlmIChkaXN0VG9CbGFjayA+IDIxMCkge1xuICAgIHJldHVybiBgcmdiKCR7bm9ybVIgKiAyMTB9LCR7bm9ybUcgKiAyMTB9LCR7bm9ybUIgKiAyMTB9KWA7XG4gIH1cbiAgcmV0dXJuIERHLkNvbG9yLnRvUmdiKGRnQ29sb3IpO1xufVxuXG5leHBvcnQgY2xhc3MgU3RyaW5nVXRpbHMge1xuICBwdWJsaWMgc3RhdGljIGhhc2hDb2RlKHM6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGhhc2g6IG51bWJlciA9IDA7XG4gICAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGhhc2g7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNocjogbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG4gIH1cbn1cblxuaW1wb3J0IHtTZXFQYWxldHRlLCBTZXFQYWxldHRlQmFzZX0gZnJvbSAnLi9zZXEtcGFsZXR0ZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVW5rbm93blNlcVBhbGV0dGUgaW1wbGVtZW50cyBTZXFQYWxldHRlIHtcbiAgcHVibGljIGFic3RyYWN0IGdldChtOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmF5QWxsUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIzY2NjY2Nic7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbG9yUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIHN0YXRpYyBwYWxldHRlOiBzdHJpbmdbXSA9IFVua25vd25Db2xvclBhbGV0dGUuYnVpbGRQYWxldHRlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRQYWxldHRlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXMgPSAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKFNlcVBhbGV0dGVCYXNlLmNvbG91clBhbGV0dGUpKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2g6IG51bWJlciA9IFN0cmluZ1V0aWxzLmhhc2hDb2RlKG0pO1xuICAgIGNvbnN0IHBJID0gaGFzaCAlIFVua25vd25Db2xvclBhbGV0dGUucGFsZXR0ZS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvcnJlY3RDb2xvcihVbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGVbcEldKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93blNlcVBhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBncmF5OiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEdyYXkoKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuZ3JheSA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5ncmF5ID0gbmV3IEdyYXlBbGxQYWxldHRlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3JheTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbG9yOiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IENvbG9yKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNvbG9yID09PSB2b2lkIDApXG4gICAgICB0aGlzLmNvbG9yID0gbmV3IFVua25vd25Db2xvclBhbGV0dGUoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgfVxufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport { detectAlphabet, getSplitterForColumn, getStats, splitterAsFasta } from './macromolecule';\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error('Fasta column must be MACROMOLECULE');\n const stats = getStats(col, 5, splitterAsFasta);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n const alphabet = detectAlphabet(stats);\n col.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n col.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n col.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n var _a;\n const separator = (_a = this.column.getTag(\"separator\" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const splitter = getSplitterForColumn(this.column);\n const stats = getStats(this.column, 1, splitter);\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */)\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) == 'true';\n else\n return false;\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule');\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = new UnitsHandler(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n constructor(col) {\n this._column = col;\n const units = this._column.tags[DG.TAGS.UNITS];\n if (units !== null)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */)) {\n if (this.isFasta() || this.isSeparator())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\"aligned\" /* TAGS.aligned */}' is mandatory.`);\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n else if (['UN'].includes(this.alphabet))\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\nUnitsHandler.PeptideFastaAlphabet = new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n]);\nUnitsHandler.DnaFastaAlphabet = new Set(['A', 'C', 'G', 'T']);\nUnitsHandler.RnaFastaAlphabet = new Set(['A', 'C', 'G', 'U']);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdHMtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVuaXRzLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBRUwsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixRQUFRLEVBR1IsZUFBZSxFQUdoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLGlFQUFpRTtBQUNqRSxNQUFNLE9BQU8sWUFBWTtJQWtCaEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQWM7UUFDaEQsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFeEQsTUFBTSxLQUFLLEdBQWdCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSywrQkFBaUIsQ0FBQztRQUMxQyxHQUFHLENBQUMsTUFBTSwrQkFBZSxPQUFPLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsTUFBTSxpQ0FBZ0IsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQWMsS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBYyxNQUFNLEtBQWdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBVyxRQUFRLEtBQWUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFD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RUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQ2hELEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FDakQsQ0FBQyxDQUFDO0FBQ29CLDZCQUFnQixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCw2QkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1xuICBBTFBIQUJFVCxcbiAgZGV0ZWN0QWxwaGFiZXQsXG4gIGdldFNwbGl0dGVyRm9yQ29sdW1uLFxuICBnZXRTdGF0cyxcbiAgTk9UQVRJT04sXG4gIFNlcUNvbFN0YXRzLFxuICBzcGxpdHRlckFzRmFzdGEsXG4gIFNwbGl0dGVyRnVuYyxcbiAgVEFHU1xufSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuXG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIG5vdGF0aW9uIHVuaXRzIGluIE1hY3JvbW9sZWN1bGUgY29sdW1ucyAqL1xuZXhwb3J0IGNsYXNzIFVuaXRzSGFuZGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY29sdW1uOiBERy5Db2x1bW47IC8vIHRoZSBjb2x1bW4gdG8gYmUgY29udmVydGVkXG4gIHByb3RlY3RlZCBfdW5pdHM6IHN0cmluZzsgLy8gdW5pdHMsIG9mIHRoZSBmb3JtIGZhc3RhLCBzZXBhcmF0b3JcbiAgcHJvdGVjdGVkIF9ub3RhdGlvbjogTk9UQVRJT047IC8vIGN1cnJlbnQgbm90YXRpb24gKHdpdGhvdXQgOlNFUTpOVCwgZXRjLilcbiAgcHJvdGVjdGVkIF9kZWZhdWx0R2FwU3ltYm9sOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgX2RlZmF1bHRHYXBTeW1ib2xzRGljdCA9IHtcbiAgICBIRUxNOiAnKicsXG4gICAgU0VQQVJBVE9SOiAnJyxcbiAgICBGQVNUQTogJy0nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUGVwdGlkZUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICdHJywgJ0wnLCAnWScsICdTJywgJ0UnLCAnUScsICdEJywgJ04nLCAnRicsICdBJyxcbiAgICAnSycsICdSJywgJ0gnLCAnQycsICdWJywgJ1AnLCAnVycsICdJJywgJ00nLCAnVCcsXG4gIF0pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdUJ10pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdVJ10pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VW5pdHNUb0Zhc3RhQ29sdW1uKGNvbDogREcuQ29sdW1uKSB7XG4gICAgaWYgKGNvbC5zZW1UeXBlICE9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zhc3RhIGNvbHVtbiBtdXN0IGJlIE1BQ1JPTU9MRUNVTEUnKTtcblxuICAgIGNvbnN0IHN0YXRzOiBTZXFDb2xTdGF0cyA9IGdldFN0YXRzKGNvbCwgNSwgc3BsaXR0ZXJBc0Zhc3RhKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIGNvbnN0IGFscGhhYmV0ID0gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpO1xuXG4gICAgY29sLnNldFRhZyhERy5UQUdTLlVOSVRTLCBOT1RBVElPTi5GQVNUQSk7XG4gICAgY29sLnNldFRhZyhUQUdTLmFsaWduZWQsIGFsaWduZWQpO1xuICAgIGNvbC5zZXRUYWcoVEFHUy5hbHBoYWJldCwgYWxwaGFiZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1bml0cygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdW5pdHM7IH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNvbHVtbigpOiBERy5Db2x1bW4geyByZXR1cm4gdGhpcy5fY29sdW1uOyB9XG5cbiAgcHVibGljIGdldCBub3RhdGlvbigpOiBOT1RBVElPTiB7IHJldHVybiB0aGlzLl9ub3RhdGlvbjsgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdEdhcFN5bWJvbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZGVmYXVsdEdhcFN5bWJvbDsgfVxuXG4gIHB1YmxpYyBnZXQgc2VwYXJhdG9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5zZXBhcmF0b3IpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gTk9UQVRJT04uU0VQQVJBVE9SICYmIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXBhcmF0b3IgaXMgbWFuZGF0b3J5ICBmb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScuYCk7XG4gICAgcmV0dXJuIHNlcGFyYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpZ25lZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWduZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcblxuICAgIC8vIFRBR1MuYWxpZ25lZCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxpZ25lZCAmJiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFnIGFsaWduZWQgbm90IHNldCcpO1xuXG4gICAgcmV0dXJuIGFsaWduZWQ7XG4gIH1cblxuICAvKiogQWxwaGFiZXQgbmFtZSAodXBwZXIgY2FzZSkgKi9cbiAgcHVibGljIGdldCBhbHBoYWJldCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFscGhhYmV0ID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFRBR1MuYWxwaGFiZXQpO1xuXG4gICAgLy8gVEFHUy5hbHBoYWJldCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxwaGFiZXQgJiYgKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhZyBhbHBoYWJldCBub3Qgc2V0Jyk7XG5cbiAgICByZXR1cm4gYWxwaGFiZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxwaGFiZXRTaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSB8fCB0aGlzLmFscGhhYmV0ID09IEFMUEhBQkVULlVOKSB7XG4gICAgICBjb25zdCBhbHBoYWJldFNpemVTdHIgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgICAgbGV0IGFscGhhYmV0U2l6ZTogbnVtYmVyO1xuICAgICAgaWYgKGFscGhhYmV0U2l6ZVN0cikge1xuICAgICAgICBhbHBoYWJldFNpemUgPSBwYXJzZUludChhbHBoYWJldFNpemVTdHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2FsY3VsYXRlIGFscGhhYmV0U2l6ZSBvbiBkZW1hbmRcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXI6IFNwbGl0dGVyRnVuYyA9IGdldFNwbGl0dGVyRm9yQ29sdW1uKHRoaXMuY29sdW1uKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyh0aGlzLmNvbHVtbiwgMSwgc3BsaXR0ZXIpO1xuICAgICAgICBhbHBoYWJldFNpemUgPSBPYmplY3Qua2V5cyhzdGF0cy5mcmVxKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxwaGFiZXRTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuYWxwaGFiZXQpIHtcbiAgICAgIGNhc2UgQUxQSEFCRVQuUFQ6XG4gICAgICAgIHJldHVybiAyMDtcbiAgICAgIGNhc2UgQUxQSEFCRVQuRE5BOlxuICAgICAgY2FzZSBBTFBIQUJFVC5STkE6XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgY2FzZSAnTlQnOlxuICAgICAgICBjb25zb2xlLndhcm4oYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJ05UJy5gKTtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRBbHBoYWJldElzTXVsdGljaGFyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5vdGF0aW9uID09IE5PVEFUSU9OLkhFTE0gfHwgdGhpcy5hbHBoYWJldCA9PSBBTFBIQUJFVC5VTilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldElzTXVsdGljaGFyKSA9PSAndHJ1ZSc7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzRmFzdGEoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5GQVNUQTsgfVxuXG4gIHB1YmxpYyBpc1NlcGFyYXRvcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubm90YXRpb24gPT09IE5PVEFUSU9OLlNFUEFSQVRPUjsgfVxuXG4gIHB1YmxpYyBpc0hlbG0oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5IRUxNOyB9XG5cbiAgcHVibGljIGlzUm5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuUk5BOyB9XG5cbiAgcHVibGljIGlzRG5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BOyB9XG5cbiAgcHVibGljIGlzUGVwdGlkZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuYWxwaGFiZXQgPT09IEFMUEhBQkVULlBUOyB9XG5cbiAgcHVibGljIGlzTXNhKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbGlnbmVkID8gdGhpcy5hbGlnbmVkLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoJ01TQScpIDogZmFsc2U7IH1cblxuICAvKiogQXNzb2NpYXRlIG5vdGF0aW9uIHR5cGVzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdW5pdHMgKi9cbiAgLyoqXG4gICAqIEByZXR1cm4ge05PVEFUSU9OfSAgICAgTm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB1bml0cyB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90YXRpb24oKTogTk9UQVRJT04ge1xuICAgIGlmICh0aGlzLnVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChOT1RBVElPTi5GQVNUQSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uRkFTVEE7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICAgIHJldHVybiBOT1RBVElPTi5TRVBBUkFUT1I7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uSEVMTTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgaGFzIHVuZXhwZWN0ZWQgbm90YXRpb24gJyR7dGhpcy51bml0c30nLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gb2YgdGhlIHNwZWNpZmllZCBub3RhdGlvbiB0eXBlIGFuZCB0aGUgc2FtZVxuICAgKiBsZW5ndGggYXMgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7Tk9UQVRJT059IHRhcmdldE5vdGF0aW9uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHByb3RlY3RlZCBnZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogREcuQ29sdW1uIHtcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbjtcbiAgICBjb25zdCBsZW4gPSBjb2wubGVuZ3RoO1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb3RhdGlvbi50b0xvd2VyQ2FzZSgpICsgJygnICsgY29sLm5hbWUgKyAnKSc7XG4gICAgY29uc3QgbmV3Q29sTmFtZSA9IGNvbC5kYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKG5hbWUpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmV3Q29sTmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdGFyZ2V0Tm90YXRpb24pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5DRUxMX1JFTkRFUkVSLCAnTWFjcm9tb2xlY3VsZScpO1xuXG4gICAgY29uc3Qgc3JjQWxpZ25lZCA9IGNvbC5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcbiAgICBpZiAoc3JjQWxpZ25lZClcbiAgICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBzcmNBbGlnbmVkKTtcblxuICAgIGNvbnN0IHNyY0FscGhhYmV0ID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0KTtcbiAgICBpZiAoc3JjQWxwaGFiZXQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXQsIHNyY0FscGhhYmV0KTtcblxuICAgIGxldCBzcmNBbHBoYWJldFNpemU6IHN0cmluZyA9IGNvbC5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgIGlmIChzcmNBbHBoYWJldFNpemUpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRTaXplLCBzcmNBbHBoYWJldFNpemUpO1xuXG4gICAgY29uc3Qgc3JjQWxwaGFiZXRJc011bHRpY2hhcjogc3RyaW5nID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpO1xuICAgIGlmIChzcmNBbHBoYWJldElzTXVsdGljaGFyICE9PSB1bmRlZmluZWQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciwgc3JjQWxwaGFiZXRJc011bHRpY2hhcik7XG5cbiAgICBpZiAodGFyZ2V0Tm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSkge1xuICAgICAgc3JjQWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKS50b1N0cmluZygpO1xuICAgICAgbmV3Q29sdW1uLnNldFRhZyhUQUdTLmFscGhhYmV0U2l6ZSwgc3JjQWxwaGFiZXRTaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gdXNpbmcgdGVtcGxhdGVDb2wgYXMgYSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gdGVtcGxhdGVDb2wgIHRoZSBwcm9wZXJ0aWVzIGFuZCB1bml0cyBvZiB0aGlzIGNvbHVtbiBhcmUgdXNlZCBhcyBhXG4gICAqIHRlbXBsYXRlIHRvIGJ1aWxkIHRoZSBuZXcgb25lXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uKHRlbXBsYXRlQ29sOiBERy5Db2x1bW4pOiBERy5Db2x1bW4ge1xuICAgIGNvbnN0IGNvbDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcih0ZW1wbGF0ZUNvbCk7XG4gICAgY29uc3QgdGFyZ2V0Tm90YXRpb24gPSBjb2wubm90YXRpb247XG4gICAgcmV0dXJuIGNvbC5nZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIGZ1bmN0aW9uIGNoZWNraW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgJ3VuaXRzJyBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXRzICB0aGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bml0c1N0cmluZ0lzVmFsaWQodW5pdHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHVuaXRzID0gdW5pdHMudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwcmVmaXhlcyA9IFtOT1RBVElPTi5GQVNUQSwgTk9UQVRJT04uU0VQQVJBVE9SLCBOT1RBVElPTi5IRUxNXTtcbiAgICBjb25zdCBwb3N0Zml4ZXMgPSBbJ3JuYScsICdkbmEnLCAncHQnXTtcblxuICAgIGNvbnN0IHByZWZpeENyaXRlcmlvbiA9IHByZWZpeGVzLnNvbWUoKHApID0+IHVuaXRzLnN0YXJ0c1dpdGgocC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgcmV0dXJuIHByZWZpeENyaXRlcmlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29sdW1uIG9mIHNlbWFudGljIHR5cGUgTUFDUk9NT0xFQ1VMRSBmcm9tIHRoZSBsaXN0IG9mXG4gICAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSAgICBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBjb2x1bW5cbiAgICogQHBhcmFtIHtzdHJpbmd9ICAgIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgICB1bml0cyAgdGhlIHVuaXRzIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uRnJvbVBhcmFtcyhcbiAgICBsZW46IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdW5pdHM6IHN0cmluZ1xuICApOiBERy5Db2x1bW4ge1xuICAgIC8vIFdBUk5JTkc6IGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXMgaW1wb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHVuaXF1ZW5lc3NcbiAgICAvLyBvZiB0aGUgbmV3IGNvbHVtbidzIG5hbWVcbiAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIHVuaXRzIHBhcmFtZXRlclxuICAgIGlmICghVW5pdHNIYW5kbGVyLnVuaXRzU3RyaW5nSXNWYWxpZCh1bml0cykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0IG9mIFxcJ3VuaXRzXFwnIHBhcmFtZXRlcicpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdW5pdHMpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICB0aGlzLl9jb2x1bW4gPSBjb2w7XG4gICAgY29uc3QgdW5pdHMgPSB0aGlzLl9jb2x1bW4udGFnc1tERy5UQUdTLlVOSVRTXTtcbiAgICBpZiAodW5pdHMgIT09IG51bGwpXG4gICAgICB0aGlzLl91bml0cyA9IHVuaXRzO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pdHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gY29sdW1uJyk7XG4gICAgdGhpcy5fbm90YXRpb24gPSB0aGlzLmdldE5vdGF0aW9uKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdhcFN5bWJvbCA9ICh0aGlzLmlzRmFzdGEoKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQSA6XG4gICAgICAodGhpcy5pc0hlbG0oKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNIDpcbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuU0VQQVJBVE9SO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFsaWduZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciBjb2x1bW4gJyR7dGhpcy5jb2x1bW4ubmFtZX0nIG9mIG5vdGF0aW9uICcke3RoaXMubm90YXRpb259JyBgICtcbiAgICAgICAgICBgdGFnICcke1RBR1MuYWxpZ25lZH0nIGlzIG1hbmRhdG9yeS5gKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoIXRoaXMuY29sdW1uLnRhZ3MuaGFzKFRBR1MuYWxwaGFiZXRTaXplKSkge1xuICAgIC8vICAgaWYgKHRoaXMuaXNIZWxtKCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gfVxuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpKSB7XG4gICAgICBpZiAodGhpcy5pc0hlbG0oKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgYCArXG4gICAgICAgICAgYHRhZyAnJHtUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXJ9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldElzTXVsdGljaGFyfScgaXMgbWFuZGF0b3J5LmApO1xuICAgIH1cbiAgfVxufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorLength, vectorDotProduct } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../aminoacids';\nimport { NucleotidesPalettes } from '../nucleotides';\nimport { UnknownSeqPalettes } from '../unknown';\nimport { UnitsHandler } from '../utils/units-handler';\n;\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStats(seqCol, minLength, splitter) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const seq of seqCol.categories) {\n const mSeq = splitter(seq);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\nexport const monomerRe = /\\[(\\w+)\\]|(\\w)|(-)/g;\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n let mRes;\n const m = ma[0];\n if (m.length > 1) {\n mRes = ma[1];\n }\n else {\n mRes = m;\n }\n return mRes;\n }).toArray();\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n var _a, _b;\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;\n const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return UnitsHandler.DnaFastaAlphabet;\n case \"RNA\" /* ALPHABET.RNA */:\n return UnitsHandler.RnaFastaAlphabet;\n case \"PT\" /* ALPHABET.PT */:\n return UnitsHandler.PeptideFastaAlphabet;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\nexport function detectAlphabet(stats) {\n const alphabetCandidates = [\n [\"PT\" /* ALPHABET.PT */, UnitsHandler.PeptideFastaAlphabet],\n [\"DNA\" /* ALPHABET.DNA */, UnitsHandler.DnaFastaAlphabet],\n [\"RNA\" /* ALPHABET.RNA */, UnitsHandler.RnaFastaAlphabet],\n ];\n // Calculate likelihoods for alphabet_candidates\n const alphabetCandidatesSim = alphabetCandidates.map((c) => getAlphabetSimilarity(stats.freq, c[1]));\n const maxCos = Math.max(...alphabetCandidatesSim);\n const alphabet = maxCos > 0.65 ? alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][0] : 'UN';\n return alphabet;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStats(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case 'PT':\n return AminoacidsPalettes.GrokGroups;\n case 'NT':\n case 'DNA':\n case 'RNA':\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n var _a;\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = (_a = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n })) !== null && _a !== void 0 ? _a : null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1hY3JvbW9sZWN1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFcEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUUvRixPQUFPLEVBQWEsa0JBQWtCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQTRCbkQsQ0FBQztBQU1GOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxNQUFpQixFQUFFLFNBQWlCLEVBQUUsUUFBc0I7SUFDbkYsTUFBTSxJQUFJLEdBQTRCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDdEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBRXZCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsSUFBSSxXQUFXLElBQUksSUFBSTtZQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVztZQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDNUIsS0FBSyxNQUFNLENBQUMs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QUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxtQ0FBSSxJQUFJLENBQUM7SUFDWCxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHd1IGZyb20gJ3d1JztcblxuaW1wb3J0IHtWZWN0b3J9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7dmVjdG9yTGVuZ3RoLCB2ZWN0b3JEb3RQcm9kdWN0fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4uL3NlcS1wYWxldHRlcyc7XG5pbXBvcnQge0FtaW5vYWNpZHMsIEFtaW5vYWNpZHNQYWxldHRlc30gZnJvbSAnLi4vYW1pbm9hY2lkcyc7XG5pbXBvcnQge051Y2xlb3RpZGVzLCBOdWNsZW90aWRlc1BhbGV0dGVzfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1Vua25vd25TZXFQYWxldHRlc30gZnJvbSAnLi4vdW5rbm93bic7XG5pbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi4vdXRpbHMvdW5pdHMtaGFuZGxlcic7XG5cblxuLyoqIGVudW0gdHlwZSB0byBzaW1wbGlmeSBzZXR0aW5nIFwidXNlci1mcmllbmRseVwiIG5vdGF0aW9uIGlmIG5lY2Vzc2FyeSAqL1xuZXhwb3J0IGNvbnN0IGVudW0gTk9UQVRJT04ge1xuICBGQVNUQSA9ICdmYXN0YScsXG4gIFNFUEFSQVRPUiA9ICdzZXBhcmF0b3InLFxuICBIRUxNID0gJ2hlbG0nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBTElHTk1FTlQge1xuICBTRVFfTVNBID0gJ1NFUS5NU0EnLFxuICBTRVEgPSAnU0VRJyxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQUxQSEFCRVQge1xuICBETkEgPSAnRE5BJyxcbiAgUk5BID0gJ1JOQScsXG4gIFBUID0gJ1BUJyxcbiAgVU4gPSAnVU4nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBUQUdTIHtcbiAgYWxpZ25lZCA9ICdhbGlnbmVkJyxcbiAgYWxwaGFiZXQgPSAnYWxwaGFiZXQnLFxuICBhbHBoYWJldFNpemUgPSAnLmFscGhhYmV0U2l6ZScsXG4gIGFscGhhYmV0SXNNdWx0aWNoYXIgPSAnLmFscGhhYmV0SXNNdWx0aWNoYXInLFxuICBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbn07XG5cbmV4cG9ydCB0eXBlIFNlcUNvbFN0YXRzID0geyBmcmVxOiBNb25vbWVyRnJlcXMsIHNhbWVMZW5ndGg6IGJvb2xlYW4gfVxuZXhwb3J0IHR5cGUgU3BsaXR0ZXJGdW5jID0gKHNlcTogc3RyaW5nKSA9PiBzdHJpbmdbXTtcbmV4cG9ydCB0eXBlIE1vbm9tZXJGcmVxcyA9IHsgW206IHN0cmluZ106IG51bWJlciB9O1xuXG4vKiogU3RhdHMgb2Ygc2VxdWVuY2VzIHdpdGggc3BlY2lmaWVkIHNwbGl0dGVyIGZ1bmMsIHJldHVybnMgeyBmcmVxLCBzYW1lTGVuZ3RoIH0uXG4gKiBAcGFyYW0ge0RHLkNvbHVtbn0gc2VxQ29sXG4gKiBAcGFyYW0ge251bWJlcn0gbWluTGVuZ3RoXG4gKiBAcGFyYW0ge1NwbGl0dGVyRnVuY30gc3BsaXR0ZXJcbiAqIEByZXR1cm4geyBTZXFDb2xTdGF0cyB9LCBzYW1lTGVuZ3RoOiBib29sZWFuIH0gc3RhdHMgb2YgY29sdW1uIHNlcXVlbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHMoc2VxQ29sOiBERy5Db2x1bW4sIG1pbkxlbmd0aDogbnVtYmVyLCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jKTogU2VxQ29sU3RhdHMge1xuICBjb25zdCBmcmVxOiB7IFttOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gIGxldCBmaXJzdExlbmd0aCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBzZXEgb2Ygc2VxQ29sLmNhdGVnb3JpZXMpIHtcbiAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcblxuICAgIGlmIChmaXJzdExlbmd0aCA9PSBudWxsKVxuICAgICAgZmlyc3RMZW5ndGggPSBtU2VxLmxlbmd0aDtcbiAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICBzYW1lTGVuZ3RoID0gZmFsc2U7XG5cbiAgICBpZiAobVNlcS5sZW5ndGggPj0gbWluTGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbVNlcSkge1xuICAgICAgICBpZiAoIShtIGluIGZyZXEpKVxuICAgICAgICAgIGZyZXFbbV0gPSAwO1xuICAgICAgICBmcmVxW21dICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7ZnJlcTogZnJlcSwgc2FtZUxlbmd0aDogc2FtZUxlbmd0aH07XG59XG5cbmV4cG9ydCBjb25zdCBtb25vbWVyUmU6IFJlZ0V4cCA9IC9cXFsoXFx3KylcXF18KFxcdyl8KC0pL2c7XG5cbi8qKiBTcGxpdCBzZXF1ZW5jZSBmb3Igc2luZ2xlIGNoYXJhY3RlciBtb25vbWVycywgc3F1YXJlIGJyYWNrZXRzIG11bHRpY2hhciBtb25vbWVyIG5hbWVzIG9yIGdhcCBzeW1ib2wuXG4gKiBAcGFyYW0ge2FueX0gc2VxIG9iamVjdCB3aXRoIHNlcXVlbmNlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gYXJyYXkgb2YgbW9ub21lcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNGYXN0YShzZXE6IGFueSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHd1PFJlZ0V4cE1hdGNoQXJyYXk+KHNlcS50b1N0cmluZygpLm1hdGNoQWxsKG1vbm9tZXJSZSkpXG4gICAgLm1hcCgobWE6IFJlZ0V4cE1hdGNoQXJyYXkpID0+IHtcbiAgICAgIGxldCBtUmVzOiBzdHJpbmc7XG4gICAgICBjb25zdCBtOiBzdHJpbmcgPSBtYVswXTtcbiAgICAgIGlmIChtLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbVJlcyA9IG1hWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbVJlcyA9IG07XG4gICAgICB9XG4gICAgICByZXR1cm4gbVJlcztcbiAgICB9KS50b0FycmF5KCk7XG59XG5cbi8qKiBHZXRzIG1ldGhvZCB0byBzcGxpdCBzZXF1ZW5jZSBieSBzZXBhcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvcjogc3RyaW5nLCBsaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKTogU3BsaXR0ZXJGdW5jIHtcbiAgcmV0dXJuIChzZXE6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBzZXEuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH07XG59XG5cbmNvbnN0IGhlbG1SZTogUmVnRXhwID0gLyhQRVBUSURFMXxETkExfFJOQTEpXFx7KFtefV0rKX0vZztcbmNvbnN0IGhlbG1QcDFSZTogUmVnRXhwID0gL1xcWyhbXlxcW1xcXV0rKV0vZztcblxuLyoqIFNwbGl0cyBIZWxtIHN0cmluZyB0byBtb25vbWVycywgYnV0IGRvZXMgbm90IHJlcGxhY2UgbW9ub21lciBuYW1lcyB0byBvdGhlciBub3RhdGlvbiAoZS5nLiBmb3IgUk5BKS5cbiAqIE9ubHkgZm9yIGxpbmVhciBwb2x5bWVycywgZG9lcyBub3Qgc3BsaXQgUk5BIGZvciByaWJvc2UgYW5kIHBob3NwaGF0ZSBtb25vbWVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXEgU291cmNlIHN0cmluZyBvZiBIRUxNIG5vdGF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNIZWxtKHNlcTogYW55KTogc3RyaW5nW10ge1xuICBoZWxtUmUubGFzdEluZGV4ID0gMDtcbiAgY29uc3QgZWE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBoZWxtUmUuZXhlYyhzZXEudG9TdHJpbmcoKSk7XG4gIGNvbnN0IGluU2VxOiBzdHJpbmcgfCBudWxsID0gZWEgPyBlYVsyXSA6IG51bGw7XG5cbiAgY29uc3QgbW1Qb3N0UHJvY2VzcyA9IChtbTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBoZWxtUHAxUmUubGFzdEluZGV4ID0gMDtcbiAgICBjb25zdCBwcDFNID0gaGVsbVBwMVJlLmV4ZWMobW0pO1xuICAgIGlmIChwcDFNICYmIHBwMU0ubGVuZ3RoID49IDIpXG4gICAgICByZXR1cm4gcHAxTVsxXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbW07XG4gIH07XG5cbiAgY29uc3QgbW1MaXN0OiBzdHJpbmdbXSA9IGluU2VxID8gaW5TZXEuc3BsaXQoJy4nKSA6IFtdO1xuICByZXR1cm4gbW1MaXN0Lm1hcChtbVBvc3RQcm9jZXNzKTtcbn1cblxuLyoqIEdldCBzcGxpdHRlciBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2VzIHRvIG1vbm9tZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXIodW5pdHM6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBTcGxpdHRlckZ1bmMge1xuICBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE5PVEFUSU9OLkZBU1RBKSlcbiAgICByZXR1cm4gc3BsaXR0ZXJBc0Zhc3RhO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICByZXR1cm4gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvciwgbGltaXQpO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgcmV0dXJuIHNwbGl0dGVyQXNIZWxtO1xuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHVuaXRzICR7dW5pdHN9IC5gKTtcblxuICAvLyBUT0RPOiBTcGxpdHRlciBmb3IgSEVMTVxufVxuXG4vKiogR2VuZXJhdGUgc3BsaXR0ZXIgZnVuY3Rpb24gZm9yIHNlcXVlbmNlIGNvbHVtblxuICogQHBhcmFtIHtERy5Db2x1bW59IGNvbFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfSBTcGxpdHRlciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4oY29sOiBERy5Db2x1bW4pOiBTcGxpdHRlckZ1bmMge1xuICBpZiAoY29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdldCBzcGxpdHRlciBmb3Igc2VtVHlwZSBcIiR7REcuU0VNVFlQRS5NQUNST01PTEVDVUxFfVwiIG9ubHkuYCk7XG5cbiAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICBjb25zdCBzZXBhcmF0b3IgPSBjb2wuZ2V0VGFnKFRBR1Muc2VwYXJhdG9yKTtcbiAgcmV0dXJuIGdldFNwbGl0dGVyKHVuaXRzLCBzZXBhcmF0b3IpO1xufVxuXG5jb25zdCBsb25nTW9ub21lclBhcnRSZTogUmVnRXhwID0gLyhcXHcrKS9nO1xuXG4vKiogQ29udmVydCBsb25nIG1vbm9tZXIgbmFtZXMgdG8gc2hvcnQgb25lcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbm9tZXJUb1Nob3J0KGFtaW5vOiBzdHJpbmcsIG1heExlbmd0aE9mTW9ub21lcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvcnRBbWlub01hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IGFtaW5vLm1hdGNoKGxvbmdNb25vbWVyUGFydFJlKTtcbiAgY29uc3QgbmVlZEFkZERvdHM6IGJvb2xlYW4gPSBhbWluby5sZW5ndGggPiBtYXhMZW5ndGhPZk1vbm9tZXIgfHwgKHNob3J0QW1pbm9NYXRjaD8ubGVuZ3RoID8/IDApID4gMTtcbiAgY29uc3Qgc2hvcnRBbWlubyA9IHNob3J0QW1pbm9NYXRjaD8uWzBdID8/ICcgJztcbiAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG59XG5cbi8qKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0KGFscGhhYmV0OiBBTFBIQUJFVCk6IFNldDxzdHJpbmc+IHtcbiAgc3dpdGNoIChhbHBoYWJldCkge1xuICBjYXNlIEFMUEhBQkVULkROQTpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXQ7XG4gIGNhc2UgQUxQSEFCRVQuUk5BOlxuICAgIHJldHVybiBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldDtcbiAgY2FzZSBBTFBIQUJFVC5QVDpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0O1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYWxwaGFiZXQgJyR7YWxwaGFiZXR9Jy5gKTtcbiAgfVxufVxuXG4vKiogQ2FsY3VsYXRlIHNpbWlsYXJpdHkgaW4gY3VycmVudCBzZXF1ZW5jZSBhbmQgYWxwaGFiZXQuXG4gKiBAcGFyYW0ge01vbm9tZXJGcmVxc30gZnJlcVxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYWxwaGFiZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXBTeW1ib2xcbiAqIEByZXR1cm4ge251bWJlcn0gQ29zaW5lIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0U2ltaWxhcml0eShmcmVxOiBNb25vbWVyRnJlcXMsIGFscGhhYmV0OiBTZXQ8c3RyaW5nPiwgZ2FwU3ltYm9sOiBzdHJpbmcgPSAnLScpOiBudW1iZXIge1xuICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKGZyZXEpKSwgLi4uYWxwaGFiZXRdKTtcbiAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcblxuICBjb25zdCBmcmVxQTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgYWxwaGFiZXRBOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG0gb2Yga2V5cykge1xuICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgIGFscGhhYmV0QS5wdXNoKGFscGhhYmV0LmhhcyhtKSA/IDEgOiAwKTtcbiAgfVxuICAvKiBUaGVyZSB3ZXJlIGEgZmV3IGlkZWFzOiBjaGktc3F1YXJlZCwgcGVhcnNvbiBjb3JyZWxhdGlvbiAodmFyaWFuY2U/KSwgc2NhbGFyIHByb2R1Y3QgKi9cbiAgY29uc3QgZnJlcVY6IFZlY3RvciA9IG5ldyBWZWN0b3IoZnJlcUEpO1xuICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgcmV0dXJuIHZlY3RvckRvdFByb2R1Y3QoZnJlcVYsIGFscGhhYmV0VikgLyAodmVjdG9yTGVuZ3RoKGZyZXFWKSAqIHZlY3Rvckxlbmd0aChhbHBoYWJldFYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEFscGhhYmV0KHN0YXRzOiBTZXFDb2xTdGF0cyk6IHN0cmluZyB7XG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlczogW3N0cmluZywgU2V0PHN0cmluZz5dW10gPSBbXG4gICAgW0FMUEhBQkVULlBULCBVbml0c0hhbmRsZXIuUGVwdGlkZUZhc3RhQWxwaGFiZXRdLFxuICAgIFtBTFBIQUJFVC5ETkEsIFVuaXRzSGFuZGxlci5EbmFGYXN0YUFscGhhYmV0XSxcbiAgICBbQUxQSEFCRVQuUk5BLCBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldF0sXG4gIF07XG5cbiAgLy8gQ2FsY3VsYXRlIGxpa2VsaWhvb2RzIGZvciBhbHBoYWJldF9jYW5kaWRhdGVzXG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlc1NpbTogbnVtYmVyW10gPSBhbHBoYWJldENhbmRpZGF0ZXMubWFwKFxuICAgIChjKSA9PiBnZXRBbHBoYWJldFNpbWlsYXJpdHkoc3RhdHMuZnJlcSwgY1sxXSkpO1xuICBjb25zdCBtYXhDb3MgPSBNYXRoLm1heCguLi5hbHBoYWJldENhbmRpZGF0ZXNTaW0pO1xuICBjb25zdCBhbHBoYWJldCA9IG1heENvcyA+IDAuNjUgPyBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMF0gOiAnVU4nO1xuICByZXR1cm4gYWxwaGFiZXQ7XG59XG5cbi8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbCBDb2x1bW4gdG8gbG9vayBmb3IgYSBwYWxldHRlXG4gKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBQYWxldHRlKHNlcUNvbDogREcuQ29sdW1uLCBtaW5MZW5ndGg6IG51bWJlciA9IDUpOiBTZXFQYWxldHRlIHtcbiAgbGV0IGFscGhhYmV0OiBzdHJpbmc7XG4gIGlmIChzZXFDb2wuc2VtVHlwZSA9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpIHtcbiAgICBjb25zdCB1aDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcihzZXFDb2wpO1xuICAgIGFscGhhYmV0ID0gdWguYWxwaGFiZXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RhdHM6IFNlcUNvbFN0YXRzID0gZ2V0U3RhdHMoc2VxQ29sLCBtaW5MZW5ndGgsIHNwbGl0dGVyQXNGYXN0YSk7XG4gICAgYWxwaGFiZXQgPSBkZXRlY3RBbHBoYWJldChzdGF0cyk7XG4gIH1cblxuICBjb25zdCByZXMgPSBnZXRQYWxldHRlQnlUeXBlKGFscGhhYmV0KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbGV0dGVCeVR5cGUocGFsZXR0ZVR5cGU6IHN0cmluZyk6IFNlcVBhbGV0dGUge1xuICBzd2l0Y2ggKHBhbGV0dGVUeXBlKSB7XG4gIGNhc2UgJ1BUJzpcbiAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gIGNhc2UgJ05UJzpcbiAgY2FzZSAnRE5BJzpcbiAgY2FzZSAnUk5BJzpcbiAgICByZXR1cm4gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgLy8gb3RoZXJcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBTZXFDb2woZGY6IERHLkRhdGFGcmFtZSk6IERHLkNvbHVtbiB8IG51bGwge1xuICBjb25zdCBzZW1UeXBlQ29sTGlzdCA9IGRmLmNvbHVtbnMuYnlTZW1UeXBlQWxsKERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSk7XG4gIGxldCByZXNDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBzZW1UeXBlQ29sTGlzdC5maW5kKChjb2wpID0+IHtcbiAgICBjb25zdCB1bml0cyA9IGNvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gICAgcmV0dXJuIHVuaXRzID8gdW5pdHMuaW5kZXhPZignTVNBJykgIT09IC0xIDogZmFsc2U7XG4gIH0pID8/IG51bGw7XG4gIGlmICghcmVzQ29sICYmIHNlbVR5cGVDb2xMaXN0Lmxlbmd0aCA+IDApXG4gICAgcmVzQ29sID0gc2VtVHlwZUNvbExpc3RbMF07XG4gIHJldHVybiByZXNDb2w7XG59XG4iXX0=","import { monomerToShort } from './macromolecule';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/**\n * A function that prints a string aligned to left or centered.\n *\n * @param {number} x x coordinate.\n * @param {number} y y coordinate.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {string} s String to print.\n * @param {string} [color=undefinedColor] String color.\n * @param {number} [pivot=0] Pirvot.\n * @param {boolean} [left=false] Is left aligned.\n * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent\n * @param {string} [separator=''] Is separator for sequence.\n * @param {boolean} [last=false] Is checker if element last or not.\n * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param maxWord Is array of max words for each line.\n * @param wordIdx Is index of word we currently draw.\n * @param gridCell Is grid cell.\n * @param referenceSequence Is reference sequence for diff mode.\n * @param maxLengthOfMonomer Is max length of monomer.\n * @return {number} x coordinate to start printing at.\n */\nexport const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {\n var _a, _b, _c;\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA) {\n grayPart = '';\n }\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;\n compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;\n highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n }\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null) {\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n }\n let textSize = g.measureText(colorPart + grayPart);\n const indent = 5;\n let maxColorTextSize = g.measureText(colorPart).width;\n let colorTextSize = g.measureText(colorPart).width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA) {\n g.fillStyle = drawColor;\n g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);\n }\n }\n if (left || textSize > w) {\n draw(indent, indent + maxColorTextSize);\n return x + maxColorTextSize + g.measureText(grayPart).width;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + dx + maxColorTextSize;\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNlbGwtcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBMEQsY0FBYyxDQUFDO0FBRXJHLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUMxQyxDQUEyQixFQUFFLENBQVMsRUFBRSxRQUFnQixjQUFjLEVBQ3RFLFFBQWdCLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLG1CQUEyQixHQUFHLEVBQy9ELFlBQW9CLEVBQUUsRUFBRSxPQUFnQixLQUFLLEVBQUUsWUFBdUIsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUF1QyxFQUFFLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLFdBQStCLElBQUksRUFBRSxvQkFBOEIsRUFBRSxFQUFFLHFCQUFvQyxJQUFJLEVBQVUsRUFBRTs7SUFDcFIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDdEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxD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QyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7S0FFN0Q7U0FBTTtRQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztLQUNsQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7bW9ub21lclRvU2hvcnR9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG5cbmNvbnN0IHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuY29uc3QgYmxhY2tDb2xvciA9ICdyZ2IoMCwwLDApJztcbmNvbnN0IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb246IChhbWlubzogc3RyaW5nLCBtYXhMZW5ndGhPZk1vbm9tZXI6IG51bWJlcikgPT4gc3RyaW5nID0gbW9ub21lclRvU2hvcnQ7XG5cbmV4cG9ydCBlbnVtIERyYXdTdHlsZSB7XG4gIE1TQSA9ICdNU0EnLFxuICBjbGFzc2ljID0gJ2NsYXNzaWMnLFxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBwcmludHMgYSBzdHJpbmcgYWxpZ25lZCB0byBsZWZ0IG9yIGNlbnRlcmVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IHggY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IHkgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3IFdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGggSGVpZ2h0LlxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGcgQ2FudmFzIHJlbmRlcmluZyBjb250ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nIHRvIHByaW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcj11bmRlZmluZWRDb2xvcl0gU3RyaW5nIGNvbG9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwaXZvdD0wXSBQaXJ2b3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsZWZ0PWZhbHNlXSBJcyBsZWZ0IGFsaWduZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zcGFyZW5jeVJhdGU9MC4wXSBUcmFuc3BhcmVuY3kgcmF0ZSB3aGVyZSAxLjAgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScnXSBJcyBzZXBhcmF0b3IgZm9yIHNlcXVlbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbbGFzdD1mYWxzZV0gSXMgY2hlY2tlciBpZiBlbGVtZW50IGxhc3Qgb3Igbm90LlxuICogQHBhcmFtIGRyYXdTdHlsZSBJcyBkcmF3IHN0eWxlLiBNU0EgLSBmb3IgbXVsdGljaGFyU2VxLCBjbGFzc2ljIC0gZm9yIG90aGVyIHNlcS5cbiAqIEBwYXJhbSBtYXhXb3JkIElzIGFycmF5IG9mIG1heCB3b3JkcyBmb3IgZWFjaCBsaW5lLlxuICogQHBhcmFtIHdvcmRJZHggSXMgaW5kZXggb2Ygd29yZCB3ZSBjdXJyZW50bHkgZHJhdy5cbiAqIEBwYXJhbSBncmlkQ2VsbCBJcyBncmlkIGNlbGwuXG4gKiBAcGFyYW0gcmVmZXJlbmNlU2VxdWVuY2UgSXMgcmVmZXJlbmNlIHNlcXVlbmNlIGZvciBkaWZmIG1vZGUuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoT2ZNb25vbWVyIElzIG1heCBsZW5ndGggb2YgbW9ub21lci5cbiAqIEByZXR1cm4ge251bWJlcn0geCBjb29yZGluYXRlIHRvIHN0YXJ0IHByaW50aW5nIGF0LlxuICovXG5leHBvcnQgY29uc3QgcHJpbnRMZWZ0T3JDZW50ZXJlZCA9IChcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICBnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHM6IHN0cmluZywgY29sb3I6IHN0cmluZyA9IHVuZGVmaW5lZENvbG9yLFxuICBwaXZvdDogbnVtYmVyID0gMCwgbGVmdCA9IGZhbHNlLCB0cmFuc3BhcmVuY3lSYXRlOiBudW1iZXIgPSAxLjAsXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gJycsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSwgZHJhd1N0eWxlOiBEcmF3U3R5bGUgPSBEcmF3U3R5bGUuY2xhc3NpYywgbWF4V29yZDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge30sIHdvcmRJZHg6IG51bWJlciA9IDAsIGdyaWRDZWxsOiBERy5HcmlkQ2VsbCB8IG51bGwgPSBudWxsLCByZWZlcmVuY2VTZXF1ZW5jZTogc3RyaW5nW10gPSBbXSwgbWF4TGVuZ3RoT2ZNb25vbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IG51bWJlciA9PiB7XG4gIGcudGV4dEFsaWduID0gJ3N0YXJ0JztcbiAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICBsZXQgZ3JheVBhcnQgPSBsYXN0ID8gJycgOiBzZXBhcmF0b3I7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBncmF5UGFydCA9ICcnO1xuICB9XG4gIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICBsZXQgY29tcGFyZVdpdGhDdXJyZW50ID0gdHJ1ZTtcbiAgbGV0IGhpZ2hsaWdodERpZmZlcmVuY2UgPSAnZGlmZmVyZW5jZSc7XG4gIGlmICgoZ3JpZENlbGwgIT0gbnVsbCkgJiYgKGdyaWRDZWxsLmNlbGwuY29sdW1uICE9IG51bGwpKSB7XG4gICAgY29sb3JDb2RlID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29sb3ItY29kZSddID8/IHRydWU7XG4gICAgY29tcGFyZVdpdGhDdXJyZW50ID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSA/PyB0cnVlO1xuICAgIGhpZ2hsaWdodERpZmZlcmVuY2UgPSBncmlkQ2VsbC5jZWxsLmNvbHVtbi50ZW1wWydoaWdobGlnaHQtZGlmZmVyZW5jZSddID8/ICdkaWZmZXJlbmNlJztcblxuICB9XG4gIGNvbnN0IGN1cnJlbnRNb25vbWVyOiBzdHJpbmcgPSByZWZlcmVuY2VTZXF1ZW5jZVt3b3JkSWR4XTtcbiAgaWYgKGNvbXBhcmVXaXRoQ3VycmVudCAmJiAocmVmZXJlbmNlU2VxdWVuY2UubGVuZ3RoID4gMCkgJiYgKGhpZ2hsaWdodERpZmZlcmVuY2UgPT09ICdkaWZmZXJlbmNlJykpIHtcbiAgICB0cmFuc3BhcmVuY3lSYXRlID0gKGNvbG9yUGFydCA9PSBjdXJyZW50TW9ub21lcikgPyAwLjMgOiB0cmFuc3BhcmVuY3lSYXRlO1xuICB9XG4gIGlmIChjb21wYXJlV2l0aEN1cnJlbnQgJiYgKHJlZmVyZW5jZVNlcXVlbmNlLmxlbmd0aCA+IDApICYmIChoaWdobGlnaHREaWZmZXJlbmNlID09PSAnZXF1YWwnKSkge1xuICAgIHRyYW5zcGFyZW5jeVJhdGUgPSAoY29sb3JQYXJ0ICE9IGN1cnJlbnRNb25vbWVyKSA/IDAuMyA6IHRyYW5zcGFyZW5jeVJhdGU7XG4gIH1cbiAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgY29sb3JQYXJ0ID0gbW9ub21lclRvU2hvcnRGdW5jdGlvbihjb2xvclBhcnQsIG1heExlbmd0aE9mTW9ub21lcik7XG4gIH1cblxuXG4gIGxldCB0ZXh0U2l6ZTogYW55ID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQgKyBncmF5UGFydCk7XG4gIGNvbnN0IGluZGVudCA9IDU7XG5cbiAgbGV0IG1heENvbG9yVGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCkud2lkdGg7XG4gIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICBjb25zdCBkeSA9IGggLyAyIC0gKHRleHRTaXplLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIHRleHRTaXplLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpIC8gMiArIDE7XG4gIHRleHRTaXplID0gdGV4dFNpemUud2lkdGg7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBtYXhDb2xvclRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB0ZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3KGR4MTogbnVtYmVyLCBkeDI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRyYXdDb2xvciA9IGNvbG9yQ29kZSA/IGNvbG9yIDogYmxhY2tDb2xvcjtcbiAgICBnLmZpbGxTdHlsZSA9IGRyYXdDb2xvcjtcbiAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuY2xhc3NpYykge1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEsIHkgKyBkeSk7XG4gICAgICBnLmZpbGxTdHlsZSA9IGdyYXlDb2xvcjtcbiAgICAgIGcuZmlsbFRleHQoZ3JheVBhcnQsIHggKyBkeDIsIHkgKyBkeSk7XG4gICAgfVxuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgIGRyYXcoaW5kZW50LCBpbmRlbnQgKyBtYXhDb2xvclRleHRTaXplKTtcbiAgICByZXR1cm4geCArIG1heENvbG9yVGV4dFNpemUgKyBnLm1lYXN1cmVUZXh0KGdyYXlQYXJ0KS53aWR0aDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGR4ID0gKHcgLSB0ZXh0U2l6ZSkgLyAyO1xuICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgcmV0dXJuIHggKyBkeCArIG1heENvbG9yVGV4dFNpemU7XG4gIH1cbn07XG5cbiJdfQ==","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ('$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtRQUMvQixPQUFPLE1BQUMsR0FBYSxDQUFDLEtBQUssbUNBQUssR0FBYSxDQUFDLE9BQU8sQ0FBQztLQUN2RDtTQUFNO1FBQ0wsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9Db25zb2xlKGVycjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiBlcnIgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKCckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {findMonomers, parseHelm, getParts} from './utils';\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\n\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];\n const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;\n const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);\n let left = 0;\n let right = maxIndex;\n let found = false;\n maxLengthWordsSum[maxIndex + 1] = argsX + 1;\n let mid = 0;\n if (argsX > maxLengthWordsSum[0]) {\n while (!found) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < maxLengthWordsSum[mid]) {\n right = mid - 1;\n } else if (argsX > maxLengthWordsSum[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n }\n }\n left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;\n const monomers = findMonomers(gridCell.cell.value);\n const s: string = gridCell.cell.value ?? '';\n const subParts: string[] = parseHelm(s);\n const allParts: string[] = getParts(subParts, s);\n const tooltipMessage: HTMLElement[] = [];\n for (let i = 0; i < allParts.length; ++i) {\n if (monomers.has(allParts[i])) {\n tooltipMessage[i] = ui.divV([\n ui.divText(`Monomer ${allParts[i]} not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries')\n ]);\n }\n }\n (((tooltipMessage[left]?.childNodes.length ?? 0) > 0)) ?\n ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16) :\n ui.tooltip.hide();\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n }\n }\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const undefinedColor = 'rgb(100,100,100)';\n const grayColor = '#808080';\n const monomers = findMonomers(gridCell.cell.value);\n const s: string = gridCell.cell.value ?? '';\n const subParts: string[] = parseHelm(s);\n if (monomers.size == 0 && grid) {\n const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', gridCell.cell.value);\n gridCell.element = host;\n //@ts-ignore\n const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});\n return;\n } else {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h*r;\n g.canvas.style.height = `${h}px`;\n }\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n let x1 = x;\n const maxLengthWords: any = {};\n const maxLengthWordSum: any = {};\n const allParts: string[] = getParts(subParts, s);\n for (let i = 0; i < allParts.length; ++i) {\n maxLengthWords[i] = allParts[i].length * 7;\n const color = monomers.has(allParts[i]) ? 'red' : grayColor;\n g.fillStyle = undefinedColor;\n x1 = printLeftOrCentered(x1, y, w, h, g, allParts[i], color, 0, true, 1.0);\n }\n\n maxLengthWordSum[0] = maxLengthWords[0];\n for (let i = 1; i < allParts.length; i++)\n maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];\n\n gridCell.cell.column.temp = {\n 'helm-sum-maxLengthWords': maxLengthWordSum,\n 'helm-maxLengthWords': maxLengthWords\n };\n g.restore();\n return;\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn, getStats } from './macromolecule';\n/** Class for handling conversion of notation systems in Macromolecule columns */\nexport class NotationConverter extends UnitsHandler {\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === \"fasta\" /* NOTATION.FASTA */; }\n toSeparator(targetNotation) { return targetNotation === \"separator\" /* NOTATION.SEPARATOR */; }\n toHelm(targetNotation) { return targetNotation === \"helm\" /* NOTATION.HELM */; }\n /**\n * Convert a Macromolecule column from FASTA to SEPARATOR notation\n *\n * @param {string} separator A specific separator to be used\n * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default\n * @return {DG.Column} A new column in SEPARATOR notation\n */\n convertFastaToSeparator(separator, fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = this.defaultGapSymbol;\n const newColumn = this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n // assign the values to the newly created empty column\n newColumn.init((idx) => {\n const fastaPolymer = this.column.get(idx);\n const fastaMonomersArray = this.splitter(fastaPolymer);\n for (let i = 0; i < fastaMonomersArray.length; i++) {\n if (fastaMonomersArray[i] === fastaGapSymbol)\n fastaMonomersArray[i] = UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n return fastaMonomersArray.join(separator);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n return newColumn;\n }\n /**\n * Get the wrapper strings for HELM, depending on the type of the\n * macromolecule (peptide, DNA, RNA)\n *\n * @return {string[]} Array of wrappers\n */\n getHelmWrappers() {\n const prefix = (this.isDna()) ? 'DNA1{' :\n (this.isRna()) ? 'RNA1{' :\n (this.isPeptide()) ? 'PEPTIDE1{' :\n 'Unknown'; // this case should be handled as exceptional\n if (prefix === 'Unknown')\n throw new Error('Neither peptide, nor nucleotide');\n const postfix = '}$$$';\n const leftWrapper = (this.isDna()) ? 'D(' :\n (this.isRna()) ? 'R(' : ''; // no wrapper for peptides\n const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n // A helper function for converting strings to HELM\n convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {\n const monomerArray = this.splitter(sourcePolymer);\n const monomerHelmArray = monomerArray.map((mm) => {\n if (mm === sourceGapSymbol)\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n else\n return `${leftWrapper}${mm}${rightWrapper}`;\n });\n return `${prefix}${monomerHelmArray.join('.')}${postfix}`;\n }\n /**\n * Convert a string with SEPARATOR/FASTA notation to HELM\n *\n * @param {string} sourcePolymer A string to be converted\n * @param {string | null} sourceGapSymbol An optional gap symbol, set to\n * default values ('-' for FASTA and '' for SEPARATOR) unless specified\n * @return {string} The target HELM string\n */\n convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n }\n /**\n * Convert a column to HELM\n *\n * @param {string | null} sourceGapSymbol\n * @return {DG.Column}\n */\n convertToHelm(sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n const newColumn = this.getNewColumn(\"helm\" /* NOTATION.HELM */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const sourcePolymer = this.column.get(idx);\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n return newColumn;\n }\n /**\n * Convert SEPARATOR column to FASTA notation\n *\n * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA\n * @return {DG.Column} Converted column\n */\n convertSeparatorToFasta(fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = UnitsHandler._defaultGapSymbolsDict.FASTA;\n const newColumn = this.getNewColumn(\"fasta\" /* NOTATION.FASTA */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const separatorPolymer = this.column.get(idx);\n // items can be monomers or separators\n const separatorItemsArray = this.splitter(separatorPolymer);\n const fastaMonomersArray = [];\n for (let i = 0; i < separatorItemsArray.length; i++) {\n const item = separatorItemsArray[i];\n if (item.length === 0) {\n fastaMonomersArray.push(fastaGapSymbol);\n }\n else if (item.length > 1) {\n // the case of a multi-character monomer\n const monomer = '[' + item + ']';\n fastaMonomersArray.push(monomer);\n }\n else {\n fastaMonomersArray.push(item);\n }\n }\n return fastaMonomersArray.join('');\n });\n newColumn.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n return newColumn;\n }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} helmPolymer A string to be converted\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol) {\n if (!tgtGapSymbol) {\n tgtGapSymbol = (this.toFasta(tgtNotation)) ?\n UnitsHandler._defaultGapSymbolsDict.FASTA :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n if (!tgtSeparator) {\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n }\n const helmWrappersRe = /(R\\(|D\\(|\\)|P)/g;\n const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(helmPolymer);\n const tgtMonomersArray = [];\n for (let i = 0; i < helmItemsArray.length; i++) {\n let item = helmItemsArray[i];\n if (isNucleotide)\n item = item.replace(helmWrappersRe, '');\n if (item === UnitsHandler._defaultGapSymbolsDict.HELM) {\n tgtMonomersArray.push(tgtGapSymbol);\n }\n else if (this.toFasta(tgtNotation) && item.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + item + ']';\n tgtMonomersArray.push(monomer);\n }\n else {\n tgtMonomersArray.push(item);\n }\n }\n return tgtMonomersArray.join(tgtSeparator);\n }\n /**\n * Convert HELM column to FASTA/SEPARATOR\n *\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {DG.Column} Converted column\n */\n convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {\n // This function must not contain calls of isDna() and isRna(), for\n // source helm columns may contain RNA, DNA and PT across different rows\n const newColumn = this.getNewColumn(tgtNotation);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const helmPolymer = this.column.get(idx);\n return this.convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol);\n // we cannot use isDna() or isRna() because source helm columns can\n // contain DNA, RNA and PT in different cells, so the corresponding\n // tags cannot be set for the whole column\n });\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n const splitter = getSplitterForColumn(newColumn);\n const stats = getStats(newColumn, 5, splitter);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n return newColumn;\n }\n convertHelmToSeparator() {\n // TODO: implementatioreturn this.getNewColumn();\n return this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n }\n /** Dispatcher method for notation conversion\n *\n * @param {NOTATION} tgtNotation Notation we want to convert to\n * @param {string | null} tgtSeparator Possible separator\n * @return {DG.Column} Converted column\n */\n convert(tgtNotation, tgtSeparator = null) {\n // possible exceptions\n if (this.notation === tgtNotation)\n throw new Error('tgt notation is invalid');\n if (this.toSeparator(tgtNotation) && tgtSeparator === null)\n throw new Error('tgt separator is not specified');\n if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)\n return this.convertFastaToSeparator(tgtSeparator);\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))\n return this.convertToHelm();\n else if (this.isSeparator() && this.toFasta(tgtNotation))\n return this.convertSeparatorToFasta();\n else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM\n return this.convertHelm(tgtNotation);\n else if (this.isHelm() && this.toSeparator(tgtNotation))\n return this.convertHelm(tgtNotation, tgtSeparator);\n else\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90YXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm90YXRpb24tY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFFMUcsaUZBQWlGO0FBQ2pGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBR2pELElBQWMsUUFBUTtRQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxjQUF3QixJQUFhLE9BQU8sY0FBYyxpQ0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFFeEYsV0FBVyxDQUFDLGNBQXdCLElBQWEsT0FBTyxjQUFjLHlDQUF1QixDQUFDLENBQUMsQ0FBQztJQUVoRyxNQUFNLENBQUMsY0FBd0IsSUFBYSxPQUFPLGNBQWMsK0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTdGOzs7Ozs7T0FNRztJQUNLLHVCQUF1QixDQUFDLFNBQWlCLEVBQUUsaUJBQWdDLElBQUk7UUFDckYsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN6QixjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLHNDQUFvQixDQUFDO1FBQ3hELHNEQUFzRDtRQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FB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SSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFlBQWEsQ0FBQyxDQUFDOztZQUVwRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQjtnQkFDekMseUJBQXlCLElBQUksQ0FBQyxRQUFRLHlCQUF5QixXQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxZQUFtQixHQUFjO1FBQy9CLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQTdRTCxjQUFTLEdBQXdCLElBQUksQ0FBQztJQThROUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMgdG8gbWF0Y2ggZXh0ZXJuYWwgbW9kdWxlcyBpbiB3ZWJwYWNrIGNvbmZpZ3VyYXRpb24gKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7VW5pdHNIYW5kbGVyfSBmcm9tICcuL3VuaXRzLWhhbmRsZXInO1xuaW1wb3J0IHtnZXRTcGxpdHRlckZvckNvbHVtbiwgZ2V0U3RhdHMsIE5PVEFUSU9OLCBTZXFDb2xTdGF0cywgU3BsaXR0ZXJGdW5jLCBUQUdTfSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuXG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIGNvbnZlcnNpb24gb2Ygbm90YXRpb24gc3lzdGVtcyBpbiBNYWNyb21vbGVjdWxlIGNvbHVtbnMgKi9cbmV4cG9ydCBjbGFzcyBOb3RhdGlvbkNvbnZlcnRlciBleHRlbmRzIFVuaXRzSGFuZGxlciB7XG4gIHByaXZhdGUgX3NwbGl0dGVyOiBTcGxpdHRlckZ1bmMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZ2V0IHNwbGl0dGVyKCk6IFNwbGl0dGVyRnVuYyB7XG4gICAgaWYgKHRoaXMuX3NwbGl0dGVyID09PSBudWxsKVxuICAgICAgdGhpcy5fc3BsaXR0ZXIgPSBnZXRTcGxpdHRlckZvckNvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgcmV0dXJuIHRoaXMuX3NwbGl0dGVyO1xuICB9XG5cbiAgcHVibGljIHRvRmFzdGEodGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogYm9vbGVhbiB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gTk9UQVRJT04uRkFTVEE7IH1cblxuICBwdWJsaWMgdG9TZXBhcmF0b3IodGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogYm9vbGVhbiB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gTk9UQVRJT04uU0VQQVJBVE9SOyB9XG5cbiAgcHVibGljIHRvSGVsbSh0YXJnZXROb3RhdGlvbjogTk9UQVRJT04pOiBib29sZWFuIHsgcmV0dXJuIHRhcmdldE5vdGF0aW9uID09PSBOT1RBVElPTi5IRUxNOyB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBNYWNyb21vbGVjdWxlIGNvbHVtbiBmcm9tIEZBU1RBIHRvIFNFUEFSQVRPUiBub3RhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yICBBIHNwZWNpZmljIHNlcGFyYXRvciB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYXN0YUdhcFN5bWJvbCAgR2FwIHN5bWJvbCBpbiBGQVNUQSwgJy0nIGJ5IGRlZmF1bHRcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgICAgICAgQSBuZXcgY29sdW1uIGluIFNFUEFSQVRPUiBub3RhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RmFzdGFUb1NlcGFyYXRvcihzZXBhcmF0b3I6IHN0cmluZywgZmFzdGFHYXBTeW1ib2w6IHN0cmluZyB8IG51bGwgPSBudWxsKTogREcuQ29sdW1uIHtcbiAgICBpZiAoZmFzdGFHYXBTeW1ib2wgPT09IG51bGwpXG4gICAgICBmYXN0YUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcblxuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZW1wdHkgY29sdW1uXG4gICAgbmV3Q29sdW1uLmluaXQoKGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBmYXN0YVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcbiAgICAgIGNvbnN0IGZhc3RhTW9ub21lcnNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoZmFzdGFQb2x5bWVyKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFzdGFNb25vbWVyc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPT09IGZhc3RhR2FwU3ltYm9sKVxuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheVtpXSA9IFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LlNFUEFSQVRPUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYXN0YU1vbm9tZXJzQXJyYXkuam9pbihzZXBhcmF0b3IpO1xuICAgIH0pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgTk9UQVRJT04uU0VQQVJBVE9SKTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1Muc2VwYXJhdG9yLCBzZXBhcmF0b3IpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3cmFwcGVyIHN0cmluZ3MgZm9yIEhFTE0sIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGVcbiAgICogbWFjcm9tb2xlY3VsZSAocGVwdGlkZSwgRE5BLCBSTkEpXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiB3cmFwcGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRIZWxtV3JhcHBlcnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHByZWZpeCA9ICh0aGlzLmlzRG5hKCkpID8gJ0ROQTF7JyA6XG4gICAgICAodGhpcy5pc1JuYSgpKSA/ICdSTkExeycgOlxuICAgICAgICAodGhpcy5pc1BlcHRpZGUoKSkgPyAnUEVQVElERTF7JyA6XG4gICAgICAgICAgJ1Vua25vd24nOyAvLyB0aGlzIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYXMgZXhjZXB0aW9uYWxcblxuICAgIGlmIChwcmVmaXggPT09ICdVbmtub3duJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciBwZXB0aWRlLCBub3IgbnVjbGVvdGlkZScpO1xuXG4gICAgY29uc3QgcG9zdGZpeCA9ICd9JCQkJztcbiAgICBjb25zdCBsZWZ0V3JhcHBlciA9ICh0aGlzLmlzRG5hKCkpID8gJ0QoJyA6XG4gICAgICAodGhpcy5pc1JuYSgpKSA/ICdSKCcgOiAnJzsgLy8gbm8gd3JhcHBlciBmb3IgcGVwdGlkZXNcbiAgICBjb25zdCByaWdodFdyYXBwZXIgPSAodGhpcy5pc0RuYSgpIHx8IHRoaXMuaXNSbmEoKSkgPyAnKVAnIDogJyc7IC8vIG5vIHdyYXBwZXIgZm9yIHBlcHRpZGVzXG4gICAgcmV0dXJuIFtwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXhdO1xuICB9XG5cbiAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgc3RyaW5ncyB0byBIRUxNXG4gIHByaXZhdGUgY29udmVydFRvSGVsbUhlbHBlcihcbiAgICBzb3VyY2VQb2x5bWVyOiBzdHJpbmcsXG4gICAgc291cmNlR2FwU3ltYm9sOiBzdHJpbmcsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgbGVmdFdyYXBwZXI6IHN0cmluZyxcbiAgICByaWdodFdyYXBwZXI6IHN0cmluZyxcbiAgICBwb3N0Zml4OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb25vbWVyQXJyYXkgPSB0aGlzLnNwbGl0dGVyKHNvdXJjZVBvbHltZXIpO1xuICAgIGNvbnN0IG1vbm9tZXJIZWxtQXJyYXk6IHN0cmluZ1tdID0gbW9ub21lckFycmF5Lm1hcCgobW06IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG1tID09PSBzb3VyY2VHYXBTeW1ib2wpXG4gICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gYCR7bGVmdFdyYXBwZXJ9JHttbX0ke3JpZ2h0V3JhcHBlcn1gO1xuICAgIH0pO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHttb25vbWVySGVsbUFycmF5LmpvaW4oJy4nKX0ke3Bvc3RmaXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgc3RyaW5nIHdpdGggU0VQQVJBVE9SL0ZBU1RBIG5vdGF0aW9uIHRvIEhFTE1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBvbHltZXIgIEEgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHNvdXJjZUdhcFN5bWJvbCAgQW4gb3B0aW9uYWwgZ2FwIHN5bWJvbCwgc2V0IHRvXG4gICAqIGRlZmF1bHQgdmFsdWVzICgnLScgZm9yIEZBU1RBIGFuZCAnJyBmb3IgU0VQQVJBVE9SKSB1bmxlc3Mgc3BlY2lmaWVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gIFRoZSB0YXJnZXQgSEVMTSBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBjb252ZXJ0U3RyaW5nVG9IZWxtKFxuICAgIHNvdXJjZVBvbHltZXI6IHN0cmluZyxcbiAgICBzb3VyY2VHYXBTeW1ib2w6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICBjb25zdCBbcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4XSA9IHRoaXMuZ2V0SGVsbVdyYXBwZXJzKCk7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFRvSGVsbUhlbHBlcihzb3VyY2VQb2x5bWVyLCBzb3VyY2VHYXBTeW1ib2wsIHByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGNvbHVtbiB0byBIRUxNXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gc291cmNlR2FwU3ltYm9sXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHByaXZhdGUgY29udmVydFRvSGVsbShzb3VyY2VHYXBTeW1ib2w6IHN0cmluZyB8IG51bGwgPSBudWxsKTogREcuQ29sdW1uIHtcbiAgICBpZiAoc291cmNlR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgc291cmNlR2FwU3ltYm9sID0gdGhpcy5kZWZhdWx0R2FwU3ltYm9sO1xuXG4gICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuXG4gICAgY29uc3QgbmV3Q29sdW1uID0gdGhpcy5nZXROZXdDb2x1bW4oTk9UQVRJT04uSEVMTSk7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUG9seW1lciA9IHRoaXMuY29sdW1uLmdldChpZHgpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRvSGVsbUhlbHBlcihzb3VyY2VQb2x5bWVyLCBzb3VyY2VHYXBTeW1ib2whLCBwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXgpO1xuICAgIH0pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgTk9UQVRJT04uSEVMTSk7XG4gICAgcmV0dXJuIG5ld0NvbHVtbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IFNFUEFSQVRPUiBjb2x1bW4gdG8gRkFTVEEgbm90YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBmYXN0YUdhcFN5bWJvbCBPcHRpb25hbCBnYXAgc3ltYm9sIGZvciBGQVNUQVxuICAgKiBAcmV0dXJuIHtERy5Db2x1bW59ICBDb252ZXJ0ZWQgY29sdW1uXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRTZXBhcmF0b3JUb0Zhc3RhKGZhc3RhR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IERHLkNvbHVtbiB7XG4gICAgaWYgKGZhc3RhR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgZmFzdGFHYXBTeW1ib2wgPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQTtcblxuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLkZBU1RBKTtcbiAgICAvLyBhc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgZW1wdHkgY29sdW1uXG4gICAgbmV3Q29sdW1uLmluaXQoKGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzZXBhcmF0b3JQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAvLyBpdGVtcyBjYW4gYmUgbW9ub21lcnMgb3Igc2VwYXJhdG9yc1xuICAgICAgY29uc3Qgc2VwYXJhdG9ySXRlbXNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoc2VwYXJhdG9yUG9seW1lcik7XG4gICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcGFyYXRvckl0ZW1zQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHNlcGFyYXRvckl0ZW1zQXJyYXlbaV07XG4gICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKGZhc3RhR2FwU3ltYm9sISk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gdGhlIGNhc2Ugb2YgYSBtdWx0aS1jaGFyYWN0ZXIgbW9ub21lclxuICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKG1vbm9tZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFzdGFNb25vbWVyc0FycmF5LmpvaW4oJycpO1xuICAgIH0pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgTk9UQVRJT04uRkFTVEEpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogIENvbnZlcnQgSEVMTSBzdHJpbmcgdG8gRkFTVEEvU0VQQVJBVE9SXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWxtUG9seW1lciAgICBBIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRndE5vdGF0aW9uICAgIFRhcmdldCBub3RhdGlvbjogRkFTVEEgb3IgU0VQQVJBVE9SXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0Z3RTZXBhcmF0b3IgICBPcHRpb25hbCB0YXJnZXQgc2VwYXJhdG9yIChmb3IgSEVMTSAtPlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHRndEdhcFN5bWJvbCAgIE9wdGlvbmFsIHRhcmdldCBnYXAgc3ltYm9sXG4gICAqIFNFUEFSQVRPUilcbiAgICogQHJldHVybiB7c3RyaW5nfSBDb252ZXJ0ZWQgc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgY29udmVydEhlbG1Ub0Zhc3RhU2VwYXJhdG9yKFxuICAgIGhlbG1Qb2x5bWVyOiBzdHJpbmcsIFxuICAgIHRndE5vdGF0aW9uOiBzdHJpbmcsIFxuICAgIHRndFNlcGFyYXRvcj86IHN0cmluZywgXG4gICAgdGd0R2FwU3ltYm9sPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCF0Z3RHYXBTeW1ib2wpIHtcbiAgICAgIHRndEdhcFN5bWJvbCA9ICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24gYXMgTk9UQVRJT04pKSA/XG4gICAgICAgIFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LkZBU1RBIDpcbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuU0VQQVJBVE9SO1xuICAgIH1cblxuICAgIGlmICghdGd0U2VwYXJhdG9yKSB7XG4gICAgICB0Z3RTZXBhcmF0b3IgPSAodGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uIGFzIE5PVEFUSU9OKSkgPyAnJyA6IHRoaXMuc2VwYXJhdG9yO1xuICAgIH1cbiAgICBjb25zdCBoZWxtV3JhcHBlcnNSZSA9IC8oUlxcKHxEXFwofFxcKXxQKS9nO1xuICAgIGNvbnN0IGlzTnVjbGVvdGlkZSA9IGhlbG1Qb2x5bWVyLnN0YXJ0c1dpdGgoJ0ROQScpIHx8IGhlbG1Qb2x5bWVyLnN0YXJ0c1dpdGgoJ1JOQScpO1xuICAgIC8vIGl0ZW1zIGNhbiBiZSBtb25vbWVycyBvciBoZWxtc1xuICAgIGNvbnN0IGhlbG1JdGVtc0FycmF5ID0gdGhpcy5zcGxpdHRlcihoZWxtUG9seW1lcik7XG4gICAgY29uc3QgdGd0TW9ub21lcnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlbG1JdGVtc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgaXRlbSA9IGhlbG1JdGVtc0FycmF5W2ldO1xuICAgICAgaWYgKGlzTnVjbGVvdGlkZSlcbiAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZShoZWxtV3JhcHBlcnNSZSwgJycpO1xuICAgICAgaWYgKGl0ZW0gPT09IFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LkhFTE0pIHtcbiAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKHRndEdhcFN5bWJvbCEpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24gYXMgTk9UQVRJT04pICYmIGl0ZW0ubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyB0aGUgY2FzZSBvZiBhIG11bHRpLWNoYXJhY3RlciBtb25vbWVyIGNvbnZlcnRlZCB0byBGQVNUQVxuICAgICAgICBjb25zdCBtb25vbWVyID0gJ1snICsgaXRlbSArICddJztcbiAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKG1vbm9tZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGd0TW9ub21lcnNBcnJheS5qb2luKHRndFNlcGFyYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogIENvbnZlcnQgSEVMTSBjb2x1bW4gdG8gRkFTVEEvU0VQQVJBVE9SXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0Z3ROb3RhdGlvbiAgICBUYXJnZXQgbm90YXRpb246IEZBU1RBIG9yIFNFUEFSQVRPUlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGd0U2VwYXJhdG9yICAgT3B0aW9uYWwgdGFyZ2V0IHNlcGFyYXRvciAoZm9yIEhFTE0gLT5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RHYXBTeW1ib2wgICBPcHRpb25hbCB0YXJnZXQgZ2FwIHN5bWJvbFxuICAgKiBTRVBBUkFUT1IpXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gQ29udmVydGVkIGNvbHVtblxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbjogc3RyaW5nLCB0Z3RTZXBhcmF0b3I/OiBzdHJpbmcsIHRndEdhcFN5bWJvbD86IHN0cmluZyk6IERHLkNvbHVtbiB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjb250YWluIGNhbGxzIG9mIGlzRG5hKCkgYW5kIGlzUm5hKCksIGZvclxuICAgIC8vIHNvdXJjZSBoZWxtIGNvbHVtbnMgbWF5IGNvbnRhaW4gUk5BLCBETkEgYW5kIFBUIGFjcm9zcyBkaWZmZXJlbnQgcm93c1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKHRndE5vdGF0aW9uIGFzIE5PVEFUSU9OKTtcbiAgICAvLyBhc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgZW1wdHkgY29sdW1uXG4gICAgbmV3Q29sdW1uLmluaXQoKGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBoZWxtUG9seW1lciA9IHRoaXMuY29sdW1uLmdldChpZHgpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG1Ub0Zhc3RhU2VwYXJhdG9yKGhlbG1Qb2x5bWVyLCB0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yLCB0Z3RHYXBTeW1ib2wpO1xuICAgICAgLy8gd2UgY2Fubm90IHVzZSBpc0RuYSgpIG9yIGlzUm5hKCkgYmVjYXVzZSBzb3VyY2UgaGVsbSBjb2x1bW5zIGNhblxuICAgICAgLy8gY29udGFpbiBETkEsIFJOQSBhbmQgUFQgaW4gZGlmZmVyZW50IGNlbGxzLCBzbyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAgLy8gdGFncyBjYW5ub3QgYmUgc2V0IGZvciB0aGUgd2hvbGUgY29sdW1uXG4gICAgfSk7XG5cbiAgICAvLyBUQUdTLmFsaWduZWQgaXMgbWFuZGF0b3J5IGZvciBjb2x1bW5zIG9mIE5PVEFUSU9OLkZBU1RBIGFuZCBOT1RBVElPTi5TRVBBUkFUT1JcbiAgICBjb25zdCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4obmV3Q29sdW1uKTtcbiAgICBjb25zdCBzdGF0czogU2VxQ29sU3RhdHMgPSBnZXRTdGF0cyhuZXdDb2x1bW4sIDUsIHNwbGl0dGVyKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBhbGlnbmVkKTtcblxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRIZWxtVG9TZXBhcmF0b3IoKTogREcuQ29sdW1uIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGlvcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gIH1cblxuICAvKiogRGlzcGF0Y2hlciBtZXRob2QgZm9yIG5vdGF0aW9uIGNvbnZlcnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtOT1RBVElPTn0gdGd0Tm90YXRpb24gICBOb3RhdGlvbiB3ZSB3YW50IHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RTZXBhcmF0b3IgICBQb3NzaWJsZSBzZXBhcmF0b3JcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgICAgICAgICAgICAgICBDb252ZXJ0ZWQgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgY29udmVydCh0Z3ROb3RhdGlvbjogTk9UQVRJT04sIHRndFNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBERy5Db2x1bW4ge1xuICAgIC8vIHBvc3NpYmxlIGV4Y2VwdGlvbnNcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gdGd0Tm90YXRpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBub3RhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgaWYgKHRoaXMudG9TZXBhcmF0b3IodGd0Tm90YXRpb24pICYmIHRndFNlcGFyYXRvciA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGd0IHNlcGFyYXRvciBpcyBub3Qgc3BlY2lmaWVkJyk7XG5cbiAgICBpZiAodGhpcy5pc0Zhc3RhKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikgJiYgdGd0U2VwYXJhdG9yICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZhc3RhVG9TZXBhcmF0b3IodGd0U2VwYXJhdG9yKTtcbiAgICBlbHNlIGlmICgodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSAmJiB0aGlzLnRvSGVsbSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtKCk7XG4gICAgZWxzZSBpZiAodGhpcy5pc1NlcGFyYXRvcigpICYmIHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2VwYXJhdG9yVG9GYXN0YSgpO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSkgLy8gdGhlIGNhc2Ugb2YgSEVMTVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24pO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yISk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gJyArXG4gICAgICAgIGBmcm9tIHNvdXJjZSBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgdG8gdGFyZ2V0IG5vdGF0aW9uICcke3RndE5vdGF0aW9ufScuYCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICBzdXBlcihjb2wpO1xuICB9XG59XG4iXX0=","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\nimport {HelmWebEditor} from './helm-web-editor';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {findMonomers} from './utils';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport { NOTATION } from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const _package = new DG.Package();\nlet monomerLib: IMonomerLib | null = null;\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n return Promise.all([new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }), await grok.functions.call('Bio:getBioLib')]).then(([_, lib]: [void, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const monTypeList: string[] = monomerLib.getTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {\n return `${monType} ${monomerLib.getMonomerNamesByType(monType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n });\n}\n\nfunction rewriteLibraries() {\n org.helm.webeditor.Monomers.clear();\n monomerLib.getTypes().forEach((type) => {\n const mms = monomerLib.getMonomerNamesByType(type);\n mms.forEach((symbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib.getMonomer(type, symbol);\n const webEditorMonomer: WebEditorMonomer = {\n id: symbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at = {};\n monomer.rgroups.forEach(it => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer.data[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer.data[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer.data[SMILES].toString());\n } else {\n isBroken = true;\n }\n\n if (!isBroken)\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n });\n });\n\n // Obsolete\n let grid: DG.Grid = grok.shell.tv.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell?: DG.Cell, value?: string, units?: string) {\n const cellValue = typeof units === 'undefined' ? cell.value : value;\n const monomers = findMonomers(cellValue);\n if (monomers.size == 0) \n webEditor(cell, value, units);\n else\n grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n}\n\n//tags: cellEditor\n//description: Macromolecule \n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n let df = grok.shell.tv.grid.dataFrame;\n let col = df.columns.bySemType('Macromolecule');\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM) \n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n let converter = new NotationConverter(col);\n const resStr = converter.convertStringToHelm(mol, '/'); \n checkMonomersAndOpenWebEditor(df.currentCell, resStr, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, widgets\n//input: string helmString {semType: Macromolecule}\n//output: widget result\nexport async function propertiesPanel(helmString: string) {\n let grid = grok.shell.tv.grid;\n let parent = grid.root.parentElement;\n const host = ui.div([]);\n parent.appendChild(host);\n let editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n editor.setHelm(helmString);\n let formula = editor.getFormula(true);\n let molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n let coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n parent.lastChild.remove();\n return new DG.Widget(\n ui.tableFromMap({\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n })\n );\n}\n\nfunction webEditor(cell?: DG.Cell, value?: string, units?: string) {\n let view = ui.div();\n let df = grok.shell.tv.grid.dataFrame;\n let converter = new NotationConverter(df.columns.bySemType('Macromolecule'));\n org.helm.webeditor.MolViewer.molscale = 0.8;\n let app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n var sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n var s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n if (typeof units === 'undefined') {\n app.canvas.helm.setSequence(cell.value, 'HELM');\n } else {\n app.canvas.helm.setSequence(value, 'HELM');\n }\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n let helmValue = app.canvas.getHelm(true).replace(/<\\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');\n if (typeof units === 'undefined') {\n cell.value = helmValue;\n } else {\n let convertedRes = converter.convertHelmToFastaSeparator(helmValue, units);\n cell.value = convertedRes;\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res = {};\n let el = '';\n let digit;\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res \nexport function getMolfiles(col: DG.Column): DG.Column {\n let grid = grok.shell.tv.grid;\n let parent = grid.root.parentElement;\n let res = DG.Column.string('mols', col.length);\n const host = ui.div([]);\n parent.appendChild(host);\n let editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n res.init((i) => {\n editor.setHelm(col.get(i));\n let mol = editor.getMolfile();\n return mol;\n });\n parent.lastChild.remove();\n return res;\n}\n\n//name: helmWebEditor\n//output: object\nexport function helmWebEditor(): HelmWebEditor {\n return new HelmWebEditor();\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","grok","ui","DG","HelmWebEditor","constructor","w","h","this","host","style","width","height","editor","JSDraw2","Editor","viewonly","resizeEditor","setSize","createWebEditor","editorView","org","helm","webeditor","MolViewer","molscale","webEditor","scil","App","showabout","mexfontsize","mexrnapinontab","topmargin","mexmonomerstab","sequenceviewonly","mexfavoritefirst","mexfilter","sizes","calculateSizes","canvas","resize","rightwidth","topheight","s","bottomheight","apply","sequence","notation","toolbarheight","properties","parent","structureview","mex","setTimeout","setSequence","editorDiv","getParts","subParts","allParts","k","length","indexOfMonomer","indexOf","helmBeforeMonomer","slice","push","substring","parseHelm","split","monomers","Utils","isNullOrEmpty","seqs","i","p","detachAnnotation","str","ss","monomer","startsWith","includes","element","residue","endsWith","lastIndexOf","firstPiece","thirdPiece","elements","el","findMonomers","helmString","types","keys","monomerTypeList","monomerNames","Monomers","getMonomerSet","forEach","id","splitString","Set","filter","val","sep","ret","frag","parentheses","bracket","braces","quote","c","c2","_detachAppendix","tag","r","repeat","endswith","replace","RegExp","m","wu","Float32Array","vectorLength","v","sqrSum","Math","sqrt","static","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","super","Aminoacids","scheme","Error","isInner","inner","outer","char","isNaN","parseInt","_a","_b","_c","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","toUpperCase","AAFullNames","toLowerCase","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","UnknownColorPalette","concat","values","pI","hash","charCodeAt","hashCode","color","dgColor","g","b","distToBlack","pow","correctColor","buildPalette","col","semType","stats","getStats","splitterAsFasta","aligned","sameLength","alphabet","alphabetCandidates","alphabetCandidatesSim","map","freq","gapSymbol","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","getAlphabetSimilarity","maxCos","max","detectAlphabet","setTag","units","_units","column","_column","_notation","defaultGapSymbol","_defaultGapSymbol","separator","getTag","undefined","name","isFasta","isSeparator","getAlphabetSize","alphabetSizeStr","alphabetSize","splitter","getSplitterForColumn","console","warn","getAlphabetIsMultichar","isHelm","isRna","isDna","isPeptide","isMsa","getNotation","getNewColumn","targetNotation","len","newColName","dataFrame","columns","getUnusedName","newColumn","Array","fill","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","toString","templateCol","some","unitsStringIsValid","tags","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","seqCol","minLength","firstLength","seq","categories","mSeq","PeptideFastaAlphabet","DnaFastaAlphabet","RnaFastaAlphabet","monomerRe","matchAll","ma","mRes","toArray","helmRe","helmPp1Re","splitterAsHelm","lastIndex","ea","exec","inSeq","mm","pp1M","limit","getSplitterWithSeparator","getSplitter","longMonomerPartRe","DrawStyle","printLeftOrCentered","x","y","pivot","left","transparencyRate","last","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","maxLengthOfMonomer","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","cell","temp","currentMonomer","shortAminoMatch","match","needAddDots","shortAmino","monomerToShortFunction","textSize","measureText","maxColorTextSize","colorTextSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","dx","errorToConsole","err","String","stack","message","HelmCellRenderer","cellType","defaultWidth","defaultHeight","onMouseMove","e","maxLengthWordsSum","maxIndex","argsX","offsetX","gridColumn","bounds","right","found","mid","floor","tooltipMessage","childNodes","errMsg","error","render","cellStyle","grid","gridRow","size","window","devicePixelRatio","min","save","beginPath","rect","clip","font","textBaseline","x1","maxLengthWords","maxLengthWordSum","restore","setAttribute","skin","NotationConverter","_splitter","toFasta","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","init","idx","fastaPolymer","fastaMonomersArray","join","getHelmWrappers","prefix","convertToHelmHelper","sourcePolymer","sourceGapSymbol","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","convertHelm","convertHelmToSeparator","convert","_package","monomerLib","initHelm","Promise","all","resolve","reject","dojo","ready","then","_","lib","rewriteLibraries","onChanged","subscribe","monTypeList","getTypes","msgStr","monType","getMonomerNamesByType","clear","type","symbol","isBroken","getMonomer","webEditorMonomer","molfile","n","na","naturalAnalog","rs","rgroups","polymerType","mt","monomerType","at","it","data","getRS","addOneMonomer","invalidate","helmCellRenderer","checkMonomersAndOpenWebEditor","view","df","converter","bySemType","app","showHeader","showFooter","add","onOK","helmValue","getHelm","convertedRes","show","modal","fullScreen","from","editMoleculeCell","openEditor","mol","currentCell","resStr","propertiesPanel","root","parentElement","appendChild","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","lastChild","remove","smiles","newS","res","digit","test","j","getMolfiles","getMolfile","helmWebEditor"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"package.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"DG\"","webpack://helm/./src/helm-web-editor.ts","webpack://helm/./src/utils.ts","webpack://helm/external var \"wu\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://helm/./src/cell-renderer.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://helm/./src/package.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport class HelmWebEditor {\n host: any;\n editor: any;\n w = 200;\n h = 100;\n constructor() {\n this.host = ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});\n this.editor = new JSDraw2.Editor(this.host, {width: this.w, height: this.h, viewonly: true});\n }\n\n resizeEditor(w: number, h: number) {\n this.editor.setSize(w, h);\n }\n\n createWebEditor(value: string) {\n const editorView = ui.div();\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const webEditor = new scil.helm.App(editorView, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = webEditor.calculateSizes();\n webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(webEditor.sequence.style, s);\n //@ts-ignore\n scil.apply(webEditor.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(webEditor.properties.parent.style, s);\n webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);\n webEditor.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n webEditor.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n return {editorDiv: editorView, webEditor: webEditor};\n }\n}\n\n","import * as DG from 'datagrok-api/dg';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements =[firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n/* this function returns names of monomers that are NOT in the monomer library */\nexport function findMonomers(helmString: string) {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n const splitString = parseHelm(helmString);\n return new Set(splitString.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","import { CandidateType } from './types';\nexport const monomerRe = /(\\[[A-Za-z0-9-_]+\\]|.)/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(\"PT\" /* ALPHABET.PT */, Alphabets.fasta.peptide, 0.50),\n new CandidateType(\"DNA\" /* ALPHABET.DNA */, Alphabets.fasta.dna, 0.55),\n new CandidateType(\"RNA\" /* ALPHABET.RNA */, Alphabets.fasta.rna, 0.55),\n];\n//# sourceMappingURL=consts.js.map","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],\n [1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],\n [0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],\n [0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1]];\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 8,\n gapExtend: 2,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix */\nexport function needlemanWunch(args) {\n return (seq1, seq2) => {\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = Object.assign(Object.assign({}, defaultArgs), args);\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Array(seq1.length + 1).fill(0),\n new Array(seq1.length + 1).fill(0)\n ];\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++)\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] + scoringMatrix[alphabetIndexes[seq1[j - 1]]][alphabetIndexes[seq2[i - 1]]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need to invert the result\n return -matrix[prevRow][seq1.length];\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFD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QUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDeEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDM0I7cUJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUN0QyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN4QixjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUN2QixjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUMzQjthQUNGO1lBQ0QsWUFBWTtZQUNaLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDbEIsT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QjtRQUNELDZFQUE2RTtRQUM3RSwrQkFBK0I7UUFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIEJsb3N1bSA2MiBtYXRyaXggZm9yIHByb3RlaW4gc2VxdWVuY2VzXG5jb25zdCBCTE9TVU02MjpBcnJheTxBcnJheTxudW1iZXI+PiA9XG5bWzQsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDAsIC0zLCAtMiwgMCwgLTIsIC0xLCAwLCAtNF0sXG4gIFstMSwgNSwgMCwgLTIsIC0zLCAxLCAwLCAtMiwgMCwgLTMsIC0yLCAyLCAtMSwgLTMsIC0yLCAtMSwgLTEsIC0zLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTRdLFxuICBbLTIsIDAsIDYsIDEsIC0zLCAwLCAwLCAwLCAxLCAtMywgLTMsIDAsIC0yLCAtMywgLTIsIDEsIDAsIC00LCAtMiwgLTMsIDMsIDAsIC0xLCAtNF0sXG4gIFstMiwgLTIsIDEsIDYsIC0zLCAwLCAyLCAtMSwgLTEsIC0zLCAtNCwgLTEsIC0zLCAtMywgLTEsIDAsIC0xLCAtNCwgLTMsIC0zLCA0LCAxLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgOSwgLTMsIC00LCAtMywgLTMsIC0xLCAtMSwgLTMsIC0xLCAtMiwgLTMsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTMsIC0zLCAtMiwgLTRdLFxuICBbLTEsIDEsIDAsIDAsIC0zLCA1LCAyLCAtMiwgMCwgLTMsIC0yLCAxLCAwLCAtMywgLTEsIDAsIC0xLCAtMiwgLTEsIC0yLCAwLCAzLCAtMSwgLTRdLFxuICBbLTEsIDAsIDAsIDIsIC00LCAyLCA1LCAtMiwgMCwgLTMsIC0zLCAxLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTMsIC0yLCAtMiwgMSwgNCwgLTEsIC00XSxcbiAgWzAsIC0yLCAwLCAtMSwgLTMsIC0yLCAtMiwgNiwgLTIsIC00LCAtNCwgLTIsIC0zLCAtMywgLTIsIDAsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtNF0sXG4gIFstMiwgMCwgMSwgLTEsIC0zLCAwLCAwLCAtMiwgOCwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtMiwgLTEsIC0yLCAtMiwgMiwgLTMsIDAsIDAsIC0xLCAtNF0sXG4gIFstMSwgLTMsIC0zLCAtMywgLTEsIC0zLCAtMywgLTQsIC0zLCA0LCAyLCAtMywgMSwgMCwgLTMsIC0yLCAtMSwgLTMsIC0xLCAzLCAtMywgLTMsIC0xLCAtNF0sXG4gIFstMSwgLTIsIC0zLCAtNCwgLTEsIC0yLCAtMywgLTQsIC0zLCAyLCA0LCAtMiwgMiwgMCwgLTMsIC0yLCAtMSwgLTIsIC0xLCAxLCAtNCwgLTMsIC0xLCAtNF0sXG4gIFstMSwgMiwgMCwgLTEsIC0zLCAxLCAxLCAtMiwgLTEsIC0zLCAtMiwgNSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDAsIDEsIC0xLCAtNF0sXG4gIFstMSwgLTEsIC0yLCAtMywgLTEsIDAsIC0yLCAtMywgLTIsIDEsIDIsIC0xLCA1LCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIDEsIC0zLCAtMSwgLTEsIC00XSxcbiAgWy0yLCAtMywgLTMsIC0zLCAtMiwgLTMsIC0zLCAtMywgLTEsIDAsIDAsIC0zLCAwLCA2LCAtNCwgLTIsIC0yLCAxLCAzLCAtMSwgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMiwgLTEsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC00LCA3LCAtMSwgLTEsIC00LCAtMywgLTIsIC0yLCAtMSwgLTIsIC00XSxcbiAgWzEsIC0xLCAxLCAwLCAtMSwgMCwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgLTEsIC0yLCAtMSwgNCwgMSwgLTMsIC0yLCAtMiwgMCwgMCwgMCwgLTRdLFxuICBbMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDUsIC0yLCAtMiwgMCwgLTEsIC0xLCAwLCAtNF0sXG4gIFstMywgLTMsIC00LCAtNCwgLTIsIC0yLCAtMywgLTIsIC0yLCAtMywgLTIsIC0zLCAtMSwgMSwgLTQsIC0zLCAtMiwgMTEsIDIsIC0zLCAtNCwgLTMsIC0yLCAtNF0sXG4gIFstMiwgLTIsIC0yLCAtMywgLTIsIC0xLCAtMiwgLTMsIDIsIC0xLCAtMSwgLTIsIC0xLCAzLCAtMywgLTIsIC0yLCAyLCA3LCAtMSwgLTMsIC0yLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgLTEsIC0yLCAtMiwgLTMsIC0zLCAzLCAxLCAtMiwgMSwgLTEsIC0yLCAtMiwgMCwgLTMsIC0xLCA0LCAtMywgLTIsIC0xLCAtNF0sXG4gIFstMiwgLTEsIDMsIDQsIC0zLCAwLCAxLCAtMSwgMCwgLTMsIC00LCAwLCAtMywgLTMsIC0yLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAxLCAtMywgMywgNCwgLTIsIDAsIC0zLCAtMywgMSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTIsIDAsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC00XSxcbiAgWy00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgMV1dO1xuXG4vLyBQcm90ZWluIGluZGV4ZXMgZm9yIEJMT1NVTSBtYXRyaXhcbmNvbnN0IFByb3RJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfSA9IHtcbiAgJ0EnOiAwLCAnUic6IDEsICdOJzogMiwgJ0QnOiAzLCAnQyc6IDQsICdRJzogNSwgJ0UnOiA2LCAnRyc6IDcsICdIJzogOCxcbiAgJ0knOiA5LCAnTCc6IDEwLCAnSyc6IDExLCAnTSc6IDEyLCAnRic6IDEzLCAnUCc6IDE0LCAnUyc6IDE1LCAnVCc6IDE2LFxuICAnVyc6IDE3LCAnWSc6IDE4LCAnVic6IDE5LCAnQic6IDIwLCAnWic6IDIxLCAnWCc6IDIyLCAnKic6IDIzXG59O1xuXG5pbnRlcmZhY2UgTmVlZGxlbWFuV3VuY2hBcmdzIHtcbiAgZ2FwT3BlbjogbnVtYmVyO1xuICBnYXBFeHRlbmQ6IG51bWJlcjtcbiAgc2NvcmluZ01hdHJpeDogbnVtYmVyW11bXTtcbiAgYWxwaGFiZXRJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfTtcbn1cblxuY29uc3QgZGVmYXVsdEFyZ3M6IE5lZWRsZW1hbld1bmNoQXJncyA9IHtcbiAgZ2FwT3BlbjogOCxcbiAgZ2FwRXh0ZW5kOiAyLFxuICBzY29yaW5nTWF0cml4OiBCTE9TVU02MixcbiAgYWxwaGFiZXRJbmRleGVzOiBQcm90SW5kZXhlc1xufTtcblxuLyoqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyBiYXNlZCBvbiBnYXAgcGVuYWx0eSBhbmQgbWF0cml4ICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZGxlbWFuV3VuY2goYXJnczogUGFydGlhbDxOZWVkbGVtYW5XdW5jaEFyZ3M+KTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gICAgLy8gSW50ZWFkLCB3ZSB3aWxsIHN0b3JlIG9ubHkgdGhlIGxhc3QgdHdvIHJvd3NcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBbXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMCksXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMClcbiAgICBdO1xuICAgIC8vIHNpbWlsYXJseSwgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgb3BlcmF0aW9uIGxlZCB0byB0aGUgY3VycmVudCBjZWxsXG4gICAgLy8gaS5lLiB3aGV0aGVyIHdlIGNhbWUgZnJvbSB0aGUgbGVmdCwgdG9wIG9yIGRpYWdvbmFsIHRvIGFzc2lnbiBnYXAgb3Blbi9nYXAgZXh0ZW5kIHBlbmFsdHlcbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArIDEpLmZpbGwoZmFsc2UpO1xuICAgIGNvbnN0IGhvcml6b250YWxHYXBzOiBib29sZWFuW10gPSBuZXcgQXJyYXk8Ym9vbGVhbj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKGZhbHNlKTtcblxuICAgIC8vdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgd2hpY2ggcm93IHdlIGFyZSBpblxuICAgIC8vIHRoZXkgd2lsbCBzd2FwIHBsYWNlcyBvbiBlYWNoIGl0ZXJhdGlvblxuICAgIGxldCBwcmV2Um93ID0gMDtcbiAgICBsZXQgY3VyclJvdyA9IDE7XG4gICAgLy8gSW5pdGlhbGl6ZSBmaXJzdCByb3dcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTEubGVuZ3RoICsgMTsgaSsrKVxuICAgICAgbWF0cml4WzBdW2ldID0gLWdhcE9wZW4gLSAoaSAtIDEpICogZ2FwRXh0ZW5kO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZXN0IG9mIHRoZSBtYXRyaXhcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTIubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICBtYXRyaXhbY3VyclJvd11bMF0gPSAtZ2FwT3BlbiAtIChpIC0gMSkgKiBnYXBFeHRlbmQ7XG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlcTEubGVuZ3RoICsgMTsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRpYWdvbmFsID1cbiAgICAgICAgICBtYXRyaXhbcHJldlJvd11baiAtIDFdICsgc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNbc2VxMVtqIC0gMV1dXVthbHBoYWJldEluZGV4ZXNbc2VxMltpIC0gMV1dXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCB0byBpbnZlcnQgdGhlIHJlc3VsdFxuICAgIHJldHVybiAtbWF0cml4W3ByZXZSb3ddW3NlcTEubGVuZ3RoXTtcbiAgfTtcbn1cbiJdfQ==","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","export function hamming() {\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n if (seq1.length !== seq2.length)\n diff = Math.abs(seq1.length - seq2.length);\n let result = 0;\n for (let i = 0; i < Math.min(seq1.length, seq2.length); i++) {\n if (seq1[i] !== seq2[i])\n result++;\n }\n return result + diff;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUNwQywrREFBK0Q7UUFDL0QsK0ZBQStGO1FBQy9GLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtZQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsQ0FBQztTQUNaO1FBQ0QsT0FBTyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZygpOiBtbURpc3RhbmNlRnVuY3Rpb25UeXBlIHtcbiAgcmV0dXJuIChzZXExOiBzdHJpbmcsIHNlcTI6IHN0cmluZykgPT4ge1xuICAgIC8vIGhhbW1pbmcgZGlzdGFuY2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHNhbWUgc2l6ZSBzdHJpbmdzLFxuICAgIC8vIGJ1dCBzdGlsbCwgbGV0cyBhZGQgYSBjaGVjayBhbmQgaWYgdGhleSBhcmUgbm90IHNhbWUgbGVuZ3RoIGFkZCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcmVzdWx0XG4gICAgbGV0IGRpZmYgPSAwO1xuICAgIGlmIChzZXExLmxlbmd0aCAhPT0gc2VxMi5sZW5ndGgpXG4gICAgICBkaWZmID0gTWF0aC5hYnMoc2VxMS5sZW5ndGggLSBzZXEyLmxlbmd0aCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNlcTEubGVuZ3RoLCBzZXEyLmxlbmd0aCk7IGkrKykge1xuICAgICAgaWYgKHNlcTFbaV0gIT09IHNlcTJbaV0pXG4gICAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICsgZGlmZjtcbiAgfTtcbn1cbiJdfQ==","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Rpc3RhbmNlfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsZXZlbnN0ZWluKCk6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICByZXR1cm4gKHNlcTE6IHN0cmluZywgc2VxMjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGRpc3RhbmNlKHNlcTEsIHNlcTIpO1xuICB9O1xufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport { candidateAlphabets } from './macromolecule/consts';\nimport { detectAlphabet, getSplitterForColumn, getSplitterWithSeparator } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\nexport const Tags = new class {\n constructor() {\n /** Column's temp slot name for a UnitsHandler object */\n this.uhTemp = `units-handler.${DG.SEMTYPE.MACROMOLECULE}`;\n }\n}();\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== \"fasta\" /* NOTATION.FASTA */)\n throw new Error(`The column of notation '${\"fasta\" /* NOTATION.FASTA */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n uh.column.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n UnitsHandler.setTags(uh);\n }\n static setUnitsToSeparatorColumn(uh, separator) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== \"separator\" /* NOTATION.SEPARATOR */)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must have the separator tag.`);\n uh.column.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n uh.column.setTag(\"separator\" /* TAGS.separator */, separator);\n UnitsHandler.setTags(uh);\n }\n static setUnitsToHelmColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`The column of notation '${\"helm\" /* NOTATION.HELM */}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n uh.column.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n UnitsHandler.setTags(uh);\n }\n /** From detectMacromolecule */\n static setTags(uh) {\n const units = uh.column.getTag(DG.TAGS.UNITS);\n const stats = uh.stats;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n if ([\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */].includes(units)) {\n // Empty monomer alphabet is not allowed\n if (Object.keys(stats.freq).length === 0)\n throw new Error('Alphabet is empty');\n const aligned = stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n uh.column.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n const alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n uh.column.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n if (alphabet === \"UN\" /* ALPHABET.UN */) {\n const alphabetSize = Object.keys(stats.freq).length;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n uh.column.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, alphabetSize.toString());\n uh.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, alphabetIsMultichar ? 'true' : 'false');\n }\n }\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n const separator = this.column.getTag(\"separator\" /* TAGS.separator */) ?? undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n get helmCompatible() {\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */);\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const stats = this.stats;\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation === \"helm\" /* NOTATION.HELM */)\n return true;\n else if (this.alphabet !== \"UN\" /* ALPHABET.UN */)\n return false;\n else\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) === 'true';\n }\n /** */\n get splitted() {\n if (this._splitted === null) {\n const splitter = this.getSplitter();\n const colLength = this._column.length;\n this._splitted = new Array(colLength);\n const catIdxList = this._column.getRawData();\n const catList = this._column.categories;\n for (let rowI = 0; rowI < colLength; rowI++) {\n const seq = catList[catIdxList[rowI]];\n this._splitted[rowI] = splitter(seq);\n }\n }\n return this._splitted;\n }\n get stats() {\n if (this._stats === null) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of this.splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n this._stats = { freq: freq, sameLength: sameLength };\n }\n return this._stats;\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n isHelmCompatible() { return this.helmCompatible === 'true'; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation, separator) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n if (targetNotation === \"separator\" /* NOTATION.SEPARATOR */) {\n if (!separator)\n throw new Error(`Notation \\'${\"separator\" /* NOTATION.SEPARATOR */}\\' requires separator value.`);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n }\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule'); // cell.renderer\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = UnitsHandler.getOrCreate(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n /** Gets function to split seq value to monomers */\n getSplitter() {\n return getSplitterForColumn(this._column);\n }\n getDistanceFunctionName() {\n // TODO add support for helm and separator notation\n if (!this.isFasta())\n throw new Error('Only FASTA notation is supported');\n if (this.isMsa())\n return MmDistanceFunctionsNames.HAMMING;\n switch (this.alphabet) {\n // As DNA and RNA scoring matrices are same as identity matrices(mostly),\n // we can use very fast and optimized Levenshtein distance library\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n case \"PT\" /* ALPHABET.PT */:\n return MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH;\n // For default case, let's use Levenshtein distance\n default:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n }\n }\n getDistanceFunction() {\n return mmDistanceFunctions[this.getDistanceFunctionName()]();\n }\n // checks if the separator notation is compatible with helm library\n async checkHelmCompatibility() {\n // check first for the column tag to avoid extra processing\n if (this.column.tags.has(\".isHelmCompatible\" /* TAGS.isHelmCompatible */))\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */) === 'true';\n // get the monolmer lib and check against the column\n const monomerLibHelper = await getMonomerLibHelper();\n const bioLib = monomerLibHelper.getBioLib();\n // retrieve peptides\n const peptides = bioLib.getMonomerSymbolsByType(\"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */.toString());\n // convert the peptides list to a set for faster lookup\n const peptidesSet = new Set(peptides);\n // get splitter for given separator and check if all monomers are in the lib\n const splitterFunc = getSplitterWithSeparator(this.separator);\n // iterate over the columns, split them and check if all monomers are in the lib\n //TODO maybe add missing threshhold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n for (const row of this.column.categories) {\n const monomers = splitterFunc(row);\n for (const monomer of monomers) {\n if (!peptidesSet.has(monomer)) {\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'false');\n return false;\n }\n }\n }\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'true');\n return true;\n }\n constructor(col) {\n this._splitted = null;\n this._stats = null;\n this._column = col;\n const units = this._column.getTag(DG.TAGS.UNITS);\n if (units !== null && units !== undefined)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */) || !this.column.tags.has(\"alphabet\" /* TAGS.alphabet */) ||\n (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) && !this.isHelm() && this.alphabet === \"UN\" /* ALPHABET.UN */)) {\n // The following detectors and setters are to be called because the column is likely\n // as the UnitsHandler constructor was called on the column.\n if (this.isFasta()) {\n UnitsHandler.setUnitsToFastaColumn(this);\n }\n else if (this.isSeparator()) {\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n UnitsHandler.setUnitsToSeparatorColumn(this, separator);\n }\n else if (this.isHelm()) {\n UnitsHandler.setUnitsToHelmColumn(this);\n }\n else {\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\n }\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm()) {\n this.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, 'true');\n }\n else if (['UN'].includes(this.alphabet)) {\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n }\n /** Gets a column's UnitsHandler object from temp slot or creates a new and stores it to the temp slot. */\n static getOrCreate(col) {\n if (!(Tags.uhTemp in col.temp))\n col.temp[Tags.uhTemp] = new UnitsHandler(col);\n return col.temp[Tags.uhTemp];\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\n//# sourceMappingURL=units-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType } from './types';\nimport { Alphabets, candidateAlphabets, monomerRe } from './consts';\nimport { UnitsHandler } from '../units-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStatsForCol(seqCol, minLength, splitter) {\n const cats = seqCol.categories;\n const splitted = wu(seqCol.getRawData())\n .map((catI) => splitter(seqCol.categories[catI]));\n return getStats(splitted, minLength);\n}\nfunction getStats(splitted, minLength) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return seq.toString().replace(monomerRe, '.$1').slice(1).split('.').map((monomer) => {\n if (monomer.startsWith('[') && monomer.endsWith(']'))\n return monomer.slice(1, -1);\n else if (monomer === '-')\n return '';\n else\n return monomer;\n });\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || (shortAminoMatch?.length ?? 0) > 1;\n const shortAmino = shortAminoMatch?.[0] ?? ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return Alphabets.fasta.dna;\n case \"RNA\" /* ALPHABET.RNA */:\n return Alphabets.fasta.rna;\n case \"PT\" /* ALPHABET.PT */:\n return Alphabets.fasta.peptide;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else {\n alphabetName = \"UN\" /* ALPHABET.UN */;\n }\n return alphabetName;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = UnitsHandler.getOrCreate(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStatsForCol(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case \"PT\" /* ALPHABET.PT */:\n return AminoacidsPalettes.GrokGroups;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n }) ?? null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { getSplitter } from '../utils/macromolecule/utils';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag(\"separator\" /* TAGS.separator */);\n const splitterFunc = getSplitter(units, sep);\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n monomers.forEach((m) => {\n if (!monomerSymbolDict[m]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[m] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[m]);\n });\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n for (let i = 0; i < col.length; ++i) {\n const macroMolecule = col.get(i);\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n // what is the reason of double conversion?\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const units = cell.column.tags[DG.TAGS.UNITS];\n const sep = cell.column.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const macroMolecule = cell.value;\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n return molFiles;\n}\nexport function createMomomersMolDict(lib) {\n const dict = {};\n lib.forEach((it) => {\n if (it['polymerType'] === 'PEPTIDE') {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n monomerObject[field] = it[field];\n });\n dict[it[\"symbol\" /* HELM_FIELDS.SYMBOL */]] = monomerObject;\n }\n });\n return dict;\n}\nexport function createJsonMonomerLibFromSdf(table) {\n const resultLib = [];\n for (let i = 0; i < table.rowCount; i++) {\n const monomer = {};\n Object.keys(jsonSdfMonomerLibDict).forEach((key) => {\n if (key === \"symbol\" /* HELM_FIELDS.SYMBOL */) {\n const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);\n monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;\n }\n else if (key === \"rgroups\" /* HELM_FIELDS.RGROUPS */) {\n const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\\n');\n const jsonRgroups = [];\n rgroups.forEach((g) => {\n const rgroup = {};\n const altAtom = g.substring(g.lastIndexOf(']') + 1);\n const radicalNum = g.match(/\\[R(\\d+)\\]/)[1];\n rgroup[\"capGroupSmiles\" /* HELM_RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* HELM_RGROUP_FIELDS.ALTERNATE_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* HELM_RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* HELM_RGROUP_FIELDS.LABEL */] = `R${radicalNum}`;\n jsonRgroups.push(rgroup);\n });\n monomer[key] = jsonRgroups;\n }\n else {\n if (jsonSdfMonomerLibDict[key])\n monomer[key] = table.get(jsonSdfMonomerLibDict[key], i);\n }\n });\n resultLib.push(monomer);\n }\n return resultLib;\n}\nexport async function getMonomerLibHelper() {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installer for MonomerLibraryHelper.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=monomer-utils.js.map","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = monomer[0]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = monomer[1]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (monomer[0]?.toLowerCase() == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","import { monomerToShort } from './macromolecule/utils';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/**\n * A function that prints a string aligned to left or centered.\n *\n * @param {number} x x coordinate.\n * @param {number} y y coordinate.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {string} s String to print.\n * @param {string} [color=undefinedColor] String color.\n * @param {number} [pivot=0] Pirvot.\n * @param {boolean} [left=false] Is left aligned.\n * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent\n * @param {string} [separator=''] Is separator for sequence.\n * @param {boolean} [last=false] Is checker if element last or not.\n * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param maxWord Is array of max words for each line.\n * @param wordIdx Is index of word we currently draw.\n * @param gridCell Is grid cell.\n * @param referenceSequence Is reference sequence for diff mode.\n * @param maxLengthOfMonomer Is max length of monomer.\n * @return {number} x coordinate to start printing at.\n */\nexport const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA) {\n grayPart = '';\n }\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = gridCell.cell.column.temp['color-code'] ?? true;\n compareWithCurrent = gridCell.cell.column.temp['compare-with-current'] ?? true;\n highlightDifference = gridCell.cell.column.temp['highlight-difference'] ?? 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n }\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null) {\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n }\n let textSize = g.measureText(colorPart + grayPart);\n const indent = 5;\n let maxColorTextSize = g.measureText(colorPart).width;\n let colorTextSize = g.measureText(colorPart).width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA) {\n g.fillStyle = drawColor;\n g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);\n }\n }\n if (left || textSize > w) {\n draw(indent, indent + maxColorTextSize);\n return x + maxColorTextSize + g.measureText(grayPart).width;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + dx + maxColorTextSize;\n }\n};\n//# sourceMappingURL=cell-renderer.js.map","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ('$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtRQUMvQixPQUFPLE1BQUMsR0FBYSxDQUFDLEtBQUssbUNBQUssR0FBYSxDQUFDLE9BQU8sQ0FBQztLQUN2RDtTQUFNO1FBQ0wsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9Db25zb2xlKGVycjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiBlcnIgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKCckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {findMonomers, parseHelm, getParts} from './utils';\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];\n const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;\n const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);\n let left = 0;\n let right = maxIndex;\n let found = false;\n maxLengthWordsSum[maxIndex + 1] = argsX + 1;\n let mid = 0;\n if (argsX > maxLengthWordsSum[0]) {\n while (!found) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < maxLengthWordsSum[mid]) {\n right = mid - 1;\n } else if (argsX > maxLengthWordsSum[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n }\n }\n left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;\n const monomers = findMonomers(gridCell.cell.value);\n const s: string = gridCell.cell.value ?? '';\n const subParts: string[] = parseHelm(s);\n const allParts: string[] = getParts(subParts, s);\n const tooltipMessage: HTMLElement[] = [];\n for (let i = 0; i < allParts.length; ++i) {\n if (monomers.has(allParts[i])) {\n tooltipMessage[i] = ui.divV([\n ui.divText(`Monomer '${allParts[i]}' not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries')\n ]);\n }\n }\n (((tooltipMessage[left]?.childNodes.length ?? 0) > 0)) ?\n ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16) :\n ui.tooltip.hide();\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n }\n }\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const undefinedColor = 'rgb(100,100,100)';\n const grayColor = '#808080';\n\n const s: string = !gridCell.cell.value ? '' : gridCell.cell.value\n .replaceAll(helmGapStartRe, '{').replaceAll(helmGapIntRe, '.').replaceAll(helmGapEndRe, '}');\n const monomers = findMonomers(s);\n const subParts: string[] = parseHelm(s);\n if (monomers.size == 0 && grid) {\n const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', s);\n gridCell.element = host;\n //@ts-ignore\n const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});\n return;\n } else {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h * r;\n g.canvas.style.height = `${h}px`;\n }\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n let x1 = x;\n const maxLengthWords: any = {};\n const maxLengthWordSum: any = {};\n const allParts: string[] = getParts(subParts, s);\n for (let i = 0; i < allParts.length; ++i) {\n maxLengthWords[i] = allParts[i].length * 7;\n const color = monomers.has(allParts[i]) ? 'red' : grayColor;\n g.fillStyle = undefinedColor;\n x1 = printLeftOrCentered(x1, y, w, h, g, allParts[i], color, 0, true, 1.0);\n }\n\n maxLengthWordSum[0] = maxLengthWords[0];\n for (let i = 1; i < allParts.length; i++)\n maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];\n\n gridCell.cell.column.temp = {\n 'helm-sum-maxLengthWords': maxLengthWordSum,\n 'helm-maxLengthWords': maxLengthWords\n };\n g.restore();\n return;\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn } from './macromolecule/utils';\n/** Class for handling conversion of notation systems in Macromolecule columns */\nexport class NotationConverter extends UnitsHandler {\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === \"fasta\" /* NOTATION.FASTA */; }\n toSeparator(targetNotation) { return targetNotation === \"separator\" /* NOTATION.SEPARATOR */; }\n toHelm(targetNotation) { return targetNotation === \"helm\" /* NOTATION.HELM */; }\n /**\n * Convert a Macromolecule column from FASTA to SEPARATOR notation\n *\n * @param {string} separator A specific separator to be used\n * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default\n * @return {DG.Column} A new column in SEPARATOR notation\n */\n convertFastaToSeparator(separator, fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = this.defaultGapSymbol;\n const newColumn = this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */, separator);\n // assign the values to the newly created empty column\n newColumn.init((idx) => {\n const fastaPolymer = this.column.get(idx);\n const fastaMonomersArray = this.splitter(fastaPolymer);\n for (let i = 0; i < fastaMonomersArray.length; i++) {\n if (fastaMonomersArray[i] === fastaGapSymbol)\n fastaMonomersArray[i] = UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n return fastaMonomersArray.join(separator);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n return newColumn;\n }\n /**\n * Get the wrapper strings for HELM, depending on the type of the\n * macromolecule (peptide, DNA, RNA)\n *\n * @return {string[]} Array of wrappers\n */\n getHelmWrappers() {\n const prefix = (this.isDna()) ? 'DNA1{' :\n (this.isRna() || this.isHelmCompatible()) ? 'RNA1{' : 'PEPTIDE1{';\n // (this.isPeptide()) ? 'PEPTIDE1{' :\n // 'Unknown'; // this case should be handled as exceptional\n // if (prefix === 'Unknown')\n // throw new Error('Neither peptide, nor nucleotide');\n const postfix = '}$$$$';\n const leftWrapper = (this.isDna()) ? 'D(' :\n (this.isRna()) ? 'R(' : ''; // no wrapper for peptides\n const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n // A helper function for converting strings to HELM\n convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {\n const monomerArray = this.splitter(sourcePolymer);\n const monomerHelmArray = monomerArray.map((mm) => {\n if (!mm || mm === sourceGapSymbol) {\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n }\n else {\n return mm.length == 1 ? `${leftWrapper}${mm}${rightWrapper}` :\n `${leftWrapper}[${mm}]${rightWrapper}`;\n }\n });\n return `${prefix}${monomerHelmArray.join('.')}${postfix}`;\n }\n /**\n * Convert a string with SEPARATOR/FASTA notation to HELM\n *\n * @param {string} sourcePolymer A string to be converted\n * @param {string | null} sourceGapSymbol An optional gap symbol, set to\n * default values ('-' for FASTA and '' for SEPARATOR) unless specified\n * @return {string} The target HELM string\n */\n convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n }\n /**\n * Convert a column to HELM\n *\n * @param {string | null} sourceGapSymbol\n * @return {DG.Column}\n */\n convertToHelm(sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n const newColumn = this.getNewColumn(\"helm\" /* NOTATION.HELM */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const sourcePolymer = this.column.get(idx);\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n return newColumn;\n }\n /**\n * Convert SEPARATOR column to FASTA notation\n *\n * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA\n * @return {DG.Column} Converted column\n */\n convertSeparatorToFasta(fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = UnitsHandler._defaultGapSymbolsDict.FASTA;\n const newColumn = this.getNewColumn(\"fasta\" /* NOTATION.FASTA */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const separatorPolymer = this.column.get(idx);\n // items can be monomers or separators\n const separatorItemsArray = this.splitter(separatorPolymer);\n const fastaMonomersArray = [];\n for (let i = 0; i < separatorItemsArray.length; i++) {\n const item = separatorItemsArray[i];\n if (item.length === 0) {\n fastaMonomersArray.push(fastaGapSymbol);\n }\n else if (item.length > 1) {\n // the case of a multi-character monomer\n const monomer = '[' + item + ']';\n fastaMonomersArray.push(monomer);\n }\n else {\n fastaMonomersArray.push(item);\n }\n }\n return fastaMonomersArray.join('');\n });\n newColumn.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n return newColumn;\n }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} helmPolymer A string to be converted\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol) {\n if (!tgtGapSymbol) {\n tgtGapSymbol = (this.toFasta(tgtNotation)) ?\n UnitsHandler._defaultGapSymbolsDict.FASTA :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n if (!tgtSeparator)\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n const helmWrappersRe = /(R\\(|D\\(|\\)|P)/g;\n const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(helmPolymer);\n const tgtMonomersArray = [];\n for (let i = 0; i < helmItemsArray.length; i++) {\n let item = helmItemsArray[i];\n if (isNucleotide)\n item = item.replace(helmWrappersRe, '');\n if (item === UnitsHandler._defaultGapSymbolsDict.HELM) {\n tgtMonomersArray.push(tgtGapSymbol);\n }\n else if (this.toFasta(tgtNotation) && item.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + item + ']';\n tgtMonomersArray.push(monomer);\n }\n else {\n tgtMonomersArray.push(item);\n }\n }\n return tgtMonomersArray.join(tgtSeparator);\n }\n /**\n * Convert HELM column to FASTA/SEPARATOR\n *\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {DG.Column} Converted column\n */\n convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {\n // This function must not contain calls of isDna() and isRna(), for\n // source helm columns may contain RNA, DNA and PT across different rows\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const helmPolymer = this.column.get(idx);\n return this.convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol);\n // we cannot use isDna() or isRna() because source helm columns can\n // contain DNA, RNA and PT in different cells, so the corresponding\n // tags cannot be set for the whole column\n });\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n const splitter = getSplitterForColumn(newColumn);\n const aligned = this.stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n return newColumn;\n }\n convertHelmToSeparator() {\n // TODO: implementatioreturn this.getNewColumn();\n return this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n }\n /** Dispatcher method for notation conversion\n *\n * @param {NOTATION} tgtNotation Notation we want to convert to\n * @param {string | null} tgtSeparator Possible separator\n * @return {DG.Column} Converted column\n */\n convert(tgtNotation, tgtSeparator = null) {\n // possible exceptions\n if (this.notation === tgtNotation)\n throw new Error('tgt notation is invalid');\n if (this.toSeparator(tgtNotation) && tgtSeparator === null)\n throw new Error('tgt separator is not specified');\n if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null) {\n return this.convertFastaToSeparator(tgtSeparator);\n }\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation)) {\n return this.convertToHelm();\n }\n else if (this.isSeparator() && this.toFasta(tgtNotation)) {\n return this.convertSeparatorToFasta();\n }\n else if (this.isHelm() && this.toFasta(tgtNotation)) { // the case of HELM\n return this.convertHelm(tgtNotation);\n }\n else if (this.isHelm() && this.toSeparator(tgtNotation)) {\n return this.convertHelm(tgtNotation, tgtSeparator);\n }\n else {\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=notation-converter.js.map","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\nimport {HelmWebEditor} from './helm-web-editor';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {findMonomers} from './utils';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const _package = new DG.Package();\nlet monomerLib: IMonomerLib | null = null;\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n return Promise.all([new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }), await grok.functions.call('Bio:getBioLib')]).then(([_, lib]: [void, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const polymerTypeList: string[] = monomerLib.getPolymerTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n polymerTypeList.length == 0 ? 'empty' : polymerTypeList.map((polymerType) => {\n return `${polymerType} ${monomerLib.getMonomerSymbolsByType(polymerType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n });\n}\n\nfunction rewriteLibraries() {\n org.helm.webeditor.Monomers.clear();\n monomerLib.getPolymerTypes().forEach((polymerType) => {\n const monomerSymbols = monomerLib.getMonomerSymbolsByType(polymerType);\n monomerSymbols.forEach((monomerSymbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib.getMonomer(polymerType, monomerSymbol);\n const webEditorMonomer: WebEditorMonomer = {\n id: monomerSymbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at = {};\n monomer.rgroups.forEach((it) => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer[SMILES].toString());\n } else {\n isBroken = true;\n }\n\n if (!isBroken)\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n });\n });\n\n // Obsolete\n const grid: DG.Grid = grok.shell.tv.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell?: DG.Cell, value?: string, units?: string) {\n const cellValue = typeof units === 'undefined' ? cell.value : value;\n const monomers = findMonomers(cellValue);\n if (monomers.size == 0) {\n webEditor(cell, value, units);\n } else {\n grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n }\n}\n\n//tags: cellEditor\n//description: Macromolecule\n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n const df = grok.shell.tv.grid.dataFrame;\n const col = df.columns.bySemType('Macromolecule');\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM)\n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n const converter = new NotationConverter(col);\n const resStr = converter.convertStringToHelm(mol, '/');\n checkMonomersAndOpenWebEditor(df.currentCell, resStr, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, widgets\n//input: string helmString {semType: Macromolecule}\n//output: widget result\nexport async function propertiesPanel(helmString: string) {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement;\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n editor.setHelm(helmString);\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n parent.lastChild.remove();\n return new DG.Widget(\n ui.tableFromMap({\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n })\n );\n}\n\nfunction webEditor(cell?: DG.Cell, value?: string, units?: string) {\n const view = ui.div();\n const df = grok.shell.tv.grid.dataFrame;\n const converter = new NotationConverter(df.columns.bySemType('Macromolecule'));\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(() => {\n if (typeof units === 'undefined')\n app.canvas.helm.setSequence(cell.value, 'HELM');\n else\n app.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n const helmValue = app.canvas.getHelm(true).replace(/<\\/span>/g, '')\n .replace(/<span style='background:#bbf;'>/g, '');\n if (typeof units === 'undefined') {\n cell.value = helmValue;\n } else {\n const convertedRes = converter.convertHelmToFastaSeparator(helmValue, units);\n cell.value = convertedRes;\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res = {};\n let el = '';\n let digit;\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res\nexport function getMolfiles(col: DG.Column): DG.Column {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement;\n const res = DG.Column.string('mols', col.length);\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n res.init((i) => {\n editor.setHelm(col.get(i));\n const mol = editor.getMolfile();\n return mol;\n });\n parent.lastChild.remove();\n return res;\n}\n\n//name: helmWebEditor\n//output: object\nexport function helmWebEditor(): HelmWebEditor {\n return new HelmWebEditor();\n}\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","grok","ui","DG","HelmWebEditor","constructor","w","h","this","host","style","width","height","editor","JSDraw2","Editor","viewonly","resizeEditor","setSize","createWebEditor","editorView","org","helm","webeditor","MolViewer","molscale","webEditor","scil","App","showabout","mexfontsize","mexrnapinontab","topmargin","mexmonomerstab","sequenceviewonly","mexfavoritefirst","mexfilter","sizes","calculateSizes","canvas","resize","rightwidth","topheight","s","bottomheight","apply","sequence","notation","toolbarheight","properties","parent","structureview","mex","setTimeout","setSequence","editorDiv","getParts","subParts","allParts","k","length","indexOfMonomer","indexOf","helmBeforeMonomer","slice","push","substring","parseHelm","split","monomers","Utils","isNullOrEmpty","seqs","i","p","detachAnnotation","str","ss","monomer","startsWith","includes","element","residue","endsWith","lastIndexOf","firstPiece","thirdPiece","elements","el","findMonomers","helmString","types","keys","monomerTypeList","monomerNames","Monomers","getMonomerSet","forEach","id","splitString","Set","filter","val","sep","ret","frag","parentheses","bracket","braces","quote","c","c2","_detachAppendix","tag","r","repeat","endswith","replace","RegExp","m","wu","CandidateType","name","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","monomerRe","fasta","peptide","dna","rna","peq","Uint32Array","defaultArgs","gapOpen","gapExtend","scoringMatrix","alphabetIndexes","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","seq1","seq2","diff","Math","abs","result","min","LEVENSHTEIN","a","b","tmp","n","lst","pv","mv","sc","charCodeAt","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","j","start","vlen","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","args","assign","matrix","Array","fill","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","left","max","Tags","uhTemp","static","uh","column","semType","getTag","Error","setTag","setTags","separator","units","stats","some","aligned","sameLength","candidates","gapSymbol","candidatesSims","map","sim","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","vectorLength","getAlphabetSimilarity","alphabetName","maxSim","cs","find","detectAlphabet","alphabetSize","alphabetIsMultichar","toString","_units","_column","_notation","defaultGapSymbol","_defaultGapSymbol","undefined","isFasta","isSeparator","helmCompatible","getAlphabetSize","alphabetSizeStr","parseInt","console","warn","getAlphabetIsMultichar","splitted","_splitted","splitter","getSplitter","colLength","catIdxList","getRawData","catList","categories","rowI","seq","_stats","firstLength","mSeq","isHelm","isRna","isDna","isPeptide","isMsa","toUpperCase","isHelmCompatible","getNotation","toLowerCase","getNewColumn","targetNotation","col","len","newColName","dataFrame","columns","getUnusedName","newColumn","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","templateCol","getOrCreate","unitsStringIsValid","getSplitterForColumn","getDistanceFunctionName","getDistanceFunction","async","tags","peptides","funcList","package","prepare","getOutputParamValue","getMonomerLibHelper","getBioLib","getMonomerSymbolsByType","peptidesSet","splitterFunc","getSplitterWithSeparator","row","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","setUnitsToFastaColumn","setUnitsToSeparatorColumn","setUnitsToHelmColumn","temp","Float32Array","v","sqrSum","sqrt","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","scheme","isInner","inner","outer","char","isNaN","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","UnknownColorPalette","concat","values","pI","hash","hashCode","color","dgColor","g","distToBlack","pow","correctColor","splitterAsFasta","limit","buildPalette","helmRe","helmPp1Re","splitterAsHelm","lastIndex","ea","exec","inSeq","mm","pp1M","longMonomerPartRe","DrawStyle","printLeftOrCentered","x","y","pivot","transparencyRate","last","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","maxLengthOfMonomer","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","cell","currentMonomer","shortAminoMatch","match","needAddDots","shortAmino","monomerToShortFunction","textSize","measureText","maxColorTextSize","colorTextSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","dx","errorToConsole","err","_a","String","stack","message","helmGapStartRe","helmGapIntRe","helmGapEndRe","HelmCellRenderer","cellType","defaultWidth","defaultHeight","onMouseMove","e","maxLengthWordsSum","maxIndex","argsX","offsetX","gridColumn","bounds","right","found","mid","floor","tooltipMessage","childNodes","errMsg","error","render","cellStyle","grid","gridRow","replaceAll","size","window","devicePixelRatio","save","beginPath","rect","clip","font","textBaseline","x1","maxLengthWords","maxLengthWordSum","restore","setAttribute","skin","NotationConverter","_splitter","toFasta","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","init","idx","fastaPolymer","fastaMonomersArray","join","getHelmWrappers","convertToHelmHelper","sourcePolymer","sourceGapSymbol","prefix","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","convertHelm","convertHelmToSeparator","convert","_package","monomerLib","initHelm","Promise","all","resolve","reject","dojo","ready","then","_","lib","rewriteLibraries","onChanged","subscribe","polymerTypeList","getPolymerTypes","msgStr","polymerType","clear","monomerSymbol","isBroken","getMonomer","webEditorMonomer","molfile","na","naturalAnalog","rs","rgroups","type","mt","monomerType","at","it","getRS","addOneMonomer","invalidate","helmCellRenderer","checkMonomersAndOpenWebEditor","view","df","converter","bySemType","app","showHeader","showFooter","add","onOK","helmValue","getHelm","convertedRes","show","modal","fullScreen","from","editMoleculeCell","openEditor","mol","currentCell","resStr","propertiesPanel","root","parentElement","appendChild","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","lastChild","remove","smiles","newS","res","digit","test","getMolfiles","getMolfile","helmWebEditor"],"sourceRoot":""}
|