@datagrok/helm 3.0.0 → 3.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"package-test.js","mappings":"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","sources":["webpack://helm/./node_modules/fast-sha256/sha256.js","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 \"DG\"","webpack://helm/./node_modules/@datagrok-libraries/test/src/dataframe-utils.js","webpack://helm/./node_modules/@datagrok-libraries/test/src/test.js","webpack://helm/./src/tests/_first-tests.ts","webpack://helm/./src/utils/index.ts","webpack://helm/external var \"ui\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/helm/helm-helper.js","webpack://helm/./src/tests/utils.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/types/monomer-library.js","webpack://helm/./src/tests/helm-tests.ts","webpack://helm/external var \"grok\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/lib-settings.js","webpack://helm/./src/tests/findMonomers-tests.ts","webpack://helm/external var \"$\"","webpack://helm/external var \"rxjs\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/external var \"wu\"","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/lru-cache/dist/esm/index.js","webpack://helm/./node_modules/@datagrok-libraries/hwe/dist/index.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/helm/consts.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-const.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./src/tests/renderers-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/chemical-table-parser-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/utils.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v2k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v3k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/seq-helper.js","webpack://helm/./src/tests/get-molfiles-tests.ts","webpack://helm/./src/widgets/properties-widget.ts","webpack://helm/./src/tests/properties-widget-tests.ts","webpack://helm/./src/tests/parse-helm-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/generator.js","webpack://helm/./src/tests/helm-web-editor-tests.ts","webpack://helm/./src/tests/helm-input-tests.ts","webpack://helm/./src/tests/helm-helper-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/substructure-filter/bio-substructure-filter-types.js","webpack://helm/./src/tests/helm-substructure-filter.ts","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./src/tests/helm-activity-cliffs.ts","webpack://helm/./src/tests/to-atomic-level-ui-non-linear.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/chem/rdkit-module.js","webpack://helm/./src/package-test.ts"],"sourcesContent":["(function (root, factory) {\n // Hack to make all exports of this module sha256 function object properties.\n var exports = {};\n factory(exports);\n var sha256 = exports[\"default\"];\n for (var k in exports) {\n sha256[k] = exports[k];\n }\n \n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = sha256;\n } else if (typeof define === 'function' && define.amd) {\n define(function() { return sha256; }); \n } else {\n root.sha256 = sha256;\n }\n})(this, function(exports) {\n\"use strict\";\nexports.__esModule = true;\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n// sha256(message) -> hash\n// sha256.hmac(key, message) -> mac\n// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n// Classes:\n//\n// new sha256.Hash()\n// new sha256.HMAC(key)\n//\nexports.digestLength = 32;\nexports.blockSize = 64;\n// SHA-256 constants\nvar K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\nfunction hashBlocks(w, v, p, pos, len) {\n var a, b, c, d, e, f, g, h, u, i, j, t1, t2;\n while (len >= 64) {\n a = v[0];\n b = v[1];\n c = v[2];\n d = v[3];\n e = v[4];\n f = v[5];\n g = v[6];\n h = v[7];\n for (i = 0; i < 16; i++) {\n j = pos + i * 4;\n w[i] = (((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) |\n ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff));\n }\n for (i = 16; i < 64; i++) {\n u = w[i - 2];\n t1 = (u >>> 17 | u << (32 - 17)) ^ (u >>> 19 | u << (32 - 19)) ^ (u >>> 10);\n u = w[i - 15];\n t2 = (u >>> 7 | u << (32 - 7)) ^ (u >>> 18 | u << (32 - 18)) ^ (u >>> 3);\n w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0);\n }\n for (i = 0; i < 64; i++) {\n t1 = (((((e >>> 6 | e << (32 - 6)) ^ (e >>> 11 | e << (32 - 11)) ^\n (e >>> 25 | e << (32 - 25))) + ((e & f) ^ (~e & g))) | 0) +\n ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n t2 = (((a >>> 2 | a << (32 - 2)) ^ (a >>> 13 | a << (32 - 13)) ^\n (a >>> 22 | a << (32 - 22))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n h = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n v[0] += a;\n v[1] += b;\n v[2] += c;\n v[3] += d;\n v[4] += e;\n v[5] += f;\n v[6] += g;\n v[7] += h;\n pos += 64;\n len -= 64;\n }\n return pos;\n}\n// Hash implements SHA256 hash algorithm.\nvar Hash = /** @class */ (function () {\n function Hash() {\n this.digestLength = exports.digestLength;\n this.blockSize = exports.blockSize;\n // Note: Int32Array is used instead of Uint32Array for performance reasons.\n this.state = new Int32Array(8); // hash state\n this.temp = new Int32Array(64); // temporary state\n this.buffer = new Uint8Array(128); // buffer for data to hash\n this.bufferLength = 0; // number of bytes in buffer\n this.bytesHashed = 0; // number of total bytes hashed\n this.finished = false; // indicates whether the hash was finalized\n this.reset();\n }\n // Resets hash state making it possible\n // to re-use this instance to hash other data.\n Hash.prototype.reset = function () {\n this.state[0] = 0x6a09e667;\n this.state[1] = 0xbb67ae85;\n this.state[2] = 0x3c6ef372;\n this.state[3] = 0xa54ff53a;\n this.state[4] = 0x510e527f;\n this.state[5] = 0x9b05688c;\n this.state[6] = 0x1f83d9ab;\n this.state[7] = 0x5be0cd19;\n this.bufferLength = 0;\n this.bytesHashed = 0;\n this.finished = false;\n return this;\n };\n // Cleans internal buffers and re-initializes hash state.\n Hash.prototype.clean = function () {\n for (var i = 0; i < this.buffer.length; i++) {\n this.buffer[i] = 0;\n }\n for (var i = 0; i < this.temp.length; i++) {\n this.temp[i] = 0;\n }\n this.reset();\n };\n // Updates hash state with the given data.\n //\n // Optionally, length of the data can be specified to hash\n // fewer bytes than data.length.\n //\n // Throws error when trying to update already finalized hash:\n // instance must be reset to use it again.\n Hash.prototype.update = function (data, dataLength) {\n if (dataLength === void 0) { dataLength = data.length; }\n if (this.finished) {\n throw new Error(\"SHA256: can't update because hash was finished.\");\n }\n var dataPos = 0;\n this.bytesHashed += dataLength;\n if (this.bufferLength > 0) {\n while (this.bufferLength < 64 && dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n if (this.bufferLength === 64) {\n hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n this.bufferLength = 0;\n }\n }\n if (dataLength >= 64) {\n dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n dataLength %= 64;\n }\n while (dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n return this;\n };\n // Finalizes hash state and puts hash into out.\n //\n // If hash was already finalized, puts the same value.\n Hash.prototype.finish = function (out) {\n if (!this.finished) {\n var bytesHashed = this.bytesHashed;\n var left = this.bufferLength;\n var bitLenHi = (bytesHashed / 0x20000000) | 0;\n var bitLenLo = bytesHashed << 3;\n var padLength = (bytesHashed % 64 < 56) ? 64 : 128;\n this.buffer[left] = 0x80;\n for (var i = left + 1; i < padLength - 8; i++) {\n this.buffer[i] = 0;\n }\n this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n this.finished = true;\n }\n for (var i = 0; i < 8; i++) {\n out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n }\n return this;\n };\n // Returns the final hash digest.\n Hash.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._saveState = function (out) {\n for (var i = 0; i < this.state.length; i++) {\n out[i] = this.state[i];\n }\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._restoreState = function (from, bytesHashed) {\n for (var i = 0; i < this.state.length; i++) {\n this.state[i] = from[i];\n }\n this.bytesHashed = bytesHashed;\n this.finished = false;\n this.bufferLength = 0;\n };\n return Hash;\n}());\nexports.Hash = Hash;\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nvar HMAC = /** @class */ (function () {\n function HMAC(key) {\n this.inner = new Hash();\n this.outer = new Hash();\n this.blockSize = this.inner.blockSize;\n this.digestLength = this.inner.digestLength;\n var pad = new Uint8Array(this.blockSize);\n if (key.length > this.blockSize) {\n (new Hash()).update(key).finish(pad).clean();\n }\n else {\n for (var i = 0; i < key.length; i++) {\n pad[i] = key[i];\n }\n }\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36;\n }\n this.inner.update(pad);\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36 ^ 0x5c;\n }\n this.outer.update(pad);\n this.istate = new Uint32Array(8);\n this.ostate = new Uint32Array(8);\n this.inner._saveState(this.istate);\n this.outer._saveState(this.ostate);\n for (var i = 0; i < pad.length; i++) {\n pad[i] = 0;\n }\n }\n // Returns HMAC state to the state initialized with key\n // to make it possible to run HMAC over the other data with the same\n // key without creating a new instance.\n HMAC.prototype.reset = function () {\n this.inner._restoreState(this.istate, this.inner.blockSize);\n this.outer._restoreState(this.ostate, this.outer.blockSize);\n return this;\n };\n // Cleans HMAC state.\n HMAC.prototype.clean = function () {\n for (var i = 0; i < this.istate.length; i++) {\n this.ostate[i] = this.istate[i] = 0;\n }\n this.inner.clean();\n this.outer.clean();\n };\n // Updates state with provided data.\n HMAC.prototype.update = function (data) {\n this.inner.update(data);\n return this;\n };\n // Finalizes HMAC and puts the result in out.\n HMAC.prototype.finish = function (out) {\n if (this.outer.finished) {\n this.outer.finish(out);\n }\n else {\n this.inner.finish(out);\n this.outer.update(out, this.digestLength).finish(out);\n }\n return this;\n };\n // Returns message authentication code.\n HMAC.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n return HMAC;\n}());\nexports.HMAC = HMAC;\n// Returns SHA256 hash of data.\nfunction hash(data) {\n var h = (new Hash()).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hash = hash;\n// Function hash is both available as module.hash and as default export.\nexports[\"default\"] = hash;\n// Returns HMAC-SHA256 of data under the key.\nfunction hmac(key, data) {\n var h = (new HMAC(key)).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hmac = hmac;\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(buffer, hmac, info, counter) {\n // Counter is a byte value: check if it overflowed.\n var num = counter[0];\n if (num === 0) {\n throw new Error(\"hkdf: cannot expand more\");\n }\n // Prepare HMAC instance for new data with old key.\n hmac.reset();\n // Hash in previous output if it was generated\n // (i.e. counter is greater than 1).\n if (num > 1) {\n hmac.update(buffer);\n }\n // Hash in info if it exists.\n if (info) {\n hmac.update(info);\n }\n // Hash in the counter.\n hmac.update(counter);\n // Output result to buffer and clean HMAC instance.\n hmac.finish(buffer);\n // Increment counter inside typed array, this works properly.\n counter[0]++;\n}\nvar hkdfSalt = new Uint8Array(exports.digestLength); // Filled with zeroes.\nfunction hkdf(key, salt, info, length) {\n if (salt === void 0) { salt = hkdfSalt; }\n if (length === void 0) { length = 32; }\n var counter = new Uint8Array([1]);\n // HKDF-Extract uses salt as HMAC key, and key as data.\n var okm = hmac(salt, key);\n // Initialize HMAC for expanding with extracted key.\n // Ensure no collisions with `hmac` function.\n var hmac_ = new HMAC(okm);\n // Allocate buffer.\n var buffer = new Uint8Array(hmac_.digestLength);\n var bufpos = buffer.length;\n var out = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n if (bufpos === buffer.length) {\n fillBuffer(buffer, hmac_, info, counter);\n bufpos = 0;\n }\n out[i] = buffer[bufpos++];\n }\n hmac_.clean();\n buffer.fill(0);\n counter.fill(0);\n return out;\n}\nexports.hkdf = hkdf;\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nfunction pbkdf2(password, salt, iterations, dkLen) {\n var prf = new HMAC(password);\n var len = prf.digestLength;\n var ctr = new Uint8Array(4);\n var t = new Uint8Array(len);\n var u = new Uint8Array(len);\n var dk = new Uint8Array(dkLen);\n for (var i = 0; i * len < dkLen; i++) {\n var c = i + 1;\n ctr[0] = (c >>> 24) & 0xff;\n ctr[1] = (c >>> 16) & 0xff;\n ctr[2] = (c >>> 8) & 0xff;\n ctr[3] = (c >>> 0) & 0xff;\n prf.reset();\n prf.update(salt);\n prf.update(ctr);\n prf.finish(u);\n for (var j = 0; j < len; j++) {\n t[j] = u[j];\n }\n for (var j = 2; j <= iterations; j++) {\n prf.reset();\n prf.update(u).finish(u);\n for (var k = 0; k < len; k++) {\n t[k] ^= u[k];\n }\n }\n for (var j = 0; j < len && i * len + j < dkLen; j++) {\n dk[i * len + j] = t[j];\n }\n }\n for (var i = 0; i < len; i++) {\n t[i] = u[i] = 0;\n }\n for (var i = 0; i < 4; i++) {\n ctr[i] = 0;\n }\n prf.clean();\n return dk;\n}\nexports.pbkdf2 = pbkdf2;\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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__ = DG;","import * as sha256 from 'fast-sha256';\n/**\n * For columns of string type. Checks whether column contains empty values and removes corresponding rows in case user selects to remove.\n *\n */\nexport function removeEmptyStringRows(table, col) {\n const cats = col.categories;\n const emptyRawInd = cats.map((val, ind) => !val ? ind : null).filter((it) => it !== null);\n const rawData = [...col.getRawData()];\n const emptyRawsIndexes = [];\n let removedRowsCounter = 0;\n for (let i = 0; i < table.rowCount; i++) {\n if (emptyRawInd.includes(rawData[i])) {\n table.rows.removeAt(i - removedRowsCounter);\n emptyRawsIndexes.push(i);\n removedRowsCounter += 1;\n }\n }\n return emptyRawsIndexes;\n}\nexport function hashDataFrame(table, names) {\n names !== null && names !== void 0 ? names : (names = table.columns.names());\n const hasher = new sha256.Hash();\n const order = table.getSortedOrder(names);\n const encoder = new TextEncoder();\n for (const name of names) {\n const column = table.columns.byName(name);\n const dataArray = column.getRawData();\n const isString = column.type == DG.TYPE.STRING;\n const cats = column.categories;\n for (let i = 0; i < dataArray.length; i++) {\n if (isString) {\n const data = cats[dataArray[order[i]]];\n hasher.update(encoder.encode(data));\n }\n else {\n const data = dataArray[order[i]];\n hasher.update(Uint8Array.from([data]));\n }\n }\n }\n return hasher.digest();\n}\nexport const testData = DG.DataFrame.fromCsv(`countries,fasta,smiles,molregno,LON,Zip Code,Street Address Line 1,ImageUrl,user_id,error_message,xray,flag,magnitude,CS-id,pdb_id,accel_a,time_offset,chart,fit,Questions,empty_number,empty_string\nBelgium,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C(=O)OCCCc1cccnc1)c2cccc(c2)C(=O)c3ccccc3,1480014,36.276729583740234,995042300,14016 ROUTE 31W,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,1,1,1QBS,1,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.497360340644872, 1.7058694986686864, 5.278052678195135, 0.16000320889028383],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.374499797821045},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.6242473125457764},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.367267608642578},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.6723148822784424},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.6537344455718994},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.3651671409606934},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.5654284954071045},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.4160959720611572},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.286726713180542},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.5100042819976807},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6676985025405884},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.680136501789093},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3391543924808502},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.09038983285427094},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.19802775979042053}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[7.525235855508179, 1.3186911876809984, 5.335672608564294, 0.7860743343958098],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":7.988070487976074},{\"\"x\"\":0.6000000238418579,\"\"y\"\":7.018453121185303},{\"\"x\"\":1.100000023841858,\"\"y\"\":8.115279197692871},{\"\"x\"\":1.600000023841858,\"\"y\"\":7.486658096313477},{\"\"x\"\":2.0999999046325684,\"\"y\"\":7.396438121795654},{\"\"x\"\":2.5999999046325684,\"\"y\"\":7.477052211761475},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.913095474243164},{\"\"x\"\":3.5999999046325684,\"\"y\"\":8.01385498046875},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.985900402069092},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.970335960388184},{\"\"x\"\":5.099999904632568,\"\"y\"\":5.448817253112793},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.5534818172454834},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.893947958946228},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6340042352676392},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8403874039649963}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,100,abc\nBurundi,MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW,COc1ccc2cc(ccc2c1)C(C)C(=O)Oc3ccc(C)cc3OC,1480015,36.276729583740234,995073444,80 STATE HIGHWAY 310,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,2,2,1ZP8,2,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.431460753103398, 2.1691498799246745, 5.266445597102774, 0.7825762827017926],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.751083850860596},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.203000068664551},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.415858745574951},{\"\"x\"\":1.600000023841858,\"\"y\"\":4.68414306640625},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.198400974273682},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.179222106933594},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.638473987579346},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.708553314208984},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.291589260101318},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.038082599639893},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4349939823150635},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.2194708585739136},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.1920831203460693},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.5352635979652405},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.3346920311450958}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.339458017970126, -1.0734184310171178, 4.746332950550934, 0.2482416857595658],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.2139337658882141},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.4269562065601349},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.2441573292016983},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.146635964512825},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.08818462491035461},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.2560656666755676},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.42434045672416687},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.37111231684684753},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.5581737160682678},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.183590054512024},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.5629843473434448},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3211288452148438},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.229961633682251},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.2560226917266846},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.2142398357391357}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCameroon,MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL,COc1ccc2cc(ccc2c1)C(C)C(=O)OCCCc3cccnc3,1480016,36.26095962524414,995153596,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,3,3,2BDJ,3,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.6760652578642325, 0.9046956320756703, 5.651408971856738, 0.07738846012184185],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.32425594329834},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.668442249298096},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.379785060882568},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.0345139503479},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.878653526306152},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.3451313972473145},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.336992263793945},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.037430286407471},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.0092692375183105},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.151902675628662},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4066951274871826},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3732759952545166},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.673728108406067},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48574790358543396},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.2783052325248718}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.938395863010111, -1.4658480661392117, 5.462702751996584, 0.3473139023615039],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.4941710829734802},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.15323974192142487},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.46373432874679565},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.3370431363582611},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.5179030299186707},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.27899765968322754},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.22075064480304718},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.5789918899536133},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.21169911324977875},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.27857646346092224},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0906332731246948},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8520300388336182},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.7177059650421143},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.8680918216705322},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.2413077354431152}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCanada,MMELVLKTIIGPIVVGVVLRIVDKWLNKDK,CC(C(=O)NCCS)c1cccc(c1)C(=O)c2ccccc2,1480017,36.26095962524414,99515,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,4,4,1IAN,4,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[0.8597390975430008, 1.0957625732481946, 5.260537067987958, 0.07974187998177736],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.8190152645111084},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.8421689867973328},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.8740922212600708},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.8924275040626526},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.8249067664146423},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.9327669143676758},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.8522974252700806},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.8174492716789246},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.8394647240638733},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.7139387726783752},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.5561167597770691},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3276226818561554},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.12479474395513535},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.13006797432899475},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.059702079743146896}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.760930219582546, 1.6591793293833013, 4.667155929720851, 0.7858109544121652],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.156993389129639},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.236701965332031},{\"\"x\"\":1.100000023841858,\"\"y\"\":6.010560512542725},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.495512962341309},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.087770462036133},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.79986572265625},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.597546577453613},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.520902156829834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.360654354095459},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.5539746284484863},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.577236294746399},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.0001264810562134},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.9305797815322876},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6033638715744019},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.4203685522079468}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nColombia,MDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN,FC(F)(F)c1ccc(OC2CCNCC2)cc1,1480029,36.3309440612793,995152050,1 COURT HOUSE SQUARE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,5,5,4UJ1,5,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[6.4995088314153655, 2.4270351004539914, 5.178659535348579, 0.625653346241577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.496231555938721},{\"\"x\"\":0.6000000238418579,\"\"y\"\":6.42543363571167},{\"\"x\"\":1.100000023841858,\"\"y\"\":7.040063858032227},{\"\"x\"\":1.600000023841858,\"\"y\"\":6.1115403175354},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.680728435516357},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.406774520874023},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.611269474029541},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.889094352722168},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.75344705581665},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.361435890197754},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.1666975021362305},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.172118902206421},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.801048994064331},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.4640021026134491},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.0010357667924836278}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.4734381347446401, 1.1649805188074196, 4.82958608866421, 0.09500545496710007],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.5279096364974976},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.3559974431991577},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.5246378183364868},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.5567657947540283},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.4114240407943726},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.4045010805130005},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.4769829511642456},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.4875500202178955},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.2991987466812134},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.922961413860321},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.6520044803619385},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.15350978076457977},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1078903079032898},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.17276449501514435},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.14066608250141144}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCosta Rica,MKSTKEEIQTIKTLLKDSRTAKYHKRLQIVL,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCCc3ccccc3,1480018,36.3309440612793,995084218,4041 SOUTHWESTERN BLVD,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,6,6,2BPW,6,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.4833641843311227, -1.8945978742090062, 4.671127708092568, 0.24159861311815153],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.0969524160027504},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.028483040630817413},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.22087176144123077},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.0068915546871721745},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.4305879771709442},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.44774115085601807},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.45346319675445557},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.2370593100786209},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.4657953977584839},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.155200719833374},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.2294070720672607},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.4311530590057373},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.33846116065979},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.608201026916504},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.8136143684387207}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.224573521642033, 1.4454033924198528, 5.6014197746076535, 0.2823216054197577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.95027494430542},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.1754679679870605},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.276752948760986},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.589294910430908},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.616994857788086},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.120813846588135},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.340766906738281},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.876471042633057},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.94999361038208},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.162564754486084},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.399557590484619},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.7977969646453857},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.0229872465133667},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48275601863861084},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.10408931970596313}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCuba,MHAILRYFIRRLFYHIFYKIYSLISKKHQSLPSDVRQF,COc1ccc2c(c1)c(CC(=O)N3CCCC3C(=O)Oc4ccc(C)cc4OC)c(C)n2C(=O)c5ccc(Cl)cc5,1480019,36.33115768432617,995081928,1227 US HIGHWAY 11,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,7,7,1QBS,7,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.320838679713925, -1.2421619987316728, 4.831325425225256, 0.3236011098403072],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.3727470338344574},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.12365014106035233},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.48422467708587646},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.2264465093612671},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.16821794211864471},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.3879014551639557},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.5470244884490967},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.3419053554534912},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.7655120491981506},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.2346516847610474},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.453336715698242},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.9565491676330566},{\"\"x\"\":6.099999904632568,\"\"y\"\":3.335299491882324},{\"\"x\"\":6.599999904632568,\"\"y\"\":3.240290880203247},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.1107218265533447}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.6401853521511094, 1.26211588875013, 5.399028074402744, 0.5089580830068091],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.8585598468780518},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.6077206134796143},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.855252265930176},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.619039297103882},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.839388370513916},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.335283041000366},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.571141481399536},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.4155046939849854},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7316646575927734},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.0680155754089355},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.891066551208496},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.6022753715515137},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.7652576565742493},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6875326037406921},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5828871726989746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nItaly,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO[N+](=O)[O-],1480020,36.33115768432617,99502,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,8,8,1ZP8,8,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.293592105923809, 1.3781586549141835, 5.1025898038676605, 0.03493851245291291],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.1287283897399902},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.267972230911255},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.398442506790161},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.5130622386932373},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.3255116939544678},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.127340793609619},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.47259783744812},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.131181478500366},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.090421438217163},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.02299165725708},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.1105059385299683},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.4494485855102539},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1375635862350464},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.036351121962070465},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.1619771122932434}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.953125499439879, 1.2528620255306528, 5.187637440149802, 0.3110348753260886],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.6585283279418945},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.911152362823486},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.924920082092285},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.8469438552856445},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.929472923278809},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.190037727355957},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.236179828643799},{\"\"x\"\":3.5999999046325684,\"\"y\"\":6.141019344329834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.295210838317871},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.265801906585693},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.3722851276397705},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8299226760864258},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.32690900564193726},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6274543404579163},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8441857099533081}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nRwanda,MPNSEPASLLELFNSIATQGELVRSLKAGNASK,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO,1480021,36.33137130737305,995037247,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,9,2BDJ,9,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.8209972202654474, 1.3779216716448506, 5.299882228439686, 0.06040645519069608],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.7821109294891357},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.542433023452759},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.7008674144744873},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.717301607131958},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.024452209472656},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.013899326324463},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.945094347000122},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.866621971130371},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7461626529693604},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.3454740047454834},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.61944317817688},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.999405026435852},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.46259793639183044},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.054134611040353775},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.05711187422275543}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.6318079657726035, 1.8495493770000595, 5.391793312471116, 0.17060707587348442],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.458079814910889},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.554427146911621},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.799983024597168},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.364140033721924},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.864485740661621},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.4509806632995605},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.702574729919434},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.7314534187316895},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.5123443603515625},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.724395751953125},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.354506969451904},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.7307666540145874},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.6305936574935913},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.035183437168598175},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.7575169205665588}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nSwitzerland,IRVVGRYLIEVWKAAGMDMDKVLFLWSSDEI,CN1CCC(CC1)Oc2ccc(cc2)C(F)(F)F,1480028,36.33137130737305,99504,92-11 179TH PLACE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,10,1IAN,10,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.1190255865097471, 2.3163895161544437, 5.4968866182279195, 0.2035204047289052],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.1057683229446411},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.1019697189331055},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.0818607807159424},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.062997817993164},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.046447515487671},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.1217249631881714},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.2166996002197266},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.215477705001831},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.0581893920898438},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.1747995615005493},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0181127786636353},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.5344523191452026},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.2569526433944702},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.1912207305431366},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.15060538053512573}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.1038581025805785, 2.0032224204185245, 5.087602825989163, 0.13277988512492753],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.0498509407043457},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.805217742919922},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.3415253162384033},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.0549843311309814},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.250074863433838},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.0432586669921875},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.265852451324463},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.9475724697113037},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.1929898262023926},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.7460060119628906},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6175861358642578},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3006608486175537},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3444803059101105},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.015537971630692482},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5527358055114746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\n,,,,,,,,,,,,,,,,,,,,,`);\ntestData.columns.add(DG.Column.fromList(DG.TYPE.BYTE_ARRAY, 'BinaryImage', Array.from(new Uint8Array(11))));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFvQixFQUFFLEdBQWU7SUFDekUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzVCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsa0JBQWtCLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0tBQ0Y7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQW9CLEVBQUUsS0FBZ0I7SUFDbEUsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLElBQUwsS0FBSyxHQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQStCdkIsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHR5cGUgKiBhcyBfREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmRlY2xhcmUgbGV0IERHOiB0eXBlb2YgX0RHO1xuaW1wb3J0ICogYXMgc2hhMjU2IGZyb20gJ2Zhc3Qtc2hhMjU2Jztcbi8qKlxuICogRm9yIGNvbHVtbnMgb2Ygc3RyaW5nIHR5cGUuIENoZWNrcyB3aGV0aGVyIGNvbHVtbiBjb250YWlucyBlbXB0eSB2YWx1ZXMgYW5kIHJlbW92ZXMgY29ycmVzcG9uZGluZyByb3dzIGluIGNhc2UgdXNlciBzZWxlY3RzIHRvIHJlbW92ZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbXB0eVN0cmluZ1Jvd3ModGFibGU6IF9ERy5EYXRhRnJhbWUsIGNvbDogX0RHLkNvbHVtbik6IG51bWJlcltdIHtcbiAgY29uc3QgY2F0cyA9IGNvbC5jYXRlZ29yaWVzO1xuICBjb25zdCBlbXB0eVJhd0luZCA9IGNhdHMubWFwKCh2YWwsIGluZCkgPT4gIXZhbCA/IGluZCA6IG51bGwpLmZpbHRlcigoaXQpID0+IGl0ICE9PSBudWxsKTtcbiAgY29uc3QgcmF3RGF0YSA9IFsuLi5jb2wuZ2V0UmF3RGF0YSgpXTtcbiAgY29uc3QgZW1wdHlSYXdzSW5kZXhlcyA9IFtdO1xuICBsZXQgcmVtb3ZlZFJvd3NDb3VudGVyID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dDb3VudDsgaSsrKSB7XG4gICAgaWYgKGVtcHR5UmF3SW5kLmluY2x1ZGVzKHJhd0RhdGFbaV0pKSB7XG4gICAgICB0YWJsZS5yb3dzLnJlbW92ZUF0KGkgLSByZW1vdmVkUm93c0NvdW50ZXIpO1xuICAgICAgZW1wdHlSYXdzSW5kZXhlcy5wdXNoKGkpO1xuICAgICAgcmVtb3ZlZFJvd3NDb3VudGVyICs9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbXB0eVJhd3NJbmRleGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzaERhdGFGcmFtZSh0YWJsZTogX0RHLkRhdGFGcmFtZSwgbmFtZXM/OiBzdHJpbmdbXSk6IFVpbnQ4QXJyYXkge1xuICBuYW1lcyA/Pz0gdGFibGUuY29sdW1ucy5uYW1lcygpO1xuICBjb25zdCBoYXNoZXIgPSBuZXcgc2hhMjU2Lkhhc2goKTtcbiAgY29uc3Qgb3JkZXIgPSB0YWJsZS5nZXRTb3J0ZWRPcmRlcihuYW1lcyk7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGFibGUuY29sdW1ucy5ieU5hbWUobmFtZSk7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gY29sdW1uLmdldFJhd0RhdGEoKTtcbiAgICBjb25zdCBpc1N0cmluZyA9IGNvbHVtbi50eXBlID09IERHLlRZUEUuU1RSSU5HO1xuICAgIGNvbnN0IGNhdHMgPSBjb2x1bW4uY2F0ZWdvcmllcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjYXRzW2RhdGFBcnJheVtvcmRlcltpXV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKGVuY29kZXIuZW5jb2RlKGRhdGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhQXJyYXlbb3JkZXJbaV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKFVpbnQ4QXJyYXkuZnJvbShbZGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc2hlci5kaWdlc3QoKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRlc3REYXRhID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoYGNvdW50cmllcyxmYXN0YSxzbWlsZXMsbW9scmVnbm8sTE9OLFppcCBDb2RlLFN0cmVldCBBZGRyZXNzIExpbmUgMSxJbWFnZVVybCx1c2VyX2lkLGVycm9yX21lc3NhZ2UseHJheSxmbGFnLG1hZ25pdHVkZSxDUy1pZCxwZGJfaWQsYWNjZWxfYSx0aW1lX29mZnNldCxjaGFydCxmaXQsUXVlc3Rpb25zLGVtcHR5X251bWJlcixlbXB0eV9zdHJpbmdcbkJlbGdpdW0sTVNORkhORUhWTVFGWVJOTkxLVEtHVkZHUlEsQ0MoQyg9TylPQ0NDYzFjY2NuYzEpYzJjY2NjKGMyKUMoPU8pYzNjY2NjYzMsMTQ4MDAxNCwzNi4yNzY3Mjk1ODM3NDAyMzQsOTk1MDQyMzAwLDE0MDE2IFJPVVRFIDMxVyxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDEsMSwxUUJTLDEsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsyLjQ5NzM2MDM0MDY0NDg3MiwgMS43MDU4Njk0OTg2Njg2ODY0LCA1LjI3ODA1MjY3ODE5NTEzNSwgMC4xNjAwMDMyMDg4OTAyODM4M10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Mi4zNzQ0OTk3OTc4MjEwNDV9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoyLjYyNDI0NzMxMjU0NTc3NjR9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuMzY3MjY3NjA4NjQyNTc4fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjY3MjMxNDg4MjI3ODQ0MjR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjY1MzczNDQ0NTU3MTg5OTR9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjM2NTE2NzE0MDk2MDY5MzR9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjU2NTQyODQ5NTQwNzEwNDV9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjQxNjA5NTk3MjA2MTE1NzJ9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjg2NzI2NzEzMTgwNTQyfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjUxMDAwNDI4MTk5NzY4MDd9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjY3Njk4NTAyNTQwNTg4NH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42ODAxMzY1MDE3ODkwOTN9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzM5MTU0MzkyNDgwODUwMn0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wOTAzODk4MzI4NTQyNzA5NH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xOTgwMjc3NTk3OTA0MjA1M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNy41MjUyMzU4NTU1MDgxNzksIDEuMzE4NjkxMTg3NjgwOTk4NCwgNS4zMzU2NzI2MDg1NjQyOTQsIDAuNzg2MDc0MzM0Mzk1ODA5OF0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ny45ODgwNzA0ODc5NzYwNzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo3LjAxODQ1MzEyMTE4NTMwM30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6OC4xMTUyNzkxOTc2OTI4NzF9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjcuNDg2NjU4MDk2MzEzNDc3fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ny4zOTY0MzgxMjE3OTU2NTR9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo3LjQ3NzA1MjIxMTc2MTQ3NX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuOTEzMDk1NDc0MjQzMTY0fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6OC4wMTM4NTQ5ODA0Njg3NX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Ni45ODU5MDA0MDIwNjkwOTJ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuOTcwMzM1OTYwMzg4MTg0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjQ0ODgxNzI1MzExMjc5M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi41NTM0ODE4MTcyNDU0ODM0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjg5Mzk0Nzk1ODk0NjIyOH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42MzQwMDQyMzUyNjc2MzkyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjg0MDM4NzQwMzk2NDk5NjN9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LDEwMCxhYmNcbkJ1cnVuZGksTURZS0VUTExNUEtUREZQTVJHR0xQTktFUFFJUUVLVyxDT2MxY2NjMmNjKGNjYzJjMSlDKEMpQyg9TylPYzNjY2MoQyljYzNPQywxNDgwMDE1LDM2LjI3NjcyOTU4Mzc0MDIzNCw5OTUwNzM0NDQsODAgU1RBVEUgSElHSFdBWSAzMTAsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZywyLDIsMVpQOCwyLDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNC40MzE0NjA3NTMxMDMzOTgsIDIuMTY5MTQ5ODc5OTI0Njc0NSwgNS4yNjY0NDU1OTcxMDI3NzQsIDAuNzgyNTc2MjgyNzAxNzkyNl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC43NTEwODM4NTA4NjA1OTZ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo0LjIwMzAwMDA2ODY2NDU1MX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NC40MTU4NTg3NDU1NzQ5NTF9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjQuNjg0MTQzMDY2NDA2MjV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjE5ODQwMDk3NDI3MzY4Mn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMTc5MjIyMTA2OTMzNTk0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC42Mzg0NzM5ODc1NzkzNDZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjcwODU1MzMxNDIwODk4NH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC4yOTE1ODkyNjAxMDEzMTh9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMDM4MDgyNTk5NjM5ODkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjQzNDk5Mzk4MjMxNTA2MzV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMjE5NDcwODU4NTczOTEzNn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xOTIwODMxMjAzNDYwNjkzfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjUzNTI2MzU5Nzk2NTI0MDV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzM0NjkyMDMxMTQ1MDk1OH1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi4zMzk0NTgwMTc5NzAxMjYsIC0xLjA3MzQxODQzMTAxNzExNzgsIDQuNzQ2MzMyOTUwNTUwOTM0LCAwLjI0ODI0MTY4NTc1OTU2NThdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuMjEzOTMzNzY1ODg4MjE0MX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuNDI2OTU2MjA2NTYwMTM0OX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4yNDQxNTczMjkyMDE2OTgzfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjE0NjYzNTk2NDUxMjgyNX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMDg4MTg0NjI0OTEwMzU0NjF9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjI1NjA2NTY2NjY3NTU2NzZ9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjQyNDM0MDQ1NjcyNDE2Njg3fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zNzExMTIzMTY4NDY4NDc1M30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41NTgxNzM3MTYwNjgyNjc4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE4MzU5MDA1NDUxMjAyNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS41NjI5ODQzNDczNDM0NDQ4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjMyMTEyODg0NTIxNDg0Mzh9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjI5OTYxNjMzNjgyMjUxfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjI1NjAyMjY5MTcyNjY4NDZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjE0MjM5ODM1NzM5MTM1N31dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ2FtZXJvb24sTUlFVkZMRkdJVkxHTElQSVRMQUdMRlZUQVlMUVlSUkdEUUxETCxDT2MxY2NjMmNjKGNjYzJjMSlDKEMpQyg9TylPQ0NDYzNjY2NuYzMsMTQ4MDAxNiwzNi4yNjA5NTk2MjUyNDQxNCw5OTUxNTM1OTYsMzAtNTYgV0hJVEVTVE9ORSBFWFBZLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsMywzLDJCREosMywxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzQuNjc2MDY1MjU3ODY0MjMyNSwgMC45MDQ2OTU2MzIwNzU2NzAzLCA1LjY1MTQwODk3MTg1NjczOCwgMC4wNzczODg0NjAxMjE4NDE4NV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC4zMjQyNTU5NDMyOTgzNH0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjQuNjY4NDQyMjQ5Mjk4MDk2fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo0LjM3OTc4NTA2MDg4MjU2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4wMzQ1MTM5NTAzNDc5fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC44Nzg2NTM1MjYzMDYxNTJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjM0NTEzMTM5NzI0NzMxNDV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjMzNjk5MjI2Mzc5Mzk0NX0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMDM3NDMwMjg2NDA3NDcxfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjAwOTI2OTIzNzUxODMxMDV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMTUxOTAyNjc1NjI4NjYyfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjQwNjY5NTEyNzQ4NzE4MjZ9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMzczMjc1OTk1MjU0NTE2Nn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42NzM3MjgxMDg0MDYwNjd9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDg1NzQ3OTAzNTg1NDMzOTZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMjc4MzA1MjMyNTI0ODcxOH1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi45MzgzOTU4NjMwMTAxMTEsIC0xLjQ2NTg0ODA2NjEzOTIxMTcsIDUuNDYyNzAyNzUxOTk2NTg0LCAwLjM0NzMxMzkwMjM2MTUwMzldLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuNDk0MTcxMDgyOTczNDgwMn0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuMTUzMjM5NzQxOTIxNDI0ODd9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuNDYzNzM0MzI4NzQ2Nzk1NjV9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMzM3MDQzMTM2MzU4MjYxMX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNTE3OTAzMDI5OTE4NjcwN30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMjc4OTk3NjU5NjgzMjI3NTR9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjIyMDc1MDY0NDgwMzA0NzE4fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC41Nzg5OTE4ODk5NTM2MTMzfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjIxMTY5OTExMzI0OTc3ODc1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI3ODU3NjQ2MzQ2MDkyMjI0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjA5MDYzMzI3MzEyNDY5NDh9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuODUyMDMwMDM4ODMzNjE4Mn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi43MTc3MDU5NjUwNDIxMTQzfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjg2ODA5MTgyMTY3MDUzMjJ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMjQxMzA3NzM1NDQzMTE1Mn1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ2FuYWRhLE1NRUxWTEtUSUlHUElWVkdWVkxSSVZES1dMTktESyxDQyhDKD1PKU5DQ1MpYzFjY2NjKGMxKUMoPU8pYzJjY2NjYzIsMTQ4MDAxNywzNi4yNjA5NTk2MjUyNDQxNCw5OTUxNSwzMC01NiBXSElURVNUT05FIEVYUFksaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw0LDQsMUlBTiw0LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMC44NTk3MzkwOTc1NDMwMDA4LCAxLjA5NTc2MjU3MzI0ODE5NDYsIDUuMjYwNTM3MDY3OTg3OTU4LCAwLjA3OTc0MTg3OTk4MTc3NzM2XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjgxOTAxNTI2NDUxMTEwODR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjg0MjE2ODk4Njc5NzMzMjh9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuODc0MDkyMjIxMjYwMDcwOH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC44OTI0Mjc1MDQwNjI2NTI2fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC44MjQ5MDY3NjY0MTQ2NDIzfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC45MzI3NjY5MTQzNjc2NzU4fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC44NTIyOTc0MjUyNzAwODA2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC44MTc0NDkyNzE2Nzg5MjQ2fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjgzOTQ2NDcyNDA2Mzg3MzN9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzEzOTM4NzcyNjc4Mzc1Mn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41NTYxMTY3NTk3NzcwNjkxfSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMyNzYyMjY4MTg1NjE1NTR9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTI0Nzk0NzQzOTU1MTM1MzV9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTMwMDY3OTc0MzI4OTk0NzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDU5NzAyMDc5NzQzMTQ2ODk2fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1Ljc2MDkzMDIxOTU4MjU0NiwgMS42NTkxNzkzMjkzODMzMDEzLCA0LjY2NzE1NTkyOTcyMDg1MSwgMC43ODU4MTA5NTQ0MTIxNjUyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo2LjE1Njk5MzM4OTEyOTYzOX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuMjM2NzAxOTY1MzMyMDMxfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo2LjAxMDU2MDUxMjU0MjcyNX0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS40OTU1MTI5NjIzNDEzMDl9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjA4Nzc3MDQ2MjAzNjEzM30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNzk5ODY1NzIyNjU2MjV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjU5NzU0NjU3NzQ1MzYxM30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNTIwOTAyMTU2ODI5ODM0fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjM2MDY1NDM1NDA5NTQ1OX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My41NTM5NzQ2Mjg0NDg0ODYzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjU3NzIzNjI5NDc0NjM5OX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wMDAxMjY0ODEwNTYyMTM0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjkzMDU3OTc4MTUzMjI4NzZ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjAzMzYzODcxNTc0NDAxOX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40MjAzNjg1NTIyMDc5NDY4fV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5Db2xvbWJpYSxNRFJUREVWU05IVEhES1BUTFRXRkVFSUZFRVlIU1BGSE4sRkMoRikoRiljMWNjYyhPQzJDQ05DQzIpY2MxLDE0ODAwMjksMzYuMzMwOTQ0MDYxMjc5Myw5OTUxNTIwNTAsMSBDT1VSVCBIT1VTRSBTUVVBUkUsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw1LDUsNFVKMSw1LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNi40OTk1MDg4MzE0MTUzNjU1LCAyLjQyNzAzNTEwMDQ1Mzk5MTQsIDUuMTc4NjU5NTM1MzQ4NTc5LCAwLjYyNTY1MzM0NjI0MTU3N10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ni40OTYyMzE1NTU5Mzg3MjF9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo2LjQyNTQzMzYzNTcxMTY3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo3LjA0MDA2Mzg1ODAzMjIyN30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ni4xMTE1NDAzMTc1MzU0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni42ODA3Mjg0MzU1MTYzNTd9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjQwNjc3NDUyMDg3NDAyM30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuNjExMjY5NDc0MDI5NTQxfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS44ODkwOTQzNTI3MjIxNjh9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuNzUzNDQ3MDU1ODE2NjV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuMzYxNDM1ODkwMTk3NzU0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjE2NjY5NzUwMjEzNjIzMDV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTcyMTE4OTAyMjA2NDIxfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjgwMTA0ODk5NDA2NDMzMX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NjQwMDIxMDI2MTM0NDkxfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjAwMTAzNTc2Njc5MjQ4MzYyNzh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzEuNDczNDM4MTM0NzQ0NjQwMSwgMS4xNjQ5ODA1MTg4MDc0MTk2LCA0LjgyOTU4NjA4ODY2NDIxLCAwLjA5NTAwNTQ1NDk2NzEwMDA3XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjoxLjUyNzkwOTYzNjQ5NzQ5NzZ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoxLjM1NTk5NzQ0MzE5OTE1Nzd9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuNTI0NjM3ODE4MzM2NDg2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MS41NTY3NjU3OTQ3NTQwMjgzfSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40MTE0MjQwNDA3OTQzNzI2fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40MDQ1MDEwODA1MTMwMDA1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40NzY5ODI5NTExNjQyNDU2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40ODc1NTAwMjAyMTc4OTU1fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjI5OTE5ODc0NjY4MTIxMzR9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuOTIyOTYxNDEzODYwMzIxfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjY1MjAwNDQ4MDM2MTkzODV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTUzNTA5NzgwNzY0NTc5Nzd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTA3ODkwMzA3OTAzMjg5OH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xNzI3NjQ0OTUwMTUxNDQzNX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xNDA2NjYwODI1MDE0MTE0NH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ29zdGEgUmljYSxNS1NUS0VFSVFUSUtUTExLRFNSVEFLWUhLUkxRSVZMLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NDYzNjY2NjYzMsMTQ4MDAxOCwzNi4zMzA5NDQwNjEyNzkzLDk5NTA4NDIxOCw0MDQxIFNPVVRIV0VTVEVSTiBCTFZELGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNiw2LDJCUFcsNiwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuNDgzMzY0MTg0MzMxMTIyNywgLTEuODk0NTk3ODc0MjA5MDA2MiwgNC42NzExMjc3MDgwOTI1NjgsIDAuMjQxNTk4NjEzMTE4MTUxNTNdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuMDk2OTUyNDE2MDAyNzUwNH0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuMDI4NDgzMDQwNjMwODE3NDEzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjIyMDg3MTc2MTQ0MTIzMDc3fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjAwNjg5MTU1NDY4NzE3MjE3NDV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjQzMDU4Nzk3NzE3MDk0NDJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjQ0Nzc0MTE1MDg1NjAxODA3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40NTM0NjMxOTY3NTQ0NTU1N30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMjM3MDU5MzEwMDc4NjIwOX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NjU3OTUzOTc3NTg0ODM5fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE1NTIwMDcxOTgzMzM3NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4yMjk0MDcwNzIwNjcyNjA3fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjQzMTE1MzA1OTAwNTczNzN9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMzM4NDYxMTYwNjU5Nzl9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNjA4MjAxMDI2OTE2NTA0fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjgxMzYxNDM2ODQzODcyMDd9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzUuMjI0NTczNTIxNjQyMDMzLCAxLjQ0NTQwMzM5MjQxOTg1MjgsIDUuNjAxNDE5Nzc0NjA3NjUzNSwgMC4yODIzMjE2MDU0MTk3NTc3XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo0Ljk1MDI3NDk0NDMwNTQyfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NS4xNzU0Njc5Njc5ODcwNjA1fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjI3Njc1Mjk0ODc2MDk4Nn0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS41ODkyOTQ5MTA0MzA5MDh9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjYxNjk5NDg1Nzc4ODA4Nn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMTIwODEzODQ2NTg4MTM1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS4zNDA3NjY5MDY3MzgyODF9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0Ljg3NjQ3MTA0MjYzMzA1N30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC45NDk5OTM2MTAzODIwOH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4xNjI1NjQ3NTQ0ODYwODR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMzk5NTU3NTkwNDg0NjE5fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjc5Nzc5Njk2NDY0NTM4NTd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDIyOTg3MjQ2NTEzMzY2N30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40ODI3NTYwMTg2Mzg2MTA4NH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xMDQwODkzMTk3MDU5NjMxM31dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ3ViYSxNSEFJTFJZRklSUkxGWUhJRllLSVlTTElTS0tIUVNMUFNEVlJRRixDT2MxY2NjMmMoYzEpYyhDQyg9TylOM0NDQ0MzQyg9TylPYzRjY2MoQyljYzRPQyljKEMpbjJDKD1PKWM1Y2NjKENsKWNjNSwxNDgwMDE5LDM2LjMzMTE1NzY4NDMyNjE3LDk5NTA4MTkyOCwxMjI3IFVTIEhJR0hXQVkgMTEsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw3LDcsMVFCUyw3LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy4zMjA4Mzg2Nzk3MTM5MjUsIC0xLjI0MjE2MTk5ODczMTY3MjgsIDQuODMxMzI1NDI1MjI1MjU2LCAwLjMyMzYwMTEwOTg0MDMwNzJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuMzcyNzQ3MDMzODM0NDU3NH0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuMTIzNjUwMTQxMDYwMzUyMzN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuNDg0MjI0Njc3MDg1ODc2NDZ9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMjI2NDQ2NTA5MzYxMjY3MX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMTY4MjE3OTQyMTE4NjQ0NzF9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjM4NzkwMTQ1NTE2Mzk1NTd9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjU0NzAyNDQ4ODQ0OTA5Njd9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjM0MTkwNTM1NTQ1MzQ5MTJ9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzY1NTEyMDQ5MTk4MTUwNn0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4yMzQ2NTE2ODQ3NjEwNDc0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjQ1MzMzNjcxNTY5ODI0Mn0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi45NTY1NDkxNjc2MzMwNTY2fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjMzNTI5OTQ5MTg4MjMyNH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4yNDAyOTA4ODAyMDMyNDd9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMTEwNzIxODI2NTUzMzQ0N31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy42NDAxODUzNTIxNTExMDk0LCAxLjI2MjExNTg4ODc1MDEzLCA1LjM5OTAyODA3NDQwMjc0NCwgMC41MDg5NTgwODMwMDY4MDkxXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjozLjg1ODU1OTg0Njg3ODA1MTh9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjozLjYwNzcyMDYxMzQ3OTYxNDN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuODU1MjUyMjY1OTMwMTc2fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjYxOTAzOTI5NzEwMzg4Mn0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuODM5Mzg4MzcwNTEzOTE2fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My4zMzUyODMwNDEwMDAzNjZ9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjU3MTE0MTQ4MTM5OTUzNn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuNDE1NTA0NjkzOTg0OTg1NH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My43MzE2NjQ2NTc1OTI3NzM0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjA2ODAxNTU3NTQwODkzNTV9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuODkxMDY2NTUxMjA4NDk2fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjYwMjI3NTM3MTU1MTUxMzd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzY1MjU3NjU2NTc0MjQ5M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42ODc1MzI2MDM3NDA2OTIxfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjU4Mjg4NzE3MjY5ODk3NDZ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkl0YWx5LE1TTkZITkVIVk1RRllSTk5MS1RLR1ZGR1JRLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NPW04rXSg9TylbTy1dLDE0ODAwMjAsMzYuMzMxMTU3Njg0MzI2MTcsOTk1MDIsXCIxNjgtNDYgOTFTVCBBVkUuLCAyTkQgRkxSXCIsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw4LDgsMVpQOCw4LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi4yOTM1OTIxMDU5MjM4MDksIDEuMzc4MTU4NjU0OTE0MTgzNSwgNS4xMDI1ODk4MDM4Njc2NjA1LCAwLjAzNDkzODUxMjQ1MjkxMjkxXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjoyLjEyODcyODM4OTczOTk5MDJ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoyLjI2Nzk3MjIzMDkxMTI1NX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Mi4zOTg0NDI1MDY3OTAxNjF9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuNTEzMDYyMjM4NjkzMjM3M30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuMzI1NTExNjkzOTU0NDY3OH0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuMTI3MzQwNzkzNjA5NjE5fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi40NzI1OTc4Mzc0NDgxMn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuMTMxMTgxNDc4NTAwMzY2fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjA5MDQyMTQzODIxNzE2M30se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4wMjI5OTE2NTcyNTcwOH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xMTA1MDU5Mzg1Mjk5NjgzfSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ0OTQ0ODU4NTUxMDI1Mzl9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTM3NTYzNTg2MjM1MDQ2NH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMzYzNTExMjE5NjIwNzA0NjV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTYxOTc3MTEyMjkzMjQzNH1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS45NTMxMjU0OTk0Mzk4NzksIDEuMjUyODYyMDI1NTMwNjUyOCwgNS4xODc2Mzc0NDAxNDk4MDIsIDAuMzExMDM0ODc1MzI2MDg4Nl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NS42NTg1MjgzMjc5NDE4OTQ1fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NS45MTExNTIzNjI4MjM0ODZ9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuOTI0OTIwMDgyMDkyMjg1fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1Ljg0Njk0Mzg1NTI4NTY0NDV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjkyOTQ3MjkyMzI3ODgwOX0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuMTkwMDM3NzI3MzU1OTU3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4yMzYxNzk4Mjg2NDM3OTl9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjE0MTAxOTM0NDMyOTgzNH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4yOTUyMTA4MzgzMTc4NzF9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMjY1ODAxOTA2NTg1NjkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjM3MjI4NTEyNzYzOTc3MDV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuODI5OTIyNjc2MDg2NDI1OH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMjY5MDkwMDU2NDE5MzcyNn0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42Mjc0NTQzNDA0NTc5MTYzfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjg0NDE4NTcwOTk1MzMwODF9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcblJ3YW5kYSxNUE5TRVBBU0xMRUxGTlNJQVRRR0VMVlJTTEtBR05BU0ssQ0MoQylDYzFjY2MoY2MxKUMoQylDKD1PKU4yQ0NDQzJDKD1PKU9DQ08sMTQ4MDAyMSwzNi4zMzEzNzEzMDczNzMwNSw5OTUwMzcyNDcsXCIxNjgtNDYgOTFTVCBBVkUuLCAyTkQgRkxSXCIsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw5LDksMkJESiw5LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy44MjA5OTcyMjAyNjU0NDc0LCAxLjM3NzkyMTY3MTY0NDg1MDYsIDUuMjk5ODgyMjI4NDM5Njg2LCAwLjA2MDQwNjQ1NTE5MDY5NjA4XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjozLjc4MjExMDkyOTQ4OTEzNTd9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjozLjU0MjQzMzAyMzQ1Mjc1OX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My43MDA4Njc0MTQ0NzQ0ODczfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjcxNzMwMTYwNzEzMTk1OH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMDI0NDUyMjA5NDcyNjU2fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4wMTM4OTkzMjYzMjQ0NjN9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjk0NTA5NDM0NzAwMDEyMn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuODY2NjIxOTcxMTMwMzcxfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjc0NjE2MjY1Mjk2OTM2MDR9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMzQ1NDc0MDA0NzQ1NDgzNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi42MTk0NDMxNzgxNzY4OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC45OTk0MDUwMjY0MzU4NTJ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDYyNTk3OTM2MzkxODMwNDR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDU0MTM0NjExMDQwMzUzNzc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1NzExMTg3NDIyMjc1NTQzfV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1LjYzMTgwNzk2NTc3MjYwMzUsIDEuODQ5NTQ5Mzc3MDAwMDU5NSwgNS4zOTE3OTMzMTI0NzExMTYsIDAuMTcwNjA3MDc1ODczNDg0NDJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjUuNDU4MDc5ODE0OTEwODg5fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NS41NTQ0MjcxNDY5MTE2MjF9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNzk5OTgzMDI0NTk3MTY4fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjM2NDE0MDAzMzcyMTkyNH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuODY0NDg1NzQwNjYxNjIxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS40NTA5ODA2NjMyOTk1NjA1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS43MDI1NzQ3Mjk5MTk0MzR9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjczMTQ1MzQxODczMTY4OTV9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuNTEyMzQ0MzYwMzUxNTYyNX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS43MjQzOTU3NTE5NTMxMjV9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMzU0NTA2OTY5NDUxOTA0fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjczMDc2NjY1NDAxNDU4NzR9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjMwNTkzNjU3NDkzNTkxM30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMzUxODM0MzcxNjg1OTgxNzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzU3NTE2OTIwNTY2NTU4OH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuU3dpdHplcmxhbmQsSVJWVkdSWUxJRVZXS0FBR01ETURLVkxGTFdTU0RFSSxDTjFDQ0MoQ0MxKU9jMmNjYyhjYzIpQyhGKShGKUYsMTQ4MDAyOCwzNi4zMzEzNzEzMDczNzMwNSw5OTUwNCw5Mi0xMSAxNzlUSCBQTEFDRSxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDksMTAsMUlBTiwxMCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzEuMTE5MDI1NTg2NTA5NzQ3MSwgMi4zMTYzODk1MTYxNTQ0NDM3LCA1LjQ5Njg4NjYxODIyNzkxOTUsIDAuMjAzNTIwNDA0NzI4OTA1Ml0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MS4xMDU3NjgzMjI5NDQ2NDExfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MS4xMDE5Njk3MTg5MzMxMDU1fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjA4MTg2MDc4MDcxNTk0MjR9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuMDYyOTk3ODE3OTkzMTY0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4wNDY0NDc1MTU0ODc2NzF9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoxLjEyMTcyNDk2MzE4ODE3MTR9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoxLjIxNjY5OTYwMDIxOTcyNjZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoxLjIxNTQ3NzcwNTAwMTgzMX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wNTgxODkzOTIwODk4NDM4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE3NDc5OTU2MTUwMDU0OTN9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDE4MTEyNzc4NjYzNjM1M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41MzQ0NTIzMTkxNDUyMDI2fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI1Njk1MjY0MzM5NDQ3MDJ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTkxMjIwNzMwNTQzMTM2Nn0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xNTA2MDUzODA1MzUxMjU3M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy4xMDM4NTgxMDI1ODA1Nzg1LCAyLjAwMzIyMjQyMDQxODUyNDUsIDUuMDg3NjAyODI1OTg5MTYzLCAwLjEzMjc3OTg4NTEyNDkyNzUzXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjozLjA0OTg1MDk0MDcwNDM0NTd9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoyLjgwNTIxNzc0MjkxOTkyMn0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My4zNDE1MjUzMTYyMzg0MDMzfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjA1NDk4NDMzMTEzMDk4MTR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjI1MDA3NDg2MzQzMzgzOH0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMDQzMjU4NjY2OTkyMTg3NX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMjY1ODUyNDUxMzI0NDYzfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi45NDc1NzI0Njk3MTEzMDM3fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjE5Mjk4OTgyNjIwMjM5MjZ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNzQ2MDA2MDExOTYyODkwNn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42MTc1ODYxMzU4NjQyNTc4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMwMDY2MDg0ODYxNzU1Mzd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzQ0NDgwMzA1OTEwMTEwNX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMTU1Mzc5NzE2MzA2OTI0ODJ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTUyNzM1ODA1NTExNDc0Nn1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuLCwsLCwsLCwsLCwsLCwsLCwsLCwsYCk7XG50ZXN0RGF0YS5jb2x1bW5zLmFkZChERy5Db2x1bW4uZnJvbUxpc3QoREcuVFlQRS5CWVRFX0FSUkFZLCAnQmluYXJ5SW1hZ2UnLCBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KDExKSkpKTtcbiJdfQ==","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { testData } from './dataframe-utils';\nimport { changeOptionsSaveLayout, filterAsync, loadLayout, selectFilterChangeCurrent, testViewerInternal } from './test-viewer-utils';\nconst STANDART_TIMEOUT = 30000;\nconst BENCHMARK_TIMEOUT = 10800000;\nconst stdLog = console.log.bind(console);\nconst stdInfo = console.info.bind(console);\nconst stdWarn = console.warn.bind(console);\nconst stdError = console.error.bind(console);\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\nconst demoCatName = 'Demo';\nconst detectorsCatName = 'Detectors';\nconst coreCatName = 'Core';\nconst wasRegistered = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report, returnOnFail) {\n this.catchUnhandled = true;\n this.report = false;\n this.returnOnFail = false;\n this.closeAll = true;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n if (returnOnFail !== undefined)\n this.returnOnFail = returnOnFail;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = STANDART_TIMEOUT);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var _b;\n let result = '';\n try {\n if (DG.Test.isInDebug)\n debugger;\n let res = yield test();\n try {\n result = (_b = res === null || res === void 0 ? void 0 : res.toString()) !== null && _b !== void 0 ? _b : '';\n }\n catch (e) {\n result = 'Can\\'t convert test\\'s result to string';\n console.error(`Can\\'t convert test\\'s result to string in the ${this.category}:${this.name} test`);\n }\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport class Category {\n}\nexport class NodeTestExecutionOptions {\n}\nexport class TestExecutionOptions {\n}\nexport function testEvent(event, handler, trigger, ms = 0, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n try {\n handler(args);\n resolve('OK');\n }\n catch (e) {\n reject(e);\n }\n finally {\n sub.unsubscribe();\n clearTimeout(timeout);\n }\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function testEventAsync(event, handler, trigger, ms = 0, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n handler(args).then(() => {\n resolve('OK');\n }).catch((e) => {\n reject(e);\n }).finally(() => {\n sub.unsubscribe();\n clearTimeout(timeout);\n });\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected = true, error) {\n if (error)\n error = `${error}, `;\n else\n error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001, error) {\n if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||\n (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||\n (actual === Number.NaN && expected === Number.NaN) || (isNaN(actual) && isNaN(expected)))\n return;\n const areEqual = Math.abs(actual - expected) < tolerance;\n expect(areEqual, true, `${error !== null && error !== void 0 ? error : ''} (tolerance = ${tolerance}; a = ${actual}, e = ${expected})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectTable(actual, expected, error) {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error !== null && error !== void 0 ? error : ''}, row count`);\n for (const column of expected.columns) {\n const actualColumn = actual.columns.byName(column.name);\n if (actualColumn == null)\n throw new Error(`Column ${column.name} not found`);\n if (actualColumn.type != column.type)\n throw new Error(`Column ${column.name} type expected ${column.type} got ${actualColumn.type}`);\n for (let i = 0; i < expectedRowCount; i++) {\n const value = column.get(i);\n const actualValue = actualColumn.get(i);\n if (column.type == DG.TYPE.FLOAT)\n expectFloat(actualValue, value, 0.0001, error);\n else if (column.type == DG.TYPE.DATE_TIME)\n expect(actualValue.isSame(value), true, error);\n else\n expect(actualValue, value, error);\n }\n }\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests_, options) {\n var _a;\n currentCategory = category;\n tests_();\n if (tests[currentCategory]) {\n tests[currentCategory].clear = (_a = options === null || options === void 0 ? void 0 : options.clear) !== null && _a !== void 0 ? _a : true;\n tests[currentCategory].timeout = options === null || options === void 0 ? void 0 : options.timeout;\n tests[currentCategory].benchmarks = options === null || options === void 0 ? void 0 : options.benchmarks;\n tests[currentCategory].stressTests = options === null || options === void 0 ? void 0 : options.stressTests;\n tests[currentCategory].owner = options === null || options === void 0 ? void 0 : options.owner;\n }\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nfunction addNamespace(s, f) {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\nexport function initAutoTests(package_, module) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n return __awaiter(this, void 0, void 0, function* () {\n const packageId = package_.id;\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (package_.name === 'DevTools' || (!!module && module._package.name === 'DevTools')) {\n for (const f of window.dartTests) {\n const arr = f.name.split(/\\s*\\|\\s*!/g);\n let name = (_a = arr.pop()) !== null && _a !== void 0 ? _a : f.name;\n let cat = arr.length ? coreCatName + ': ' + arr.join(': ') : coreCatName;\n let fullName = name.split(' | ');\n name = fullName[fullName.length - 1];\n fullName.unshift(cat);\n fullName.pop();\n cat = fullName.join(': ');\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(new Test(cat, name, f.test, { isAggregated: false, timeout: (_c = (_b = f.options) === null || _b === void 0 ? void 0 : _b.timeout) !== null && _c !== void 0 ? _c : STANDART_TIMEOUT, skipReason: (_d = f.options) === null || _d === void 0 ? void 0 : _d.skipReason, owner: (_e = f.options) === null || _e === void 0 ? void 0 : _e.owner, benchmark: (_g = (_f = f.options) === null || _f === void 0 ? void 0 : _f.benchmark) !== null && _g !== void 0 ? _g : false }));\n }\n }\n const moduleAutoTests = [];\n const moduleDemo = [];\n const moduleDetectors = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n const reg = new RegExp(/skip:\\s*([^,\\s]+)|wait:\\s*(\\d+)|cat:\\s*([^,\\s]+)|timeout:\\s*(\\d+)/g);\n for (const f of packFunctions) {\n const tests = f.options['test'];\n const demo = f.options['demoPath'];\n if ((tests && Array.isArray(tests) && tests.length)) {\n for (let i = 0; i < tests.length; i++) {\n const res = tests[i].matchAll(reg);\n const map = {};\n Array.from(res).forEach((arr) => {\n if (arr[0].startsWith('skip'))\n map['skip'] = arr[1];\n else if (arr[0].startsWith('wait'))\n map['wait'] = parseInt(arr[2]);\n else if (arr[0].startsWith('cat'))\n map['cat'] = arr[3];\n else if (arr[0].startsWith('timeout'))\n map['timeout'] = parseInt(arr[4]);\n });\n const test = new Test((_h = map.cat) !== null && _h !== void 0 ? _h : autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {\n const res = yield grok.functions.eval(addNamespace(tests[i], f));\n if (map.wait)\n yield delay(map.wait);\n // eslint-disable-next-line no-throw-literal\n if (typeof res === 'boolean' && !res)\n throw `Failed: ${tests[i]}, expected true, got ${res}`;\n }), { skipReason: map.skip, timeout: DG.Test.isInBenchmark ? (_j = map.benchmarkTimeout) !== null && _j !== void 0 ? _j : BENCHMARK_TIMEOUT : (_k = map.timeout) !== null && _k !== void 0 ? _k : STANDART_TIMEOUT });\n if (map.cat) {\n const cat = map.cat;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n // only before/after can be defined in ts files tests under the category\n if (!moduleTests[cat].tests)\n moduleTests[cat].tests = [];\n moduleTests[cat].tests.push(test);\n }\n else\n moduleAutoTests.push(test);\n }\n }\n if (demo) {\n const wait = f.options['demoWait'] ? parseInt(f.options['demoWait']) : undefined;\n const test = new Test(demoCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n yield delay(300);\n grok.shell.clearLastError();\n yield f.apply();\n yield delay(wait ? wait : 2000);\n const unhandled = yield grok.shell.lastError;\n if (unhandled)\n throw new Error(unhandled);\n }), { skipReason: f.options['demoSkip'] });\n moduleDemo.push(test);\n }\n if (f.hasTag('semTypeDetector')) {\n let detectorsTestData = testData;\n if (f.options['testData']) {\n detectorsTestData = yield grok.data.files.openTable(`System:AppData/${package_.nqName}/${f.options['testData']}`);\n }\n const test = new Test(detectorsCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n const arr = [];\n console.log(`System:AppData/${package_.nqName}/${f.options['testData']}`);\n for (const col of detectorsTestData.clone().columns) {\n const res = yield f.apply([col]);\n arr.push(res || col.semType);\n }\n const resArr = arr.filter((i) => i);\n expect(resArr.length, 1);\n if (f.options['testDataColumnName'])\n expect(resArr[0], f.options['testDataColumnName']);\n }), { skipReason: f.options['skipTest'] });\n moduleDetectors.push(test);\n }\n }\n wasRegistered[packageId] = true;\n if (moduleAutoTests.length > 0)\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests, clear: true };\n if (moduleDemo.length > 0)\n moduleTests[demoCatName] = { tests: moduleDemo, clear: true };\n if (moduleDetectors.length > 0)\n moduleTests[detectorsCatName] = { tests: moduleDetectors, clear: false };\n });\n}\nfunction redefineConsole() {\n const logs = [];\n console.log = (...args) => {\n logs.push(...args);\n stdLog(...args);\n };\n console.info = (...args) => {\n logs.push(...args);\n stdInfo(...args);\n };\n console.warn = (...args) => {\n logs.push(...args);\n stdWarn(...args);\n };\n console.error = (...args) => {\n logs.push(...args);\n stdError(...args);\n };\n return logs;\n}\nfunction resetConsole() {\n console.log = stdLog;\n console.info = stdInfo;\n console.warn = stdWarn;\n console.error = stdError;\n}\nexport function runTests(options) {\n var _a, _b;\n var _c;\n return __awaiter(this, void 0, void 0, function* () {\n const package_ = (options === null || options === void 0 ? void 0 : options.nodeOptions) ? options.nodeOptions.package : grok.functions.getCurrentCall().func.package;\n if (!package_)\n throw new Error('Can\\'t run tests outside of the package');\n const match = (_a = package_.packageOwner) === null || _a === void 0 ? void 0 : _a.match(/<([^>]*)>/);\n const packageOwner = match ? match[1] : '';\n if (package_ != undefined)\n yield initAutoTests(package_);\n const results = [];\n console.log(`Running tests...`);\n console.log(options);\n options !== null && options !== void 0 ? options : (options = {});\n (_b = (_c = options).testContext) !== null && _b !== void 0 ? _b : (_c.testContext = new TestContext());\n grok.shell.clearLastError();\n const logs = redefineConsole();\n yield invokeTests(tests, options);\n for (let r of results) {\n r.result = r.result.toString().replace(/\"/g, '\\'');\n if (r.logs != undefined)\n r.logs = r.logs.toString().replace(/\"/g, '\\'');\n }\n return results;\n function invokeCategoryMethod(method, category) {\n return __awaiter(this, void 0, void 0, function* () {\n let invokationResult = undefined;\n try {\n if (method !== undefined) {\n yield timeout(() => __awaiter(this, void 0, void 0, function* () {\n yield method();\n }), 100000, `before ${category}: timeout error`);\n }\n }\n catch (x) {\n invokationResult = yield getResult(x);\n }\n return invokationResult;\n });\n }\n function invokeTestsInCategory(category, options, isTargetCategory) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;\n return __awaiter(this, void 0, void 0, function* () {\n let t = (_a = category.tests) !== null && _a !== void 0 ? _a : [];\n const res = [];\n // let memoryUsageBefore = (window?.performance as any)?.memory?.usedJSHeapSize;\n const widgetsBefore = getWidgetsCountSafe();\n if (category.clear) {\n let skippingTests = isTargetCategory && options.skipToTest != undefined;\n for (let i = 0; i < t.length; i++) {\n if (t[i].options) {\n if (((_b = t[i].options) === null || _b === void 0 ? void 0 : _b.benchmark) === undefined) {\n if (!t[i].options)\n t[i].options = {};\n t[i].options.benchmark = (_c = category.benchmarks) !== null && _c !== void 0 ? _c : false;\n }\n }\n let test = t[i];\n if (options.test)\n if (options.test.toLowerCase() !== test.name.toLowerCase())\n continue;\n if (skippingTests) {\n if ((options === null || options === void 0 ? void 0 : options.skipToTest) != undefined && test.name.toLowerCase().trim() === (options === null || options === void 0 ? void 0 : options.skipToTest.toLowerCase().trim())) {\n // Found the target test, stop skipping after this one\n skippingTests = false;\n }\n else\n continue;\n }\n if (test === null || test === void 0 ? void 0 : test.options) {\n test.options.owner = (_g = (_f = (_e = (_d = t[i].options) === null || _d === void 0 ? void 0 : _d.owner) !== null && _e !== void 0 ? _e : category === null || category === void 0 ? void 0 : category.owner) !== null && _f !== void 0 ? _f : packageOwner) !== null && _g !== void 0 ? _g : '';\n }\n // let isGBEnable = (window as any).gc && test.options?.skipReason == undefined;\n // console.log(`********${isGBEnable}`);\n // if (isGBEnable)\n // await (window as any).gc();\n // memoryUsageBefore = (window?.performance as any)?.memory?.usedJSHeapSize;\n let testRun = yield execTest(test, options === null || options === void 0 ? void 0 : options.test, logs, DG.Test.isInBenchmark ? (_j = (_h = t[i].options) === null || _h === void 0 ? void 0 : _h.benchmarkTimeout) !== null && _j !== void 0 ? _j : BENCHMARK_TIMEOUT : (_l = (_k = t[i].options) === null || _k === void 0 ? void 0 : _k.timeout) !== null && _l !== void 0 ? _l : STANDART_TIMEOUT, package_.name, options.verbose);\n // if (isGBEnable)\n // await (window as any).gc();\n if (testRun) {\n res.push(Object.assign(Object.assign({}, testRun), { widgetsDifference: getWidgetsCountSafe() - widgetsBefore }));\n // Return early if returnOnFail is set and test failed (but ignore failure for the skipToTest test itself)\n if (options.returnOnFail && options.skipToTest !== test.name && !testRun.success && !testRun.skipped)\n return res;\n }\n // res.push({ ...testRun, memoryDelta: (window?.performance as any)?.memory?.usedJSHeapSize - memoryUsageBefore, widgetsDelta: getWidgetsCountSafe() - widgetsBefore });\n if (!options.nodeOptions && ((_m = options.testContext) === null || _m === void 0 ? void 0 : _m.closeAll) !== false) {\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n }\n }\n }\n else {\n let skippingTests = isTargetCategory && options.skipToTest != undefined;\n for (let i = 0; i < t.length; i++) {\n let test = t[i];\n if (options.test)\n if (options.test.toLowerCase() !== test.name.toLowerCase())\n continue;\n if (skippingTests) {\n if ((options === null || options === void 0 ? void 0 : options.skipToTest) != undefined && test.name.toLowerCase().trim() === (options === null || options === void 0 ? void 0 : options.skipToTest.toLowerCase().trim())) {\n // Found the target test, stop skipping after this one\n skippingTests = false;\n }\n continue; // Skip this test (including the target)\n }\n if (test === null || test === void 0 ? void 0 : test.options) {\n test.options.owner = (_r = (_q = (_p = (_o = t[i].options) === null || _o === void 0 ? void 0 : _o.owner) !== null && _p !== void 0 ? _p : category === null || category === void 0 ? void 0 : category.owner) !== null && _q !== void 0 ? _q : packageOwner) !== null && _r !== void 0 ? _r : '';\n }\n // let isGBEnable = (window as any).gc && test.options?.skipReason == undefined;\n // console.log(`********${isGBEnable}`);\n // if (isGBEnable)\n // await (window as any).gc();\n // memoryUsageBefore = (window?.performance as any)?.memory?.usedJSHeapSize;\n let testRun = yield execTest(test, options === null || options === void 0 ? void 0 : options.test, logs, DG.Test.isInBenchmark ? (_t = (_s = t[i].options) === null || _s === void 0 ? void 0 : _s.benchmarkTimeout) !== null && _t !== void 0 ? _t : BENCHMARK_TIMEOUT : (_u = t[i].options) === null || _u === void 0 ? void 0 : _u.timeout, package_.name, options.verbose);\n // if (isGBEnable)\n // await (window as any).gc();\n if (testRun) {\n res.push(Object.assign(Object.assign({}, testRun), { widgetsDifference: getWidgetsCountSafe() - widgetsBefore }));\n // Return early if returnOnFail is set and test failed (but ignore failure for the skipToTest test itself)\n if (options.returnOnFail && options.skipToTest !== test.name && !testRun.success && !testRun.skipped)\n return res;\n }\n // res.push({ ...testRun, memoryDelta: (window?.performance as any)?.memory?.usedJSHeapSize - memoryUsageBefore, widgetsDifference: getWidgetsCountSafe() - widgetsBefore });\n }\n }\n return res;\n });\n }\n function getWidgetsCountSafe() {\n var _a;\n if (typeof process !== 'undefined')\n return 0;\n let length = -1;\n try {\n length = DG.Widget.getAll().length;\n }\n catch (e) {\n console.warn((_a = e.message) !== null && _a !== void 0 ? _a : e);\n }\n return length;\n }\n function invokeTests(categoriesToInvoke, options) {\n var _a, _b, _c, _d, _e, _f;\n return __awaiter(this, void 0, void 0, function* () {\n try {\n let skippingCategories = (options === null || options === void 0 ? void 0 : options.skipToCategory) != undefined;\n let isTargetCategory = false;\n for (const [key, value] of Object.entries(categoriesToInvoke)) {\n if ((_a = options.exclude) === null || _a === void 0 ? void 0 : _a.some((c) => key.startsWith(c)))\n continue;\n if ((options === null || options === void 0 ? void 0 : options.category) != null && !key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase().trim()))\n continue;\n if (skippingCategories) {\n if (isTargetCategory)\n skippingCategories = false;\n else {\n if ((options === null || options === void 0 ? void 0 : options.skipToCategory) != null && key.toLowerCase().trim() === (options === null || options === void 0 ? void 0 : options.skipToCategory.toLowerCase().trim())) {\n isTargetCategory = true;\n }\n else {\n // Haven't found the target category yet, keep skipping\n continue;\n }\n }\n }\n //@ts-ignore\n const skipped = (_b = value.tests) === null || _b === void 0 ? void 0 : _b.every((t) => {\n var _a;\n return ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason)\n || ((options === null || options === void 0 ? void 0 : options.test) != null && options.test.toLowerCase() !== t.name.toLowerCase());\n });\n if (!skipped) {\n //@ts-ignore\n const skippedCount = ((_c = value.tests) !== null && _c !== void 0 ? _c : []).filter((t) => { var _a; return ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || ((options === null || options === void 0 ? void 0 : options.test) != null && options.test.toLowerCase() !== t.name.toLowerCase()); }).length;\n stdLog(`Package testing: Started {{${key}}}${skippedCount > 0 ? ` skipped {{${skippedCount}}}` : ''}`);\n value.beforeStatus = yield invokeCategoryMethod(value.before, key);\n }\n let t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n if (options.stressTest) {\n t = t.filter((e) => { var _a; return (_a = e.options) === null || _a === void 0 ? void 0 : _a.stressTest; });\n t = shuffle(t);\n }\n if (((_f = (_e = options.tags) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0) > 0) {\n t = t.filter((e) => { var _a, _b; return (_b = (_a = e.options) === null || _a === void 0 ? void 0 : _a.tags) === null || _b === void 0 ? void 0 : _b.some(tag => { var _a; return ((_a = options === null || options === void 0 ? void 0 : options.tags) !== null && _a !== void 0 ? _a : []).includes(tag); }); });\n }\n let res;\n if (value.beforeStatus) {\n res = Array.from(t.map((testElem) => {\n return {\n date: new Date().toISOString(),\n category: key,\n name: testElem.name,\n success: false,\n result: 'before() failed',\n ms: 0,\n skipped: false,\n logs: '',\n owner: packageOwner,\n package: package_.name,\n widgetsDifference: 0,\n flaking: DG.Test.isReproducing\n };\n }));\n res.forEach((test) => __awaiter(this, void 0, void 0, function* () { return yield grok.shell.reportTest('package', test); }));\n }\n else\n res = yield invokeTestsInCategory(value, options, skippingCategories);\n const data = res.filter((d) => d.result != 'skipped');\n if (!skipped)\n value.afterStatus = yield invokeCategoryMethod(value.after, key);\n // Clear after category\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n if (value.afterStatus) {\n stdLog(`Package testing: Category after() {{${key}}} failed`);\n stdLog(`Package testing: Result for {{${key}}} after: ${value.afterStatus}`);\n data.push({\n date: new Date().toISOString(),\n category: key,\n name: 'after',\n success: false,\n result: value.afterStatus,\n ms: 0,\n skipped: false,\n logs: '',\n owner: packageOwner,\n package: package_.name,\n widgetsDifference: 0,\n flaking: DG.Test.isReproducing\n });\n }\n if (value.beforeStatus) {\n stdLog(`Package testing: Category before() {{${key}}} failed`);\n stdLog(`Package testing: Result for {{${key}}} before: ${value.beforeStatus}`);\n data.push({\n date: new Date().toISOString(),\n category: key,\n name: 'before',\n success: false,\n result: value.beforeStatus,\n ms: 0,\n skipped: false,\n logs: '',\n owner: packageOwner,\n package: package_.name,\n widgetsDifference: 0,\n flaking: DG.Test.isReproducing\n });\n }\n results.push(...data);\n // If returnOnFail is set and a test failed (other than skipToTest), stop processing more categories\n if (options.returnOnFail && data.some((d) => !d.success && !d.skipped && d.name !== options.skipToTest))\n break;\n }\n }\n finally {\n resetConsole();\n }\n if (options.testContext.catchUnhandled && (!DG.Test.isInBenchmark)) {\n yield delay(1000);\n const error = yield grok.shell.lastError;\n if (error != undefined) {\n const params = {\n logs: '',\n date: new Date().toISOString(),\n category: 'Unhandled exceptions',\n name: 'Exception',\n result: error !== null && error !== void 0 ? error : '',\n success: !error,\n ms: 0,\n skipped: false,\n owner: packageOwner !== null && packageOwner !== void 0 ? packageOwner : '',\n 'package': package_.name,\n widgetsDifference: 0\n };\n stdLog(`Package testing: Unhandled Exception: ${error}`);\n results.push(Object.assign(Object.assign({}, params), { 'flaking': DG.Test.isReproducing && !error }));\n params.package = package_.name;\n yield grok.shell.reportTest('package', params);\n }\n }\n });\n }\n });\n}\nfunction getResult(x) {\n return __awaiter(this, void 0, void 0, function* () {\n return `${x.toString()}\\n${x.stack ? (yield DG.Logger.translateStackTrace(x.stack)) : ''}`;\n });\n}\nfunction execTest(t, predicate, logs, testTimeout, packageName, verbose) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n return __awaiter(this, void 0, void 0, function* () {\n logs.length = 0;\n let r;\n let type = 'package';\n const filter = predicate != undefined && (t.name.toLowerCase() !== predicate.toLowerCase());\n let skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n let skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (DG.Test.isInBenchmark && !((_c = t.options) === null || _c === void 0 ? void 0 : _c.benchmark)) {\n stdLog(`Package testing: Skipped {{${t.category}}} {{${t.name}}} doesnt available in benchmark mode`);\n return undefined;\n }\n if (skip && !DG.Test.isInBenchmark)\n stdLog(`Package testing: Skipped {{${t.category}}} {{${t.name}}}`);\n if (!skip)\n stdLog(`Package testing: Started {{${t.category}}} {{${t.name}}}`);\n const start = Date.now();\n const startDate = new Date(start).toISOString();\n try {\n if (skip)\n r = { name: t.name, owner: (_e = (_d = t.options) === null || _d === void 0 ? void 0 : _d.owner) !== null && _e !== void 0 ? _e : '', category: t.category, logs: '', date: startDate, success: true, result: skipReason, ms: 0, skipped: true, package: packageName !== null && packageName !== void 0 ? packageName : '', flaking: DG.Test.isReproducing };\n else {\n let timeout_ = testTimeout !== null && testTimeout !== void 0 ? testTimeout : STANDART_TIMEOUT;\n if (DG.Test.isProfiling)\n console.profile(`${t.category}: ${t.name}`);\n r = { name: t.name, owner: (_g = (_f = t.options) === null || _f === void 0 ? void 0 : _f.owner) !== null && _g !== void 0 ? _g : '', category: t.category, logs: '', date: startDate, success: true, result: (_h = (yield timeout(t.test, timeout_)).toString()) !== null && _h !== void 0 ? _h : 'OK', ms: 0, skipped: false, package: packageName !== null && packageName !== void 0 ? packageName : '', flaking: DG.Test.isReproducing };\n if (DG.Test.isProfiling) {\n console.profileEnd(`${t.category}: ${t.name}`);\n grok.shell.info(`Profiling of ${t.category}: ${t.name} finished \\n Please ensure that you have opened DevTools (F12) / Performance panel before test starts.`);\n }\n }\n }\n catch (x) {\n stdError(x);\n r = { name: t.name, owner: (_k = (_j = t.options) === null || _j === void 0 ? void 0 : _j.owner) !== null && _k !== void 0 ? _k : '', category: t.category, logs: '', date: startDate, success: false, result: yield getResult(x), ms: 0, skipped: false, package: packageName !== null && packageName !== void 0 ? packageName : '', flaking: false };\n }\n if (((_l = t.options) === null || _l === void 0 ? void 0 : _l.isAggregated) && r.result.constructor === DG.DataFrame) {\n const col = r.result.col('success');\n if (col)\n r.success = col.stats.sum === col.length;\n if (!verbose) {\n const df = r.result;\n df.columns.remove('stack');\n df.rows.removeWhere((r) => r.get('success'));\n r.result = df;\n }\n r.result = r.result.toCsv();\n }\n r.logs = logs.join('\\n');\n r.ms = Date.now() - start;\n if (!skip)\n stdLog(`Package testing: Finished {{${t.category}}} {{${t.name}}} with {{${r.success ? 'success' : 'error'}}} for ${r.ms} ms`);\n if (!r.success) {\n stdLog(`Package testing: Result for {{${t.category}}} {{${t.name}}}: ${r.result}`);\n }\n r.category = t.category;\n r.name = t.name;\n r.owner = (_o = (_m = t.options) === null || _m === void 0 ? void 0 : _m.owner) !== null && _o !== void 0 ? _o : '';\n if (!filter) {\n let params = {\n 'success': r.success, 'result': r.result, 'ms': r.ms, 'date': r.date,\n 'skipped': r.skipped, 'category': t.category, 'name': t.name, 'logs': r.logs, 'owner': r.owner,\n 'flaking': DG.Test.isReproducing && r.success,\n 'package': r.package\n };\n if (r.result.constructor == Object) {\n const res = Object.keys(r.result).reduce((acc, k) => (Object.assign(Object.assign({}, acc), { ['result.' + k]: r.result[k] })), {});\n params = Object.assign(Object.assign({}, params), res);\n }\n if (params.result instanceof DG.DataFrame)\n params.result = JSON.stringify((_p = params.result) === null || _p === void 0 ? void 0 : _p.toJson()) || '';\n yield grok.shell.reportTest(type, params);\n }\n return r;\n });\n}\nexport function shuffle(array) {\n const newArr = array.slice();\n newArr.sort(() => Math.random() - 0.5);\n return newArr;\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500, interval = 50) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const intervalId = setInterval(() => {\n if (checkHandler()) {\n clearInterval(intervalId);\n resolve(null);\n }\n }, interval);\n });\n });\n}\n// Returns test execution result or an error in case of timeout\nexport function timeout(func, testTimeout, timeoutReason = 'EXECUTION TIMEOUT') {\n return __awaiter(this, void 0, void 0, function* () {\n let timeout = null;\n const timeoutPromise = new Promise((_, reject) => {\n timeout = setTimeout(() => {\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(timeoutReason);\n }, testTimeout);\n });\n try {\n return yield Promise.race([func(), timeoutPromise]);\n }\n finally {\n if (timeout)\n clearTimeout(timeout);\n }\n });\n}\nexport function isDialogPresent(dialogTitle) {\n const dialogs = DG.Dialog.getOpenDialogs();\n for (let i = 0; i < dialogs.length; i++) {\n if (dialogs[i].title == dialogTitle)\n return true;\n }\n return false;\n}\n/** Expects an asynchronous {@link action} to throw an exception. Use {@link check} to perform\n * deeper inspection of the exception if necessary.\n * @param {function(): Promise<void>} action\n * @param {function(any): boolean} check\n * @return {Promise<void>}\n */\nexport function expectExceptionAsync(action, check) {\n return __awaiter(this, void 0, void 0, function* () {\n let caught = false;\n let checked = false;\n try {\n yield action();\n }\n catch (e) {\n caught = true;\n checked = !check || check(e);\n }\n finally {\n if (!caught)\n throw new Error('An exception is expected but not thrown');\n if (!checked)\n throw new Error('An expected exception is thrown, but it does not satisfy the condition');\n }\n });\n}\nconst catDF = DG.DataFrame.fromColumns([DG.Column.fromStrings('col', ['val1', 'val2', 'val3'])]);\n/**\n * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a\n * @param {string} v Viewer name\n * @param {_DG.DataFrame} df Dataframe to use. Should have at least 3 rows\n * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not\n * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test\n * @param {boolean} options.arbitraryDfTest If set to false, test on arbitrary dataframe\n * (one categorical column) will not be performed\n * @param {object} options List of options (optional)\n * @return {Promise<void>} The test is considered successful if it completes without errors\n */\nexport function testViewer(v, df, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const packageName = (_a = options === null || options === void 0 ? void 0 : options.packageName) !== null && _a !== void 0 ? _a : '';\n if (options === null || options === void 0 ? void 0 : options.detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n try {\n //1. Open, do nothing and close\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded);\n //in case viewer with async rendering - wait for render to complete\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, undefined, options.awaitViewer);\n //2. Open viewer, run selection, filter, etc. and close\n if (!(options === null || options === void 0 ? void 0 : options.readOnly)) {\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, selectFilterChangeCurrent);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, selectFilterChangeCurrent, options.awaitViewer);\n }\n //2. Open viewer, change options, save layout and close\n let propsAndLayout = null;\n propsAndLayout = yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, changeOptionsSaveLayout);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n propsAndLayout = yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, changeOptionsSaveLayout, options.awaitViewer);\n //3. Load layout\n yield testViewerInternal(tv, v, packageName, grok.events.onViewLayoutApplied, loadLayout, undefined, propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.layout, { savedProps: propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.savedProps });\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewLayoutApplied, loadLayout, options.awaitViewer, propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.layout, { savedProps: propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.savedProps });\n //4. Open viewer on arbitary dataset\n if ((options === null || options === void 0 ? void 0 : options.arbitraryDfTest) !== false) {\n tv.dataFrame = catDF;\n yield delay(50);\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, undefined, options.awaitViewer);\n }\n //5. Call postponed filtering\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, filterAsync);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, filterAsync, options.awaitViewer);\n }\n finally {\n // closeAll() is handling by common test workflow\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBS0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEksTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUM7QUFFbkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUVkLEVBQUUsQ0FBQztBQUVQLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUNyQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQStCLEVBQUUsQ0FBQztBQUNyRCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBS3RCO0FBTEQsV0FBaUIsTUFBTTtJQUNyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZ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QUFFLENBQUM7b0JBQzVHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQzlCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7NEJBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDL0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs0QkFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUM5RCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDOzRCQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2xELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7NEJBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0UsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBQSxHQUFHLENBQUMsR0FBRyxtQ0FBSSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFTLEVBQUU7d0JBQ2hILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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USxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzVHO1lBRUQsNkJBQTZCO1lBQzdCLE1BQU0sa0JBQWtCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckYsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVztnQkFDdEIsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsT0FBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBRTlHO2dCQUFTO1lBQ1IsaURBQWlEO1lBQ2pELHlCQUF5QjtZQUN6Qix5QkFBeUI7U0FDMUI7O0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIF9ncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCB0eXBlICogYXMgX0RHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5kZWNsYXJlIGxldCBncm9rOiB0eXBlb2YgX2dyb2ssIERHOiB0eXBlb2YgX0RHO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0ZXN0RGF0YSB9IGZyb20gJy4vZGF0YWZyYW1lLXV0aWxzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5pbXBvcnQgeyBjaGFuZ2VPcHRpb25zU2F2ZUxheW91dCwgZmlsdGVyQXN5bmMsIGxvYWRMYXlvdXQsIHNlbGVjdEZpbHRlckNoYW5nZUN1cnJlbnQsIHRlc3RWaWV3ZXJJbnRlcm5hbCB9IGZyb20gJy4vdGVzdC12aWV3ZXItdXRpbHMnO1xuXG5jb25zdCBTVEFOREFSVF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBCRU5DSE1BUktfVElNRU9VVCA9IDEwODAwMDAwO1xuXG5jb25zdCBzdGRMb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkSW5mbyA9IGNvbnNvbGUuaW5mby5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkRXJyb3IgPSBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiBDYXRlZ29yeVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3QgZGVtb0NhdE5hbWUgPSAnRGVtbyc7XG5jb25zdCBkZXRlY3RvcnNDYXROYW1lID0gJ0RldGVjdG9ycyc7XG5jb25zdCBjb3JlQ2F0TmFtZSA9ICdDb3JlJztcbmNvbnN0IHdhc1JlZ2lzdGVyZWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5leHBvcnQgbGV0IGN1cnJlbnRDYXRlZ29yeTogc3RyaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIGFzc3VyZSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgYmVuY2htYXJrV2FyblRpbWVvdXQ/OiBudW1iZXI7XG4gIGJlbmNobWFya1RpbWVvdXQ/OiBudW1iZXI7XG4gIHVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIHNraXBSZWFzb24/OiBzdHJpbmc7XG4gIGlzQWdncmVnYXRlZD86IGJvb2xlYW47XG4gIGJlbmNobWFyaz86IGJvb2xlYW47XG4gIHN0cmVzc1Rlc3Q/OiBib29sZWFuO1xuICBvd25lcj86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSZXN1bHQge1xuICBkYXRlOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgcmVzdWx0OiBhbnk7XG4gIG1zOiBudW1iZXI7XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIGxvZ3M6IHN0cmluZztcbiAgb3duZXI6IHN0cmluZztcbiAgcGFja2FnZTogc3RyaW5nO1xuICBmbGFraW5nOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJlc3VsdEV4dGVuZGVkIGV4dGVuZHMgVGVzdFJlc3VsdHtcbiAgd2lkZ2V0c0RpZmZlcmVuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeU9wdGlvbnMge1xuICBjbGVhcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGJlbmNobWFya3M/OiBib29sZWFuO1xuICBzdHJlc3NUZXN0cz86IGJvb2xlYW47XG4gIG93bmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENvbnRleHQge1xuICBzdHJlc3NUZXN0PzogYm9vbGVhbjtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcbiAgcmV0dXJuT25GYWlsID0gZmFsc2U7XG4gIGNsb3NlQWxsID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4sIHJldHVybk9uRmFpbD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gICAgaWYgKHJldHVybk9uRmFpbCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJldHVybk9uRmFpbCA9IHJldHVybk9uRmFpbDtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT47XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgb3B0aW9ucz86IFRlc3RPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGVnb3J5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPz89IFNUQU5EQVJUX1RJTUVPVVQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoREcuVGVzdC5pc0luRGVidWcpXG4gICAgICAgICAgICBkZWJ1Z2dlcjtcblxuICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0ZXN0KCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlcz8udG9TdHJpbmcoKSA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICdDYW5cXCd0IGNvbnZlcnQgdGVzdFxcJ3MgcmVzdWx0IHRvIHN0cmluZyc7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5cXCd0IGNvbnZlcnQgdGVzdFxcJ3MgcmVzdWx0IHRvIHN0cmluZyBpbiB0aGUgJHt0aGlzLmNhdGVnb3J5fToke3RoaXMubmFtZX0gdGVzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3J5IHtcbiAgdGVzdHM/OiBUZXN0W107XG4gIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICBiZWZvcmVTdGF0dXM/OiBzdHJpbmc7XG4gIGFmdGVyU3RhdHVzPzogc3RyaW5nO1xuICBjbGVhcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGJlbmNobWFya3M/OiBib29sZWFuO1xuICBiZW5jaG1hcmtUaW1lb3V0PzogbnVtYmVyO1xuICBzdHJlc3NUZXN0cz86IGJvb2xlYW47XG4gIG93bmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTm9kZVRlc3RFeGVjdXRpb25PcHRpb25zIHtcbiAgcGFja2FnZSE6IF9ERy5QYWNrYWdlO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdEV4ZWN1dGlvbk9wdGlvbnMge1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgdGVzdD86IHN0cmluZztcbiAgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dDtcbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgc3RyZXNzVGVzdD86IGJvb2xlYW47XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgbm9kZU9wdGlvbnM/OiBOb2RlVGVzdEV4ZWN1dGlvbk9wdGlvbnM7XG4gIHNraXBUb0NhdGVnb3J5Pzogc3RyaW5nO1xuICBza2lwVG9UZXN0Pzogc3RyaW5nO1xuICByZXR1cm5PbkZhaWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEV2ZW50PFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gdm9pZCwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDAsIHJlYXNvbjogc3RyaW5nID0gYHRpbWVvdXRgXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJnczogVCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudEFzeW5jPFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gUHJvbWlzZTx2b2lkPiwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDAsIHJlYXNvbjogc3RyaW5nID0gYHRpbWVvdXRgXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJnczogVCkgPT4ge1xuICAgICAgaGFuZGxlcihhcmdzKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkgPSB0cnVlLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXJyb3IpXG4gICAgZXJyb3IgPSBgJHtlcnJvcn0sIGA7XG4gIGVsc2UgZXJyb3IgPSAnJztcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfUV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKChhY3R1YWwgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB8fFxuICAgIChhY3R1YWwgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSB8fFxuICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfTsgYSA9ICR7YWN0dWFsfSwgZSA9ICR7ZXhwZWN0ZWR9KWApO1xuICBpZiAoIWFyZUVxdWFsKVxuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH0gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdFRhYmxlKGFjdHVhbDogX0RHLkRhdGFGcmFtZSwgZXhwZWN0ZWQ6IF9ERy5EYXRhRnJhbWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGV4cGVjdGVkUm93Q291bnQgPSBleHBlY3RlZC5yb3dDb3VudDtcbiAgY29uc3QgYWN0dWFsUm93Q291bnQgPSBhY3R1YWwucm93Q291bnQ7XG4gIGV4cGVjdChhY3R1YWxSb3dDb3VudCwgZXhwZWN0ZWRSb3dDb3VudCwgYCR7ZXJyb3IgPz8gJyd9LCByb3cgY291bnRgKTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBleHBlY3RlZC5jb2x1bW5zKSB7XG4gICAgY29uc3QgYWN0dWFsQ29sdW1uID0gYWN0dWFsLmNvbHVtbnMuYnlOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uLnR5cGUgIT0gY29sdW1uLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSB0eXBlIGV4cGVjdGVkICR7Y29sdW1uLnR5cGV9IGdvdCAke2FjdHVhbENvbHVtbi50eXBlfWApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWRSb3dDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbi5nZXQoaSk7XG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbENvbHVtbi5nZXQoaSk7XG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5GTE9BVClcbiAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIHZhbHVlLCAwLjAwMDEsIGVycm9yKTtcbiAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09IERHLlRZUEUuREFURV9USU1FKVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUuaXNTYW1lKHZhbHVlKSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgZWxzZVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUsIHZhbHVlLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RPYmplY3QoYWN0dWFsOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBleHBlY3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFhY3R1YWwuaGFzT3duUHJvcGVydHkoZXhwZWN0ZWRLZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwcm9wZXJ0eSBcIiR7ZXhwZWN0ZWRLZXl9XCIgbm90IGZvdW5kYCk7XG5cbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlICE9IGV4cGVjdGVkVmFsdWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICgke2V4cGVjdGVkVmFsdWV9KSBmb3Iga2V5ICcke2V4cGVjdGVkS2V5fScsIGdvdCAoJHthY3R1YWxWYWx1ZX0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5KGFjdHVhbDogQXJyYXlMaWtlPGFueT4sIGV4cGVjdGVkOiBBcnJheUxpa2U8YW55Pikge1xuICBjb25zdCBhY3R1YWxMZW5ndGggPSBhY3R1YWwubGVuZ3RoO1xuICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcblxuICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCBsZW5ndGg6IGFjdHVhbCBhcnJheSBsZW5ndGggaXMgJHthY3R1YWxMZW5ndGh9IGAgK1xuICAgICAgYGFuZCBleHBlY3RlZCBhcnJheSBsZW5ndGggaXMgJHtleHBlY3RlZExlbmd0aH1gKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0c186ICgpID0+IHZvaWQsIG9wdGlvbnM/OiBDYXRlZ29yeU9wdGlvbnMpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzXygpO1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSkge1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uY2xlYXIgPSBvcHRpb25zPy5jbGVhciA/PyB0cnVlO1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQ7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZW5jaG1hcmtzID0gb3B0aW9ucz8uYmVuY2htYXJrcztcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnN0cmVzc1Rlc3RzID0gb3B0aW9ucz8uc3RyZXNzVGVzdHM7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5vd25lciA9IG9wdGlvbnM/Lm93bmVyO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5mdW5jdGlvbiBhZGROYW1lc3BhY2Uoczogc3RyaW5nLCBmOiBfREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfOiBfREcuUGFja2FnZSwgbW9kdWxlPzogYW55KSB7XG4gIGNvbnN0IHBhY2thZ2VJZCA9IHBhY2thZ2VfLmlkO1xuICBpZiAod2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVRlc3RzID0gbW9kdWxlID8gbW9kdWxlLnRlc3RzIDogdGVzdHM7XG4gIGlmIChwYWNrYWdlXy5uYW1lID09PSAnRGV2VG9vbHMnIHx8ICghIW1vZHVsZSAmJiBtb2R1bGUuX3BhY2thZ2UubmFtZSA9PT0gJ0RldlRvb2xzJykpIHtcbiAgICBmb3IgKGNvbnN0IGYgb2YgKDxhbnk+d2luZG93KS5kYXJ0VGVzdHMpIHtcbiAgICAgIGNvbnN0IGFyciA9IGYubmFtZS5zcGxpdCgvXFxzKlxcfFxccyohL2cpO1xuICAgICAgbGV0IG5hbWUgPSBhcnIucG9wKCkgPz8gZi5uYW1lO1xuICAgICAgbGV0IGNhdCA9IGFyci5sZW5ndGggPyBjb3JlQ2F0TmFtZSArICc6ICcgKyBhcnIuam9pbignOiAnKSA6IGNvcmVDYXROYW1lO1xuICAgICAgbGV0IGZ1bGxOYW1lOiBzdHJpbmdbXSA9IG5hbWUuc3BsaXQoJyB8ICcpO1xuICAgICAgbmFtZSA9IGZ1bGxOYW1lW2Z1bGxOYW1lLmxlbmd0aCAtIDFdO1xuICAgICAgZnVsbE5hbWUudW5zaGlmdChjYXQpO1xuICAgICAgZnVsbE5hbWUucG9wKCk7XG4gICAgICBjYXQgPSBmdWxsTmFtZS5qb2luKCc6ICcpO1xuICAgICAgaWYgKG1vZHVsZVRlc3RzW2NhdF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgbW9kdWxlVGVzdHNbY2F0XSA9IHsgdGVzdHM6IFtdLCBjbGVhcjogdHJ1ZSB9O1xuICAgICAgbW9kdWxlVGVzdHNbY2F0XS50ZXN0cy5wdXNoKG5ldyBUZXN0KGNhdCwgbmFtZSwgZi50ZXN0LCB7IGlzQWdncmVnYXRlZDogZmFsc2UsIHRpbWVvdXQ6IGYub3B0aW9ucz8udGltZW91dCA/PyBTVEFOREFSVF9USU1FT1VULCBza2lwUmVhc29uOiBmLm9wdGlvbnM/LnNraXBSZWFzb24sIG93bmVyOiBmLm9wdGlvbnM/Lm93bmVyLCBiZW5jaG1hcms6IGYub3B0aW9ucz8uYmVuY2htYXJrID8/IGZhbHNlIH0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbW9kdWxlQXV0b1Rlc3RzID0gW107XG4gIGNvbnN0IG1vZHVsZURlbW8gPSBbXTtcbiAgY29uc3QgbW9kdWxlRGV0ZWN0b3JzID0gW107XG4gIGNvbnN0IHBhY2tGdW5jdGlvbnMgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbHRlcihgcGFja2FnZS5pZCA9IFwiJHtwYWNrYWdlSWR9XCJgKS5saXN0KCk7XG4gIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoL3NraXA6XFxzKihbXixcXHNdKyl8d2FpdDpcXHMqKFxcZCspfGNhdDpcXHMqKFteLFxcc10rKXx0aW1lb3V0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBjb25zdCBkZW1vID0gZi5vcHRpb25zWydkZW1vUGF0aCddO1xuICAgIGlmICgodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgICBjb25zdCBtYXA6IHsgc2tpcD86IHN0cmluZywgd2FpdD86IG51bWJlciwgY2F0Pzogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyLCBiZW5jaG1hcmtUaW1lb3V0PzogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgQXJyYXkuZnJvbShyZXMpLmZvckVhY2goKGFycikgPT4ge1xuICAgICAgICAgIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnc2tpcCcpKSBtYXBbJ3NraXAnXSA9IGFyclsxXTtcbiAgICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnd2FpdCcpKSBtYXBbJ3dhaXQnXSA9IHBhcnNlSW50KGFyclsyXSk7XG4gICAgICAgICAgZWxzZSBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ2NhdCcpKSBtYXBbJ2NhdCddID0gYXJyWzNdO1xuICAgICAgICAgIGVsc2UgaWYgKGFyclswXS5zdGFydHNXaXRoKCd0aW1lb3V0JykpIG1hcFsndGltZW91dCddID0gcGFyc2VJbnQoYXJyWzRdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRlc3QgPSBuZXcgVGVzdChtYXAuY2F0ID8/IGF1dG9UZXN0c0NhdE5hbWUsIHRlc3RzLmxlbmd0aCA9PT0gMSA/IGYubmFtZSA6IGAke2YubmFtZX0gJHtpICsgMX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuZXZhbChhZGROYW1lc3BhY2UodGVzdHNbaV0sIGYpKTtcbiAgICAgICAgICBpZiAobWFwLndhaXQpIGF3YWl0IGRlbGF5KG1hcC53YWl0KTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnYm9vbGVhbicgJiYgIXJlcykgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX0sIGV4cGVjdGVkIHRydWUsIGdvdCAke3Jlc31gO1xuICAgICAgICB9LCB7IHNraXBSZWFzb246IG1hcC5za2lwLCB0aW1lb3V0OiBERy5UZXN0LmlzSW5CZW5jaG1hcmsgPyBtYXAuYmVuY2htYXJrVGltZW91dCA/PyBCRU5DSE1BUktfVElNRU9VVCA6IG1hcC50aW1lb3V0ID8/IFNUQU5EQVJUX1RJTUVPVVQgfSk7XG4gICAgICAgIGlmIChtYXAuY2F0KSB7XG4gICAgICAgICAgY29uc3QgY2F0OiBzdHJpbmcgPSBtYXAuY2F0O1xuICAgICAgICAgIGlmIChtb2R1bGVUZXN0c1tjYXRdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBtb2R1bGVUZXN0c1tjYXRdID0geyB0ZXN0czogW10sIGNsZWFyOiB0cnVlIH07XG5cbiAgICAgICAgICAvLyBvbmx5IGJlZm9yZS9hZnRlciBjYW4gYmUgZGVmaW5lZCBpbiB0cyBmaWxlcyB0ZXN0cyB1bmRlciB0aGUgY2F0ZWdvcnlcbiAgICAgICAgICBpZiAoIW1vZHVsZVRlc3RzW2NhdF0udGVzdHMpXG4gICAgICAgICAgICBtb2R1bGVUZXN0c1tjYXRdLnRlc3RzID0gW107XG4gICAgICAgICAgbW9kdWxlVGVzdHNbY2F0XS50ZXN0cy5wdXNoKHRlc3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBtb2R1bGVBdXRvVGVzdHMucHVzaCh0ZXN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbW8pIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBmLm9wdGlvbnNbJ2RlbW9XYWl0J10gPyBwYXJzZUludChmLm9wdGlvbnNbJ2RlbW9XYWl0J10pIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdGVzdCA9IG5ldyBUZXN0KGRlbW9DYXROYW1lLCBmLmZyaWVuZGx5TmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBkZWxheSgzMDApO1xuICAgICAgICBncm9rLnNoZWxsLmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIGF3YWl0IGYuYXBwbHkoKTtcbiAgICAgICAgYXdhaXQgZGVsYXkod2FpdCA/IHdhaXQgOiAyMDAwKTtcbiAgICAgICAgY29uc3QgdW5oYW5kbGVkID0gYXdhaXQgZ3Jvay5zaGVsbC5sYXN0RXJyb3I7XG4gICAgICAgIGlmICh1bmhhbmRsZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHVuaGFuZGxlZCk7XG4gICAgICB9LCB7IHNraXBSZWFzb246IGYub3B0aW9uc1snZGVtb1NraXAnXSB9KTtcbiAgICAgIG1vZHVsZURlbW8ucHVzaCh0ZXN0KTtcbiAgICB9XG4gICAgaWYgKGYuaGFzVGFnKCdzZW1UeXBlRGV0ZWN0b3InKSkge1xuICAgICAgbGV0IGRldGVjdG9yc1Rlc3REYXRhID0gdGVzdERhdGE7XG4gICAgICBpZiAoZi5vcHRpb25zWyd0ZXN0RGF0YSddKSB7XG4gICAgICAgIGRldGVjdG9yc1Rlc3REYXRhID0gYXdhaXQgZ3Jvay5kYXRhLmZpbGVzLm9wZW5UYWJsZShgU3lzdGVtOkFwcERhdGEvJHtwYWNrYWdlXy5ucU5hbWV9LyR7Zi5vcHRpb25zWyd0ZXN0RGF0YSddfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0ID0gbmV3IFRlc3QoZGV0ZWN0b3JzQ2F0TmFtZSwgZi5mcmllbmRseU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgIGNvbnNvbGUubG9nKGBTeXN0ZW06QXBwRGF0YS8ke3BhY2thZ2VfLm5xTmFtZX0vJHtmLm9wdGlvbnNbJ3Rlc3REYXRhJ119YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZGV0ZWN0b3JzVGVzdERhdGEuY2xvbmUoKS5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZi5hcHBseShbY29sXSk7XG4gICAgICAgICAgYXJyLnB1c2gocmVzIHx8IGNvbC5zZW1UeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNBcnIgPSBhcnIuZmlsdGVyKChpKSA9PiBpKTtcbiAgICAgICAgZXhwZWN0KHJlc0Fyci5sZW5ndGgsIDEpO1xuXG4gICAgICAgIGlmIChmLm9wdGlvbnNbJ3Rlc3REYXRhQ29sdW1uTmFtZSddKVxuICAgICAgICAgIGV4cGVjdChyZXNBcnJbMF0sIGYub3B0aW9uc1sndGVzdERhdGFDb2x1bW5OYW1lJ10pO1xuXG4gICAgICB9LCB7IHNraXBSZWFzb246IGYub3B0aW9uc1snc2tpcFRlc3QnXSB9KTtcbiAgICAgIG1vZHVsZURldGVjdG9ycy5wdXNoKHRlc3QpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAobW9kdWxlQXV0b1Rlc3RzLmxlbmd0aCA+IDApXG4gICAgbW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gPSB7IHRlc3RzOiBtb2R1bGVBdXRvVGVzdHMsIGNsZWFyOiB0cnVlIH07XG4gIGlmIChtb2R1bGVEZW1vLmxlbmd0aCA+IDApXG4gICAgbW9kdWxlVGVzdHNbZGVtb0NhdE5hbWVdID0geyB0ZXN0czogbW9kdWxlRGVtbywgY2xlYXI6IHRydWUgfTtcbiAgaWYgKG1vZHVsZURldGVjdG9ycy5sZW5ndGggPiAwKVxuICAgIG1vZHVsZVRlc3RzW2RldGVjdG9yc0NhdE5hbWVdID0geyB0ZXN0czogbW9kdWxlRGV0ZWN0b3JzLCBjbGVhcjogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gcmVkZWZpbmVDb25zb2xlKCk6IGFueVtdIHtcbiAgY29uc3QgbG9nczogYW55W10gPSBbXTtcbiAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5hcmdzKTtcbiAgICBzdGRMb2coLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZEluZm8oLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUud2FybiA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZFdhcm4oLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5hcmdzKTtcbiAgICBzdGRFcnJvciguLi5hcmdzKTtcbiAgfTtcbiAgcmV0dXJuIGxvZ3M7XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q29uc29sZSgpOiB2b2lkIHtcbiAgY29uc29sZS5sb2cgPSBzdGRMb2c7XG4gIGNvbnNvbGUuaW5mbyA9IHN0ZEluZm87XG4gIGNvbnNvbGUud2FybiA9IHN0ZFdhcm47XG4gIGNvbnNvbGUuZXJyb3IgPSBzdGRFcnJvcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKG9wdGlvbnM/OiBUZXN0RXhlY3V0aW9uT3B0aW9ucykgOiBQcm9taXNlPFRlc3RSZXN1bHRFeHRlbmRlZFtdPntcblxuICBjb25zdCBwYWNrYWdlXzogX0RHLlBhY2thZ2UgPSBvcHRpb25zPy5ub2RlT3B0aW9ucyA/IG9wdGlvbnMubm9kZU9wdGlvbnMucGFja2FnZSA6IGdyb2suZnVuY3Rpb25zLmdldEN1cnJlbnRDYWxsKCkuZnVuYy5wYWNrYWdlO1xuICBpZiAoIXBhY2thZ2VfKVxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBydW4gdGVzdHMgb3V0c2lkZSBvZiB0aGUgcGFja2FnZScpO1xuICBjb25zdCBtYXRjaCA9IHBhY2thZ2VfLnBhY2thZ2VPd25lcj8ubWF0Y2goLzwoW14+XSopPi8pO1xuICBjb25zdCBwYWNrYWdlT3duZXIgPSBtYXRjaCA/IG1hdGNoWzFdIDogJyc7XG4gIGlmIChwYWNrYWdlXyAhPSB1bmRlZmluZWQpXG4gICAgYXdhaXQgaW5pdEF1dG9UZXN0cyhwYWNrYWdlXyk7XG4gIGNvbnN0IHJlc3VsdHM6VGVzdFJlc3VsdEV4dGVuZGVkW10gPSBbXTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHMuLi5gKTtcbiAgY29uc29sZS5sb2cob3B0aW9ucyk7XG4gIG9wdGlvbnMgPz89IHt9O1xuICBvcHRpb25zIS50ZXN0Q29udGV4dCA/Pz0gbmV3IFRlc3RDb250ZXh0KCk7XG4gIGdyb2suc2hlbGwuY2xlYXJMYXN0RXJyb3IoKTtcbiAgY29uc3QgbG9ncyA9IHJlZGVmaW5lQ29uc29sZSgpO1xuXG4gIGF3YWl0IGludm9rZVRlc3RzKHRlc3RzLCBvcHRpb25zKTtcblxuICBmb3IgKGxldCByIG9mIHJlc3VsdHMpIHtcbiAgICByLnJlc3VsdCA9IHIucmVzdWx0LnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcJycpO1xuICAgIGlmIChyLmxvZ3MgIT0gdW5kZWZpbmVkKVxuICAgICAgci5sb2dzID0gci5sb2dzIS50b1N0cmluZygpLnJlcGxhY2UoL1wiL2csICdcXCcnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcblxuICBhc3luYyBmdW5jdGlvbiBpbnZva2VDYXRlZ29yeU1ldGhvZChtZXRob2Q6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZCwgY2F0ZWdvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGludm9rYXRpb25SZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChtZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBtZXRob2QoKTtcbiAgICAgICAgfSwgMTAwMDAwLCBgYmVmb3JlICR7Y2F0ZWdvcnl9OiB0aW1lb3V0IGVycm9yYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICBpbnZva2F0aW9uUmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0KHgpO1xuICAgIH1cbiAgICByZXR1cm4gaW52b2thdGlvblJlc3VsdFxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW52b2tlVGVzdHNJbkNhdGVnb3J5KGNhdGVnb3J5OiBDYXRlZ29yeSwgb3B0aW9uczogVGVzdEV4ZWN1dGlvbk9wdGlvbnMsIGlzVGFyZ2V0Q2F0ZWdvcnk6IGJvb2xlYW4pOiBQcm9taXNlPFRlc3RSZXN1bHRFeHRlbmRlZFtdPiB7XG4gICAgbGV0IHQgPSBjYXRlZ29yeS50ZXN0cyA/PyBbXTtcbiAgICBjb25zdCByZXMgOiBUZXN0UmVzdWx0RXh0ZW5kZWRbXSA9IFtdO1xuICAgIC8vIGxldCBtZW1vcnlVc2FnZUJlZm9yZSA9ICh3aW5kb3c/LnBlcmZvcm1hbmNlIGFzIGFueSk/Lm1lbW9yeT8udXNlZEpTSGVhcFNpemU7XG4gICAgY29uc3Qgd2lkZ2V0c0JlZm9yZSA9IGdldFdpZGdldHNDb3VudFNhZmUoKTtcblxuICAgIGlmIChjYXRlZ29yeS5jbGVhcikge1xuICAgICAgICBsZXQgc2tpcHBpbmdUZXN0cyA9IGlzVGFyZ2V0Q2F0ZWdvcnkgJiYgb3B0aW9ucy5za2lwVG9UZXN0ICE9IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGlmICh0W2ldLm9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAodFtpXS5vcHRpb25zPy5iZW5jaG1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKCF0W2ldLm9wdGlvbnMpXG4gICAgICAgICAgICAgIHRbaV0ub3B0aW9ucyA9IHt9XG4gICAgICAgICAgICB0W2ldLm9wdGlvbnMhLmJlbmNobWFyayA9IGNhdGVnb3J5LmJlbmNobWFya3MgPz8gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXN0ID0gdFtpXTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGVzdClcbiAgICAgICAgICBpZiAob3B0aW9ucy50ZXN0LnRvTG93ZXJDYXNlKCkgIT09IHRlc3QubmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChza2lwcGluZ1Rlc3RzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnNraXBUb1Rlc3QgIT0gdW5kZWZpbmVkICYmIHRlc3QubmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gb3B0aW9ucz8uc2tpcFRvVGVzdC50b0xvd2VyQ2FzZSgpLnRyaW0oKSkge1xuICAgICAgICAgICAgLy8gRm91bmQgdGhlIHRhcmdldCB0ZXN0LCBzdG9wIHNraXBwaW5nIGFmdGVyIHRoaXMgb25lXG4gICAgICAgICAgICBza2lwcGluZ1Rlc3RzID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlc3Q/Lm9wdGlvbnMpIHtcbiAgICAgICAgICB0ZXN0Lm9wdGlvbnMub3duZXIgPSB0W2ldLm9wdGlvbnM/Lm93bmVyID8/IGNhdGVnb3J5Py5vd25lciA/PyBwYWNrYWdlT3duZXIgPz8gJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbGV0IGlzR0JFbmFibGUgPSAod2luZG93IGFzIGFueSkuZ2MgJiYgdGVzdC5vcHRpb25zPy5za2lwUmVhc29uID09IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYCoqKioqKioqJHtpc0dCRW5hYmxlfWApO1xuICAgICAgICAvLyBpZiAoaXNHQkVuYWJsZSlcbiAgICAgICAgLy8gICBhd2FpdCAod2luZG93IGFzIGFueSkuZ2MoKTtcbiAgICAgICAgLy8gbWVtb3J5VXNhZ2VCZWZvcmUgPSAod2luZG93Py5wZXJmb3JtYW5jZSBhcyBhbnkpPy5tZW1vcnk/LnVzZWRKU0hlYXBTaXplO1xuICAgICAgICBsZXQgdGVzdFJ1biA9IGF3YWl0IGV4ZWNUZXN0KFxuICAgICAgICAgICAgdGVzdCxcbiAgICAgICAgICAgIG9wdGlvbnM/LnRlc3QsXG4gICAgICAgICAgICBsb2dzLCBERy5UZXN0LmlzSW5CZW5jaG1hcmsgPyB0W2ldLm9wdGlvbnM/LmJlbmNobWFya1RpbWVvdXQgPz8gQkVOQ0hNQVJLX1RJTUVPVVQgOiB0W2ldLm9wdGlvbnM/LnRpbWVvdXQgPz8gU1RBTkRBUlRfVElNRU9VVCxcbiAgICAgICAgICAgIHBhY2thZ2VfLm5hbWUsXG4gICAgICAgICAgICBvcHRpb25zLnZlcmJvc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBpZiAoaXNHQkVuYWJsZSlcbiAgICAgICAgLy8gICBhd2FpdCAod2luZG93IGFzIGFueSkuZ2MoKTtcbiAgICAgICAgaWYgKHRlc3RSdW4pIHtcbiAgICAgICAgICByZXMucHVzaCh7IC4uLnRlc3RSdW4sICB3aWRnZXRzRGlmZmVyZW5jZTogZ2V0V2lkZ2V0c0NvdW50U2FmZSgpIC0gd2lkZ2V0c0JlZm9yZSB9KTtcbiAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgaWYgcmV0dXJuT25GYWlsIGlzIHNldCBhbmQgdGVzdCBmYWlsZWQgKGJ1dCBpZ25vcmUgZmFpbHVyZSBmb3IgdGhlIHNraXBUb1Rlc3QgdGVzdCBpdHNlbGYpXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuT25GYWlsICYmIG9wdGlvbnMuc2tpcFRvVGVzdCAhPT0gdGVzdC5uYW1lICYmICF0ZXN0UnVuLnN1Y2Nlc3MgJiYgIXRlc3RSdW4uc2tpcHBlZClcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzLnB1c2goeyAuLi50ZXN0UnVuLCBtZW1vcnlEZWx0YTogKHdpbmRvdz8ucGVyZm9ybWFuY2UgYXMgYW55KT8ubWVtb3J5Py51c2VkSlNIZWFwU2l6ZSAtIG1lbW9yeVVzYWdlQmVmb3JlLCB3aWRnZXRzRGVsdGE6IGdldFdpZGdldHNDb3VudFNhZmUoKSAtIHdpZGdldHNCZWZvcmUgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLm5vZGVPcHRpb25zICYmIG9wdGlvbnMudGVzdENvbnRleHQ/LmNsb3NlQWxsICE9PSBmYWxzZSkge1xuICAgICAgICAgIGdyb2suc2hlbGwuY2xvc2VBbGwoKTtcbiAgICAgICAgICBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHNraXBwaW5nVGVzdHMgPSBpc1RhcmdldENhdGVnb3J5ICYmIG9wdGlvbnMuc2tpcFRvVGVzdCAhPSB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHRlc3QgPSB0W2ldO1xuICAgICAgICBpZiAob3B0aW9ucy50ZXN0KVxuICAgICAgICAgIGlmIChvcHRpb25zLnRlc3QudG9Mb3dlckNhc2UoKSAhPT0gdGVzdC5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHNraXBwaW5nVGVzdHMpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8uc2tpcFRvVGVzdCAhPSB1bmRlZmluZWQgJiYgdGVzdC5uYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpID09PSBvcHRpb25zPy5za2lwVG9UZXN0LnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAvLyBGb3VuZCB0aGUgdGFyZ2V0IHRlc3QsIHN0b3Agc2tpcHBpbmcgYWZ0ZXIgdGhpcyBvbmVcbiAgICAgICAgICAgIHNraXBwaW5nVGVzdHMgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7ICAvLyBTa2lwIHRoaXMgdGVzdCAoaW5jbHVkaW5nIHRoZSB0YXJnZXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdD8ub3B0aW9ucykge1xuICAgICAgICAgIHRlc3Qub3B0aW9ucy5vd25lciA9IHRbaV0ub3B0aW9ucz8ub3duZXIgPz8gY2F0ZWdvcnk/Lm93bmVyID8/IHBhY2thZ2VPd25lciA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBsZXQgaXNHQkVuYWJsZSA9ICh3aW5kb3cgYXMgYW55KS5nYyAmJiB0ZXN0Lm9wdGlvbnM/LnNraXBSZWFzb24gPT0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgKioqKioqKioke2lzR0JFbmFibGV9YCk7XG4gICAgICAgIC8vIGlmIChpc0dCRW5hYmxlKVxuICAgICAgICAvLyAgIGF3YWl0ICh3aW5kb3cgYXMgYW55KS5nYygpO1xuICAgICAgICAvLyBtZW1vcnlVc2FnZUJlZm9yZSA9ICh3aW5kb3c/LnBlcmZvcm1hbmNlIGFzIGFueSk/Lm1lbW9yeT8udXNlZEpTSGVhcFNpemU7XG4gICAgICAgIGxldCB0ZXN0UnVuID0gYXdhaXQgZXhlY1Rlc3QoXG4gICAgICAgICAgICB0ZXN0LFxuICAgICAgICAgICAgb3B0aW9ucz8udGVzdCxcbiAgICAgICAgICAgIGxvZ3MsXG4gICAgICAgICAgICBERy5UZXN0LmlzSW5CZW5jaG1hcmsgPyB0W2ldLm9wdGlvbnM/LmJlbmNobWFya1RpbWVvdXQgPz8gQkVOQ0hNQVJLX1RJTUVPVVQgOiB0W2ldLm9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICAgICAgICBwYWNrYWdlXy5uYW1lLFxuICAgICAgICAgICAgb3B0aW9ucy52ZXJib3NlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gaWYgKGlzR0JFbmFibGUpXG4gICAgICAgIC8vICAgYXdhaXQgKHdpbmRvdyBhcyBhbnkpLmdjKCk7XG5cbiAgICAgICAgaWYgKHRlc3RSdW4pIHtcbiAgICAgICAgICByZXMucHVzaCh7IC4uLnRlc3RSdW4sIHdpZGdldHNEaWZmZXJlbmNlOiBnZXRXaWRnZXRzQ291bnRTYWZlKCkgLSB3aWRnZXRzQmVmb3JlIH0pO1xuICAgICAgICAgIC8vIFJldHVybiBlYXJseSBpZiByZXR1cm5PbkZhaWwgaXMgc2V0IGFuZCB0ZXN0IGZhaWxlZCAoYnV0IGlnbm9yZSBmYWlsdXJlIGZvciB0aGUgc2tpcFRvVGVzdCB0ZXN0IGl0c2VsZilcbiAgICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkZhaWwgJiYgb3B0aW9ucy5za2lwVG9UZXN0ICE9PSB0ZXN0Lm5hbWUgJiYgIXRlc3RSdW4uc3VjY2VzcyAmJiAhdGVzdFJ1bi5za2lwcGVkKVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICAvLyByZXMucHVzaCh7IC4uLnRlc3RSdW4sIG1lbW9yeURlbHRhOiAod2luZG93Py5wZXJmb3JtYW5jZSBhcyBhbnkpPy5tZW1vcnk/LnVzZWRKU0hlYXBTaXplIC0gbWVtb3J5VXNhZ2VCZWZvcmUsIHdpZGdldHNEaWZmZXJlbmNlOiBnZXRXaWRnZXRzQ291bnRTYWZlKCkgLSB3aWRnZXRzQmVmb3JlIH0pO1xuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRXaWRnZXRzQ291bnRTYWZlKCkge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICByZXR1cm4gMDtcbiAgICBsZXQgbGVuZ3RoID0gLTE7XG4gICAgdHJ5IHtcbiAgICAgIGxlbmd0aCA9IERHLldpZGdldC5nZXRBbGwoKS5sZW5ndGg7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oZS5tZXNzYWdlID8/IGUpO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW52b2tlVGVzdHMoY2F0ZWdvcmllc1RvSW52b2tlOiB7IFtrZXk6IHN0cmluZ106IENhdGVnb3J5IH0sIG9wdGlvbnM6IFRlc3RFeGVjdXRpb25PcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBza2lwcGluZ0NhdGVnb3JpZXMgPSBvcHRpb25zPy5za2lwVG9DYXRlZ29yeSAhPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgaXNUYXJnZXRDYXRlZ29yeSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2F0ZWdvcmllc1RvSW52b2tlKSkge1xuICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUoKGMpID0+IGtleS5zdGFydHNXaXRoKGMpKSlcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IG51bGwgJiYgIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKS50cmltKCkpKVxuICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGlmIChza2lwcGluZ0NhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGFyZ2V0Q2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgICBza2lwcGluZ0NhdGVnb3JpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uc2tpcFRvQ2F0ZWdvcnkgIT0gbnVsbCAmJiBrZXkudG9Mb3dlckNhc2UoKS50cmltKCkgPT09IG9wdGlvbnM/LnNraXBUb0NhdGVnb3J5LnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNUYXJnZXRDYXRlZ29yeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEhhdmVuJ3QgZm91bmQgdGhlIHRhcmdldCBjYXRlZ29yeSB5ZXQsIGtlZXAgc2tpcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdmFsdWUudGVzdHM/LmV2ZXJ5KCh0OiBUZXN0KSA9PiB0Lm9wdGlvbnM/LnNraXBSZWFzb25cbiAgICAgICAgICAgICAgfHwgKG9wdGlvbnM/LnRlc3QgIT0gbnVsbCAmJiBvcHRpb25zLnRlc3QudG9Mb3dlckNhc2UoKSAhPT0gdC5uYW1lLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgIGlmICghc2tpcHBlZCkge1xuICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgY29uc3Qgc2tpcHBlZENvdW50ID0gKHZhbHVlLnRlc3RzID8/IFtdKS5maWx0ZXIoKHQ6IFRlc3QpID0+XG4gICAgICAgICAgICAgICAgdC5vcHRpb25zPy5za2lwUmVhc29uIHx8IChvcHRpb25zPy50ZXN0ICE9IG51bGwgJiYgb3B0aW9ucy50ZXN0LnRvTG93ZXJDYXNlKCkgIT09IHQubmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICAgICAgc3RkTG9nKGBQYWNrYWdlIHRlc3Rpbmc6IFN0YXJ0ZWQge3ske2tleX19fSR7c2tpcHBlZENvdW50ID4gMCA/IGAgc2tpcHBlZCB7eyR7c2tpcHBlZENvdW50fX19YCA6ICcnfWApO1xuICAgICAgICAgICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSBhd2FpdCBpbnZva2VDYXRlZ29yeU1ldGhvZCh2YWx1ZS5iZWZvcmUsIGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5zdHJlc3NUZXN0KSB7XG4gICAgICAgICAgICAgIHQgPSB0LmZpbHRlcigoZSkgPT4gZS5vcHRpb25zPy5zdHJlc3NUZXN0KTtcbiAgICAgICAgICAgICAgdCA9IHNodWZmbGUodCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKChvcHRpb25zLnRhZ3M/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgICAgICAgICAgdCA9IHQuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgICAgICAgZS5vcHRpb25zPy50YWdzPy5zb21lKHRhZyA9PiAob3B0aW9ucz8udGFncyA/PyBbXSkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcmVzOiBUZXN0UmVzdWx0RXh0ZW5kZWRbXTtcbiAgICAgICAgICBpZiAodmFsdWUuYmVmb3JlU3RhdHVzKSB7XG4gICAgICAgICAgICAgIHJlcyA9IEFycmF5LmZyb20odC5tYXAoKHRlc3RFbGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRlc3RFbGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiAnYmVmb3JlKCkgZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICBtczogMCxcbiAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2dzOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICBvd25lcjogcGFja2FnZU93bmVyLFxuICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U6IHBhY2thZ2VfLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0c0RpZmZlcmVuY2U6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgZmxha2luZzogREcuVGVzdC5pc1JlcHJvZHVjaW5nXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIHJlcy5mb3JFYWNoKGFzeW5jICh0ZXN0KSA9PiBhd2FpdCBncm9rLnNoZWxsLnJlcG9ydFRlc3QoJ3BhY2thZ2UnLCB0ZXN0KSk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGludm9rZVRlc3RzSW5DYXRlZ29yeSh2YWx1ZSwgb3B0aW9ucywgc2tpcHBpbmdDYXRlZ29yaWVzKTtcbiAgICAgICAgICBjb25zdCBkYXRhOiBUZXN0UmVzdWx0RXh0ZW5kZWRbXSA9IHJlcy5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG5cbiAgICAgICAgICBpZiAoIXNraXBwZWQpXG4gICAgICAgICAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0gYXdhaXQgaW52b2tlQ2F0ZWdvcnlNZXRob2QodmFsdWUuYWZ0ZXIsIGtleSk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhZnRlciBjYXRlZ29yeVxuICAgICAgICAgIC8vIGdyb2suc2hlbGwuY2xvc2VBbGwoKTtcbiAgICAgICAgICAvLyBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICAgICAgaWYgKHZhbHVlLmFmdGVyU3RhdHVzKSB7XG4gICAgICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBDYXRlZ29yeSBhZnRlcigpIHt7JHtrZXl9fX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBSZXN1bHQgZm9yIHt7JHtrZXl9fX0gYWZ0ZXI6ICR7dmFsdWUuYWZ0ZXJTdGF0dXN9YCk7XG4gICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeToga2V5LFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ2FmdGVyJyxcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIG1zOiAwLFxuICAgICAgICAgICAgICAgICAgc2tpcHBlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBsb2dzOiAnJyxcbiAgICAgICAgICAgICAgICAgIG93bmVyOiBwYWNrYWdlT3duZXIsXG4gICAgICAgICAgICAgICAgICBwYWNrYWdlOiBwYWNrYWdlXy5uYW1lLFxuICAgICAgICAgICAgICAgICAgd2lkZ2V0c0RpZmZlcmVuY2U6IDAsXG4gICAgICAgICAgICAgICAgICBmbGFraW5nOiBERy5UZXN0LmlzUmVwcm9kdWNpbmdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpIHtcbiAgICAgICAgICAgICAgc3RkTG9nKGBQYWNrYWdlIHRlc3Rpbmc6IENhdGVnb3J5IGJlZm9yZSgpIHt7JHtrZXl9fX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBSZXN1bHQgZm9yIHt7JHtrZXl9fX0gYmVmb3JlOiAke3ZhbHVlLmJlZm9yZVN0YXR1c31gKTtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBrZXksXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnYmVmb3JlJyxcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsXG4gICAgICAgICAgICAgICAgICBtczogMCxcbiAgICAgICAgICAgICAgICAgIHNraXBwZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgbG9nczogJycsXG4gICAgICAgICAgICAgICAgICBvd25lcjogcGFja2FnZU93bmVyLFxuICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGFja2FnZV8ubmFtZSxcbiAgICAgICAgICAgICAgICAgIHdpZGdldHNEaWZmZXJlbmNlOiAwLFxuICAgICAgICAgICAgICAgICAgZmxha2luZzogREcuVGVzdC5pc1JlcHJvZHVjaW5nXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG5cbiAgICAgICAgICAvLyBJZiByZXR1cm5PbkZhaWwgaXMgc2V0IGFuZCBhIHRlc3QgZmFpbGVkIChvdGhlciB0aGFuIHNraXBUb1Rlc3QpLCBzdG9wIHByb2Nlc3NpbmcgbW9yZSBjYXRlZ29yaWVzXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuT25GYWlsICYmIGRhdGEuc29tZSgoZCkgPT4gIWQuc3VjY2VzcyAmJiAhZC5za2lwcGVkICYmIGQubmFtZSAhPT0gb3B0aW9ucy5za2lwVG9UZXN0KSlcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc2V0Q29uc29sZSgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0Q29udGV4dCEuY2F0Y2hVbmhhbmRsZWQgJiYgKCFERy5UZXN0LmlzSW5CZW5jaG1hcmspKSB7XG4gICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgZ3Jvay5zaGVsbC5sYXN0RXJyb3I7XG4gICAgICBpZiAoZXJyb3IgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAgICAgICAgIGxvZ3M6ICcnLFxuICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiAnVW5oYW5kbGVkIGV4Y2VwdGlvbnMnLFxuICAgICAgICAgICAgICBuYW1lOiAnRXhjZXB0aW9uJyxcbiAgICAgICAgICAgICAgcmVzdWx0OiBlcnJvciA/PyAnJyxcbiAgICAgICAgICAgICAgc3VjY2VzczogIWVycm9yLFxuICAgICAgICAgICAgICBtczogMCxcbiAgICAgICAgICAgICAgc2tpcHBlZDogZmFsc2UsXG4gICAgICAgICAgICAgIG93bmVyOiBwYWNrYWdlT3duZXIgPz8gJycsXG4gICAgICAgICAgICAgICdwYWNrYWdlJzogcGFja2FnZV8ubmFtZSxcbiAgICAgICAgICAgICAgd2lkZ2V0c0RpZmZlcmVuY2U6IDBcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBVbmhhbmRsZWQgRXhjZXB0aW9uOiAke2Vycm9yfWApO1xuXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHsuLi5wYXJhbXMsICdmbGFraW5nJzogREcuVGVzdC5pc1JlcHJvZHVjaW5nICYmICFlcnJvcn0pO1xuICAgICAgICAgICg8YW55PnBhcmFtcykucGFja2FnZSA9IHBhY2thZ2VfLm5hbWU7XG4gICAgICAgICAgYXdhaXQgZ3Jvay5zaGVsbC5yZXBvcnRUZXN0KCdwYWNrYWdlJywgcGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzdWx0KHg6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBgJHt4LnRvU3RyaW5nKCl9XFxuJHt4LnN0YWNrID8gKGF3YWl0IERHLkxvZ2dlci50cmFuc2xhdGVTdGFja1RyYWNlKHguc3RhY2spKSA6ICcnfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNUZXN0KHQ6IFRlc3QsIHByZWRpY2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBsb2dzOiBhbnlbXSxcbiAgdGVzdFRpbWVvdXQ/OiBudW1iZXIsIHBhY2thZ2VOYW1lPzogc3RyaW5nLCB2ZXJib3NlPzogYm9vbGVhblxuKTogUHJvbWlzZTxUZXN0UmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gIGxvZ3MubGVuZ3RoID0gMDtcbiAgbGV0IHI6IFRlc3RSZXN1bHQ7XG4gIGxldCB0eXBlOiBzdHJpbmcgPSAncGFja2FnZSc7XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKHQubmFtZS50b0xvd2VyQ2FzZSgpICE9PSBwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSk7XG4gIGxldCBza2lwID0gdC5vcHRpb25zPy5za2lwUmVhc29uIHx8IGZpbHRlcjtcbiAgbGV0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG5cbiAgaWYgKERHLlRlc3QuaXNJbkJlbmNobWFyayAmJiAhdC5vcHRpb25zPy5iZW5jaG1hcmspIHtcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogU2tpcHBlZCB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19IGRvZXNudCBhdmFpbGFibGUgaW4gYmVuY2htYXJrIG1vZGVgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHNraXAgJiYgIURHLlRlc3QuaXNJbkJlbmNobWFyaylcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogU2tpcHBlZCB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19YCk7XG4gIGlmICghc2tpcClcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogU3RhcnRlZCB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19YCk7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc3RhcnQpLnRvSVNPU3RyaW5nKCk7XG4gIHRyeSB7XG4gICAgaWYgKHNraXApXG4gICAgICByID0geyBuYW1lOiB0Lm5hbWUsIG93bmVyOnQub3B0aW9ucz8ub3duZXIgPz8gJycsIGNhdGVnb3J5OiB0LmNhdGVnb3J5LCBsb2dzOiAnJywgZGF0ZTogc3RhcnREYXRlLCBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHNraXBSZWFzb24hLCBtczogMCwgc2tpcHBlZDogdHJ1ZSwgcGFja2FnZTogcGFja2FnZU5hbWUgPz8gJycsIGZsYWtpbmc6IERHLlRlc3QuaXNSZXByb2R1Y2luZ307XG4gICAgZWxzZSB7XG4gICAgICBsZXQgdGltZW91dF8gPSB0ZXN0VGltZW91dCA/PyBTVEFOREFSVF9USU1FT1VUO1xuXG4gICAgICBpZiAoREcuVGVzdC5pc1Byb2ZpbGluZylcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGAke3QuY2F0ZWdvcnl9OiAke3QubmFtZX1gKTtcblxuICAgICAgciA9IHsgbmFtZTogdC5uYW1lLCBvd25lcjp0Lm9wdGlvbnM/Lm93bmVyID8/ICcnLCBjYXRlZ29yeTogdC5jYXRlZ29yeSwgbG9nczogJycsIGRhdGU6IHN0YXJ0RGF0ZSwgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiAoYXdhaXQgdGltZW91dCh0LnRlc3QsIHRpbWVvdXRfKSkudG9TdHJpbmcoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2UgLCBwYWNrYWdlOiBwYWNrYWdlTmFtZSA/PyAnJywgZmxha2luZzogREcuVGVzdC5pc1JlcHJvZHVjaW5nfTtcblxuICAgICAgaWYgKERHLlRlc3QuaXNQcm9maWxpbmcpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGAke3QuY2F0ZWdvcnl9OiAke3QubmFtZX1gKTtcbiAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKGBQcm9maWxpbmcgb2YgJHt0LmNhdGVnb3J5fTogJHt0Lm5hbWV9IGZpbmlzaGVkIFxcbiBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGhhdmUgb3BlbmVkIERldlRvb2xzIChGMTIpIC8gUGVyZm9ybWFuY2UgcGFuZWwgYmVmb3JlIHRlc3Qgc3RhcnRzLmApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgc3RkRXJyb3IoeCk7XG4gICAgciA9IHsgbmFtZTogdC5uYW1lLCBvd25lcjp0Lm9wdGlvbnM/Lm93bmVyID8/ICcnLCBjYXRlZ29yeTogdC5jYXRlZ29yeSwgbG9nczogJycsIGRhdGU6IHN0YXJ0RGF0ZSwgc3VjY2VzczogZmFsc2UsIHJlc3VsdDogYXdhaXQgZ2V0UmVzdWx0KHgpLCBtczogMCwgc2tpcHBlZDogZmFsc2UsIHBhY2thZ2U6IHBhY2thZ2VOYW1lID8/ICcnLCBmbGFraW5nOiBmYWxzZX07XG4gIH1cbiAgaWYgKHQub3B0aW9ucz8uaXNBZ2dyZWdhdGVkICYmIHIucmVzdWx0LmNvbnN0cnVjdG9yID09PSBERy5EYXRhRnJhbWUpIHtcbiAgICBjb25zdCBjb2wgPSByLnJlc3VsdC5jb2woJ3N1Y2Nlc3MnKTtcbiAgICBpZiAoY29sKVxuICAgICAgci5zdWNjZXNzID0gY29sLnN0YXRzLnN1bSA9PT0gY29sLmxlbmd0aDtcbiAgICBpZiAoIXZlcmJvc2UpIHtcbiAgICAgIGNvbnN0IGRmID0gci5yZXN1bHQ7XG4gICAgICBkZi5jb2x1bW5zLnJlbW92ZSgnc3RhY2snKTtcbiAgICAgIGRmLnJvd3MucmVtb3ZlV2hlcmUoKHIpID0+IHIuZ2V0KCdzdWNjZXNzJykpO1xuICAgICAgci5yZXN1bHQgPSBkZjtcbiAgICB9XG4gICAgci5yZXN1bHQgPSByLnJlc3VsdC50b0NzdigpO1xuICB9XG4gIHIubG9ncyA9IGxvZ3Muam9pbignXFxuJyk7XG4gIHIubXMgPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gIGlmICghc2tpcClcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogRmluaXNoZWQge3ske3QuY2F0ZWdvcnl9fX0ge3ske3QubmFtZX19fSB3aXRoIHt7JHtyLnN1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZXJyb3InfX19IGZvciAke3IubXN9IG1zYCk7XG4gIGlmICghci5zdWNjZXNzKSB7XG4gICAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogUmVzdWx0IGZvciB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19OiAke3IucmVzdWx0fWApO1xuICB9XG4gIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICByLm5hbWUgPSB0Lm5hbWU7XG4gIHIub3duZXIgPSB0Lm9wdGlvbnM/Lm93bmVyID8/ICcnO1xuICBpZiAoIWZpbHRlcikge1xuICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAnc3VjY2Vzcyc6IHIuc3VjY2VzcywgJ3Jlc3VsdCc6IHIucmVzdWx0LCAnbXMnOiByLm1zLCAnZGF0ZSc6IHIuZGF0ZSxcbiAgICAgICdza2lwcGVkJzogci5za2lwcGVkLCAnY2F0ZWdvcnknOiB0LmNhdGVnb3J5LCAnbmFtZSc6IHQubmFtZSwgJ2xvZ3MnOiByLmxvZ3MsICdvd25lcic6IHIub3duZXIsXG4gICAgICAnZmxha2luZyc6IERHLlRlc3QuaXNSZXByb2R1Y2luZyAmJiByLnN1Y2Nlc3MsXG4gICAgICAncGFja2FnZSc6IHIucGFja2FnZVxuICAgIH07XG4gICAgaWYgKHIucmVzdWx0LmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xuICAgICAgY29uc3QgcmVzID0gT2JqZWN0LmtleXMoci5yZXN1bHQpLnJlZHVjZSgoYWNjLCBrKSA9PiAoeyAuLi5hY2MsIFsncmVzdWx0LicgKyBrXTogci5yZXN1bHRba10gfSksIHt9KTtcbiAgICAgIHBhcmFtcyA9IHsgLi4ucGFyYW1zLCAuLi5yZXMgfTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlc3VsdCBpbnN0YW5jZW9mIERHLkRhdGFGcmFtZSlcbiAgICAgIHBhcmFtcy5yZXN1bHQgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMucmVzdWx0Py50b0pzb24oKSkgfHwgJyc7XG4gICAgYXdhaXQgZ3Jvay5zaGVsbC5yZXBvcnRUZXN0KHR5cGUsIHBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlKGFycmF5OiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgbmV3QXJyID0gYXJyYXkuc2xpY2UoKTtcbiAgbmV3QXJyLnNvcnQoKCkgPT4gTWF0aC5yYW5kb20oKSAtIDAuNSk7XG4gIHJldHVybiBuZXdBcnI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCwgaW50ZXJ2YWw6IG51bWJlciA9IDUwKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsSWQ6IFRpbWVvdXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoY2hlY2tIYW5kbGVyKCkpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICB9LCBpbnRlcnZhbCk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIHRlc3QgZXhlY3V0aW9uIHJlc3VsdCBvciBhbiBlcnJvciBpbiBjYXNlIG9mIHRpbWVvdXRcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lb3V0KGZ1bmM6ICgpID0+IFByb21pc2U8YW55PiwgdGVzdFRpbWVvdXQ6IG51bWJlciwgdGltZW91dFJlYXNvbjogc3RyaW5nID0gJ0VYRUNVVElPTiBUSU1FT1VUJyk6IFByb21pc2U8YW55PiB7XG4gIGxldCB0aW1lb3V0OiBhbnkgPSBudWxsO1xuICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPGFueT4oKF8sIHJlamVjdCkgPT4ge1xuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QodGltZW91dFJlYXNvbik7XG4gICAgfSwgdGVzdFRpbWVvdXQpO1xuICB9KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtmdW5jKCksIHRpbWVvdXRQcm9taXNlXSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRpbWVvdXQpXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpYWxvZ3MgPSBERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGRpYWxvZ3NbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBFeHBlY3RzIGFuIGFzeW5jaHJvbm91cyB7QGxpbmsgYWN0aW9ufSB0byB0aHJvdyBhbiBleGNlcHRpb24uIFVzZSB7QGxpbmsgY2hlY2t9IHRvIHBlcmZvcm1cbiAqIGRlZXBlciBpbnNwZWN0aW9uIG9mIHRoZSBleGNlcHRpb24gaWYgbmVjZXNzYXJ5LlxuICogQHBhcmFtICB7ZnVuY3Rpb24oKTogUHJvbWlzZTx2b2lkPn0gYWN0aW9uXG4gKiBAcGFyYW0gIHtmdW5jdGlvbihhbnkpOiBib29sZWFufSBjaGVja1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGVjdEV4Y2VwdGlvbkFzeW5jKGFjdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgY2hlY2s/OiAoZXhjZXB0aW9uOiBhbnkpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGNhdWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBsZXQgY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IGFjdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY2F1Z2h0ID0gdHJ1ZTtcbiAgICBjaGVja2VkID0gIWNoZWNrIHx8IGNoZWNrKGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICghY2F1Z2h0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQgYnV0IG5vdCB0aHJvd24nKTtcbiAgICBpZiAoIWNoZWNrZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGV4cGVjdGVkIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGJ1dCBpdCBkb2VzIG5vdCBzYXRpc2Z5IHRoZSBjb25kaXRpb24nKTtcbiAgfVxufVxuXG5jb25zdCBjYXRERiA9IERHLkRhdGFGcmFtZS5mcm9tQ29sdW1ucyhbREcuQ29sdW1uLmZyb21TdHJpbmdzKCdjb2wnLCBbJ3ZhbDEnLCAndmFsMicsICd2YWwzJ10pXSk7XG5cbi8qKlxuICogVW5pdmVyc2FsIHRlc3QgZm9yIHZpZXdlcnMuIEl0IHNlYXJjaCB2aWV3ZXJzIGluIERPTSBieSB0YWdzOiBjYW52YXMsIHN2ZywgaW1nLCBpbnB1dCwgaDEsIGFcbiAqIEBwYXJhbSAge3N0cmluZ30gdiBWaWV3ZXIgbmFtZVxuICogQHBhcmFtICB7X0RHLkRhdGFGcmFtZX0gZGYgRGF0YWZyYW1lIHRvIHVzZS4gU2hvdWxkIGhhdmUgYXQgbGVhc3QgMyByb3dzXG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLmRldGVjdFNlbWFudGljVHlwZXMgU3BlY2lmeSB3aGV0aGVyIHRvIGRldGVjdCBzZW1hbnRpYyB0eXBlcyBvciBub3RcbiAqIEBwYXJhbSAge2Jvb2xlYW59IG9wdGlvbnMucmVhZE9ubHkgSWYgc2V0IHRvIHRydWUsIHRoZSBkYXRhZnJhbWUgd2lsbCBub3QgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSB0ZXN0XG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLmFyYml0cmFyeURmVGVzdCBJZiBzZXQgdG8gZmFsc2UsIHRlc3Qgb24gYXJiaXRyYXJ5IGRhdGFmcmFtZVxuICogKG9uZSBjYXRlZ29yaWNhbCBjb2x1bW4pIHdpbGwgbm90IGJlIHBlcmZvcm1lZFxuICogQHBhcmFtICB7b2JqZWN0fSBvcHRpb25zIExpc3Qgb2Ygb3B0aW9ucyAob3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBUaGUgdGVzdCBpcyBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgaWYgaXQgY29tcGxldGVzIHdpdGhvdXQgZXJyb3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IF9ERy5EYXRhRnJhbWUsIG9wdGlvbnM/OiB7XG4gIGRldGVjdFNlbWFudGljVHlwZXM/OiBib29sZWFuLCByZWFkT25seT86IGJvb2xlYW4sIGFyYml0cmFyeURmVGVzdD86IGJvb2xlYW4sXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nLCBhd2FpdFZpZXdlcj86ICh2aWV3ZXI6IF9ERy5WaWV3ZXIpID0+IFByb21pc2U8dm9pZD5cbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBvcHRpb25zPy5wYWNrYWdlTmFtZSA/PyAnJztcbiAgaWYgKG9wdGlvbnM/LmRldGVjdFNlbWFudGljVHlwZXMpXG4gICAgYXdhaXQgZ3Jvay5kYXRhLmRldGVjdFNlbWFudGljVHlwZXMoZGYpO1xuICBjb25zdCB0diA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KGRmKTtcblxuICB0cnkge1xuICAgIC8vMS4gT3BlbiwgZG8gbm90aGluZyBhbmQgY2xvc2VcbiAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkKTtcbiAgICAvL2luIGNhc2Ugdmlld2VyIHdpdGggYXN5bmMgcmVuZGVyaW5nIC0gd2FpdCBmb3IgcmVuZGVyIHRvIGNvbXBsZXRlXG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgdW5kZWZpbmVkLCBvcHRpb25zIS5hd2FpdFZpZXdlcik7XG5cbiAgICAvLzIuIE9wZW4gdmlld2VyLCBydW4gc2VsZWN0aW9uLCBmaWx0ZXIsIGV0Yy4gYW5kIGNsb3NlXG4gICAgaWYgKCFvcHRpb25zPy5yZWFkT25seSkge1xuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgc2VsZWN0RmlsdGVyQ2hhbmdlQ3VycmVudCk7XG4gICAgICBpZiAob3B0aW9ucz8uYXdhaXRWaWV3ZXIpXG4gICAgICAgIGF3YWl0IHRlc3RWaWV3ZXJJbnRlcm5hbCh0diwgdiwgcGFja2FnZU5hbWUsIGdyb2suZXZlbnRzLm9uVmlld2VyQWRkZWQsIHNlbGVjdEZpbHRlckNoYW5nZUN1cnJlbnQsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKTtcbiAgICB9XG5cbiAgICAvLzIuIE9wZW4gdmlld2VyLCBjaGFuZ2Ugb3B0aW9ucywgc2F2ZSBsYXlvdXQgYW5kIGNsb3NlXG4gICAgbGV0IHByb3BzQW5kTGF5b3V0OiB7IGxheW91dDogYW55LCBzYXZlZFByb3BzOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICAgIHByb3BzQW5kTGF5b3V0ID0gYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgY2hhbmdlT3B0aW9uc1NhdmVMYXlvdXQpO1xuICAgIGlmIChvcHRpb25zPy5hd2FpdFZpZXdlcilcbiAgICAgIHByb3BzQW5kTGF5b3V0ID0gYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCxcbiAgICAgICAgY2hhbmdlT3B0aW9uc1NhdmVMYXlvdXQsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKVxuXG4gICAgLy8zLiBMb2FkIGxheW91dFxuICAgIGF3YWl0IHRlc3RWaWV3ZXJJbnRlcm5hbCh0diwgdiwgcGFja2FnZU5hbWUsIGdyb2suZXZlbnRzLm9uVmlld0xheW91dEFwcGxpZWQsIGxvYWRMYXlvdXQsIHVuZGVmaW5lZCwgcHJvcHNBbmRMYXlvdXQ/LmxheW91dCxcbiAgICAgIHsgc2F2ZWRQcm9wczogcHJvcHNBbmRMYXlvdXQ/LnNhdmVkUHJvcHMgfSk7XG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3TGF5b3V0QXBwbGllZCwgbG9hZExheW91dCwgb3B0aW9ucyEuYXdhaXRWaWV3ZXIsXG4gICAgICAgIHByb3BzQW5kTGF5b3V0Py5sYXlvdXQsIHsgc2F2ZWRQcm9wczogcHJvcHNBbmRMYXlvdXQ/LnNhdmVkUHJvcHMgfSk7XG5cbiAgICAvLzQuIE9wZW4gdmlld2VyIG9uIGFyYml0YXJ5IGRhdGFzZXRcbiAgICBpZiAob3B0aW9ucz8uYXJiaXRyYXJ5RGZUZXN0ICE9PSBmYWxzZSkge1xuICAgICAgdHYuZGF0YUZyYW1lID0gY2F0REY7XG4gICAgICBhd2FpdCBkZWxheSg1MCk7XG4gICAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkKTtcbiAgICAgIGlmIChvcHRpb25zPy5hd2FpdFZpZXdlcilcbiAgICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgdW5kZWZpbmVkLCBvcHRpb25zIS5hd2FpdFZpZXdlcik7XG4gICAgfVxuXG4gICAgLy81LiBDYWxsIHBvc3Rwb25lZCBmaWx0ZXJpbmdcbiAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkLCBmaWx0ZXJBc3luYyk7XG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgZmlsdGVyQXN5bmMsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKTtcblxuICB9IGZpbmFsbHkge1xuICAgIC8vIGNsb3NlQWxsKCkgaXMgaGFuZGxpbmcgYnkgY29tbW9uIHRlc3Qgd29ya2Zsb3dcbiAgICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgLy8gREcuQmFsbG9vbi5jbG9zZUFsbCgpO1xuICB9XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {category, test} from '@datagrok-libraries/test/src/test';\n\ncategory('_first', () => {\n /** The first test of the package to evaluate problems with imports. */\n test('_first', async () => { });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types/monomer-library';\n\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from '../constants';\n\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\nexport function removeGapsFromHelm(srcHelm: string): string {\n return srcHelm.replaceAll(helmGapStartRe, '{').replaceAll(helmGapIntRe, '.')\n .replaceAll(helmGapEndRe, '}').replace('{*}', '{}');\n}\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): string[] {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n if (!(s == null || 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 closingIndex = findClosing(monomer, 1, '[', ']');\n const element = monomer.substring(1, closingIndex);\n monomers.push(element);\n const residue = monomer.substring(closingIndex + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const openingIndex = findOpening(monomer, monomer.length - 2, '[', ']');\n const element = monomer.substring(openingIndex + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, openingIndex);\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 return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\n/** Searches monomers of helmString for missed. */\nexport function findMonomers(seqMonomerSymbolList: string[], monomerLib: IMonomerLib): Set<string> {\n return new Set(seqMonomerSymbolList.filter((s) => monomerLib?.getMonomer(null, s)));\n}\n\nfunction findClosing(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i < s.length) {\n if (s[i] === open)\n count++;\n\n if (s[i] === close) {\n if (count === 0)\n return i;\n count--;\n }\n i++;\n }\n return -1;\n}\n\nfunction findOpening(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i >= 0) {\n if (s[i] === close)\n count++;\n\n if (s[i] === open) {\n if (count === 0)\n return i;\n count--;\n }\n i--;\n }\n return -1;\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 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 if (s.endsWith(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 = unescape(tag.replace(new RegExp('\\\\' + c, 'g'), c));\n return {tag: tag, str: s};\n}\n\nfunction unescape(s: string) {\n if (s == null || 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__ = ui;","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nexport class HelmInputBase extends DG.JsInputBase {\n}\nexport const HelmNotSupportedErrorType = 'HelmNotSupportedError';\nexport class HelmNotSupportedError extends Error {\n constructor(message) {\n super(message);\n this.type = HelmNotSupportedErrorType;\n }\n}\nexport async function getHelmHelper() {\n const packageName = 'Helm';\n const funcList = DG.Func.find({ package: packageName, name: `getHelmHelper` });\n if (funcList.length === 0)\n throw new Error(`Package '${packageName}' must be installed for HelmHelper.`);\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\nui.input.helmAsync = async function (name, options) {\n return (await getHelmHelper()).createHelmInput(name, options);\n};\n/** Inputs logic */\nexport function getMonomerHandleArgs(a, name) {\n if (!a)\n throw new Error(`Argument 'a' of type Atom or HelmType is mandatory.`);\n let biotype;\n let elem;\n const aa = a;\n if (aa.T === 'ATOM') {\n // Legacy HelmAtom.biotype() returns the js-draw-lite HelmType union (which\n // still carries the `HELM_NUCLETIDE` typo); cast to the hwe-owned HelmType.\n biotype = aa.biotype();\n elem = aa.elem;\n }\n else {\n biotype = a;\n elem = name;\n }\n return [biotype, elem];\n}\n//# sourceMappingURL=helm-helper.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {delay, testEvent} from '@datagrok-libraries/test/src/test';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {_package} from '../package-test';\n\n\nexport async function initHelmMainPackage(): Promise<void> {\n await getHelmHelper();\n}\n\nexport async function awaitGrid(grid: DG.Grid, timeout: number = 5000): Promise<void> {\n await delay(100);\n await testEvent(grid.onAfterDrawContent, () => {},\n () => { grid.invalidate(); }, timeout);\n}\n\nexport async function readDataframe(tableName: string): Promise<DG.DataFrame> {\n const file = await loadFileAsText(tableName);\n const df = DG.DataFrame.fromCsv(file);\n df.name = tableName.replace('.csv', '');\n return df;\n}\n\nexport async function loadFileAsText(name: string): Promise<string> {\n return await _package.files.readAsText(name);\n}\n","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport { errInfo } from '../utils/err-info';\nexport const DEFAULT_FILES_LIB_PROVIDER_NAME = 'Files';\nexport async function findProviderWithLibraryName(providers, libraryName) {\n for (const provider of providers) {\n const libNames = await provider.listLibraries();\n if (libNames.includes(libraryName) || libNames.includes(`${libraryName}.json`))\n return provider;\n }\n return null;\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 installed for MonomerLibHelper.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\nexport class MonomerSetPlaceholder {\n constructor(monomerLib, symbol, polymerType, monomerType, monomerLinks) {\n this.monomerLib = monomerLib;\n this.symbol = symbol;\n this.polymerType = polymerType;\n this.monomerType = monomerType;\n this.monomerLinks = monomerLinks;\n this.error = null;\n try {\n this.monomers = this.monomerLinks.map((mLink) => {\n const resM = this.monomerLib.getMonomer(this.polymerType, mLink.symbol);\n if (!resM)\n throw new Error('Monomer not found: ');\n if (resM.lib?.source != mLink.source)\n throw new Error(`Monomer '${symbol}' found in different library.`);\n return resM;\n });\n }\n catch (err) {\n const [errMsg, _errStack] = errInfo(err);\n this.error = errMsg;\n this.monomers = [];\n }\n }\n}\nexport class MonomerSet {\n constructor(description, placeholders, source = undefined, error = undefined) {\n this.description = description;\n this.placeholders = placeholders;\n this.source = source;\n this.error = error;\n }\n updateSets(setList, reload = false) {\n if (reload)\n this.placeholders = [];\n for (const _set of setList)\n if (!_set.error)\n this._updateSetInt(_set);\n // TODO: File onChanged\n }\n _updateSetInt(set) {\n for (const setPh of set.placeholders)\n this.placeholders.push(setPh);\n }\n}\n//# sourceMappingURL=monomer-library.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/test/src/test';\n\nimport {parseHelm} from '../utils';\nimport {initHelmMainPackage} from './utils';\n\nimport {_package} from '../package-test';\n\ncategory('Helm', () => {\n //These tests require webservice that is not present on test stand\n // test('helmToFasta', async () => {\n // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');\n // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');\n // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');\n // });\n //\n // test('helmToRNA', async () => {\n // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');\n // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');\n // // eslint-disable-next-line max-len\n // expect(\n // await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA'\n // );\n // });\n //\n // test('helmToPeptide', async () => {\n // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');\n // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');\n // // eslint-disable-next-line max-len\n // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');\n // });\n\n // detectMacromolecule is a function of Bio package\n // test('detectMacromolecule', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n // });\n\n // semType and units tags are detecting by Bio package function detectMacromolecule\n // test('detectHelm', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.meta.units, 'HELM');\n // });\n\n const complexMonomers = [\n // tests parsing of complex monomer in square brackets like [L-hArg(Et,Et)]\n 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n // tests parsing of complex monomer and one as a side chain as well\n 'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',\n // tests parsing of complex monomer and one as a side chain as well\n 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // tests complex monomer as side chain\n 'RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // test complex monomer, side chain and linker\n 'RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0'\n ];\n\n const complexMonomersExpected = [\n ['L-hArg(Et,Et)', 'E', 'F', 'G', 'C', 'E'],\n ['L-hArg(Et,Et)', 'L-hArg(Et,Et)', 'E', 'F', 'G'],\n ['dhp', 'm1A', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['r', 'mo6pur', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['afhna', 'mo6pur', '36SS', 'r', 'T', 'p']\n ];\n\n const complexTestNames = [\n 'complex-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',\n 'complex-side-chain', 'complex+side-chain+linker'\n ];\n\n before(async () => {\n await initHelmMainPackage();\n });\n\n test('parseHelm', async () => {\n const expectedResults = [\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],\n ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],\n ['R', 'U', 'P', 'T', 'A'],\n ['A', '*', 'G', 'C']\n ];\n const helmStrings = [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',\n // eslint-disable-next-line max-len\n 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',\n 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',\n 'PEPTIDE1{A.*.G.C}$$$$V2.0'\n ];\n for (let idx = 0; idx < helmStrings.length; ++idx) {\n const monomerSet = new Set(parseHelm(helmStrings[idx]));\n const monomerArray = Array.from(monomerSet);\n expect(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));\n }\n });\n complexMonomers.forEach((helm, i) => {\n test(complexTestNames[i], async () => {\n const monomersArray = parseHelm(helm);\n monomersArray.sort();\n const expected = complexMonomersExpected[i];\n expected.sort();\n expectArray(monomersArray, expected);\n });\n });\n});\n","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\n// -- Monomer libraries --\nconst LIB_STORAGE_NAME = 'Libraries';\nconst LIB_SETTINGS_KEY = 'Settings';\nconst DUPLICATE_MONOMER_PREFERENCES_KEY = 'DuplicateMonomerPreferences';\n// user settings does not allow more than 5000 characters, but unfortunately we need this, so we will split\n// the string into chunks and store them separately\nconst MAX_USER_SETTINGS_STRING_LENGTH = 4000;\nconst CHUNK_KEY_SUFFIX = 'nextChunk';\nasync function getDuplicatePrefsFull() {\n // the first part of it will always live in DUPLICATE_MONOMER_PREFERENCES_KEY\n let resStr = await grok.userSettings.getValue(LIB_STORAGE_NAME, DUPLICATE_MONOMER_PREFERENCES_KEY, true) ?? '';\n if (!resStr)\n return {};\n // chunk will end with special suffix and just before it will have the number of the next chunk key\n while (resStr.endsWith(CHUNK_KEY_SUFFIX)) {\n const nextChunkKey = `${DUPLICATE_MONOMER_PREFERENCES_KEY}${resStr.charAt(resStr.length - CHUNK_KEY_SUFFIX.length - 1)}`;\n const nextChunkStr = (await grok.userSettings.getValue(LIB_STORAGE_NAME, nextChunkKey, true)) ?? '';\n resStr = resStr.slice(0, resStr.length - CHUNK_KEY_SUFFIX.length - 1) + nextChunkStr;\n }\n return JSON.parse(resStr);\n}\nasync function setDuplicatePrefsFull(value) {\n const valueStr = JSON.stringify(value);\n const chunksCount = Math.ceil(valueStr.length / MAX_USER_SETTINGS_STRING_LENGTH);\n for (let i = 0; i < chunksCount; i++) {\n const key = i === 0 ? DUPLICATE_MONOMER_PREFERENCES_KEY : `${DUPLICATE_MONOMER_PREFERENCES_KEY}${i}`;\n const nextKey = i < chunksCount - 1 ? `${i + 1}` : '';\n const chunkStr = valueStr.slice(i * MAX_USER_SETTINGS_STRING_LENGTH, (i + 1) * MAX_USER_SETTINGS_STRING_LENGTH);\n const chunkStrToStore = nextKey ? chunkStr + nextKey + CHUNK_KEY_SUFFIX : chunkStr;\n await grok.userSettings.add(LIB_STORAGE_NAME, key, chunkStrToStore, true);\n }\n}\nlet userLibSettingsPromise = Promise.resolve();\nexport async function getUserLibSettings() {\n let res;\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n const resStr = await grok.userSettings.getValue(LIB_STORAGE_NAME, LIB_SETTINGS_KEY, true);\n res = resStr ? JSON.parse(resStr) : { exclude: [], explicit: [], duplicateMonomerPreferences: {} };\n const duplicatePrefs = await getDuplicatePrefsFull();\n // Fix empty object returned in case there is no settings stored for user\n res.exclude = res.exclude instanceof Array ? res.exclude : [];\n res.explicit = res.explicit instanceof Array ? res.explicit : [];\n res.duplicateMonomerPreferences = res.duplicateMonomerPreferences instanceof Object ?\n res.duplicateMonomerPreferences : {};\n // migrate from short hand if needed\n for (const polymerType in duplicatePrefs) {\n res.duplicateMonomerPreferences[polymerType] = res.duplicateMonomerPreferences[polymerType] ?? {};\n for (const libraryName in duplicatePrefs[polymerType]) {\n for (const monomerSymbol of duplicatePrefs[polymerType][libraryName])\n res.duplicateMonomerPreferences[polymerType][monomerSymbol] = libraryName;\n }\n }\n // console.debug(`Bio: getUserLibSettings()\\n${JSON.stringify(res, undefined, 2)}`);\n });\n await userLibSettingsPromise;\n return res;\n}\nexport async function setUserLibSettings(value) {\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n value.duplicateMonomerPreferences = value.duplicateMonomerPreferences ?? {};\n // console.debug(`Bio: setUserLibSettings()\\n${JSON.stringify(value, undefined, 2)}`);\n // extract short hand for duplicateMonomerPreferences\n const duplicatePrefsShortHand = {};\n for (const polymerType in value.duplicateMonomerPreferences) {\n duplicatePrefsShortHand[polymerType] = {};\n for (const monomerSymbol in value.duplicateMonomerPreferences[polymerType]) {\n const libraryName = value.duplicateMonomerPreferences[polymerType][monomerSymbol];\n duplicatePrefsShortHand[polymerType][libraryName] = duplicatePrefsShortHand[polymerType][libraryName] ?? [];\n duplicatePrefsShortHand[polymerType][libraryName].push(monomerSymbol);\n }\n }\n await setDuplicatePrefsFull(duplicatePrefsShortHand);\n //await grok.userSettings.add(LIB_STORAGE_NAME, DUPLICATE_MONOMER_PREFERENCES_KEY, JSON.stringify(duplicatePrefsShortHand), true);\n value.duplicateMonomerPreferences = {}; // clear to reduce size\n await grok.userSettings.add(LIB_STORAGE_NAME, LIB_SETTINGS_KEY, JSON.stringify(value), true);\n });\n await userLibSettingsPromise;\n}\n//# sourceMappingURL=lib-settings.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, expectObject, test} from '@datagrok-libraries/test/src/test';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings,\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {findMonomers, parseHelm} from '../utils';\nimport {initHelmMainPackage} from './utils';\n\n\n/** Tests with default monomer library */\ncategory('findMonomers', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Tests 'findMonomers' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries for tests\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true);\n });\n\n const tests: { [testName: string]: { test: string, tgt: Set<string> } } = {\n 'withoutMissed': {\n test: 'PEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(),\n },\n 'withMissed':\n {\n test: 'PEPTIDE1{meI.missed2.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(['missed2'])\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(testName, async () => {\n _testFindMonomers(testData.test, testData.tgt);\n });\n }\n\n function _testFindMonomers(testHelmValue: string, tgtMissedSet: Set<string>): void {\n const monomerLib = monomerLibHelper.getMonomerLib();\n const monomerSymbolList: string[] = parseHelm(testHelmValue);\n const resMissedSet: Set<string> = findMonomers(monomerSymbolList, monomerLib);\n expectObject(resMissedSet, tgtMissedSet);\n }\n});\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n /* Requires notation handler */ NOTATION[\"CUSTOM\"] = \"custom\";\n /* Requires notation handler */ NOTATION[\"BILN\"] = \"biln\";\n})(NOTATION || (NOTATION = {}));\nexport var ALPHABET;\n(function (ALPHABET) {\n ALPHABET[\"DNA\"] = \"DNA\";\n ALPHABET[\"RNA\"] = \"RNA\";\n ALPHABET[\"PT\"] = \"PT\";\n /** Unknown */\n ALPHABET[\"UN\"] = \"UN\";\n})(ALPHABET || (ALPHABET = {}));\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"aligned\"] = \"aligned\";\n TAGS[\"alphabet\"] = \"alphabet\";\n TAGS[\"alphabetSize\"] = \".alphabetSize\";\n TAGS[\"alphabetIsMultichar\"] = \".alphabetIsMultichar\";\n TAGS[\"separator\"] = \"separator\";\n TAGS[\"isHelmCompatible\"] = \".isHelmCompatible\";\n TAGS[\"positionNames\"] = \".positionNames\";\n TAGS[\"positionLabels\"] = \".positionLabels\";\n TAGS[\"regions\"] = \".regions\";\n TAGS[\"positionShift\"] = \".positionShift\";\n TAGS[\"selectedPosition\"] = \".selectedPosition\";\n TAGS[\"polymerTypeColumnName\"] = \".polymerTypeColumnName\";\n TAGS[\"annotations\"] = \".annotations\";\n TAGS[\"numberingScheme\"] = \".numberingScheme\";\n TAGS[\"annotationColumnName\"] = \".annotationColumnName\";\n})(TAGS || (TAGS = {}));\nexport { TAGS as BioTags };\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/g;\nexport const helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/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(ALPHABET.PT, Alphabets.fasta.peptide, 0.50),\n new CandidateType(ALPHABET.DNA, Alphabets.fasta.dna, 0.55),\n new CandidateType(ALPHABET.RNA, Alphabets.fasta.rna, 0.55),\n];\n/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\nexport const GapOriginals = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n [NOTATION.BILN]: '',\n};\nexport const MONOMER_MOTIF_SPLITTER = ' , ';\n/** Tag on Monomer columns storing the nqName of a function that returns an IMonomerCanonicalizer.\n * The `.%` prefix ensures this tag is persisted with projects. */\nexport const MONOMER_CANONICALIZER_FUNC_TAG = '.%monomer-canonicalizer-func';\n/** Column temp key for the cached IMonomerCanonicalizer instance */\nexport const MONOMER_CANONICALIZER_TEMP = 'monomer-canonicalizer';\nexport const NOTATION_PROVIDER_CONSTRUCTOR_ROLE = 'notationProviderConstructor';\n//# sourceMappingURL=consts.js.map","import { NOTATION_PROVIDER_CONSTRUCTOR_ROLE } from './consts';\nexport class NotationProviderBase {\n /** Name of the custom notation */\n static get notationName() {\n return 'Custom';\n }\n ;\n /** flag to let bio know if this provider implements method for converting helm to it */\n static get implementsFromHelm() {\n return false;\n }\n ;\n /** Method for converting HELM to this notation */\n static convertFromHelm(helm, options) {\n throw new Error(`Method convertFromHelm not implemented for this notation provider`);\n }\n ;\n static async getProviderConstructors() {\n // this is terrible, I know, but otherwise this gets put in webworkers and fails due to DG resolution)))\n // @ts-ignore\n if (window?.DG) {\n // @ts-ignore\n const constFuncs = window.DG.Func.find({ meta: { role: NOTATION_PROVIDER_CONSTRUCTOR_ROLE } });\n return Promise.all(constFuncs.map((f) => f.apply({})));\n }\n return [];\n }\n}\n/** 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","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","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, polymerType) {\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', // asp, aspartic acid, asp\n 'E': '#E60A0A', // glu, glutamic acid\n 'C': '#E6E600', // cys, cysteine\n 'M': '#E6E600', // met, methionine\n 'K': '#145AFF', // lys, lysine\n 'R': '#145AFF', // arg, arginine\n 'S': '#FA9600', // ser, serine\n 'T': '#FA9600', // thr, threonine\n 'F': '#3232AA', // phe, phenylalanine\n 'Y': '#3232AA', // tyr, tyrosine\n 'N': '#00DCDC', // asn, asparagine\n 'Q': '#00DCDC', // gln, glutamine\n 'G': '#EBEBEB', // gly, glycine\n 'L': '#0F820F', // leu, leucine\n 'V': '#0F820F', // val, valine\n 'I': '#0F820F', // ile, isoleucine\n 'A': '#C8C8C8', // ala, alanine\n 'W': '#B45AB4', // trp, tryptophan\n 'H': '#8282D2', // his, histidine\n 'P': '#DC9682', // pro, proline\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', // Nle - norleucine\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', // orange ?\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","/**\n * @module LRUCache\n */\nconst perf = typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ? process : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort;\n _onabort = [];\n reason;\n aborted = false;\n addEventListener(_, fn) {\n this._onabort.push(fn);\n }\n };\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill();\n }\n signal = new AS();\n abort(reason) {\n if (this.signal.aborted)\n return;\n //@ts-ignore\n this.signal.reason = reason;\n //@ts-ignore\n this.signal.aborted = true;\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason);\n }\n this.signal.onabort?.(reason);\n }\n };\n let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning)\n return;\n printACPolyfillWarning = false;\n emitWarning('AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n constructor(size) {\n super(size);\n this.fill(0);\n }\n}\nclass Stack {\n heap;\n length;\n // private constructor\n static #constructing = false;\n static create(max) {\n const HeapCls = getUintArray(max);\n if (!HeapCls)\n return [];\n Stack.#constructing = true;\n const s = new Stack(max, HeapCls);\n Stack.#constructing = false;\n return s;\n }\n constructor(max, HeapCls) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)');\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max);\n this.length = 0;\n }\n push(n) {\n this.heap[this.length++] = n;\n }\n pop() {\n return this.heap[--this.length];\n }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n #max;\n #maxSize;\n #dispose;\n #disposeAfter;\n #fetchMethod;\n #memoMethod;\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl;\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution;\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas;\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale;\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet;\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL;\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize;\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort;\n // computed properties\n #size;\n #calculatedSize;\n #keyMap;\n #keyList;\n #valList;\n #next;\n #prev;\n #head;\n #tail;\n #free;\n #disposed;\n #sizes;\n #starts;\n #ttls;\n #hasDispose;\n #hasFetchMethod;\n #hasDisposeAfter;\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals(c) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head;\n },\n get tail() {\n return c.#tail;\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n moveToTail: (index) => c.#moveToTail(index),\n indexes: (options) => c.#indexes(options),\n rindexes: (options) => c.#rindexes(options),\n isStale: (index) => c.#isStale(index),\n };\n }\n // Protected read-only members\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max() {\n return this.#max;\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize() {\n return this.#maxSize;\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize() {\n return this.#calculatedSize;\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size() {\n return this.#size;\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod() {\n return this.#fetchMethod;\n }\n get memoMethod() {\n return this.#memoMethod;\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose;\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter;\n }\n constructor(options) {\n const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options;\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer');\n }\n const UintArray = max ? getUintArray(max) : Array;\n if (!UintArray) {\n throw new Error('invalid max value: ' + max);\n }\n this.#max = max;\n this.#maxSize = maxSize;\n this.maxEntrySize = maxEntrySize || this.#maxSize;\n this.sizeCalculation = sizeCalculation;\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function');\n }\n }\n if (memoMethod !== undefined &&\n typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined');\n }\n this.#memoMethod = memoMethod;\n if (fetchMethod !== undefined &&\n typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified');\n }\n this.#fetchMethod = fetchMethod;\n this.#hasFetchMethod = !!fetchMethod;\n this.#keyMap = new Map();\n this.#keyList = new Array(max).fill(undefined);\n this.#valList = new Array(max).fill(undefined);\n this.#next = new UintArray(max);\n this.#prev = new UintArray(max);\n this.#head = 0;\n this.#tail = 0;\n this.#free = Stack.create(max);\n this.#size = 0;\n this.#calculatedSize = 0;\n if (typeof dispose === 'function') {\n this.#dispose = dispose;\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter;\n this.#disposed = [];\n }\n else {\n this.#disposeAfter = undefined;\n this.#disposed = undefined;\n }\n this.#hasDispose = !!this.#dispose;\n this.#hasDisposeAfter = !!this.#disposeAfter;\n this.noDisposeOnSet = !!noDisposeOnSet;\n this.noUpdateTTL = !!noUpdateTTL;\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n this.ignoreFetchAbort = !!ignoreFetchAbort;\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError('maxSize must be a positive integer if specified');\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError('maxEntrySize must be a positive integer if specified');\n }\n this.#initializeSizeTracking();\n }\n this.allowStale = !!allowStale;\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n this.updateAgeOnGet = !!updateAgeOnGet;\n this.updateAgeOnHas = !!updateAgeOnHas;\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1;\n this.ttlAutopurge = !!ttlAutopurge;\n this.ttl = ttl || 0;\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified');\n }\n this.#initializeTTLTracking();\n }\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError('At least one of max, maxSize, or ttl is required');\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED';\n if (shouldWarn(code)) {\n warned.add(code);\n const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.';\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n }\n }\n }\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key) {\n return this.#keyMap.has(key) ? Infinity : 0;\n }\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max);\n const starts = new ZeroArray(this.#max);\n this.#ttls = ttls;\n this.#starts = starts;\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0;\n ttls[index] = ttl;\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index], 'expire');\n }\n }, ttl + 1);\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n };\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0;\n };\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index];\n const start = starts[index];\n /* c8 ignore next */\n if (!ttl || !start)\n return;\n status.ttl = ttl;\n status.start = start;\n status.now = cachedNow || getNow();\n const age = status.now - start;\n status.remainingTTL = ttl - age;\n }\n };\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0;\n const getNow = () => {\n const n = perf.now();\n if (this.ttlResolution > 0) {\n cachedNow = n;\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n return n;\n };\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key);\n if (index === undefined) {\n return 0;\n }\n const ttl = ttls[index];\n const start = starts[index];\n if (!ttl || !start) {\n return Infinity;\n }\n const age = (cachedNow || getNow()) - start;\n return ttl - age;\n };\n this.#isStale = index => {\n const s = starts[index];\n const t = ttls[index];\n return !!t && !!s && (cachedNow || getNow()) - s > t;\n };\n }\n // conditionally set private methods related to TTL\n #updateItemAge = () => { };\n #statusTTL = () => { };\n #setItemTTL = () => { };\n /* c8 ignore stop */\n #isStale = () => false;\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max);\n this.#calculatedSize = 0;\n this.#sizes = sizes;\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index];\n sizes[index] = 0;\n };\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0;\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function');\n }\n size = sizeCalculation(v, k);\n if (!isPosInt(size)) {\n throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n }\n }\n else {\n throw new TypeError('invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.');\n }\n }\n return size;\n };\n this.#addItemSize = (index, size, status) => {\n sizes[index] = size;\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index];\n while (this.#calculatedSize > maxSize) {\n this.#evict(true);\n }\n }\n this.#calculatedSize += sizes[index];\n if (status) {\n status.entrySize = size;\n status.totalCalculatedSize = this.#calculatedSize;\n }\n };\n }\n #removeItemSize = _i => { };\n #addItemSize = (_i, _s, _st) => { };\n #requireSize = (_k, _v, size, sizeCalculation) => {\n if (size || sizeCalculation) {\n throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n }\n return 0;\n };\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#head) {\n break;\n }\n else {\n i = this.#prev[i];\n }\n }\n }\n }\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#tail) {\n break;\n }\n else {\n i = this.#next[i];\n }\n }\n }\n }\n #isValidIndex(index) {\n return (index !== undefined &&\n this.#keyMap.get(this.#keyList[index]) === index);\n }\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries();\n }\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache';\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(fn, getOptions = {}) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n if (fn(value, this.#keyList[i], this)) {\n return this.get(this.#keyList[i], getOptions);\n }\n }\n }\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(fn, thisp = this) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(fn, thisp = this) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false;\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i], 'expire');\n deleted = true;\n }\n }\n return deleted;\n }\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key) {\n const i = this.#keyMap.get(key);\n if (i === undefined)\n return undefined;\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n return undefined;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i];\n const start = this.#starts[i];\n if (ttl && start) {\n const remain = ttl - (perf.now() - start);\n entry.ttl = remain;\n entry.start = Date.now();\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n return entry;\n }\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr = [];\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i];\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined || key === undefined)\n continue;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i];\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - this.#starts[i];\n entry.start = Math.floor(Date.now() - age);\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n arr.unshift([key, entry]);\n }\n return arr;\n }\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr) {\n this.clear();\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start;\n entry.start = perf.now() - age;\n }\n this.set(key, entry.value, entry);\n }\n }\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(k, v, setOptions = {}) {\n if (v === undefined) {\n this.delete(k);\n return this;\n }\n const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss';\n status.maxEntrySizeExceeded = true;\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set');\n return this;\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n if (index === undefined) {\n // addition\n index = (this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size);\n this.#keyList[index] = k;\n this.#valList[index] = v;\n this.#keyMap.set(k, index);\n this.#next[this.#tail] = index;\n this.#prev[index] = this.#tail;\n this.#tail = index;\n this.#size++;\n this.#addItemSize(index, size, status);\n if (status)\n status.set = 'add';\n noUpdateTTL = false;\n }\n else {\n // update\n this.#moveToTail(index);\n const oldVal = this.#valList[index];\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'));\n const { __staleWhileFetching: s } = oldVal;\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set']);\n }\n }\n }\n else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set']);\n }\n }\n this.#removeItemSize(index);\n this.#addItemSize(index, size, status);\n this.#valList[index] = v;\n if (status) {\n status.set = 'replace';\n const oldValue = oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal;\n if (oldValue !== undefined)\n status.oldValue = oldValue;\n }\n }\n else if (status) {\n status.set = 'update';\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking();\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start);\n }\n if (status)\n this.#statusTTL(status, index);\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return this;\n }\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop() {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head];\n this.#evict(true);\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching;\n }\n }\n else if (val !== undefined) {\n return val;\n }\n }\n }\n finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n }\n #evict(free) {\n const head = this.#head;\n const k = this.#keyList[head];\n const v = this.#valList[head];\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict']);\n }\n }\n this.#removeItemSize(head);\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined;\n this.#valList[head] = undefined;\n this.#free.push(head);\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0;\n this.#free.length = 0;\n }\n else {\n this.#head = this.#next[head];\n }\n this.#keyMap.delete(k);\n this.#size--;\n return head;\n }\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k, hasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined) {\n return false;\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index);\n }\n if (status) {\n status.has = 'hit';\n this.#statusTTL(status, index);\n }\n return true;\n }\n else if (status) {\n status.has = 'stale';\n this.#statusTTL(status, index);\n }\n }\n else if (status) {\n status.has = 'miss';\n }\n return false;\n }\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k, peekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions;\n const index = this.#keyMap.get(k);\n if (index === undefined ||\n (!allowStale && this.#isStale(index))) {\n return;\n }\n const v = this.#valList[index];\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n }\n #backgroundFetch(k, index, options, context) {\n const v = index === undefined ? undefined : this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n return v;\n }\n const ac = new AC();\n const { signal } = options;\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n });\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n };\n const cb = (v, updateCache = false) => {\n const { aborted } = ac.signal;\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true;\n options.status.fetchError = ac.signal.reason;\n if (ignoreAbort)\n options.status.fetchAbortIgnored = true;\n }\n else {\n options.status.fetchResolved = true;\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason);\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p;\n if (this.#valList[index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index] = bf.__staleWhileFetching;\n }\n else {\n this.#delete(k, 'fetch');\n }\n }\n else {\n if (options.status)\n options.status.fetchUpdated = true;\n this.set(k, v, fetchOpts.options);\n }\n }\n return v;\n };\n const eb = (er) => {\n if (options.status) {\n options.status.fetchRejected = true;\n options.status.fetchError = er;\n }\n return fetchFail(er);\n };\n const fetchFail = (er) => {\n const { aborted } = ac.signal;\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n const noDelete = allowStale || options.noDeleteOnFetchRejection;\n const bf = p;\n if (this.#valList[index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined;\n if (del) {\n this.#delete(k, 'fetch');\n }\n else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index] = bf.__staleWhileFetching;\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true;\n }\n return bf.__staleWhileFetching;\n }\n else if (bf.__returned === bf) {\n throw er;\n }\n };\n const pcall = (res, rej) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej);\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort) {\n res(undefined);\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true);\n }\n }\n });\n };\n if (options.status)\n options.status.fetchDispatched = true;\n const p = new Promise(pcall).then(cb, eb);\n const bf = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n });\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined });\n index = this.#keyMap.get(k);\n }\n else {\n this.#valList[index] = bf;\n }\n return bf;\n }\n #isBackgroundFetch(p) {\n if (!this.#hasFetchMethod)\n return false;\n const b = p;\n return (!!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC);\n }\n async fetch(k, fetchOptions = {}) {\n const { \n // get options\n allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n // set options\n ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n if (!this.#hasFetchMethod) {\n if (status)\n status.fetch = 'get';\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n });\n }\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n };\n let index = this.#keyMap.get(k);\n if (index === undefined) {\n if (status)\n status.fetch = 'miss';\n const p = this.#backgroundFetch(k, index, options, context);\n return (p.__returned = p);\n }\n else {\n // in cache, maybe already fetching\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined;\n if (status) {\n status.fetch = 'inflight';\n if (stale)\n status.returnedStale = true;\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v);\n }\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index);\n if (!forceRefresh && !isStale) {\n if (status)\n status.fetch = 'hit';\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n if (status)\n this.#statusTTL(status, index);\n return v;\n }\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context);\n const hasStale = p.__staleWhileFetching !== undefined;\n const staleVal = hasStale && allowStale;\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh';\n if (staleVal && isStale)\n status.returnedStale = true;\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n }\n }\n async forceFetch(k, fetchOptions = {}) {\n const v = await this.fetch(k, fetchOptions);\n if (v === undefined)\n throw new Error('fetch() returned undefined');\n return v;\n }\n memo(k, memoOptions = {}) {\n const memoMethod = this.#memoMethod;\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor');\n }\n const { context, forceRefresh, ...options } = memoOptions;\n const v = this.get(k, options);\n if (!forceRefresh && v !== undefined)\n return v;\n const vv = memoMethod(k, v, {\n options,\n context,\n });\n this.set(k, vv, options);\n return vv;\n }\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k, getOptions = {}) {\n const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const value = this.#valList[index];\n const fetching = this.#isBackgroundFetch(value);\n if (status)\n this.#statusTTL(status, index);\n if (this.#isStale(index)) {\n if (status)\n status.get = 'stale';\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire');\n }\n if (status && allowStale)\n status.returnedStale = true;\n return allowStale ? value : undefined;\n }\n else {\n if (status &&\n allowStale &&\n value.__staleWhileFetching !== undefined) {\n status.returnedStale = true;\n }\n return allowStale ? value.__staleWhileFetching : undefined;\n }\n }\n else {\n if (status)\n status.get = 'hit';\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching;\n }\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n return value;\n }\n }\n else if (status) {\n status.get = 'miss';\n }\n }\n #connect(p, n) {\n this.#prev[n] = p;\n this.#next[p] = n;\n }\n #moveToTail(index) {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n this.#connect(this.#prev[index], this.#next[index]);\n }\n this.#connect(this.#tail, index);\n this.#tail = index;\n }\n }\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k) {\n return this.#delete(k, 'delete');\n }\n #delete(k, reason) {\n let deleted = false;\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n deleted = true;\n if (this.#size === 1) {\n this.#clear(reason);\n }\n else {\n this.#removeItemSize(index);\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n this.#keyMap.delete(k);\n this.#keyList[index] = undefined;\n this.#valList[index] = undefined;\n if (index === this.#tail) {\n this.#tail = this.#prev[index];\n }\n else if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n const pi = this.#prev[index];\n this.#next[pi] = this.#next[index];\n const ni = this.#next[index];\n this.#prev[ni] = this.#prev[index];\n }\n this.#size--;\n this.#free.push(index);\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return deleted;\n }\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete');\n }\n #clear(reason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else {\n const k = this.#keyList[index];\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n }\n this.#keyMap.clear();\n this.#valList.fill(undefined);\n this.#keyList.fill(undefined);\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0);\n this.#starts.fill(0);\n }\n if (this.#sizes) {\n this.#sizes.fill(0);\n }\n this.#head = 0;\n this.#tail = 0;\n this.#free.length = 0;\n this.#calculatedSize = 0;\n this.#size = 0;\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n}\n//# sourceMappingURL=index.js.map","import {LRUCache}from'lru-cache';var B=class extends Error{constructor(e,t,n){super(t),this.name=\"HwError\",this.code=e,n!==void 0&&(this.context=Object.freeze({...n})),Object.setPrototypeOf(this,new.target.prototype),typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,new.target);}},D=class extends B{constructor(e,t,n){super(e,t,n?.context),this.name=\"HelmParseError\",n?.span!==void 0&&(this.span={...n.span}),Object.setPrototypeOf(this,new.target.prototype);}},qe=class extends B{constructor(e,t){let n=Object.freeze([...e]),o=t??Oi(n);super(\"helm-validation-failed\",o),this.name=\"HelmValidationError\",this.diagnostics=n,Object.setPrototypeOf(this,new.target.prototype);}};function Oi(i){if(i.length===0)return \"HELM validation failed\";let t=i[0],n=i.length>1?` (+${i.length-1} more)`:\"\";return `HELM validation failed: ${t.code} \\u2014 ${t.message}${n}`}var K=class extends B{constructor(e,t,n){super(e,t??`HELM operation not supported: ${e}`,n),this.name=\"HelmNotSupportedError\",Object.setPrototypeOf(this,new.target.prototype);}},Yt=class extends B{constructor(e,t){super(\"monomer-not-found\",`Monomer not found in library: ${e}/${t}`,{polymerType:e,symbol:t}),this.name=\"MonomerNotFoundError\",this.polymerType=e,this.symbol=t,Object.setPrototypeOf(this,new.target.prototype);}};var Ae=class{constructor(e){if(!Number.isInteger(e.max)||e.max<=0)throw new RangeError(`LruCache: max must be a positive integer (got ${e.max})`);let t=e.onEvict;this._cache=t===void 0?new LRUCache({max:e.max}):new LRUCache({max:e.max,dispose:(n,o,r)=>{t(o,n);}});}get(e){return this._cache.get(e)}set(e,t){this._cache.set(e,t);}has(e){return this._cache.has(e)}delete(e){return this._cache.delete(e)}clear(){this._cache.clear();}get size(){return this._cache.size}keys(){return this._cache.keys()}entries(){return this._cache.entries()}};var Me=class{debug(e,t){}info(e,t){}warn(e,t){}error(e,t){}};function Xt(i){return i>=65&&i<=90||i>=97&&i<=122}function Ye(i){return i>=48&&i<=57}function Ni(i){return i===32||i===9||i===10||i===13}var Jt=class{constructor(e){this.src=e,this.len=e.length,this.pos=0,this.tokens=[];}tokenize(){for(;this.pos<this.len;){let e=this.pos,t=this.src.charCodeAt(this.pos);if(Ni(t))throw new D(\"unexpected-whitespace\",`Unexpected whitespace at offset ${e}`,{span:{start:e,end:e+1}});if(t===91){this.scanBracket(e);continue}if(t===34){this.scanQuote(e);continue}if(Xt(t)){this.scanIdentifier(e);continue}if(Ye(t)){this.scanNumber(e);continue}let n=Fi.get(t);if(n!==void 0){this.pos+=1,this.push(n,this.src.charAt(e),e,this.pos);continue}throw new D(\"unexpected-char\",`Unexpected character ${JSON.stringify(this.src.charAt(e))} at offset ${e}`,{span:{start:e,end:e+1}})}return this.push(\"eof\",\"\",this.len,this.len),{tokens:this.tokens,source:this.src}}scanBracket(e){let t=1,n=false,o=false,r=e+1;for(;r<this.len;){let s=this.src.charCodeAt(r);if(n){if(s===92&&r+1<this.len){r+=2;continue}if(s===34){n=false,r+=1;continue}if(s===10||s===13)throw new D(\"unexpected-newline\",`Newline inside bracket at offset ${r}`,{span:{start:r,end:r+1}});r+=1;continue}if(o){if(s===36&&r+1<this.len){let a=this.src.charCodeAt(r+1);if(a===124){o=false,r+=2;continue}if(a===93){o=false,r+=1;continue}}if(s===10||s===13)throw new D(\"unexpected-newline\",`Newline inside bracket at offset ${r}`,{span:{start:r,end:r+1}});r+=1;continue}if(s===10||s===13)throw new D(\"unexpected-newline\",`Newline inside bracket at offset ${r}`,{span:{start:r,end:r+1}});if(s===34){n=true,r+=1;continue}if(s===124&&r+1<this.len&&this.src.charCodeAt(r+1)===36){o=true,r+=2;continue}if(s===91){t+=1,r+=1;continue}if(s===93){if(t-=1,t===0){let a=r+1,l=this.src.slice(e+1,r);this.pos=a,this.push(\"inline-smiles\",l,e,a);return}r+=1;continue}r+=1;}throw new D(\"unterminated-bracket\",`Unterminated '[' starting at offset ${e}`,{span:{start:e,end:this.len}})}scanQuote(e){let t=[],n=e+1;for(;n<this.len;){let o=this.src.charCodeAt(n);if(o===34){let r=n+1;this.pos=r,this.push(\"quote-string\",t.join(\"\"),e,r);return}if(o===92&&n+1<this.len){let r=this.src.charCodeAt(n+1);r===34?t.push('\"'):r===92?t.push(\"\\\\\"):r===110?t.push(`\n`):r===114?t.push(\"\\r\"):r===116?t.push(\"\t\"):(t.push(\"\\\\\"),t.push(this.src.charAt(n+1))),n+=2;continue}if(o===10||o===13)throw new D(\"unexpected-newline\",`Newline inside quote at offset ${n}`,{span:{start:n,end:n+1}});t.push(this.src.charAt(n)),n+=1;}throw new D(\"unterminated-quote\",`Unterminated '\"' starting at offset ${e}`,{span:{start:e,end:this.len}})}scanIdentifier(e){let t=e+1;for(;t<this.len;){let o=this.src.charCodeAt(t);if(Xt(o)||Ye(o)||o===95){t+=1;continue}if(o===45&&t+1<this.len&&Xt(this.src.charCodeAt(t+1))){t+=2;continue}break}let n=this.src.slice(e,t);this.pos=t,this.push(\"identifier\",n,e,t);}scanNumber(e){let t=e+1;for(;t<this.len&&Ye(this.src.charCodeAt(t));)t+=1;if(t+1<this.len&&this.src.charCodeAt(t)===46&&Ye(this.src.charCodeAt(t+1))){for(t+=2;t<this.len&&Ye(this.src.charCodeAt(t));)t+=1;let o=this.src.slice(e,t);this.pos=t,this.push(\"decimal\",o,e,t);return}let n=this.src.slice(e,t);this.pos=t,this.push(\"integer\",n,e,t);}push(e,t,n,o){this.tokens.push({kind:e,value:t,span:{start:n,end:o}});}},Fi=new Map([[123,\"lbrace\"],[125,\"rbrace\"],[40,\"lparen\"],[41,\"rparen\"],[93,\"rbracket\"],[124,\"pipe\"],[46,\"dot\"],[44,\"comma\"],[43,\"plus\"],[58,\"colon\"],[45,\"dash\"],[36,\"dollar\"],[62,\"gt\"],[63,\"question\"],[42,\"asterisk\"],[95,\"underscore\"],[39,\"apos\"]]);function zn(i){let e=new Jt(i).tokenize();return Gi(e),e}function Gi(i){let e=null;for(let t of i.tokens)if(t.kind===\"apos\")e=e===null?t.span:null;else if(t.kind===\"eof\"&&e!==null)throw new D(\"unterminated-apostrophe\",`Unterminated apostrophe block starting at offset ${e.start}`,{span:{start:e.start,end:i.source.length}})}var Vi={perPolymer:new Map,version:\"\"};function ce(){return {atoms:[],bonds:[],chains:[],groups:[],annotations:Vi}}function Y(i,e){for(let t of i.atoms)if(t.id===e)return t}function yt(i,e){for(let t of i.bonds)if(t.id===e)return t}function re(i,e){if(e===void 0)return i.bio.positionInChain;let t=0;for(let n=0;n<e.backboneAtoms.length;n++){let o=e.backboneAtoms[n];if(o!==void 0&&(t+=1,o.id===i.id||o.branchAtom!==void 0&&(t+=1,o.branchAtom.id===i.id)))return t}return 0}var b={AA:\"HELM_AA\",SUGAR:\"HELM_SUGAR\",BASE:\"HELM_BASE\",LINKER:\"HELM_LINKER\",CHEM:\"HELM_CHEM\",BLOB:\"HELM_BLOB\",NUCLEOTIDE:\"HELM_NUCLEOTIDE\"},v={PEPTIDE:\"PEPTIDE\",RNA:\"RNA\",CHEM:\"CHEM\",BLOB:\"BLOB\",G:\"G\"},Ui={BACKBONE:\"Backbone\",BRANCH:\"Branch\",TERMINAL:\"Terminal\",UNDEFINED:\"Undefined\"};var ye=class{constructor(){this._counter=0;}next(){return this._counter+=1,this._counter}reset(){this._counter=0;}get current(){return this._counter}};function Te(i){let e=new Map,t=0;for(let n of i.chains)for(let o of n.backboneAtoms)t+=1,e.set(o.id,t),o.branchAtom!==void 0&&(t+=1,e.set(o.branchAtom.id,t));return e}function Se(i){let e=i.trim();if(/^\\[[a-zA-Z_][a-zA-Z0-9_]*\\]$/.test(e))return false;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n===40||n===91||n===61||n===47||n===92||n===42)return true}return false}function zi(i){let e=new Map,t=/\\[R(\\d{1,2})\\]/g,n;for(;(n=t.exec(i))!==null;){let o=parseInt(n[1],10);o>=1&&o<=10&&!e.has(o)&&e.set(o,n.index);}return e}function Ki(i){let e=new Map,n=/\\s*\\|\\$([^$]*)\\$\\|/.exec(i);if(n===null)return e;let o=n[1].split(\";\"),r=n.index+n[0].indexOf(\"$\")+1,s=0;for(let a of o){let l=/^_R(\\d{1,2})$/.exec(a);if(l!==null){let d=parseInt(l[1],10);d>=1&&d<=10&&!e.has(d)&&e.set(d,r+s);}s+=a.length+1;}return e}function Wi(i){let e=new Map,t=/\\[\\*:(\\d{1,2})\\]/g,n;for(;(n=t.exec(i))!==null;){let o=parseInt(n[1],10);o>=1&&o<=10&&!e.has(o)&&e.set(o,n.index);}return e}function Kn(i){let e=i.trim();if(e.length===0)return {ok:false,reason:\"empty-smiles\"};let t=zi(e);if(t.size>0)return {ok:true,canonicalSmiles:e,info:{rs:t.size,rgroupPositions:t,flavor:\"jsdraw\"}};let n=Ki(e);if(n.size>0)return {ok:true,canonicalSmiles:e,info:{rs:n.size,rgroupPositions:n,flavor:\"chemaxon\"}};let o=Wi(e);return o.size>0?{ok:true,canonicalSmiles:e,info:{rs:o.size,rgroupPositions:o,flavor:\"opensmiles\"}}:{ok:false,reason:\"no-rgroups-found\"}}var X=class{constructor(){this._listeners=new Set;this._completed=false;}subscribe(e){return this._completed?()=>{}:(this._listeners.add(e),()=>{this._listeners.delete(e);})}next(e){if(!this._completed)for(let t of [...this._listeners])t(e);}complete(){this._completed=true,this._listeners.clear();}get observerCount(){return this._listeners.size}};function C(i){return {line:\"#202020\",text:\"#000000\",background:i}}function ji(i){return {line:\"#e0e0e0\",text:\"#ffffff\",background:en(i,.25)}}function Ee(i){let e=/^#([0-9a-fA-F]{6})$/.exec(i),t=/^#([0-9a-fA-F]{3})$/.exec(i);if(e!==null){let n=e[1];return [parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]}if(t!==null){let n=t[1];return [parseInt(n[0]+n[0],16),parseInt(n[1]+n[1],16),parseInt(n[2]+n[2],16)]}return null}function Zt(i){return i.toString(16).padStart(2,\"0\")}function tn(i,e,t){return `#${Zt(i)}${Zt(e)}${Zt(t)}`}function nn(i,e,t){let n=i/255,o=e/255,r=t/255,s=Math.max(n,o,r),a=Math.min(n,o,r),l=(s+a)/2;if(s===a)return [0,0,l];let d=s-a,u=l>.5?d/(2-s-a):d/(s+a),c;return s===n?c=((o-r)/d+(o<r?6:0))*60:s===o?c=((r-n)/d+2)*60:c=((n-o)/d+4)*60,[c,u,l]}function Qt(i,e,t){let n=t;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?i+(e-i)*6*n:n<1/2?e:n<2/3?i+(e-i)*(2/3-n)*6:i}function jn(i,e,t){if(e===0){let s=Math.round(t*255);return [s,s,s]}let n=t<.5?t*(1+e):t+e-t*e,o=2*t-n,r=i/360;return [Math.round(Qt(o,n,r+1/3)*255),Math.round(Qt(o,n,r)*255),Math.round(Qt(o,n,r-1/3)*255)]}function vt(i,e=.3,t=.1){let n=Ee(i);if(n===null)return i;let[o,r,s]=nn(n[0],n[1],n[2]),a=Math.max(0,Math.min(1,r*(1-e))),l=Math.max(0,Math.min(.95,s+t*(1-s))),[d,u,c]=jn(o,a,l);return tn(d,u,c)}function Wn(i){let e=Ee(i);if(e===null)return 0;let t=n=>{let o=n/255;return o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4)};return .2126*t(e[0])+.7152*t(e[1])+.0722*t(e[2])}function qn(i,e){let t=Wn(i),n=Wn(e),o=Math.max(t,n),r=Math.min(t,n);return (o+.05)/(r+.05)}function Yn(i){let e=Ee(i);if(e===null)return {h:0,s:0,l:0};let[t,n,o]=nn(e[0],e[1],e[2]);return {h:t,s:n,l:o}}function qi(i){let e=(i.h%360+360)%360,t=Math.max(0,Math.min(1,i.s)),n=Math.max(0,Math.min(1,i.l)),[o,r,s]=jn(e,t,n);return tn(o,r,s)}function gt(i){let e=Ee(i);if(e===null)return \"#1f2937\";let[t,n,o]=nn(e[0],e[1],e[2]);if(o>.85||n<.15&&o>.7)return \"#1f2937\";let r=Math.max(.08,o-.3),s=Math.min(1,n+.1);return qi({h:t,s,l:r})}function Yi(i){let e=Ee(i);return e===null?null:{r:e[0]/255,g:e[1]/255,b:e[2]/255}}function _t(i){let e=Yi(i);if(e===null)return \"#1f2937\";let t=s=>s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),n=.2126*t(e.r)+.7152*t(e.g)+.0722*t(e.b),o=(n+.05)/(0+.05);return (1+.05)/(n+.05)>o?\"#ffffff\":\"#1f2937\"}function en(i,e){let t=Ee(i);if(t===null)return i;let n=1-e,o=Math.max(0,Math.min(255,Math.round(t[0]*n))),r=Math.max(0,Math.min(255,Math.round(t[1]*n))),s=Math.max(0,Math.min(255,Math.round(t[2]*n)));return tn(o,r,s)}var Xn={A:C(\"#A0A0FF\"),G:C(\"#FF7070\"),T:C(\"#A0FFA0\"),C:C(\"#FF8C4B\"),U:C(\"#FF8080\")},Jn={R:C(\"#7a85c1\"),r:C(\"#7a85c1\")},Zn={P:C(\"#9aa5e1\"),p:C(\"#9aa5e1\")},Qn={A:C(\"#C8C8C8\"),R:C(\"#145AFF\"),N:C(\"#00DCDC\"),D:C(\"#E60A0A\"),C:C(\"#E6E600\"),E:C(\"#00DCDC\"),Q:C(\"#E60A0A\"),G:C(\"#EBEBEB\"),H:C(\"#8282D2\"),I:C(\"#0F820F\"),L:C(\"#0F820F\"),K:C(\"#145AFF\"),M:C(\"#E6E600\"),F:C(\"#3232AA\"),P:C(\"#DC9682\"),S:C(\"#FA9600\"),T:C(\"#FA9600\"),W:C(\"#B45AB4\"),Y:C(\"#3232AA\"),V:C(\"#0F820F\")},eo={R:C(\"#eeeeee\")},to={B:C(\"#999999\"),G:C(\"#e2e2e2\")},no={P:C(\"#9aa5e1\")},_e={name:\"light\",fallback:{line:\"#202020\",text:\"#000000\",background:\"#eeeeee\"},errorTriple:{line:\"#cc0000\",text:\"#000000\",background:\"#FFFF00\"},palette:{[b.BASE]:Xn,[b.SUGAR]:Jn,[b.LINKER]:Zn,[b.AA]:Qn,[b.CHEM]:eo,[b.BLOB]:to,[b.NUCLEOTIDE]:no}};function ge(i){let e={};for(let[t,n]of Object.entries(i))e[t]=ji(n.background);return e}var Ce={name:\"dark\",fallback:{line:\"#e0e0e0\",text:\"#ffffff\",background:en(\"#eeeeee\",.5)},errorTriple:{line:\"#ff5050\",text:\"#ffffff\",background:en(\"#FFFF00\",.4)},palette:{[b.BASE]:ge(Xn),[b.SUGAR]:ge(Jn),[b.LINKER]:ge(Zn),[b.AA]:ge(Qn),[b.CHEM]:ge(eo),[b.BLOB]:ge(to),[b.NUCLEOTIDE]:ge(no)}};function P(i,e,t=_e){if(i===null)return {...t.errorTriple};let n=i.meta?.colors;if(n!==void 0){let r=t.name===\"light\"?n.light:t.name===\"dark\"?n.dark:void 0;if(r!==void 0)return {...r,line:gt(r.background)};if(n.default!==void 0)return {...n.default,line:gt(n.default.background)}}let o=i.naturalAnalog;if(o!==void 0&&o!==\"\"){let r=t.palette[e];if(r!==void 0){let s=r[o];if(s!==void 0)return {...s,line:gt(s.background),text:_t(s.background)}}}return {...t.fallback,line:gt(t.fallback.background),text:_t(t.fallback.background)}}function Xe(i){for(let e in i)if(Object.prototype.hasOwnProperty.call(i,e)&&e.toLowerCase()===\"capgroupsmiles\"){let t=i[e];if(typeof t==\"string\")return t}}function oo(i){let e=false,t=i.rgroups.map(n=>{let o=Xe(n);return o!==void 0&&n.capGroupSMILES!==o?(e=true,{...n,capGroupSMILES:o}):n});return e?{...i,rgroups:t}:i}var Xi=new Set([\"PEPTIDE\",\"RNA\",\"CHEM\",\"BLOB\"]),Ji=new Set([\"Backbone\",\"Branch\",\"Terminal\",\"Undefined\"]),Zi=/^R[1-9][0-9]*$/;function wt(i){let e=[];if(!Array.isArray(i))return {ok:false,errors:[{path:\"$\",message:`Expected a JSON array of monomers, got ${O(i)}`}]};for(let t=0;t<i.length;t++)Qi(i[t],`$.${t}`,e);return e.length>0?{ok:false,errors:e}:{ok:true,data:i}}function Qi(i,e,t){if(!Ze(i)){t.push({path:e,message:`Expected an object, got ${O(i)}`});return}on(i,\"symbol\",e,t,{minLength:1}),on(i,\"molfile\",e,t);let n=i.polymerType;n===void 0?t.push({path:`${e}.polymerType`,message:\"Required property missing\"}):typeof n!=\"string\"?t.push({path:`${e}.polymerType`,message:`Expected string, got ${O(n)}`}):Xi.has(n)||t.push({path:`${e}.polymerType`,message:`Expected one of PEPTIDE|RNA|CHEM|BLOB, got '${n}'`});let o=i.monomerType;o===void 0?t.push({path:`${e}.monomerType`,message:\"Required property missing\"}):typeof o!=\"string\"?t.push({path:`${e}.monomerType`,message:`Expected string, got ${O(o)}`}):Ji.has(o)||t.push({path:`${e}.monomerType`,message:`Expected one of Backbone|Branch|Terminal|Undefined, got '${o}'`});let r=i.rgroups;if(r===void 0)t.push({path:`${e}.rgroups`,message:\"Required property missing\"});else if(!Array.isArray(r))t.push({path:`${e}.rgroups`,message:`Expected array, got ${O(r)}`});else {let s=new Set;for(let a=0;a<r.length;a++)er(r[a],`${e}.rgroups[${a}]`,t,s);}if(Je(i,\"name\",e,t),Je(i,\"smiles\",e,t),Je(i,\"naturalAnalog\",e,t),Je(i,\"author\",e,t),\"createDate\"in i&&i.createDate!==void 0&&i.createDate!==null&&typeof i.createDate!=\"string\"&&t.push({path:`${e}.createDate`,message:`Expected string or null, got ${O(i.createDate)}`}),\"id\"in i&&i.id!==void 0){let s=i.id;typeof s==\"string\"||typeof s==\"number\"&&Number.isInteger(s)||t.push({path:`${e}.id`,message:`Expected integer or string, got ${O(s)}`});}if(\"meta\"in i&&i.meta!==void 0){let s=i.meta;Ze(s)?s.colors!==void 0&&tr(s.colors,`${e}.meta.colors`,t):t.push({path:`${e}.meta`,message:`Expected object, got ${O(s)}`});}}function er(i,e,t,n){if(!Ze(i)){t.push({path:e,message:`Expected an object, got ${O(i)}`});return}let o=i.label;if(o===void 0?t.push({path:`${e}.label`,message:\"Required property missing\"}):typeof o!=\"string\"?t.push({path:`${e}.label`,message:`Expected string, got ${O(o)}`}):Zi.test(o)?n.has(o)?t.push({path:`${e}.label`,message:`Duplicate R-group label '${o}'`}):n.add(o):t.push({path:`${e}.label`,message:`Expected pattern /^R[1-9][0-9]*$/, got '${o}'`}),on(i,\"capGroupName\",e,t),Xe(i)===void 0){let r=Object.keys(i).some(s=>s.toLowerCase()===\"capgroupsmiles\");t.push({path:`${e}.capGroupSMILES`,message:r?\"Expected string\":\"Required property missing\"});}Je(i,\"alternateId\",e,t),\"id\"in i&&i.id!==void 0&&(typeof i.id!=\"number\"||!Number.isInteger(i.id))&&t.push({path:`${e}.id`,message:`Expected integer, got ${O(i.id)}`});}function tr(i,e,t){if(!Ze(i)){t.push({path:e,message:`Expected object, got ${O(i)}`});return}for(let n of [\"default\",\"light\",\"dark\"])i[n]!==void 0&&nr(i[n],`${e}.${n}`,t);}function nr(i,e,t){if(!Ze(i)){t.push({path:e,message:`Expected object, got ${O(i)}`});return}for(let n of [\"line\",\"text\",\"background\"])i[n]===void 0?t.push({path:`${e}.${n}`,message:\"Required property missing\"}):typeof i[n]!=\"string\"&&t.push({path:`${e}.${n}`,message:`Expected string, got ${O(i[n])}`});}function on(i,e,t,n,o){let r=i[e],s=`${t}.${e}`;if(r===void 0){n.push({path:s,message:\"Required property missing\"});return}if(typeof r!=\"string\"){n.push({path:s,message:`Expected string, got ${O(r)}`});return}o?.minLength!==void 0&&r.length<o.minLength&&n.push({path:s,message:`Expected string of length >= ${o.minLength}, got ${r.length}`});}function Je(i,e,t,n){let o=i[e];o!==void 0&&typeof o!=\"string\"&&n.push({path:`${t}.${e}`,message:`Expected string, got ${O(o)}`});}function Ze(i){return typeof i==\"object\"&&i!==null&&!Array.isArray(i)}function O(i){return i===null?\"null\":Array.isArray(i)?\"array\":typeof i}var or=/^R([1-9][0-9]*)$/;function Z(i){switch(i.polymerType){case v.PEPTIDE:return b.AA;case v.CHEM:return b.CHEM;case v.BLOB:return b.BLOB;case v.RNA:{if(i.monomerType===\"Branch\")return b.BASE;if(i.monomerType===\"Backbone\"){let e=i.naturalAnalog;return e===\"P\"||e===\"p\"?b.LINKER:b.SUGAR}return null}default:return null}}function ir(i){let e=new Map;for(let t of i.rgroups){let n=or.exec(t.label);n!==null&&e.set(parseInt(n[1],10),t);}return Object.assign({},i,{rs:i.rgroups.length,rgroupMap:e})}var rn=class i{constructor(e){this._version=0;this._byPolymerSymbol=new Map;this._byBiotypeSymbol=new Map;this._byNaturalAnalog=new Map;this._resolved=new WeakMap;this._inlineSmilesCounter=0;this.source=e,this.onChanged=new X;}static empty(e=\"empty\"){return new i(e)}static fromJSON(e,t=\"inline\",n){let o=new i(t);for(let r=0;r<e.length;r++){let s=e[r],a=wt([s]);if(!a.ok){n!==void 0?n.skipped.push({index:r,errors:a.errors}):console.warn(`MonomerLib.fromJSON: skipping invalid entry at index ${r}`,a.errors);continue}o._addNoFire(s);}return o}static fromText(e,t=\"inline\"){let n;try{n=JSON.parse(e);}catch(r){let s=r instanceof Error?r.message:String(r);throw new B(\"invalid-monomer-lib\",`MonomerLib.fromText: JSON.parse failed \\u2014 ${s}`)}let o=wt(n);if(!o.ok)throw new B(\"invalid-monomer-lib\",`MonomerLib.fromText: schema validation failed (${o.errors.length} errors)`,{errors:o.errors});return i.fromJSON(o.data,t)}static async fromUrl(e,t){let n=t??globalThis.fetch;if(n===void 0)throw new B(\"fetch-unavailable\",\"MonomerLib.fromUrl: no fetch implementation available \\u2014 pass `fetchImpl` or run in a fetch-capable environment.\",{url:e});let o=await n(e);if(!o.ok)throw new B(\"monomer-lib-fetch-failed\",`MonomerLib.fromUrl: HTTP ${o.status} fetching ${e}`,{url:e,status:o.status});let r=await o.text();return i.fromText(r,e)}static merge(...e){let t=e.map(o=>o.source).join(\"+\")||\"empty\",n=new i(t);for(let o of e)for(let r of o.getPolymerTypes())for(let s of o.getMonomerSymbolsByType(r)){let a=o.getMonomer(r,s);a!==null&&n._addNoFire(a);}return n}get isEmpty(){for(let e of this._byPolymerSymbol.values())if(e.size>0)return false;return true}get version(){return this._version}getMonomer(e,t){let n=this._byPolymerSymbol.get(e);return n===void 0?null:n.get(t)??null}getMonomerSet(e){let t=this._byBiotypeSymbol.get(e);return t===void 0?new Map:new Map(t)}getMonomerSymbolsByType(e){let t=this._byPolymerSymbol.get(e);return t===void 0?[]:Array.from(t.keys())}getByNaturalAnalog(e,t){let n=this._byNaturalAnalog.get(e);if(n===void 0)return [];let o=n.get(t);return o===void 0?[]:o.slice()}getPolymerTypes(){let e=[];for(let[t,n]of this._byPolymerSymbol.entries())n.size>0&&e.push(t);return e}getColors(e,t){let n=rr(t),o=e===null?b.AA:Z(e)??b.AA;return P(e,o,n)}getResolved(e){return this._resolved.get(e)}addMonomer(e){let t=wt([e]);if(!t.ok)throw new B(\"invalid-monomer\",\"MonomerLib.addMonomer: schema validation failed\",{errors:t.errors});let n=this._addNoFire(e);this._bumpVersion(),this.onChanged.next({type:n?\"update\":\"add\",affectedSymbols:[e.symbol]});}addMonomers(e){let t=[],n=false;for(let o of e)this._addNoFire(o)&&(n=true),t.push(o.symbol);t.length!==0&&(this._bumpVersion(),this.onChanged.next({type:n?\"update\":\"add\",affectedSymbols:t}));}removeMonomer(e,t){let n=this._byPolymerSymbol.get(e);if(n===void 0)return false;let o=n.get(t);if(o===void 0)return false;n.delete(t);let r=Z(o);if(r!==null){let a=this._byBiotypeSymbol.get(r);a!==void 0&&a.delete(t);}let s=o.naturalAnalog;if(s!==void 0&&s!==\"\"){let l=this._byNaturalAnalog.get(e)?.get(s);if(l!==void 0){let d=l.indexOf(o);d>=0&&l.splice(d,1);}}return this._bumpVersion(),this.onChanged.next({type:\"remove\",affectedSymbols:[t]}),true}setMonomerColors(e,t,n){let o=this.getMonomer(e,t);if(o===null)throw new B(\"monomer-not-found\",`MonomerLib.setMonomerColors: ${e}/${t} not found`,{polymerType:e,symbol:t});let r=o.meta??{},s=r.colors??{},a=Object.assign({},r,{colors:Object.assign({},s,n)}),l=Object.assign({},o,{meta:a});this._addNoFire(l),this._bumpVersion(),this.onChanged.next({type:\"update\",affectedSymbols:[t]});}merge(e){for(let t of e.getPolymerTypes())for(let n of e.getMonomerSymbolsByType(t)){let o=e.getMonomer(t,n);o!==null&&this._addNoFire(o);}this._bumpVersion(),this.onChanged.next({type:\"reload\"});}registerInlineSmilesMonomer(e,t,n){let o=Kn(t);if(!o.ok)throw new B(\"inline-smiles-without-r-groups\",`MonomerLib.registerInlineSmilesMonomer: ${o.reason}`,{smiles:t});this._inlineSmilesCounter+=1;let r=`#${this._inlineSmilesCounter}`,s=[],a=Array.from(o.info.rgroupPositions.keys()).sort((u,c)=>u-c);for(let u of a)s.push({label:`R${u}`,capGroupName:\"H\",capGroupSMILES:\"\"});let l=n?.symbolHint!==void 0?{smilesHint:n.symbolHint}:void 0,d={symbol:r,polymerType:e,monomerType:\"Undefined\",molfile:\"\",smiles:o.canonicalSmiles,rgroups:s,...l!==void 0?{meta:l}:{}};return this._addNoFire(d),this._bumpVersion(),this.onChanged.next({type:\"add\",affectedSymbols:[r]}),d}toJSON(){let e=[];for(let t of this._byPolymerSymbol.values())for(let n of t.values())e.push(n);return e}_addNoFire(e){e=oo(e);let t=e.polymerType,n=this._byPolymerSymbol.get(t);n===void 0&&(n=new Map,this._byPolymerSymbol.set(t,n));let o=n.get(e.symbol);if(n.set(e.symbol,e),o!==void 0){let a=Z(o);if(a!==null){let d=this._byBiotypeSymbol.get(a);d!==void 0&&d.delete(o.symbol);}let l=o.naturalAnalog;if(l!==void 0&&l!==\"\"){let d=this._byNaturalAnalog.get(t)?.get(l);if(d!==void 0){let u=d.indexOf(o);u>=0&&d.splice(u,1);}}this._resolved.delete(o);}let r=Z(e);if(r!==null){let a=this._byBiotypeSymbol.get(r);a===void 0&&(a=new Map,this._byBiotypeSymbol.set(r,a)),a.set(e.symbol,e);}let s=e.naturalAnalog;if(s!==void 0&&s!==\"\"){let a=this._byNaturalAnalog.get(t);a===void 0&&(a=new Map,this._byNaturalAnalog.set(t,a));let l=a.get(s);l===void 0&&(l=[],a.set(s,l)),l.push(e);}return this._resolved.set(e,ir(e)),o!==void 0}_bumpVersion(){this._version+=1;}};function rr(i){return i===\"dark\"?Ce:_e}function ve(i,e,t){return new sn(i,e,t??{}).run()}var sr=new Set([\"?\",\"*\",\"_\",\"X\",\"N\"]),ar=/^R([1-9][0-9]*)$/;function lr(i){return typeof i.registerInlineSmilesMonomer==\"function\"}var sn=class{constructor(e,t,n){this.diagnostics=[];this.oldToNew=new Map;this.placeholderCache=new Map;this.mol=e,this.lib=t,this.options=n;}run(){let e=new Map;for(let a of this.mol.chains)e.set(a.id,a.polymerType);for(let a of this.mol.atoms){let l=e.get(a.bio.chainId)??null,d=this.resolveAtom(a,l);this.oldToNew.set(a.id,d);}for(let a of this.mol.atoms){let l=this.oldToNew.get(a.id);if(l===void 0||a.branchAtom===void 0)continue;let d=this.oldToNew.get(a.branchAtom.id);d!==void 0&&(l.branchAtom=d);}let t=[];for(let a of this.mol.bonds){let l=this.oldToNew.get(a.a1.id),d=this.oldToNew.get(a.a2.id);l===void 0||d===void 0||t.push({...a,a1:l,a2:d});}let n=new Map;for(let a of t)n.set(a.id,a);let o=[];for(let a of this.mol.chains){let l=[];for(let u of a.backboneAtoms){let c=this.oldToNew.get(u.id);c!==void 0&&l.push(c);}let d=[];for(let u of a.bonds){let c=n.get(u.id);c!==void 0&&d.push(c);}o.push({id:a.id,polymerType:a.polymerType,backboneAtoms:l,bonds:d,...a.annotation!==void 0?{annotation:a.annotation}:{},...a.strandType!==void 0?{strandType:a.strandType}:{}});}return {mol:{atoms:this.mol.atoms.map(a=>this.oldToNew.get(a.id)),bonds:t,chains:o,groups:this.mol.groups,annotations:this.mol.annotations},diagnostics:this.diagnostics}}resolveAtom(e,t){let n=null,o=e.biotype;if(t!==null){let r=this.lib.getMonomer(t,e.symbol);if(r!==null)n=this.toResolved(r),o=Z(r)??e.biotype;else if(this.isAmbiguitySymbol(e))n=this.synthesizeAmbiguity(t,e),this.emit(\"info\",\"ambiguous-monomer\",`Ambiguous monomer '${e.symbol}' on chain '${e.bio.chainId}'`,e);else if(Se(e.symbol))n=this.registerInlineSmilesFallback(t,e);else if(this.options.legacyCaseFallback===true&&t===\"RNA\"){let s=this.findCaseInsensitiveMatch(t,e.symbol);s!==null&&(n=this.toResolved(s),o=Z(s)??e.biotype,this.emit(\"info\",\"case-mismatch\",`Symbol '${e.symbol}' matched library entry '${s.symbol}' only after case fold`,e));}n===null&&(n=this.synthesizeMissing(t,e),this.emit(\"warning\",\"unresolved-monomer\",`Monomer '${e.symbol}' not found in library for ${t}`,e));}return {...e,monomer:n,biotype:o}}toResolved(e){let t=this.lib.getResolved?.(e);if(t!==void 0)return t;let n=new Map;for(let o of e.rgroups){let r=ar.exec(o.label);r!==null&&n.set(parseInt(r[1],10),o);}return Object.assign({},e,{rs:e.rgroups.length,rgroupMap:n})}isAmbiguitySymbol(e){return !!(sr.has(e.symbol)||e.bio.ambiguity!==void 0)}synthesizeAmbiguity(e,t){let n=`ambig:${e}:${t.symbol}`,o=this.placeholderCache.get(n);return o===void 0&&(o={symbol:t.symbol,polymerType:e,monomerType:\"Undefined\",molfile:\"\",rgroups:[{label:\"R1\",capGroupName:\"H\",capGroupSMILES:\"\"},{label:\"R2\",capGroupName:\"H\",capGroupSMILES:\"\"}],meta:{ambiguous:true}},this.placeholderCache.set(n,o)),this.toResolved(o)}synthesizeMissing(e,t){let n=`missing:${e}:${t.symbol}`,o=this.placeholderCache.get(n);return o===void 0&&(o={symbol:t.symbol,polymerType:e,monomerType:\"Undefined\",molfile:\"\",rgroups:[{label:\"R1\",capGroupName:\"H\",capGroupSMILES:\"\"},{label:\"R2\",capGroupName:\"H\",capGroupSMILES:\"\"}],meta:{missing:true}},this.placeholderCache.set(n,o)),this.toResolved(o)}registerInlineSmilesFallback(e,t){if(lr(this.lib))try{let n=this.lib.registerInlineSmilesMonomer(e,t.symbol);return this.toResolved(n)}catch{this.emit(\"warning\",\"inline-smiles-without-r-groups\",`Inline SMILES '${dr(t.symbol,40)}' has no detectable R-groups`,t);}else this.emit(\"warning\",\"inline-smiles-without-r-groups\",\"Inline SMILES seen but lib has no registerInlineSmilesMonomer\",t);return this.synthesizeMissing(e,t)}findCaseInsensitiveMatch(e,t){let n=t.toLowerCase();for(let o of this.lib.getMonomerSymbolsByType(e))if(o.toLowerCase()===n&&o!==t){let r=this.lib.getMonomer(e,o);if(r!==null)return r}return null}emit(e,t,n,o){let r={chainId:o.bio.chainId,atomId:o.id,symbol:o.symbol};this.diagnostics.push({severity:e,code:t,message:n,context:r});}};function dr(i,e){return i.length<=e?i:i.slice(0,e-1)+\"\\u2026\"}function Qe(i,e,t){let n=t?.mode??\"lenient\",o;try{o=zn(i);}catch(r){if(r instanceof D){if(n===\"strict\")throw r;let s={severity:\"error\",code:r.code,message:r.message,...r.span!==void 0?{span:{start:r.span.start,end:r.span.end}}:{}};return {mol:ce(),diagnostics:[s]}}throw r}return ro(o,e,t)}function ro(i,e,t){let o=new ln(i,e,t?.mode??\"lenient\").parseDocument();if(e===null||t?.resolveMonomers===false)return o;let r=ve(o.mol,e,{mode:t?.mode??\"lenient\",...t?.legacyCaseFallback===true?{legacyCaseFallback:true}:{}});return {mol:r.mol,diagnostics:[...o.diagnostics,...r.diagnostics]}}var an=class{constructor(e){this.tokens=e.tokens,this.len=e.tokens.length,this.eof=e.tokens[e.tokens.length-1],this.idx=0;}peek(e=0){let t=this.idx+e;return t>=this.len?this.eof:this.tokens[t]}advance(){let e=this.idx<this.len?this.tokens[this.idx]:this.eof;return e.kind!==\"eof\"&&(this.idx+=1),e}optional(e){let t=this.idx<this.len?this.tokens[this.idx]:this.eof;return t.kind===e?(t.kind!==\"eof\"&&(this.idx+=1),t):null}at(e){return (this.idx<this.len?this.tokens[this.idx]:this.eof).kind===e}at2(e,t){let o=(this.idx<this.len?this.tokens[this.idx]:this.eof).kind;return o===e||o===t}at3(e,t,n){let r=(this.idx<this.len?this.tokens[this.idx]:this.eof).kind;return r===e||r===t||r===n}currentSpan(){return (this.idx<this.len?this.tokens[this.idx]:this.eof).span}position(){return this.idx}setPosition(e){this.idx=e;}isAtEnd(){return (this.idx<this.len?this.tokens[this.idx]:this.eof).kind===\"eof\"}},cr=/^(PEPTIDE|RNA|DNA|CHEM|BLOB|G)([0-9]+)$/;function io(i){let e=cr.exec(i);if(e===null)return null;let t=e[1],n=parseInt(e[2],10);switch(t){case \"PEPTIDE\":return {rawTypeName:\"PEPTIDE\",polymerType:v.PEPTIDE,number:n,isDnaShim:false,isGroup:false};case \"RNA\":return {rawTypeName:\"RNA\",polymerType:v.RNA,number:n,isDnaShim:false,isGroup:false};case \"DNA\":return {rawTypeName:\"DNA\",polymerType:v.RNA,number:n,isDnaShim:true,isGroup:false};case \"CHEM\":return {rawTypeName:\"CHEM\",polymerType:v.CHEM,number:n,isDnaShim:false,isGroup:false};case \"BLOB\":return {rawTypeName:\"BLOB\",polymerType:v.BLOB,number:n,isDnaShim:false,isGroup:false};case \"G\":return {rawTypeName:\"G\",polymerType:v.PEPTIDE,number:n,isDnaShim:false,isGroup:true};default:return null}}var ln=class{constructor(e,t,n){this.diagnostics=[];this.chains=[];this.chainById=new Map;this.pendingBonds=[];this.groups=[];this.atomIds=new ye;this.bondIds=new ye;this.cursor=new an(e),this.source=e.source,this.lib=t,this.mode=n,this.annotations={perPolymer:new Map,version:\"\"};}parseDocument(){if(this.cursor.isAtEnd())return this.emit(\"warning\",\"empty-helm\",\"Empty HELM string\"),{mol:ce(),diagnostics:this.diagnostics};if(this.parseSimplePolymers(),this.expectDollarSeparator(1),this.parseConnections(),this.expectDollarSeparator(2),this.parseGroupsSection(),this.expectDollarSeparator(3),this.parseAnnotationsSection(),this.cursor.at(\"dollar\")&&(this.cursor.advance(),this.parseVersionTrailer()),!this.cursor.isAtEnd())for(this.emit(\"warning\",\"extra-section-separator\",\"Unexpected trailing tokens after HELM document\",this.cursor.currentSpan());!this.cursor.isAtEnd();)this.cursor.advance();return {mol:this.finalize(),diagnostics:this.diagnostics}}expectDollarSeparator(e){if(this.cursor.at(\"dollar\")){this.cursor.advance();return}this.emit(\"error\",\"missing-section-separator\",`Expected '$' separator before section ${e+1}`,this.cursor.currentSpan());}parseSimplePolymers(){if(!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()))for(this.parsePolymer();this.cursor.at(\"pipe\");){if(this.cursor.advance(),this.cursor.at(\"dollar\")||this.cursor.isAtEnd()){this.emit(\"warning\",\"empty-polymer-body\",\"Empty polymer after '|'\",this.cursor.currentSpan());return}this.parsePolymer();}}parsePolymer(){let e=this.cursor.currentSpan(),t=this.cursor.optional(\"identifier\");if(t===null){this.emit(\"error\",\"unexpected-token\",`Expected polymer id, got '${this.cursor.peek().value}'`,this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let n=io(t.value);if(n===null){this.emit(\"error\",\"unknown-polymer-type\",`Unknown polymer type '${t.value}'`,t.span),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.chainById.has(t.value)&&this.emit(\"warning\",\"duplicate-polymer-id\",`Duplicate polymer id '${t.value}'`,t.span),this.cursor.optional(\"lbrace\")===null){this.emit(\"error\",\"unexpected-token\",`Expected '{' after polymer id '${t.value}'`,this.cursor.currentSpan());return}let o={id:t.value,polymerType:n.polymerType,rawTypeName:n.rawTypeName,rawNumber:n.number,backboneAtoms:[],allAtoms:[],bonds:[],span:{start:e.start,end:e.end}};if(this.chains.push(o),this.chainById.set(o.id,o),this.cursor.at(\"rbrace\"))this.emit(\"warning\",\"empty-polymer-body\",`Empty body for polymer '${o.id}'`,this.cursor.currentSpan());else if(n.isGroup)this.parseGroupBody(o);else switch(n.polymerType){case v.PEPTIDE:this.parsePeptideBody(o);break;case v.RNA:this.parseRnaBody(o,n.isDnaShim),n.isDnaShim&&this.emit(\"info\",\"dna-emitted-as-rna\",`DNA polymer '${o.id}' will be emitted as RNA on canonicalize`,t.span);break;case v.CHEM:this.parseChemBody(o);break;case v.BLOB:this.parseBlobBody(o);break;}if(this.cursor.optional(\"rbrace\")===null){this.emit(\"error\",\"unterminated-brace\",`Expected '}' to close polymer '${o.id}'`,this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let r=this.cursor.optional(\"quote-string\");r!==null&&(o.annotation=r.value);}parsePeptideBody(e){for(this.parsePeptideItem(e);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rbrace\")||this.cursor.at(\"gt\")));)this.parsePeptideItem(e);if(this.cursor.at(\"gt\")){let t=this.cursor.currentSpan();this.cursor.advance(),this.emit(\"warning\",\"peptide-cyclic-without-closure\",`Peptide '${e.id}' marked cyclic with '>' \\u2014 no explicit closure connection emitted`,t);}}parsePeptideItem(e){if(this.cursor.at(\"lparen\"))this.parsePeptideAlternation(e);else {let t=this.parsePeptideAtom(e);this.maybeRepeatBracket(e,[t]);}this.maybeAttachAnnotation(e);}parsePeptideAtom(e){let t=this.consumeMonomerSymbol(false),{symbol:n,annotation:o,ambiguity:r,ambiguityKind:s,isInlineSmiles:a,rawPayload:l,inlineSource:d,span:u}=t,c=this.makeAtom(e,b.AA,n);o!==void 0&&(c.tag=o),r!==void 0&&(c.bio.ambiguity=r),s!==void 0&&(c.bio.ambiguityKind=s),d!==void 0&&(c.inlineSource=d),a&&this.registerInlineSmiles(l,u,v.PEPTIDE),this.addToChain(e,c,true);let m=e.backboneAtoms[e.backboneAtoms.length-2];return m!==void 0&&this.addBond(e,m,c,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),c}parsePeptideAlternation(e){let t=this.cursor.currentSpan();if(this.cursor.advance(),this.peptideContentIsSubsequence()){let d=e.backboneAtoms.length;for(this.parsePeptideItem(e);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rparen\")||this.cursor.isAtEnd()));)this.parsePeptideItem(e);this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' to close repeat sub-sequence\",this.cursor.currentSpan());let u=e.backboneAtoms.slice(d);this.maybeRepeatBracket(e,u),this.maybeAttachAnnotation(e);return}let n=[],o=null;for(;!this.cursor.at(\"rparen\")&&!this.cursor.isAtEnd();){let d=this.parseAlternationCandidate(v.PEPTIDE);if(n.push(d),this.cursor.at(\"comma\"))o===\"and\"&&this.emit(\"warning\",\"mixed-separator-in-alternation\",\"Mixed ',' and '+' separators in alternation\",this.cursor.currentSpan()),o=\"or\",this.cursor.advance();else if(this.cursor.at(\"plus\"))o===\"or\"&&this.emit(\"warning\",\"mixed-separator-in-alternation\",\"Mixed ',' and '+' separators in alternation\",this.cursor.currentSpan()),o=\"and\",this.cursor.advance();else break}this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' to close alternation\",this.cursor.currentSpan());let r=o===\"and\"?\"+\":\",\",s=`(${n.map(d=>d.symbol+(d.ratio!==void 0?`:${String(d.ratio)}`:\"\")).join(r)})`,a=this.makeAtom(e,b.AA,\"?\");a.bio.ambiguity=s,a.bio.ambiguityKind=o===\"and\"?\"and\":\"or\",this.addToChain(e,a,true);let l=e.backboneAtoms[e.backboneAtoms.length-2];if(l!==void 0&&this.addBond(e,l,a,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),o===\"and\")for(let d of n)typeof d.ratio==\"number\"&&d.ratio<0&&this.emit(\"error\",\"ratio-and-negative\",`Negative ratio ${d.ratio} in AND mixture`,t);this.maybeRepeatBracket(e,[a]),this.maybeAttachAnnotation(e);}peptideContentIsSubsequence(){let e=1,t=0;for(;;){let n=this.cursor.peek(t);if(n.kind===\"eof\")return false;if(n.kind===\"lparen\"){e+=1,t+=1;continue}if(n.kind===\"rparen\"){if(e-=1,e===0)return true;t+=1;continue}if(e===1){if(n.kind===\"dot\")return true;if(n.kind===\"comma\"||n.kind===\"plus\"||n.kind===\"colon\")return false}if(t+=1,t>1024)return false}}parseAlternationCandidate(e){let{symbol:t,isInlineSmiles:n,rawPayload:o,span:r}=this.consumeMonomerSymbol(true);n&&this.registerInlineSmiles(o,r,e);let s;if(this.cursor.optional(\"colon\")!==null){let a=this.cursor.peek();a.kind===\"integer\"||a.kind===\"decimal\"?(this.cursor.advance(),s=parseFloat(a.value)):a.kind===\"question\"?(this.cursor.advance(),s=\"?\"):this.emit(\"error\",\"unexpected-token\",\"Expected ratio after ':' in alternation\",a.span);}return s===void 0?{symbol:t}:{symbol:t,ratio:s}}parseRnaBody(e,t){for(this.parseRnaItem(e,t);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rbrace\")||this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseRnaItem(e,t);}parseRnaItem(e,t){if(this.cursor.at(\"lparen\")){this.parseRnaAlternation(e,t);return}if(this.cursor.at(\"asterisk\")){this.cursor.currentSpan();this.cursor.advance();let d=this.makeAtom(e,b.NUCLEOTIDE,\"*\");this.addToChain(e,d,true);let u=e.backboneAtoms[e.backboneAtoms.length-2];u!==void 0&&this.addBond(e,u,d,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),this.maybeRepeatBracket(e,[d]),this.maybeAttachAnnotation(e);return}let n=this.parseRnaSugar(e,t);this.maybeAttachAnnotation(e);let o;this.cursor.at(\"lparen\")&&(this.cursor.advance(),this.cursor.at(\"rparen\")||(o=this.parseRnaBaseSymbol(e),this.maybeAttachAnnotationTo(o)),this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' after RNA base\",this.cursor.currentSpan()),o!==void 0&&(this.addBond(e,n,o,\"branch\",{kind:\"numeric\",r:3},{kind:\"numeric\",r:1}),n.branchAtom=o));let r;this.canStartRnaLinker()&&(r=this.parseRnaLinker(e),this.maybeAttachAnnotationTo(r)),r!==void 0&&this.addBond(e,n,r,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1});let s=e.backboneAtoms.indexOf(n);if(s>0){let l=e.backboneAtoms[s-1];this.addBond(e,l,n,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1});}let a=[n];o!==void 0&&a.push(o),r!==void 0&&a.push(r),this.maybeRepeatBracket(e,a);}canStartRnaLinker(){let e=this.cursor.peek().kind;return e===\"identifier\"||e===\"inline-smiles\"||e===\"asterisk\"}parseRnaSugar(e,t){let{symbol:n,isInlineSmiles:o,rawPayload:r,inlineSource:s,span:a}=this.consumeMonomerSymbol(false),l=this.makeAtom(e,b.SUGAR,n);return s!==void 0&&(l.inlineSource=s),o&&this.registerInlineSmiles(r,a,v.RNA),this.addToChain(e,l,true),l}parseRnaBaseSymbol(e){let{symbol:t,isInlineSmiles:n,rawPayload:o,inlineSource:r,span:s}=this.consumeMonomerSymbol(false),a=this.makeAtom(e,b.BASE,t);return r!==void 0&&(a.inlineSource=r),n&&this.registerInlineSmiles(o,s,v.RNA),this.addToChain(e,a,false),a}parseRnaLinker(e){if(this.cursor.at(\"asterisk\")){this.cursor.currentSpan();this.cursor.advance();let d=this.makeAtom(e,b.LINKER,\"*\");return this.addToChain(e,d,true),d}let{symbol:t,isInlineSmiles:n,rawPayload:o,inlineSource:r,span:s}=this.consumeMonomerSymbol(false),a=this.makeAtom(e,b.LINKER,t);return r!==void 0&&(a.inlineSource=r),n&&this.registerInlineSmiles(o,s,v.RNA),this.addToChain(e,a,true),a}parseRnaAlternation(e,t){let n=e.backboneAtoms.length;if(this.cursor.advance(),this.looksLikeFlatAlternation()){let r=[],s=null;for(;!this.cursor.at(\"rparen\")&&!this.cursor.isAtEnd();)if(r.push(this.parseAlternationCandidate(v.RNA)),this.cursor.at(\"comma\"))s=\"or\",this.cursor.advance();else if(this.cursor.at(\"plus\"))s=\"and\",this.cursor.advance();else break;this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' in RNA alternation\",this.cursor.currentSpan());let a=s===\"and\"?\"+\":\",\",l=`(${r.map(c=>c.symbol+(c.ratio!==void 0?`:${String(c.ratio)}`:\"\")).join(a)})`,d=this.makeAtom(e,b.BASE,\"?\");d.bio.ambiguity=l,d.bio.ambiguityKind=s===\"and\"?\"and\":\"or\",this.addToChain(e,d,true);let u=e.backboneAtoms[e.backboneAtoms.length-2];u!==void 0&&this.addBond(e,u,d,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),this.maybeRepeatBracket(e,[d]),this.maybeAttachAnnotation(e);return}for(this.parseRnaItem(e,t);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rparen\")||this.cursor.isAtEnd()));)this.parseRnaItem(e,t);this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' in RNA repeat\",this.cursor.currentSpan());let o=e.backboneAtoms.slice(n);this.maybeRepeatBracket(e,o),this.maybeAttachAnnotation(e);}looksLikeFlatAlternation(){let e=1,t=0,n=false;for(;;){let o=this.cursor.peek(t);if(o.kind===\"eof\")return n;if(o.kind===\"rparen\"){if(e-=1,e===0)return n}else {if(o.kind===\"lparen\")return false;if(o.kind===\"dot\")return false;e===1&&(o.kind===\"comma\"||o.kind===\"plus\")&&(n=true);}if(t+=1,t>256)return n}}parseChemBody(e){let t;if(this.cursor.at(\"asterisk\"))this.cursor.advance(),t=this.makeAtom(e,b.CHEM,\"*\"),this.addToChain(e,t,true);else {let{symbol:n,isInlineSmiles:o,rawPayload:r,inlineSource:s,span:a}=this.consumeMonomerSymbol(false);t=this.makeAtom(e,b.CHEM,n),s!==void 0&&(t.inlineSource=s),o&&this.registerInlineSmiles(r,a,v.CHEM),this.addToChain(e,t,true);}this.maybeAttachAnnotation(e),this.cursor.at(\"apos\")&&this.maybeRepeatBracket(e,[t]),this.cursor.at(\"rbrace\")||(this.emit(\"error\",\"chem-multiple-monomers\",`CHEM polymer '${e.id}' must contain exactly one monomer`,this.cursor.currentSpan()),this.skipUntil([\"rbrace\",\"eof\"]));}parseBlobBody(e){let t,n,o=false,r=\"\",s,a=this.cursor.currentSpan();if(this.cursor.at(\"inline-smiles\")){let d=this.cursor.advance();o=Se(d.value),r=d.value,t=d.value,n=d.value,s=d.value,a=d.span;}else if(this.cursor.at(\"identifier\")){let d=this.cursor.advance();t=d.value,n=d.value,a=d.span;}else this.emit(\"error\",\"unknown-blobtype\",\"Expected BLOB identifier\",this.cursor.currentSpan()),t=\"?\",n=\"?\";let l=this.makeAtom(e,b.BLOB,t);l.bio.blobtype=n,s!==void 0&&(l.inlineSource=s),o&&this.registerInlineSmiles(r,a,v.BLOB),this.addToChain(e,l,true),this.maybeAttachAnnotation(e);}parseGroupBody(e){let t=0;for(;;){let n=this.cursor.peek();if(n.kind===\"eof\"||t===0&&n.kind===\"rbrace\")break;n.kind===\"lbrace\"&&(t+=1),n.kind===\"rbrace\"&&(t-=1),this.cursor.advance();}}parseConnections(){if(!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()))for(this.parseConnection();this.cursor.at(\"pipe\")&&(this.cursor.advance(),!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseConnection();}parseConnection(){let e=this.cursor.currentSpan(),t=this.cursor.optional(\"identifier\");if(t===null){this.emit(\"error\",\"unexpected-token\",\"Expected chain id in connection\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.cursor.optional(\"comma\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ',' in connection\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let n=this.cursor.optional(\"identifier\");if(n===null){this.emit(\"error\",\"unexpected-token\",\"Expected second chain id in connection\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.cursor.optional(\"comma\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ',' before connection position\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let o=this.parsePosition();if(this.cursor.optional(\"colon\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ':' between position and R-group\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let r=this.parseRGroupSpec();if(this.cursor.optional(\"dash\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected '-' between connection endpoints\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let s=this.parsePosition();if(this.cursor.optional(\"colon\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ':' before second R-group\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let a=this.parseRGroupSpec(),l=this.cursor.optional(\"quote-string\"),d=r.kind===\"pair\"&&a.kind===\"pair\"?\"hbond\":\"cross-polymer\",u={chain1:t.value,pos1:o,r1:r,chain2:n.value,pos2:s,r2:a,kind:d,span:{start:e.start,end:l?.span.end??this.cursor.peek().span.start},...l!==null?{tag:l.value}:{}};this.pendingBonds.push(u);}parsePosition(){let e=this.cursor.peek();return e.kind===\"integer\"?(this.cursor.advance(),{kind:\"index\",value:parseInt(e.value,10)}):e.kind===\"question\"?(this.cursor.advance(),{kind:\"any\"}):e.kind===\"identifier\"?(this.cursor.advance(),this.emit(\"info\",\"symbol-position-reference\",`Connection position uses monomer symbol '${e.value}' as chain-level ambiguity`,e.span),{kind:\"symbol\",value:e.value}):(this.emit(\"error\",\"invalid-position\",`Expected position (integer, '?', or symbol), got '${e.value}'`,e.span),{kind:\"any\"})}parseRGroupSpec(){let e=this.cursor.peek();if(e.kind===\"question\")return this.cursor.advance(),{kind:\"unspecified\"};if(e.kind===\"asterisk\")return this.cursor.advance(),{kind:\"wildcard\"};if(e.kind===\"identifier\"){if(this.cursor.advance(),e.value===\"pair\")return {kind:\"pair\"};let t=/^R([1-9][0-9]*)$/.exec(e.value);return t===null?(this.emit(\"error\",\"invalid-rgroup\",`Expected R-group label, got '${e.value}'`,e.span),{kind:\"unspecified\"}):{kind:\"numeric\",r:parseInt(t[1],10)}}return this.emit(\"error\",\"invalid-rgroup\",`Expected R-group label, got '${e.value}'`,e.span),{kind:\"unspecified\"}}parseGroupsSection(){if(!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()))for(this.parseGroupOrBondRatio();this.cursor.at(\"pipe\")&&(this.cursor.advance(),!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseGroupOrBondRatio();}parseGroupOrBondRatio(){let e=this.cursor.optional(\"identifier\");if(e===null){this.emit(\"error\",\"unexpected-token\",\"Expected group or bond-ratio identifier\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}this.cursor.at(\"lparen\")?this.parseGroupAfterId(e):this.cursor.at(\"plus\")?this.parseBondRatioAfterId(e):(this.emit(\"warning\",\"unexpected-token\",`Expected '(' or '+' after id '${e.value}' in section 3`,this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]));}parseGroupAfterId(e){let t=io(e.value);(t===null||!t.isGroup)&&this.emit(\"error\",\"unknown-group-reference\",`Group id must be 'G<n>', got '${e.value}'`,e.span),this.cursor.advance();let n=[],o=\"or\",r=null;for(;!this.cursor.at(\"rparen\")&&!this.cursor.isAtEnd();){let s=this.parseGroupMember();if(s!==null&&n.push(s),this.cursor.at(\"comma\"))r===null&&(r=\"or\",o=\"or\"),this.cursor.advance();else if(this.cursor.at(\"plus\"))r===null&&(r=\"and\",o=\"and\"),this.cursor.advance();else break}this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' to close group\",this.cursor.currentSpan()),this.groups.push({id:e.value,kind:o,members:n});}parseGroupMember(){let e=this.cursor.optional(\"identifier\");if(e===null)return this.emit(\"error\",\"unexpected-token\",\"Expected group member id\",this.cursor.currentSpan()),null;let t;return this.cursor.optional(\"colon\")!==null&&(t=this.parseRatio()),t===void 0?{target:e.value}:{target:e.value,ratio:t}}parseRatio(){let e=this.cursor.peek();if(e.kind===\"integer\"||e.kind===\"decimal\"){this.cursor.advance();let t=parseFloat(e.value);if(this.cursor.at(\"dash\")){this.cursor.peek();if(this.cursor.peek(1).kind===\"integer\"){this.cursor.advance();let o=this.cursor.advance();this.emit(\"info\",\"ratio-range\",`Ratio range ${e.value}-${o.value}; using lower bound`,{start:e.span.start,end:o.span.end});}}return t}return e.kind===\"question\"?(this.cursor.advance(),\"?\"):(this.emit(\"error\",\"unexpected-token\",`Expected ratio after ':', got '${e.value}'`,e.span),0)}parseBondRatioAfterId(e){this.cursor.advance();let t=this.cursor.optional(\"identifier\");if(t===null){this.emit(\"error\",\"unexpected-token\",\"Expected second chain id in bond-ratio\",this.cursor.currentSpan());return}let n;if(this.cursor.optional(\"colon\")!==null){let r=this.parseRatio();typeof r==\"number\"&&(n=r);}let o=this.pendingBonds.find(r=>r.chain1===e.value&&r.chain2===t.value||r.chain1===t.value&&r.chain2===e.value);if(o===void 0){this.emit(\"warning\",\"bond-ratio-no-matching-bond\",`Bond-ratio for ${e.value}+${t.value} has no matching cross-polymer bond`,e.span);return}n!==void 0&&(o.ratio={numerator:n});}parseAnnotationsSection(){if(this.cursor.at(\"dollar\")||this.cursor.isAtEnd())return;this.cursor.position();if(this.cursor.at(\"lbrace\")){this.parseAnnotation20(),this.cursor.at(\"pipe\")&&(this.emit(\"info\",\"annotation-mixed-versions\",\"Mixed HELM 2.0 JSON and HELM 1.0 pipe annotations\",this.cursor.currentSpan()),this.cursor.advance(),this.parseAnnotation10Entries());return}this.parseAnnotation10Entries();}parseAnnotation20(){let e=this.cursor.currentSpan(),t=0,n=e.end;for(;!this.cursor.isAtEnd();){let s=this.cursor.peek();if(s.kind===\"lbrace\")t+=1;else if(s.kind===\"rbrace\"&&(t-=1,t===0)){n=s.span.end,this.cursor.advance();break}this.cursor.advance();}let o=this.source.slice(e.start,n),r=null;try{r=JSON.parse(o);}catch{this.emit(\"warning\",\"annotation-malformed-json\",\"Annotation block is not valid JSON\",{start:e.start,end:n}),this.annotations={perPolymer:this.annotations.perPolymer,version:this.annotations.version,raw:o};return}if(r!==null&&typeof r==\"object\"&&!Array.isArray(r)){let s=new Map(this.annotations.perPolymer);for(let[a,l]of Object.entries(r))l!==null&&typeof l==\"object\"&&!Array.isArray(l)?(s.set(a,{...l}),this.chainById.has(a)||this.emit(\"warning\",\"annotation-unknown-polymer\",`Annotation references unknown polymer '${a}'`,e)):s.set(a,{value:l});this.annotations={perPolymer:s,version:this.annotations.version};}else this.emit(\"warning\",\"annotation-malformed-json\",\"Annotation block parsed but is not an object\",{start:e.start,end:n}),this.annotations={perPolymer:this.annotations.perPolymer,version:this.annotations.version,raw:o};}parseAnnotation10Entries(){for(this.parseAnnotation10One();this.cursor.at(\"pipe\")&&(this.cursor.advance(),!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseAnnotation10One();}parseAnnotation10One(){let e=this.cursor.optional(\"identifier\");if(e===null){this.emit(\"warning\",\"annotation-malformed-json\",\"Expected polymer-id in HELM 1.0 annotation\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.cursor.optional(\"lbrace\")===null){this.emit(\"warning\",\"annotation-malformed-json\",\"Expected '{' after polymer-id\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let t=[];for(;!this.cursor.at(\"rbrace\")&&!this.cursor.isAtEnd();)t.push(this.cursor.advance().value);if(this.cursor.optional(\"rbrace\")===null){this.emit(\"error\",\"unterminated-brace\",\"Expected '}' to close annotation\",this.cursor.currentSpan());return}let n=t.join(\"\").trim(),o=new Map(this.annotations.perPolymer),r=o.get(e.value)??{};n===\"ss\"||n===\"as\"?o.set(e.value,{...r,strandtype:n}):o.set(e.value,{...r,[n]:true}),this.chainById.has(e.value)||this.emit(\"warning\",\"annotation-unknown-polymer\",`Annotation references unknown polymer '${e.value}'`,e.span),this.annotations={perPolymer:o,version:this.annotations.version};}parseVersionTrailer(){let e=this.cursor.optional(\"identifier\");if(e===null){this.annotations={...this.annotations,version:\"\"};return}let t=e.value;if(this.cursor.at(\"dot\")&&this.cursor.peek(1).kind===\"integer\"){this.cursor.advance();let n=this.cursor.advance();t=`${e.value}.${n.value}`;}this.annotations={...this.annotations,version:t};}skipUntil(e){for(;!this.cursor.isAtEnd();){if(e.includes(this.cursor.peek().kind))return;this.cursor.advance();}}consumeMonomerSymbol(e){let t=this.cursor.peek();if(t.kind===\"inline-smiles\"){this.cursor.advance();let n=Se(t.value);return {symbol:t.value,isInlineSmiles:n,rawPayload:t.value,inlineSource:t.value,span:t.span}}if(t.kind===\"identifier\"){this.cursor.advance();let n=t.value,o=t.span;for(;this.cursor.peek().kind===\"dash\"&&this.cursor.peek(1).kind===\"integer\"&&(this.cursor.peek(2).kind===\"identifier\"||this.cursor.peek(2).kind===\"dash\");){this.cursor.advance();let s=this.cursor.advance();if(n=`${n}-${s.value}`,o=s.span,this.cursor.peek().kind===\"identifier\"){let a=this.cursor.advance();n=`${n}${a.value}`,o=a.span;}}return {symbol:n,isInlineSmiles:false,rawPayload:n,span:{start:t.span.start,end:o.end}}}if(t.kind===\"asterisk\"||t.kind===\"underscore\"||t.kind===\"question\")return this.cursor.advance(),{symbol:t.value,isInlineSmiles:false,rawPayload:t.value,span:t.span};if(t.kind===\"integer\"&&this.cursor.peek(1).kind===\"identifier\"){let n=this.cursor.advance(),o=this.cursor.advance(),r=`${n.value}${o.value}`;return {symbol:r,isInlineSmiles:false,rawPayload:r,span:{start:n.span.start,end:o.span.end}}}return this.emit(\"error\",\"unexpected-token\",`Expected monomer symbol, got '${t.value}'`,t.span),{symbol:\"?\",isInlineSmiles:false,rawPayload:\"\",span:t.span}}maybeRepeatBracket(e,t){if(!this.cursor.at(\"apos\"))return;let n=this.cursor.currentSpan();this.cursor.advance();let o=this.cursor.optional(\"integer\");if(o===null){this.emit(\"error\",\"unexpected-token\",\"Expected integer in repeat bracket\",this.cursor.currentSpan()),this.cursor.optional(\"apos\");return}let r=parseInt(o.value,10),s=r;if(this.cursor.at(\"dash\")){this.cursor.advance();let a=this.cursor.optional(\"integer\");a===null?this.emit(\"error\",\"unexpected-token\",\"Expected integer after '-' in repeat bracket\",this.cursor.currentSpan()):s=parseInt(a.value,10);}if(this.cursor.optional(\"apos\")===null&&this.emit(\"error\",\"unterminated-apostrophe\",\"Expected closing apostrophe\",this.cursor.currentSpan()),t.length===0){this.emit(\"warning\",\"repeat-on-empty-bracket\",\"Repeat bracket applied to empty content\",n);return}if(s<r){this.emit(\"warning\",\"repeat-range-inverted\",`Repeat range ${r}-${s} has max < min; swapping`,n);let a=r;r=s,s=a;}if(r===0&&s===0){this.emit(\"warning\",\"repeat-zero-count\",\"Repeat bracket with zero count\",n);return}s>1e4&&this.emit(\"warning\",\"bracket-repeat-too-large\",`Repeat range upper bound ${s} > 10000`,n),e.polymerType===v.CHEM&&this.emit(\"error\",\"repeat-on-non-iterable-polymer\",`Repeat bracket not allowed on CHEM polymer '${e.id}'`,n),this.groups.push({id:`${e.id}/bracket@${t[0]?.id??0}`,kind:\"bracket\",members:t.map(a=>({target:String(a.id)})),repeat:{min:r,max:s}});}maybeAttachAnnotation(e){let t=e.backboneAtoms[e.backboneAtoms.length-1];t!==void 0&&this.maybeAttachAnnotationTo(t);}maybeAttachAnnotationTo(e){if(e===void 0)return;let t=this.cursor.optional(\"quote-string\");t!==null&&(e.tag=t.value);}registerInlineSmiles(e,t,n){if(Se(e)){if(this.lib===null){this.emit(\"info\",\"inline-smiles-no-lib\",\"Inline SMILES seen but no monomer library available for registration\",t);return}try{this.lib.addMonomer;let o=this.lib.registerInlineSmilesMonomer;typeof o==\"function\"&&o.call(this.lib,n,e);}catch(o){let r=o instanceof Error?o.message:String(o);this.emit(\"warning\",\"inline-smiles-without-r-groups\",`Inline SMILES registration failed: ${r}`,t);}}}makeAtom(e,t,n){return {id:this.atomIds.next(),p:{x:0,y:0},biotype:t,symbol:n,monomer:null,bio:{chainId:e.id,positionInChain:0,continuousId:0},hidden:false,selected:false,highlighted:false}}addToChain(e,t,n){e.allAtoms.push(t),n&&(e.backboneAtoms.push(t),t.bio.positionInChain=e.backboneAtoms.length);}addBond(e,t,n,o,r,s){let a=this.bondIds.next();e.bonds.push({id:a,a1:t,a2:n,kind:o,r1:r,r2:s});}finalize(){let e=[];for(let a of this.pendingBonds){let l=this.chainById.get(a.chain1),d=this.chainById.get(a.chain2);if(l===void 0){this.emit(\"error\",\"unknown-chain-reference\",`Connection references unknown chain '${a.chain1}'`,a.span);continue}if(d===void 0){this.emit(\"error\",\"unknown-chain-reference\",`Connection references unknown chain '${a.chain2}'`,a.span);continue}let u=this.resolveAtomByPosition(l,a.pos1,a.span),c=this.resolveAtomByPosition(d,a.pos2,a.span);if(u===null||c===null)continue;a.r1.kind===\"pair\"&&u.branchAtom!==void 0&&(u=u.branchAtom),a.r2.kind===\"pair\"&&c.branchAtom!==void 0&&(c=c.branchAtom);let p={id:this.bondIds.next(),a1:u,a2:c,kind:a.kind,r1:a.r1,r2:a.r2,...a.tag!==void 0?{tag:a.tag}:{},...a.ratio!==void 0?{ratio:a.ratio}:{}};e.push(p);}let t=[],n=[],o=[];for(let a of this.chains){for(let c of a.allAtoms)t.push(c);for(let c of a.bonds)n.push(c);let l=this.annotations.perPolymer.get(a.id),d=l===void 0?void 0:l.strandtype,u=d===\"ss\"||d===\"as\"?d:void 0;o.push({id:a.id,polymerType:a.polymerType,backboneAtoms:a.backboneAtoms,bonds:a.bonds,...a.annotation!==void 0?{annotation:a.annotation}:{},...u!==void 0?{strandType:u}:{}});}for(let a of e)n.push(a);let r=0;for(let a of this.chains)for(let l of a.backboneAtoms)r+=1,l.bio.continuousId=r,l.branchAtom!==void 0&&(r+=1,l.branchAtom.bio.continuousId=r);let s=[];for(let a of this.groups)s.push({id:a.id,kind:a.kind,members:a.members,...a.repeat!==void 0?{repeat:a.repeat}:{}});return {atoms:t,bonds:n,chains:o,groups:s,annotations:this.annotations}}sourceOrderAtoms(e){let t=[];for(let n of e.backboneAtoms)t.push(n),n.branchAtom!==void 0&&t.push(n.branchAtom);return t}resolveAtomByPosition(e,t,n){if(t.kind===\"any\")return e.backboneAtoms[0]??null;if(t.kind===\"symbol\"){let s=e.backboneAtoms.find(a=>a.symbol===t.value);if(s===void 0){let a=e.allAtoms.find(l=>l.symbol===t.value);return a===void 0?(this.emit(\"warning\",\"position-out-of-range\",`Chain '${e.id}' has no monomer with symbol '${t.value}'`,n),e.backboneAtoms[0]??null):a}return s}let o=this.sourceOrderAtoms(e),r=t.value;return r<1||r>o.length?(this.emit(\"error\",\"position-out-of-range\",`Position ${r} out of range for chain '${e.id}' (length ${o.length})`,n),e.backboneAtoms[0]??null):o[r-1]}emit(e,t,n,o){let r={severity:e,code:t,message:n,...o!==void 0?{span:{start:o.start,end:o.end}}:{}};if(this.diagnostics.push(r),this.mode===\"strict\"&&e===\"error\")throw new D(t,n,{...o!==void 0?{span:{start:o.start,end:o.end}}:{}})}};function so(i,e,t){for(let n of t){if(n.kind!==\"backbone\"||n.r1.kind!==\"numeric\"||n.r2.kind!==\"numeric\")continue;let o=n.a1.id===i.id&&n.a2.id===e.id&&n.r1.r===2&&n.r2.r===1,r=n.a1.id===e.id&&n.a2.id===i.id&&n.r1.r===2&&n.r2.r===1;if(o||r)return true}return false}function ur(i){let e=false;for(let u of i.chains){for(let c=0;c<u.backboneAtoms.length-1;c++){let m=u.backboneAtoms[c],p=u.backboneAtoms[c+1];if(!so(m,p,i.bonds)){e=true;break}}if(e)break}if(!e)return i;let t=new Set(i.chains.map(u=>u.id)),n=u=>{let c=1;for(;t.has(`${u}${c}`);)c+=1;let m=`${u}${c}`;return t.add(m),m},o=[];for(let u of i.chains){let c=[[]],m=c[0];for(let p=0;p<u.backboneAtoms.length;p++){let h=u.backboneAtoms[p];if(m.push(h),p<u.backboneAtoms.length-1){let f=u.backboneAtoms[p+1];so(h,f,i.bonds)||(m=[],c.push(m));}}for(let p=0;p<c.length;p++){let f={id:p===0?u.id:n(u.polymerType),polymerType:u.polymerType,atoms:c[p]};p===0&&u.annotation!==void 0&&(f.annotation=u.annotation),o.push(f);}}let r=new Map;for(let u of o)for(let c=0;c<u.atoms.length;c++){let m=u.atoms[c];r.set(m.id,{chainId:u.id,pos:c+1}),m.branchAtom!==void 0&&r.set(m.branchAtom.id,{chainId:u.id,pos:c+1});}let s=new Map;for(let u of i.atoms){let c=r.get(u.id);if(c===void 0){s.set(u.id,u);continue}if(u.bio.chainId===c.chainId&&u.bio.positionInChain===c.pos){s.set(u.id,u);continue}s.set(u.id,{...u,bio:{...u.bio,chainId:c.chainId,positionInChain:c.pos}});}for(let u of i.atoms){if(u.branchAtom===void 0)continue;let c=s.get(u.id),m=s.get(u.branchAtom.id);c===void 0||m===void 0||(c.branchAtom=m);}let a=i.bonds.map(u=>{let c=s.get(u.a1.id)??u.a1,m=s.get(u.a2.id)??u.a2;return c===u.a1&&m===u.a2?u:{...u,a1:c,a2:m}}),l=o.map(u=>{let c=u.atoms.map(f=>s.get(f.id)??f),m=new Set;for(let f of u.atoms)m.add(f.id),f.branchAtom!==void 0&&m.add(f.branchAtom.id);let p=[];for(let f of a)m.has(f.a1.id)&&m.has(f.a2.id)&&p.push(f);return {id:u.id,polymerType:u.polymerType,backboneAtoms:c,bonds:p,...u.annotation!==void 0?{annotation:u.annotation}:{}}});return {atoms:i.atoms.map(u=>s.get(u.id)??u),bonds:a,chains:l,groups:i.groups,annotations:i.annotations}}function Le(i,e){let t=ur(i);return new dn(t,e??{}).emit()}var dn=class{constructor(e,t){this.mol=e,this.options=t;}emit(){let t=this.orderedChains().map(a=>this.emitPolymer(a)).join(\"|\"),n=this.emitConnections(),o=this.emitGroupsAndBondRatios(),r=this.emitAnnotations(),s=this.versionTrailer();return `${t}$${n}$${o}$${r}${s}`}orderedChains(){if(this.options.canonicalize!==true)return this.mol.chains;let e=this.mol.chains.slice();return e.sort((t,n)=>t.polymerType!==n.polymerType?t.polymerType<n.polymerType?-1:1:t.id<n.id?-1:t.id>n.id?1:0),e}emitPolymer(e){let t=this.emitChainBody(e),n=e.annotation!==void 0?`\"${Q(e.annotation)}\"`:\"\";return `${e.id}{${t}}${n}`}emitChainBody(e){switch(e.polymerType){case \"PEPTIDE\":return this.emitPeptideBody(e);case \"RNA\":return this.emitRnaBody(e);case \"CHEM\":return this.emitChemBody(e);case \"BLOB\":return this.emitBlobBody(e);default:return \"\"}}emitPeptideBody(e){let t=this.bracketsForChain(e.id),n=[],o=0,r=0,s=null;for(;o<e.backboneAtoms.length;){let a=e.backboneAtoms[o],l=t.find(u=>u.startAtomId===a.id);l!==void 0&&s===null&&(n.push(\"(\"),s=l,r+=1),n.push(this.emitMonomerToken(a));let d=a.tag!==void 0?`\"${Q(a.tag)}\"`:\"\";n.push(d),s!==null&&s.endAtomId===a.id&&(n.push(`)${ao(s.min,s.max)}`),s=null,r-=1),o+=1,o<e.backboneAtoms.length&&n.push(\".\");}return n.join(\"\")}emitRnaBody(e){let t=this.bracketsForChain(e.id),n=[],o=0,r=true,s=null,a=d=>{s!==null&&s.endAtomId===d&&(n.push(`)${ao(s.min,s.max)}`),s=null);},l=d=>{let u=t.find(c=>c.startAtomId===d);u!==void 0&&s===null&&(n.push(\"(\"),s=u);};for(;o<e.backboneAtoms.length;){let d=e.backboneAtoms[o];if(r||n.push(\".\"),r=false,d.biotype===b.NUCLEOTIDE){l(d.id),n.push(this.emitMonomerToken(d)),d.tag!==void 0&&n.push(`\"${Q(d.tag)}\"`),a(d.id),o+=1;continue}if(d.biotype===b.SUGAR){l(d.id),n.push(this.emitMonomerToken(d)),d.tag!==void 0&&n.push(`\"${Q(d.tag)}\"`),d.branchAtom!==void 0&&(n.push(\"(\"),n.push(this.emitMonomerToken(d.branchAtom)),d.branchAtom.tag!==void 0&&n.push(`\"${Q(d.branchAtom.tag)}\"`),n.push(\")\"));let u=e.backboneAtoms[o+1];u!==void 0&&u.biotype===b.LINKER?(n.push(this.emitMonomerToken(u)),u.tag!==void 0&&n.push(`\"${Q(u.tag)}\"`),a(u.id),o+=2):(a(d.id),o+=1);continue}l(d.id),n.push(this.emitMonomerToken(d)),d.tag!==void 0&&n.push(`\"${Q(d.tag)}\"`),a(d.id),o+=1;}return n.join(\"\")}emitChemBody(e){let t=e.backboneAtoms[0];if(t===void 0)return \"\";let n=t.tag!==void 0?`\"${Q(t.tag)}\"`:\"\";return `${this.emitMonomerToken(t)}${n}`}emitBlobBody(e){let t=e.backboneAtoms[0];if(t===void 0)return \"\";let n=t.tag!==void 0?`\"${Q(t.tag)}\"`:\"\";return `${this.emitMonomerToken(t)}${n}`}emitMonomerToken(e){let t;return e.inlineSource!==void 0?t=`[${e.inlineSource}]`:e.bio.ambiguity!==void 0&&(e.symbol===\"?\"||e.bio.ambiguity.startsWith(\"(\"))?t=e.bio.ambiguity:t=e.symbol,this.options.includeHighlights===true&&e.selected?`<span style='background:#bbf;'>${t}</span>`:t}emitConnections(){let e=[];for(let t of this.crossPolymerBonds())e.push(this.emitConnection(t));return e.join(\"|\")}*crossPolymerBonds(){let e=new Map;for(let t of this.mol.chains){let n=new Map;for(let o=0;o<t.backboneAtoms.length;o++)n.set(t.backboneAtoms[o].id,o);e.set(t.id,n);}for(let t of this.mol.bonds){if(t.kind===\"backbone\"){if(t.a1.bio.chainId===t.a2.bio.chainId){let n=e.get(t.a1.bio.chainId);if(n!==void 0){let o=n.get(t.a1.id),r=n.get(t.a2.id);if(o!==void 0&&r!==void 0&&Math.abs(o-r)===1)continue}}yield t;continue}if(t.kind===\"branch\"){if(t.a1.branchAtom!==void 0&&t.a1.branchAtom.id===t.a2.id||t.a2.branchAtom!==void 0&&t.a2.branchAtom.id===t.a1.id)continue;yield t;continue}yield t;}}emitConnection(e){let t=lo(e.r1,e.kind),n=lo(e.r2,e.kind),o=e.tag!==void 0?`\"${Q(e.tag)}\"`:\"\",r=String(this.connectionPosition(e.a1)),s=String(this.connectionPosition(e.a2));return `${e.a1.bio.chainId},${e.a2.bio.chainId},${r}:${t}-${s}:${n}${o}`}connectionPosition(e){return re(e,this.mol.chains.find(t=>t.id===e.bio.chainId))}emitGroupsAndBondRatios(){let e=[];for(let t of this.mol.groups)t.kind!==\"bracket\"&&e.push(this.emitGroup(t));for(let t of this.mol.bonds){if(t.kind!==\"cross-polymer\"||t.ratio===void 0)continue;let n=t.ratio.denominator!==void 0?`${t.ratio.numerator}/${t.ratio.denominator}`:`${t.ratio.numerator}`;e.push(`${t.a1.bio.chainId}+${t.a2.bio.chainId}:${n}`);}return e.join(\"|\")}emitGroup(e){let t=e.kind===\"and\"?\"+\":\",\",n=e.members.map(o=>mr(o)).join(t);return `${e.id}(${n})`}emitAnnotations(){let e=this.mol.annotations.perPolymer;if(e.size===0)return \"\";let t={};for(let[n,o]of e)t[n]=o;return JSON.stringify(t)}versionTrailer(){let e=this.options.version??\"V2.0\";if(e===\"none\")return \"\";if(e===\"preserve\"){let t=this.mol.annotations.version;return t===\"\"?\"\":`$${t}`}return `$${e}`}bracketsForChain(e){let t=[],n=new Map;for(let o of this.mol.atoms)n.set(o.id,o.bio.chainId);for(let o of this.mol.groups){if(o.kind!==\"bracket\")continue;let r=[];for(let l of o.members){let d=parseInt(l.target,10);Number.isFinite(d)&&r.push(d);}if(r.length===0)continue;let s=new Set;for(let l of r){let d=n.get(l);d!==void 0&&s.add(d);}if(!s.has(e)||s.size>1)continue;let a=o.repeat??{min:1,max:1};t.push({members:r,min:a.min,max:a.max,set:new Set(r),startAtomId:r[0],endAtomId:r[r.length-1]});}return t}};function Q(i){let e=\"\";for(let t=0;t<i.length;t++){let n=i.charCodeAt(t);if(n===34){e+='\\\\\"';continue}if(n===92){e+=\"\\\\\\\\\";continue}if(n===10){e+=\"\\\\n\";continue}if(n===13){e+=\"\\\\r\";continue}if(n===9){e+=\"\\\\t\";continue}e+=i.charAt(t);}return e}function ao(i,e){return i===e?`'${i}'`:`'${i}-${e}'`}function lo(i,e){switch(i.kind){case \"numeric\":return `R${i.r}`;case \"unspecified\":return \"?\";case \"wildcard\":return \"*\";case \"pair\":return \"pair\";case \"positional\":return `${i.position}:R${i.r}`;default:return \"?\"}}function mr(i){return i.ratio===void 0?i.target:`${i.target}:${i.ratio}`}function un(i){return new cn(i).run()}var cn=class{constructor(e){this.chainIdMap=new Map;this.mol=e;}run(){let e=this.mol.chains.slice().sort((m,p)=>m.polymerType!==p.polymerType?m.polymerType<p.polymerType?-1:1:uo(m.id,p.id)),t={},n=[];for(let m of e){let p=pr(m.polymerType);t[p]=(t[p]??0)+1;let h=`${p}${t[p]}`;this.chainIdMap.set(m.id,h),n.push(m);}let o=new Map;for(let m of this.mol.atoms){let p=this.chainIdMap.get(m.bio.chainId)??m.bio.chainId;o.set(m.id,{...m,bio:{...m.bio,chainId:p}});}for(let m of this.mol.atoms){if(m.branchAtom===void 0)continue;let p=o.get(m.id),h=o.get(m.branchAtom.id);p!==void 0&&h!==void 0&&(p.branchAtom=h);}let r=this.mol.bonds.map(m=>({...m,a1:o.get(m.a1.id)??m.a1,a2:o.get(m.a2.id)??m.a2})),s=new Map;for(let m of r)s.set(m.id,m);let a=n.map(m=>{let p=this.chainIdMap.get(m.id)??m.id,h=[];for(let _ of m.backboneAtoms){let k=o.get(_.id);k!==void 0&&h.push(k);}let f=[];for(let _ of m.bonds){let k=s.get(_.id);k!==void 0&&f.push(k);}return {id:p,polymerType:m.polymerType,backboneAtoms:h,bonds:f,...m.annotation!==void 0&&m.annotation.length>0?{annotation:m.annotation}:{}}}),l=new Map;for(let m of a)l.set(m.id,m);r.sort((m,p)=>{let h=co(m.kind),f=co(p.kind);if(h&&!f)return 1;if(!h&&f)return -1;if(!h&&!f)return m.id-p.id;let _=m.a1.bio.chainId,k=p.a1.bio.chainId;if(_!==k)return _<k?-1:1;let g=m.a2.bio.chainId,M=p.a2.bio.chainId;if(g!==M)return g<M?-1:1;let A=re(m.a1,l.get(m.a1.bio.chainId)),w=re(p.a1,l.get(p.a1.bio.chainId));if(A!==w)return A-w;let T=re(m.a2,l.get(m.a2.bio.chainId)),S=re(p.a2,l.get(p.a2.bio.chainId));return T-S});let d=this.renumberGroups(this.mol.groups),u=this.rekeyAnnotations(this.mol.annotations);return {atoms:this.mol.atoms.map(m=>o.get(m.id)),bonds:r,chains:a,groups:d,annotations:u}}renumberGroups(e){let t=[],n=[];for(let r of e)r.kind===\"bracket\"?t.push(this.rekeyBracket(r)):n.push(r);n.sort((r,s)=>uo(r.id,s.id));let o={G:0};return n.map(r=>{o.G+=1;let s=`G${o.G}`;return {...r,id:s,members:r.members.map(a=>this.rekeyMember(a))}}).concat(t)}rekeyBracket(e){return e}rekeyMember(e){let t=this.chainIdMap.get(e.target);return t===void 0?e:e.ratio===void 0?{target:t}:{target:t,ratio:e.ratio}}rekeyAnnotations(e){let t=new Map;for(let[n,o]of e.perPolymer){let r=this.chainIdMap.get(n)??n;Object.keys(o).length!==0&&t.set(r,o);}return {perPolymer:t,version:e.version}}};function pr(i){switch(i){case \"PEPTIDE\":return \"PEPTIDE\";case \"RNA\":return \"RNA\";case \"CHEM\":return \"CHEM\";case \"BLOB\":return \"BLOB\";default:return \"BLOB\"}}function co(i){return i===\"cross-polymer\"||i===\"hbond\"}function uo(i,e){let t=/^([A-Z]+)([0-9]+)$/.exec(i),n=/^([A-Z]+)([0-9]+)$/.exec(e);return t===null||n===null?i<e?-1:i>e?1:0:t[1]!==n[1]?t[1]<n[1]?-1:1:parseInt(t[2],10)-parseInt(n[2],10)}function mo(i){let e=Te(i),t=new Map;for(let a of i.atoms){let l=e.get(a.id);if(l===void 0||l===a.bio.continuousId){t.set(a.id,a);continue}t.set(a.id,{...a,bio:{...a.bio,continuousId:l}});}for(let a of i.atoms){if(a.branchAtom===void 0)continue;let l=t.get(a.id),d=t.get(a.branchAtom.id);l===void 0||d===void 0||(l.branchAtom=d);}let n=i.bonds.map(a=>{let l=t.get(a.a1.id),d=t.get(a.a2.id);return l===void 0||d===void 0||l===a.a1&&d===a.a2?a:{...a,a1:l,a2:d}}),o=new Map;for(let a of n)o.set(a.id,a);let r=i.chains.map(a=>{let l=[];for(let u of a.backboneAtoms){let c=t.get(u.id);l.push(c??u);}let d=[];for(let u of a.bonds){let c=o.get(u.id);d.push(c??u);}return {id:a.id,polymerType:a.polymerType,backboneAtoms:l,bonds:d,...a.annotation!==void 0?{annotation:a.annotation}:{}}});return {atoms:i.atoms.map(a=>t.get(a.id)??a),bonds:n,chains:r,groups:i.groups,annotations:i.annotations}}function mn(i,e){let n=Qe(i,e??null,{mode:\"lenient\",resolveMonomers:false}),o=hr(n.mol),r=mo(o.mol),s=new Map;for(let d of r.atoms)s.set(d.id,d.bio.continuousId);let a=new Map;for(let[d,u]of o.survivorByOldContinuousId){let c=s.get(u);c!==void 0&&a.set(d,c);}let l=Le(r,{version:\"V2.0\"});return {srcHelm:i,resHelm:l,monomerMap:a}}function hr(i){let e=new Map;for(let c of i.atoms)e.set(c.bio.continuousId,c.id);let t=new Set;for(let c of i.atoms)c.symbol===\"*\"&&t.add(c.id);if(t.size===0)return {mol:i,survivorByOldContinuousId:e};let n=new Map;for(let c of i.atoms)n.set(c.id,[]);for(let c of i.bonds)n.get(c.a1.id)?.push(c),n.get(c.a2.id)?.push(c);for(let c of t){let m=n.get(c)??[];if(m.some(f=>f.kind===\"cross-polymer\"||f.kind===\"hbond\"))throw new K(\"gap-at-complex-junction\",`Gap atom ${c} participates in a cross-polymer/hbond bond`,{atomId:c});let h=m.filter(f=>f.kind===\"backbone\");if(h.length>2)throw new K(\"gap-at-complex-junction\",`Gap atom ${c} has ${h.length} backbone bonds (max 2 allowed)`,{atomId:c,bondCount:h.length})}let o=i.atoms.filter(c=>!t.has(c.id)),r=[],s=[];for(let c of i.chains){let m=c.backboneAtoms.filter(f=>!t.has(f.id)),p=(()=>{let f=0;for(let _ of i.bonds)_.id>f&&(f=_.id);return f+1})(),h=[];for(let f of c.bonds)t.has(f.a1.id)||t.has(f.a2.id)||h.push(f);for(let f=0;f<c.backboneAtoms.length;f++){let _=c.backboneAtoms[f];if(!t.has(_.id))continue;let k=fr(c.backboneAtoms,f,t),g=br(c.backboneAtoms,f,t);if(k===null||g===null)continue;let M={id:p++,a1:k,a2:g,kind:\"backbone\",r1:{kind:\"numeric\",r:2},r2:{kind:\"numeric\",r:1}};h.find(w=>w.a1.id===k.id&&w.a2.id===g.id)===void 0&&h.push(M);}for(let f of h)s.push(f);r.push({id:c.id,polymerType:c.polymerType,backboneAtoms:m,bonds:h,...c.annotation!==void 0?{annotation:c.annotation}:{}});}for(let c of i.bonds)c.kind!==\"cross-polymer\"&&c.kind!==\"hbond\"||t.has(c.a1.id)||t.has(c.a2.id)||s.push(c);let a=new Map;for(let c of r){let m=0;for(let p of c.backboneAtoms)m+=1,a.set(p.id,{...p,bio:{...p.bio,positionInChain:m}});}for(let c of o)a.has(c.id)||a.set(c.id,c);let l=r.map(c=>{let m=c.backboneAtoms.map(h=>a.get(h.id)),p=c.bonds.map(h=>({...h,a1:a.get(h.a1.id),a2:a.get(h.a2.id)}));return {id:c.id,polymerType:c.polymerType,backboneAtoms:m,bonds:p,...c.annotation!==void 0?{annotation:c.annotation}:{}}}),d=s.map(c=>({...c,a1:a.get(c.a1.id),a2:a.get(c.a2.id)}));return {mol:{atoms:o.map(c=>a.get(c.id)),bonds:d,chains:l,groups:i.groups,annotations:i.annotations},survivorByOldContinuousId:e}}function fr(i,e,t){for(let n=e-1;n>=0;n--){let o=i[n];if(o!==void 0&&!t.has(o.id))return o}return null}function br(i,e,t){for(let n=e+1;n<i.length;n++){let o=i[n];if(o!==void 0&&!t.has(o.id))return o}return null}function pn(i,e,t){let n=t?.mode??\"lenient\",o=[];for(let s of yr)o.push(...s(i,e));let r=n===\"pedantic\"?o.map(s=>s.severity===\"warning\"?{...s,severity:\"error\"}:s):o;if(n===\"strict\"||n===\"pedantic\"){let s=r.filter(a=>a.severity===\"error\");if(s.length>0)throw new qe(s)}return r}var yr=[gr,_r,vr,wr,kr,Ar,Mr,Tr];function gr(i,e){let t=[],n=new Set(i.chains.map(s=>s.id));for(let s of i.bonds)s.kind!==\"cross-polymer\"&&s.kind!==\"hbond\"||(n.has(s.a1.bio.chainId)||t.push({severity:\"error\",code:\"unknown-chain-reference\",message:`Connection references unknown chain '${s.a1.bio.chainId}'`,context:{chainId:s.a1.bio.chainId,bondId:s.id}}),n.has(s.a2.bio.chainId)||t.push({severity:\"error\",code:\"unknown-chain-reference\",message:`Connection references unknown chain '${s.a2.bio.chainId}'`,context:{chainId:s.a2.bio.chainId,bondId:s.id}}));for(let s of i.chains)for(let a of i.bonds){if(a.kind!==\"cross-polymer\"&&a.kind!==\"hbond\")continue;let l=0;for(let d of s.backboneAtoms)l+=d.branchAtom!==void 0?2:1;for(let d of [a.a1,a.a2]){if(d.bio.chainId!==s.id)continue;let u=re(d,s);(u<1||u>l)&&t.push({severity:\"error\",code:\"position-out-of-range\",message:`Position ${u} out of range for chain '${s.id}' (length ${l})`,context:{chainId:s.id,atomId:d.id,found:u}});}}let o=new Set;for(let s of i.groups)s.kind!==\"bracket\"&&o.add(s.id);for(let s of i.groups)if(s.kind!==\"bracket\")for(let a of s.members)n.has(a.target)||o.has(a.target)||t.push({severity:\"error\",code:\"unknown-group-reference\",message:`Group '${s.id}' references unknown id '${a.target}'`,context:{found:a.target}});let r=new Map;for(let s of i.groups){if(s.kind===\"bracket\")continue;let a=[];for(let l of s.members)o.has(l.target)&&a.push(l.target);r.set(s.id,a);}for(let s of r.keys()){let a=new Set,l=[s];for(;l.length>0;){let d=l.pop();if(a.has(d))continue;a.add(d);let u=r.get(d)??[];for(let c of u)c===s?t.push({severity:\"error\",code:\"group-cycle\",message:`Group cycle detected involving '${s}'`,context:{found:s}}):a.has(c)||l.push(c);}}return t}function _r(i,e){let t=[];if(e===null)return t;let n=new Map;for(let o of i.chains)n.set(o.id,o.polymerType);for(let o of i.atoms){let r=n.get(o.bio.chainId);if(r===void 0)continue;let s=o.monomer,a=s?.meta;if(s===null||a?.missing===true){t.push({severity:\"warning\",code:\"unresolved-monomer\",message:`Monomer '${o.symbol}' not found in library for ${r}`,context:{chainId:o.bio.chainId,atomId:o.id,found:o.symbol}});continue}a?.ambiguous!==true&&s.smiles!==void 0&&s.smiles.length>0&&(s.rgroups.length===0?t.push({severity:\"warning\",code:\"inline-smiles-without-r-groups\",message:`Inline-SMILES monomer '${s.symbol}' has no R-groups`,context:{atomId:o.id,found:s.symbol}}):s.rgroups.length>4&&t.push({severity:\"warning\",code:\"inline-smiles-too-many-rs\",message:`Inline-SMILES monomer '${s.symbol}' has ${s.rgroups.length} R-groups (max 4 expected)`,context:{atomId:o.id,found:s.rgroups.length}}));}for(let o of i.atoms){let r=n.get(o.bio.chainId);if(!(r===void 0||e.getMonomer(r,o.symbol)!==null)){for(let a of e.getMonomerSymbolsByType(r))if(a!==o.symbol&&a.toLowerCase()===o.symbol.toLowerCase()){t.push({severity:\"info\",code:\"case-mismatch\",message:`Symbol '${o.symbol}' differs from library entry '${a}' only in case`,context:{atomId:o.id,found:o.symbol,expected:a}});break}}}return t}function vr(i,e){let t=[],n=new Map;for(let o of i.bonds)for(let[r,s]of [[o.a1,o.r1],[o.a2,o.r2]]){if(s.kind!==\"numeric\")continue;let a=n.get(r.id)??new Set;a.has(s.r)&&t.push({severity:\"error\",code:\"rgroup-already-bonded\",message:`R-group R${s.r} on atom ${r.id} already bonded`,context:{atomId:r.id,bondId:o.id,found:s.r}}),a.add(s.r),n.set(r.id,a);}for(let o of i.bonds){for(let[r,s]of [[o.a1,o.r1],[o.a2,o.r2]]){if(s.kind!==\"numeric\"||r.monomer===null)continue;let a=r.monomer.rs;(s.r<1||s.r>a)&&t.push({severity:\"error\",code:\"rgroup-not-on-monomer\",message:`R-group R${s.r} not defined on monomer '${r.symbol}' (rs=${a})`,context:{atomId:r.id,bondId:o.id,found:s.r,expected:`R1..R${a}`}});}o.kind===\"backbone\"&&o.r1.kind===\"numeric\"&&o.r2.kind===\"numeric\"&&(o.r1.r===2&&o.r2.r===1||t.push({severity:\"warning\",code:\"backbone-rgroup-misaligned\",message:`Backbone bond uses R${o.r1.r}->R${o.r2.r} (expected R2->R1)`,context:{bondId:o.id,found:`R${o.r1.r}->R${o.r2.r}`}})),o.kind===\"branch\"&&o.r1.kind===\"numeric\"&&o.r1.r!==3&&t.push({severity:\"warning\",code:\"branch-rgroup-misaligned\",message:`Branch bond uses R${o.r1.r} (expected R3 on parent)`,context:{bondId:o.id,found:`R${o.r1.r}`}});}for(let o of i.atoms){if(o.monomer===null)continue;let s=n.get(o.id)?.size??0;if(o.monomer.rs>s){let a=o.monomer.rs-s;a>0&&o.monomer.rs>0&&t.push({severity:\"info\",code:\"unmatched-r-group\",message:`Monomer '${o.symbol}' on atom ${o.id} has ${a} unused R-group(s); default cap applied`,context:{atomId:o.id,found:a}});}}return t}function wr(i,e){let t=[];for(let n of i.chains){if(n.polymerType===\"CHEM\"&&n.backboneAtoms.length>1&&t.push({severity:\"error\",code:\"chem-multiple-monomers\",message:`CHEM polymer '${n.id}' has ${n.backboneAtoms.length} monomers (expected 1)`,context:{chainId:n.id,found:n.backboneAtoms.length}}),n.polymerType===\"BLOB\")for(let o of n.backboneAtoms)o.bio.blobtype===void 0&&o.symbol!==\"Bead\"&&o.symbol!==\"Group\"&&t.push({severity:\"error\",code:\"blob-non-blob-symbol\",message:`BLOB '${n.id}' contains non-blob symbol '${o.symbol}'`,context:{chainId:n.id,atomId:o.id,found:o.symbol}});if(n.polymerType===\"RNA\"){let o=false;for(let r=0;r<n.backboneAtoms.length;r++){let s=n.backboneAtoms[r];s.biotype===b.BASE&&!o&&t.push({severity:\"error\",code:\"rna-bare-base\",message:`Bare base '${s.symbol}' without parent sugar in '${n.id}'`,context:{chainId:n.id,atomId:s.id}}),s.biotype===b.LINKER&&(n.backboneAtoms.slice(0,r).some(l=>l.biotype===b.SUGAR)||t.push({severity:\"warning\",code:\"rna-bare-linker\",message:`Bare linker '${s.symbol}' before any sugar in '${n.id}'`,context:{chainId:n.id,atomId:s.id}})),o=s.biotype===b.SUGAR||s.biotype===b.LINKER;}}}return t}function kr(i,e){let t=[],n=new Map;for(let r of i.chains)n.set(r.id,r.polymerType);let o=new Map;for(let r of i.bonds){if(r.kind!==\"hbond\")continue;o.set(r.a1.id,(o.get(r.a1.id)??0)+1),o.set(r.a2.id,(o.get(r.a2.id)??0)+1);let s=n.get(r.a1.bio.chainId),a=n.get(r.a2.bio.chainId);(s!==\"RNA\"||a!==\"RNA\")&&t.push({severity:\"error\",code:\"pair-non-rna\",message:`Hydrogen-bond connects non-RNA chains (${s}/${a})`,context:{bondId:r.id}}),(r.a1.biotype!==b.BASE||r.a2.biotype!==b.BASE)&&t.push({severity:\"warning\",code:\"pair-position-not-base\",message:\"Hydrogen-bond endpoints are not both bases\",context:{bondId:r.id,found:`${r.a1.biotype}/${r.a2.biotype}`}}),xr(r.a1.symbol,r.a2.symbol)||t.push({severity:\"warning\",code:\"pair-non-canonical\",message:`Non-canonical pair ${r.a1.symbol}-${r.a2.symbol}`,context:{bondId:r.id,found:`${r.a1.symbol}-${r.a2.symbol}`}});}for(let[r,s]of o)s>1&&t.push({severity:\"warning\",code:\"pair-already-paired\",message:`Base atom ${r} participates in ${s} pair bonds`,context:{atomId:r,found:s}});return t}function xr(i,e){let t=i.toUpperCase(),n=e.toUpperCase();return new Set([\"A:T\",\"T:A\",\"A:U\",\"U:A\",\"G:C\",\"C:G\"]).has(`${t}:${n}`)}function Ar(i,e){let t=[];for(let n of i.atoms){let o=n.bio.ambiguity;if(o!==void 0){if(n.bio.ambiguityKind===\"and\"){let r=po(o,\"+\");for(let s of r)s.ratio!==void 0&&s.ratio<0&&t.push({severity:\"error\",code:\"ratio-and-negative\",message:`AND ratio for '${s.symbol}' is negative (${s.ratio})`,context:{atomId:n.id,found:s.ratio}});}else if(n.bio.ambiguityKind===\"or\"){let r=po(o,\",\"),s=0,a=false;for(let l of r)typeof l.ratio==\"number\"&&(s+=l.ratio,a=true);a&&Math.abs(s-1)>.001&&Math.abs(s-100)>.5&&t.push({severity:\"info\",code:\"ratio-doesnt-sum-to-1\",message:`OR ratios sum to ${s} (expected 1.0 or 100)`,context:{atomId:n.id,found:s}});}}}return t}function po(i,e){let t=i.trim();t.startsWith(\"(\")&&t.endsWith(\")\")&&(t=t.slice(1,-1));let n=t.split(e),o=[];for(let r of n){let s=r.trim();if(s.length===0)continue;let a=s.indexOf(\":\");if(a<0){o.push({symbol:s});continue}let l=s.slice(0,a),d=s.slice(a+1),u=parseFloat(d);Number.isFinite(u)?o.push({symbol:l,ratio:u}):o.push({symbol:l});}return o}function Mr(i,e){let t=[],n=new Set(i.chains.map(o=>o.id));for(let o of i.annotations.perPolymer.keys())n.has(o)||t.push({severity:\"warning\",code:\"annotation-unknown-polymer\",message:`Annotation references unknown polymer '${o}'`,context:{found:o}});return t}function Tr(i,e){let t=[];for(let o of i.chains)o.backboneAtoms.length>1e4&&t.push({severity:\"info\",code:\"polymer-too-long\",message:`Polymer '${o.id}' has ${o.backboneAtoms.length} atoms (> 10000); renderer may switch to rows layout`,context:{chainId:o.id,found:o.backboneAtoms.length}});let n=0;for(let o of i.bonds)(o.kind===\"cross-polymer\"||o.kind===\"hbond\")&&(n+=1);n>1e3&&t.push({severity:\"info\",code:\"connection-count-high\",message:`${n} cross-polymer/hbond connections (> 1000); rendering may be slow`,context:{found:n}});for(let o of i.groups)o.kind===\"bracket\"&&o.repeat!==void 0&&o.repeat.max>1e4&&t.push({severity:\"warning\",code:\"bracket-repeat-too-large\",message:`Bracket repeat upper bound ${o.repeat.max} > 10000`,context:{found:o.repeat.max}});return t}function ho(i){let e=[],t=new Map;for(let n of i.chains)for(let o of n.backboneAtoms)t.set(o.id,n.id);for(let n of i.chains)for(let o of n.backboneAtoms)o.branchAtom!==void 0&&t.set(o.branchAtom.id,n.id);for(let n of i.chains){let o=Sr(n.polymerType),r=n.backboneAtoms,s=[],a=[],l=[];for(let u of n.bonds)u.kind===\"backbone\"&&l.push(u);if(o===\"RNA\")for(let u of r){if(u.biotype!==b.SUGAR){s.push(null),a.push(null);continue}let c=null,m=null;for(let p of n.bonds){if(p.kind!==\"branch\")continue;let h=p.a1.id===u.id?p.a2:p.a2.id===u.id?p.a1:null;if(h!==null&&h.biotype===b.BASE){c=h,m=p;break}}s.push(c),a.push(m);}else for(let u=0;u<r.length;u++)s.push(null),a.push(null);let d=Er(i,n.id,r,t);e.push({id:n.id,polymerType:o,backbone:r,bases:s,backboneBonds:l,baseBonds:a,isCyclic:d,...n.strandType!==void 0?{strandType:n.strandType}:{}});}return e}function Sr(i){switch(i){case v.PEPTIDE:return \"PEPTIDE\";case v.RNA:return \"RNA\";case v.CHEM:return \"CHEM\";case v.BLOB:return \"BLOB\";default:return \"BLOB\"}}function Er(i,e,t,n){if(t.length<2)return false;let o=t[0],r=t[t.length-1];for(let s of i.bonds){if(s.kind===\"backbone\"||s.kind===\"branch\")continue;let a=n.get(s.a1.id),l=n.get(s.a2.id);if(a!==e||l!==e||!(s.a1.id===r.id&&s.a2.id===o.id||s.a2.id===r.id&&s.a1.id===o.id))continue;let u=s.a1.id===o.id?s.r1:s.r2,c=s.a1.id===r.id?s.r1:s.r2,m=u.kind===\"numeric\"&&u.r===1,p=c.kind===\"numeric\"&&c.r===2;if(m&&p)return true}return false}var hn=44.800000000000004,fo=1.5*28,kt=1.5*28/hn,fn=1.5*28/hn,bn=1.5*28/hn;function we(i,e){let t=e?.bondLength??28,n=e?.origin??{x:0,y:0},o=1.6*t,r=new Map;for(let s=0;s<i.backbone.length;s++){let a=i.backbone[s];r.set(a.id,{x:n.x+s*o,y:n.y});}return r}var Cr=Math.PI/180;function xt(i,e){let t=i.backbone.length;if(t<=2){let d={};return e?.bondLength!==void 0&&(d.bondLength=e.bondLength),e?.origin!==void 0&&(d.origin=e.origin),we(i,d)}let n=e?.bondLength??28,o=e?.origin??{x:0,y:0},r=e?.startDegrees??-90,a=1.6*n/(2*Math.sin(Math.PI/t)),l=new Map;for(let d=0;d<t;d++){let u=i.backbone[d],m=(r+d*360/t)*Cr;l.set(u.id,{x:o.x+a*Math.cos(m),y:o.y+a*Math.sin(m)});}return l}var Lr=10,Br=1.5/1.6;function bo(i,e){let t=e?.bondLength??28,n=e?.origin??{x:0,y:0},o=Math.max(1,e?.perRow??Lr),r=e?.rowSpacing??Br,s=1.6*t,a=r*s,l=new Map;for(let d=0;d<i.backbone.length;d++){let u=i.backbone[d],c=Math.floor(d/o),m=d%o,p=c%2===0?n.x+m*s:n.x+(o-1-m)*s,h=n.y+c*a;l.set(u.id,{x:p,y:h});}return l}function yo(i,e){let t=new Map;for(let r=0;r<i.backbone.length;r++)t.set(i.backbone[r].id,r);let n=i.backbone.length-1,o=[];for(let r of e.bonds){if(r.kind===\"backbone\"||r.kind===\"branch\")continue;let s=t.get(r.a1.id),a=t.get(r.a2.id);if(s===void 0||a===void 0)continue;let l=Math.min(s,a),d=Math.max(s,a);d-l<2||l===0&&d===n||o.push({lo:l,hi:d});}return o}function go(i,e){return e===null?false:yo(i,e).length>0}function yn(i,e,t){if(e===null)return we(i,t);let n=t?.bondLength??28,o=t?.origin??{x:0,y:0},r=1.6*n,s=yo(i,e);if(s.length===0)return we(i,t);let a=s[0].lo,l=s[0].hi;for(let g of s)g.lo<a&&(a=g.lo),g.hi>l&&(l=g.hi);let d=i.backbone.slice(a,l+1),u=d.length,c=r/(2*Math.sin(Math.PI/u)),m={id:i.id,polymerType:i.polymerType,backbone:d,bases:new Array(u).fill(null),baseBonds:new Array(u).fill(null)},p=a,h={x:o.x+p*r+c,y:o.y},f=xt(m,{bondLength:n,origin:h,startDegrees:180}),_=new Map;for(let g=0;g<a;g++){let M=i.backbone[g];_.set(M.id,{x:o.x+g*r,y:o.y});}for(let[g,M]of f)_.set(g,M);let k=h.x+c+r;for(let g=l+1;g<i.backbone.length;g++){let M=i.backbone[g],A=g-(l+1);_.set(M.id,{x:k+A*r,y:o.y});}return _}function vo(i){let e=new Map,t=new Map;for(let n=0;n<i.backbone.length;n++){e.set(i.backbone[n].id,n);let o=i.bases[n];o!=null&&t.set(o.id,n);}return {sugarToIdx:e,baseToIdx:t}}function _o(i,e,t){let n=e.get(i);if(n!==void 0)return n;let o=t.get(i);return o!==void 0?o:null}function wo(i,e,t){let n=i.kind===\"hbond\",o=i.kind===\"cross-polymer\"&&typeof i.r1==\"object\"&&i.r1!==null&&i.r1.kind===\"pair\"&&typeof i.r2==\"object\"&&i.r2!==null&&i.r2.kind===\"pair\";if(!n&&!o)return null;let r=_o(i.a1.id,e,t),s=_o(i.a2.id,e,t);return r===null||s===null||r===s?null:{lo:Math.min(r,s),hi:Math.max(r,s)}}function ko(i,e){if(i.polymerType!==\"RNA\"||i.backbone.length===0)return false;let{sugarToIdx:t,baseToIdx:n}=vo(i);for(let o of e.bonds)if(wo(o,t,n)!==null)return true;return false}function Rr(i,e){let t=i.backbone.length,n=new Int32Array(t).fill(-1);if(t===0)return n;let{sugarToIdx:o,baseToIdx:r}=vo(i),s=[];for(let l of e.bonds){let d=wo(l,o,r);d!==null&&s.push([d.lo,d.hi]);}s.sort((l,d)=>l[0]-d[0]||d[1]-l[1]);let a=[];for(let l of s){let[d,u]=l,c=false;for(let[m,p]of a){let h=u<m||d>p,f=d>m&&u<p||d<m&&u>p;if(!h&&!f){c=true;break}}c||n[d]!==-1||n[u]!==-1||(n[d]=u,n[u]=d,a.push(l));}return n}function Ir(i){return e(0,i.length-1,null);function e(t,n,o){let r=[],s=-1,a=t;for(;a<=n;){let l=i[a];if(l>a&&l<=n){s!==-1&&(r.push({kind:\"unpaired\",from:s,to:a-1}),s=-1);let d=1;for(;a+2*d<l-2*d&&i[a+2*d]===l-2*d&&i[a+2*d-1]===-1&&i[l-2*d+1]===-1;)d+=1;let u=a+2*(d-1),c=l-2*(d-1),m=[u,c],p=e(u+1,c-1,m);r.push({kind:\"stem\",fromIdx:a,toIdx:l,numPairs:d,child:p}),a=l+1;}else s===-1&&(s=a),a+=1;}return s!==-1&&r.push({kind:\"unpaired\",from:s,to:n}),{kind:\"loop\",nodes:r,closingPair:o}}}function At(i){let e=Math.hypot(i.x,i.y);return e===0?{x:1,y:0}:{x:i.x/e,y:i.y/e}}function Pr(i){return {x:-i.y,y:i.x}}function gn(i,e,t){return {x:i.x+e*Math.cos(t),y:i.y+e*Math.sin(t)}}function Hr(i,e,t,n){let o=t+n+1;if(o<=0)return Math.max(i/2+1,e);let r=n+1,s=o*e,a=Math.max(s/(2*Math.PI),i/2+1);for(let l=0;l<64;l++){let d=i/(2*a),c=2*Math.asin(Math.min(.9999,Math.max(-0.9999,d))),m=(2*Math.PI-r*c)*a-s,p=d,h=Math.sqrt(Math.max(1e-12,1-p*p)),_=2*(-i/(2*a*a)/h),k=2*Math.PI-r*c-r*a*_;if(!Number.isFinite(k)||Math.abs(k)<1e-12)break;let g=m/k,M=a-g;if(!Number.isFinite(M)||M<i/2+.001){a=i/2+.001;break}if(a=M,Math.abs(g)<1e-9)break}return Math.max(a,i/2+.001)}function Mt(i,e,t,n,o){let r=o.chain.bases[i];r!=null&&o.out.set(r.id,{x:e.x+n*t.x,y:e.y+n*t.y});}function xo(i,e,t){let{chain:n,step:o,rail:r,baseInwardHang:s,out:a}=t,l=2*i.numPairs-1,d={x:e.normal.x,y:e.normal.y},u={x:-e.normal.x,y:-e.normal.y};for(let m=0;m<l;m++){let p=n.backbone[i.fromIdx+m],h=n.backbone[i.toIdx-m],f=m*o,_={x:e.origin.x+f*e.tangent.x,y:e.origin.y+f*e.tangent.y},k={x:e.origin.x+f*e.tangent.x+r*e.normal.x,y:e.origin.y+f*e.tangent.y+r*e.normal.y};a.set(p.id,_),a.set(h.id,k),Mt(i.fromIdx+m,_,d,s,t),Mt(i.toIdx-m,k,u,s,t);}let c=(l-1)*o;return {origin:{x:e.origin.x+c*e.tangent.x,y:e.origin.y+c*e.tangent.y},tangent:e.tangent,normal:e.normal}}function Ao(i,e,t,n){if(i.closingPair===null)return;let{step:o,rail:r,out:s}=t,a=0,l=0;for(let T of i.nodes)T.kind===\"unpaired\"?a+=T.to-T.from+1:l+=1;let d=Hr(r,o,a,l),u=s.get(t.chain.backbone[i.closingPair[0]].id),c=s.get(t.chain.backbone[i.closingPair[1]].id),m={x:(u.x+c.x)/2,y:(u.y+c.y)/2},p=Math.sqrt(Math.max(0,d*d-r/2*(r/2))),h={x:m.x+p*e.tangent.x,y:m.y+p*e.tangent.y},f=Math.atan2(u.y-h.y,u.x-h.x),k=Math.atan2(c.y-h.y,c.x-h.x)-f;for(;k>Math.PI;)k-=2*Math.PI;for(;k<=-Math.PI;)k+=2*Math.PI;let g=k>0?-1:1,M=2*Math.asin(Math.min(.9999,Math.max(-0.9999,r/(2*d)))),A=o/d,w=f;for(let T of i.nodes)if(T.kind===\"unpaired\")for(let S=T.from;S<=T.to;S++){w=w+g*A;let R=gn(h,d,w);s.set(t.chain.backbone[S].id,R);let z=At({x:R.x-h.x,y:R.y-h.y});Mt(S,R,z,t.step,t);}else {w=w+g*A;let S=gn(h,d,w);w=w+g*M;let R=gn(h,d,w);s.set(t.chain.backbone[T.fromIdx].id,S),s.set(t.chain.backbone[T.toIdx].id,R);let z=At({x:(S.x+R.x)/2-h.x,y:(S.y+R.y)/2-h.y}),de=At({x:R.x-S.x,y:R.y-S.y}),Di=xo(T,{origin:S,tangent:z,normal:de},t);Ao(T.child,Di,t);}}function $r(i,e,t){let{step:n,rail:o,out:r}=t,s={x:e.origin.x,y:e.origin.y},a={x:e.tangent.x,y:e.tangent.y},l={x:-e.normal.x,y:-e.normal.y};for(let d of i.nodes)if(d.kind===\"unpaired\")for(let u=d.from;u<=d.to;u++){let c={x:s.x,y:s.y};r.set(t.chain.backbone[u].id,c),Mt(u,c,{x:e.normal.x,y:e.normal.y},t.step,t),s={x:s.x+n*a.x,y:s.y+n*a.y};}else {let u={origin:{x:s.x,y:s.y},tangent:l,normal:a},c=xo(d,u,t);Ao(d.child,c,t),s={x:s.x+(o+n)*a.x,y:s.y+(o+n)*a.y};}}function Mo(i,e,t){let n=t?.bondLength??28,o=1.6*n,r=o/2,a=fo*(n/28)+2*r,l=t?.origin??{x:0,y:0},d=At(t?.rootDirection??{x:1,y:0}),u=Pr(d),c=new Map;if(i.backbone.length===0)return c;let m=Rr(i,e),p=Ir(m);$r(p,{origin:l,tangent:d,normal:u},{chain:i,step:o,rail:a,baseInwardHang:r,out:c});for(let _ of i.backbone)c.has(_.id)||c.set(_.id,{x:l.x,y:l.y});return c}function To(i,e,t){if(i.polymerType!==\"RNA\")return e;let n=t?.bondLength??28,o=1.6*n;for(let r=0;r<i.backbone.length;r++){let s=i.bases[r];if(s==null||e.has(s.id))continue;let a=i.backbone[r],l=e.get(a.id);if(l===void 0)continue;let d=Dr(i,r,e);e.set(s.id,{x:l.x+o*d.x,y:l.y+o*d.y});}return e}function Dr(i,e,t){let n=i.backbone[e],o=t.get(n.id);if(o===void 0)return {x:0,y:1};let r=e>0?i.backbone[e-1]:void 0,s=e<i.backbone.length-1?i.backbone[e+1]:void 0,a=r!==void 0?t.get(r.id):void 0,l=s!==void 0?t.get(s.id):void 0,d=0,u=0;if(a!==void 0&&l!==void 0){let c=l.x-a.x,m=l.y-a.y,p=Math.hypot(c,m);if(p===0)return {x:0,y:1};let h={x:m/p,y:-c/p},f={x:-m/p,y:c/p},_=h.y>=f.y?h:f;d=_.x,u=_.y;}else if(l!==void 0){let c=l.x-o.x,m=l.y-o.y,p=Math.hypot(c,m);if(p===0)return {x:0,y:1};let h={x:m/p,y:-c/p},f={x:-m/p,y:c/p},_=h.y>=f.y?h:f;d=_.x,u=_.y;}else if(a!==void 0){let c=o.x-a.x,m=o.y-a.y,p=Math.hypot(c,m);if(p===0)return {x:0,y:1};let h={x:m/p,y:-c/p},f={x:-m/p,y:c/p},_=h.y>=f.y?h:f;d=_.x,u=_.y;}else return {x:0,y:1};return {x:d,y:u}}function Eo(i,e,t,n){let o=n?.bondLength??28,r=1.6*o,s=new Map,a=new Map;for(let p of i){let h=new Set;for(let f of p.backbone)h.add(f.id);for(let f of p.bases)f!==null&&h.add(f.id);a.set(p.id,{chain:p,atomIds:h});for(let f of h)s.set(f,p);}let l=new Set;if(i.length>0){let p=i.find(h=>h.strandType===\"ss\");l.add((p??i[0]).id);}let d=new Map;for(let p of i)d.set(p.id,p.id);let u=p=>{let h=p;for(;d.get(h)!==h;)h=d.get(h);let f=p;for(;d.get(f)!==h;){let _=d.get(f);d.set(f,h),f=_;}return h},c=(p,h)=>{d.set(u(p),u(h));},m=p=>{let h=u(p),f=new Set;for(let[_,k]of a)if(u(_)===h)for(let g of k.atomIds)f.add(g);return f};for(let p of t.bonds){if(p.kind===\"backbone\"||p.kind===\"branch\")continue;let h=s.get(p.a1.id),f=s.get(p.a2.id);if(h===void 0||f===void 0||h.id===f.id)continue;p.kind===\"hbond\"&&(h.strandType===\"as\"&&f.strandType===\"ss\"?l.add(f.id):f.strandType===\"as\"&&h.strandType===\"ss\"?l.add(h.id):h.strandType===\"as\"&&!l.has(f.id)?l.add(f.id):f.strandType===\"as\"&&!l.has(h.id)&&l.add(h.id));let _=f,k=p.a1,g=p.a2;if(l.has(f.id)&&!l.has(h.id))_=h,k=p.a2,g=p.a1;else if(!l.has(h.id)&&!l.has(f.id)){if(l.size>0){let w=new Set;for(let z of l){let de=a.get(z);if(de!==void 0)for(let je of de.atomIds)w.add(je);}let T=Lo(w,e),S=a.get(h.id),R=Co(S.atomIds,e);if(T!==null&&R!==null){let z=T+r*kt-R;z>0&&et(S.atomIds,e,0,z);}}l.add(h.id),_=f,k=p.a1,g=p.a2;}else if(l.has(h.id)&&l.has(f.id)){if(u(h.id)===u(f.id)||p.kind!==\"cross-polymer\")continue;let w=m(h.id),T=m(f.id),S=w.size<=T.size,R=S?w:T,z=S?T:w,de=e.get((S?p.a1:p.a2).id),je=e.get((S?p.a2:p.a1).id);de!==void 0&&je!==void 0&&Fr(R,de,z,je,r,e),c(h.id,f.id);continue}let M=e.get(k.id),A=e.get(g.id);if(!(M===void 0||A===void 0)){if(p.kind===\"hbond\"){let w=a.get(_.id);Or(w.atomIds,e),Nr(w.atomIds,e);let T=e.get(g.id),S=M.x-T.x,R=M.y+r*fn-T.y;R=So(R,w,l,a,e,r*fn),et(w.atomIds,e,S,R);}else if(_.isCyclic&&_.backbone.length>=3){let w=a.get(_.id),T=_.id===h.id?f:h,S=a.get(T.id);Vr(w.atomIds,A,S.atomIds,M,r,e);}else {let w=a.get(_.id),T=M.x-A.x,S=M.y+r*bn-A.y;S=So(S,w,l,a,e,r*bn),et(w.atomIds,e,T,S);}l.add(_.id),c(h.id,f.id);}}return l}function So(i,e,t,n,o,r){let s=Co(e.atomIds,o);if(s===null)return i;let a=null;for(let u of t){let c=n.get(u);if(c===void 0)continue;let m=Lo(c.atomIds,o);m!==null&&(a===null||m>a)&&(a=m);}if(a===null)return i;let l=s+i,d=a+r;return l<d?d-s:i}function Co(i,e){let t=null;for(let n of i){let o=e.get(n);o!==void 0&&(t===null||o.y<t)&&(t=o.y);}return t}function Lo(i,e){let t=null;for(let n of i){let o=e.get(n);o!==void 0&&(t===null||o.y>t)&&(t=o.y);}return t}function et(i,e,t,n){for(let o of i){let r=e.get(o);r!==void 0&&e.set(o,{x:r.x+t,y:r.y+n});}}function Or(i,e){let t=0,n=0;for(let r of i){let s=e.get(r);s!==void 0&&(t+=s.x,n+=1);}if(n===0)return;let o=t/n;for(let r of i){let s=e.get(r);s!==void 0&&e.set(r,{x:2*o-s.x,y:s.y});}}function Nr(i,e){let t=0,n=0;for(let r of i){let s=e.get(r);s!==void 0&&(t+=s.y,n+=1);}if(n===0)return;let o=t/n;for(let r of i){let s=e.get(r);s!==void 0&&e.set(r,{x:s.x,y:2*o-s.y});}}function _n(i,e){let t=0,n=0,o=0;for(let r of i){let s=e.get(r);s!==void 0&&(t+=s.x,n+=s.y,o+=1);}return o===0?{x:0,y:0}:{x:t/o,y:n/o}}function Fr(i,e,t,n,o,r){let s=_n(t,r),a=n.x-s.x,l=n.y-s.y,d=Math.hypot(a,l);d<1e-6&&(a=0,l=1,d=1);let u=a/d,c=l/d,m=n.x+u*o,p=n.y+c*o;et(i,r,m-e.x,p-e.y);}function Gr(i,e,t,n){let o=Math.cos(n),r=Math.sin(n);for(let s of i){let a=e.get(s);if(a===void 0)continue;let l=a.x-t.x,d=a.y-t.y;e.set(s,{x:t.x+l*o-d*r,y:t.y+l*r+d*o});}}function Vr(i,e,t,n,o,r){let s=_n(t,r),a=n.x-s.x,l=n.y-s.y,d=Math.hypot(a,l);d<1e-6&&(a=1,l=0,d=1);let u=a/d,c=l/d,m=_n(i,r),p=Math.hypot(e.x-m.x,e.y-m.y),h=Math.atan2(e.y-m.y,e.x-m.x),f=Math.atan2(-c,-u);Gr(i,r,m,f-h);let _=n.x+u*(o+p),k=n.y+c*(o+p);et(i,r,_-m.x,k-m.y);}function Bo(i,e,t,n){let o=n?.bondLength??28,r=n?.gap??kt,s=1.6*o,a=r*s,l=0,d=false;for(let c of i)if(t.has(c.id)){for(let m of c.backbone){let p=e.get(m.id);p!==void 0&&(d?p.y>l&&(l=p.y):(l=p.y,d=true));}for(let m of c.bases){if(m===null)continue;let p=e.get(m.id);p!==void 0&&p.y>l&&(l=p.y);}}d||(l=0);let u=l+a;for(let c of i){if(t.has(c.id))continue;let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY;for(let f of c.backbone){let _=e.get(f.id);_!==void 0&&(_.y<m&&(m=_.y),_.y>p&&(p=_.y));}for(let f of c.bases){if(f===null)continue;let _=e.get(f.id);_!==void 0&&(_.y<m&&(m=_.y),_.y>p&&(p=_.y));}if(m===Number.POSITIVE_INFINITY){t.add(c.id);continue}let h=u-m;for(let f of c.backbone){let _=e.get(f.id);_!==void 0&&e.set(f.id,{x:_.x,y:_.y+h});}for(let f of c.bases){if(f===null)continue;let _=e.get(f.id);_!==void 0&&e.set(f.id,{x:_.x,y:_.y+h});}u=p+h+a,t.add(c.id);}}var Ur=20,zr=40,Kr=250,Wr=4;function jr(i,e){let t=1,n=Kr;for(;e>n;)t*=2,n*=Wr;return i*t}function ee(i,e){let t=e?.bondLength??28,n=e?.perRow,o=e?.rowsThreshold,r=e?.circleThreshold??20,s=ho(i),a=new Map;for(let d of s){let u=qr(d,i,t,n,o,r);for(let[c,m]of u)a.set(c,m);d.polymerType===\"RNA\"&&To(d,a,{bondLength:t});}let l=Eo(s,a,i,{bondLength:t});Bo(s,a,l,{bondLength:t});for(let d of i.atoms)a.has(d.id)||a.set(d.id,{x:0,y:0});return Yr(i,a)}function qr(i,e,t,n,o,r){let s=i.backbone.length;if(s===0)return new Map;let a=i.polymerType===\"RNA\",d=n??jr(a?zr:Ur,s),u=o??d;if(i.polymerType===\"RNA\"&&ko(i,e))return Mo(i,e,{bondLength:t});if(i.isCyclic&&s<=r)return xt(i,{bondLength:t});if(!i.isCyclic&&go(i,e))return yn(i,e,{bondLength:t});if(s>u){let c=a?2:void 0;return bo(i,c!==void 0?{bondLength:t,perRow:d,rowSpacing:c}:{bondLength:t,perRow:d})}return i.isCyclic?we(i,{bondLength:t}):yn(i,e,{bondLength:t})}function Yr(i,e){let t=new Map,n=[];for(let s of i.atoms){let a=e.get(s.id)??s.p,l={...s,p:{x:a.x,y:a.y}};t.set(s.id,l),n.push(l);}for(let s=0;s<n.length;s++){let a=i.atoms[s];if(a.branchAtom!==void 0){let l=t.get(a.branchAtom.id);l!==void 0&&(n[s]={...n[s],branchAtom:l}),t.set(n[s].id,n[s]);}}let o=[];for(let s of i.bonds){let a=t.get(s.a1.id),l=t.get(s.a2.id);a===void 0||l===void 0||o.push({...s,a1:a,a2:l});}let r=[];for(let s of i.chains){let a=s.backboneAtoms.map(d=>t.get(d.id)??d),l=s.bonds.map(d=>{let u=t.get(d.a1.id)??d.a1,c=t.get(d.a2.id)??d.a2;return {...d,a1:u,a2:c}});r.push({id:s.id,polymerType:s.polymerType,backboneAtoms:a,bonds:l,...s.annotation!==void 0?{annotation:s.annotation}:{},...s.strandType!==void 0?{strandType:s.strandType}:{}});}return {atoms:n,bonds:o,chains:r,groups:i.groups,annotations:i.annotations}}function Tt(i,e){let t=Math.min(i.x,e.x),n=Math.min(i.y,e.y),o=Math.max(i.x+i.width,e.x+e.width),r=Math.max(i.y+i.height,e.y+e.height);return {x:t,y:n,width:o-t,height:r-n}}function x(i){if(Number.isInteger(i))return i===0?\"0\":i.toString();if(!Number.isFinite(i)||Object.is(i,-0))return \"0\";let e=Math.round(i*1e3)/1e3;return e===0?\"0\":e.toString()}function vn(i){if(i.length===0)return \"\";let e=i[0],t=`M ${x(e.x)} ${x(e.y)}`;for(let n=1;n<i.length;n++){let o=i[n];t+=` L ${x(o.x)} ${x(o.y)}`;}return t+=` L ${x(e.x)} ${x(e.y)} Z`,t}function Ro(i,e,t,n){let o=[],r=360/e;for(let s=0;s<e;s++){let a=(n+s*r)*Math.PI/180;o.push({x:i.x+t*Math.cos(a),y:i.y+t*Math.sin(a)});}return o}function Io(i,e,t=-30){return vn(Ro(i,6,e,t))}function Po(i,e){let t=[{x:i.x,y:i.y-e},{x:i.x+e,y:i.y},{x:i.x,y:i.y+e},{x:i.x-e,y:i.y}];return vn(t)}function Ho(i,e,t=-90){return vn(Ro(i,5,e,t))}function wn(i,e,t,n){let o=Math.abs(e)/2,r=Math.abs(t)/2,s=Math.max(0,Math.min(n,o,r)),a=i.x-o,l=i.y-r,d=a+o*2,u=l+r*2,c=`M ${x(a+s)} ${x(l)}`;return c+=` L ${x(d-s)} ${x(l)}`,c+=` A ${x(s)} ${x(s)} 0 0 1 ${x(d)} ${x(l+s)}`,c+=` L ${x(d)} ${x(u-s)}`,c+=` A ${x(s)} ${x(s)} 0 0 1 ${x(d-s)} ${x(u)}`,c+=` L ${x(a+s)} ${x(u)}`,c+=` A ${x(s)} ${x(s)} 0 0 1 ${x(a)} ${x(u-s)}`,c+=` L ${x(a)} ${x(l+s)}`,c+=` A ${x(s)} ${x(s)} 0 0 1 ${x(a+s)} ${x(l)}`,c+=\" Z\",c}function kn(i,e,t){let n=Math.abs(e),o=Math.abs(t);return `M ${x(i.x-n)} ${x(i.y)} A ${x(n)} ${x(o)} 0 1 0 ${x(i.x+n)} ${x(i.y)} A ${x(n)} ${x(o)} 0 1 0 ${x(i.x-n)} ${x(i.y)} Z`}function $o(i,e,t,n){return wn(i,e,t,n)}function Do(i,e){return kn(i,e,e)}function Oo(i,e){return `M ${x(i.x)} ${x(i.y)} L ${x(e.x)} ${x(e.y)}`}function No(i,e,t=6){let n=e.x-i.x,o=e.y-i.y,r=Math.sqrt(n*n+o*o);if(r===0)return `M ${x(i.x)} ${x(i.y)} L ${x(i.x)} ${x(i.y)}`;let s=n/r,a=o/r,l=-a,d=s,u=(i.x+e.x)/2,c=(i.y+e.y)/2,m=t/2,p=Math.min(t*.6,r*.25),h=u-s*p,f=c-a*p,_=u+s*p,k=c+a*p;return `M ${x(h-l*m)} ${x(f-d*m)} L ${x(h+l*m)} ${x(f+d*m)} M ${x(_-l*m)} ${x(k-d*m)} L ${x(_+l*m)} ${x(k+d*m)}`}function xn(i,e,t,n){switch(i){case \"hexagon\":{let o=t*Math.sqrt(3)/2,r=t;return {x:e.x-o,y:e.y-r,width:o*2,height:r*2}}case \"diamond\":return {x:e.x-t,y:e.y-t,width:t*2,height:t*2};case \"pentagon\":{let o=Math.cos(18*Math.PI/180)*t,r=-t,s=Math.sin(54*Math.PI/180)*t;return {x:e.x-o,y:e.y+r,width:o*2,height:s-r}}case \"rounded-rect\":case \"blob\":{let o=n??t,r=Math.abs(t)/2,s=Math.abs(o)/2;return {x:e.x-r,y:e.y-s,width:r*2,height:s*2}}case \"ellipse\":{let o=Math.abs(t),r=Math.abs(n??t);return {x:e.x-o,y:e.y-r,width:o*2,height:r*2}}case \"circle\":{let o=Math.abs(t);return {x:e.x-o,y:e.y-o,width:o*2,height:o*2}}}}var St=14,Fo='\"Helvetica Neue\", Helvetica, Arial, sans-serif';function Go(i){return {aa:{size:i*.72,strokeWidth:5},sugar:{size:i*1.39,strokeWidth:5,cornerRadius:i*.3},base:{size:i*.88,strokeWidth:5},linker:{size:i*.63,strokeWidth:5},chem:{size:i*1.49,strokeWidth:5,cornerRadius:i*.5},blob:{size:i*1.64,strokeWidth:5,cornerRadius:i*.8},nucleotide:{size:i*.98,strokeWidth:5}}}var I={name:\"light\",background:\"#ffffff\",defaultStroke:\"#202020\",defaultFill:\"#ffffff\",selectionColor:\"#FFC107\",highlightColor:\"#A4E2DC\",errorColor:\"#cc0000\",fontSize:St,fontFamily:Fo,bondLength:28,textColor:\"#000000\",idColor:\"#00aa00\",annotationColor:\"#FFA500\",tagDotColor:\"#dd2222\",hbondColor:\"#888888\",nonCanonicalHbondColor:\"#cc8800\",crossPolymerBondColor:\"#1f5fcd\",colorTheme:_e,palette:{softenCanvas:false},shapes:Go(St)},An={name:\"dark\",background:\"#1a1d23\",defaultStroke:\"#e0e0e0\",defaultFill:\"#2b2f37\",selectionColor:\"#FFD54F\",highlightColor:\"#7DD8CC\",errorColor:\"#ff5050\",fontSize:St,fontFamily:Fo,bondLength:28,textColor:\"#ffffff\",idColor:\"#33ff33\",annotationColor:\"#FFB84D\",tagDotColor:\"#ff6464\",hbondColor:\"#aaaaaa\",nonCanonicalHbondColor:\"#ffaa44\",crossPolymerBondColor:\"#6699ff\",colorTheme:Ce,palette:{softenCanvas:false},shapes:Go(St)};function Xr(i,e){let t=e.shapes===void 0?i.shapes:{...i.shapes,...e.shapes};return {...i,...e,shapes:t}}function tt(i,e){switch(e){case b.AA:return i.shapes.aa;case b.SUGAR:return i.shapes.sugar;case b.BASE:return i.shapes.base;case b.LINKER:return i.shapes.linker;case b.CHEM:return i.shapes.chem;case b.BLOB:return i.shapes.blob;case b.NUCLEOTIDE:return i.shapes.nucleotide}}var Vo=\"*\";function Et(i){switch(i){case b.AA:return \"hexagon\";case b.SUGAR:return \"rounded-rect\";case b.BASE:return \"diamond\";case b.LINKER:return \"circle\";case b.CHEM:return \"rounded-rect\";case b.BLOB:return \"blob\";case b.NUCLEOTIDE:return \"pentagon\"}}function Be(i,e,t=0){let n=tt(e,i.biotype);if(i.symbol===Vo)return Do(i.p,n.size+t);switch(Et(i.biotype)){case \"hexagon\":{let r=t===0?0:t/Math.cos(Math.PI/6);return Io(i.p,n.size+r)}case \"diamond\":{let r=t===0?0:t/Math.cos(Math.PI/4);return Po(i.p,n.size+r)}case \"pentagon\":{let r=t===0?0:t/Math.cos(Math.PI/5);return Ho(i.p,n.size+r)}case \"rounded-rect\":return wn(i.p,n.size+2*t,n.size+2*t,(n.cornerRadius??0)+t);case \"blob\":return $o(i.p,n.size+2*t,n.size+2*t,(n.cornerRadius??0)+t);case \"circle\":return kn(i.p,n.size+t,n.size+t)}}function ue(i,e){let t=tt(e,i.biotype),n=i.symbol===Vo?\"circle\":Et(i.biotype),o;switch(n){case \"hexagon\":case \"diamond\":case \"pentagon\":case \"circle\":o=xn(n,i.p,t.size);break;case \"rounded-rect\":case \"blob\":o=xn(n,i.p,t.size,t.size);break}let r=t.strokeWidth/2;return {x:o.x-r,y:o.y-r,width:o.width+2*r,height:o.height+2*r}}function Uo(i,e){return tt(e,i.biotype).size}function me(i,e){return tt(e,i.biotype)}var Jr=/[&\"'<>]/,Zr=/[&<>]/;function Qr(i){return Jr.test(i)?i.replace(/&/g,\"&amp;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&apos;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"):i}function se(i){return Zr.test(i)?i.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"):i}function ke(i){if(Number.isInteger(i))return i===0?\"0\":i.toString();if(!Number.isFinite(i)||Object.is(i,-0))return \"0\";let e=Math.round(i*1e3)/1e3;return e===0?\"0\":e.toString()}function L(i,e,t){let n=`<${i}`;if(e!==void 0)for(let o in e){let r=e[o];if(!(r===void 0||r===false)){if(r===true){n+=` ${o}`;continue}typeof r==\"number\"?n+=` ${o}=\"${ke(r)}\"`:n+=` ${o}=\"${Qr(r)}\"`;}}return t===void 0?`${n}/>`:typeof t==\"string\"?`${n}>${t}</${i}>`:`${n}>${t.join(\"\")}</${i}>`}var es=\"http://www.w3.org/2000/svg\",Mn=.525,Tn=.8,Sn=1.125,ts=\".hw-atom{transition:stroke-width 120ms,filter 120ms;}.hw-atom:focus{outline:none;}.hw-atom__shape{shape-rendering:geometricPrecision;}.hw-bond__stroke{stroke-linecap:round;}\",ns=[[\"A\",\"T\"],[\"A\",\"U\"],[\"G\",\"C\"]];function Lt(i,e={}){let t=e.theme??I,n=e.width??400,o=e.height??100,r=e.padding??16,s=e.backColor??t.background,a=e.showIds??false,l=e.showAnnotations??true,d=e.fontSize??t.fontSize,u=e.selectedAtomIds??new Set,c=e.highlightedAtomIds??new Set;e.documentImpl??(typeof globalThis<\"u\"&&typeof globalThis.document<\"u\"?globalThis.document:void 0);let p=e.fixedModelBbox??En(i,t),h=os(p,n,o,r,e.maxScale??1),f=h.x-p.x*h.scale,_=h.y-p.y*h.scale,k=Cn(i,t,c),g=Ln(i,t,u),M=is(i,t),A=cs(i,t,d,a,e.bondLength??t.bondLength),w=l?ps(i,t,d):\"\",T=`translate(${ke(f)} ${ke(_)}) scale(${ke(h.scale)})`,S=L(\"g\",{class:\"hw-content\",transform:T},[M,A,w,k,g].join(\"\")),R=L(\"defs\",void 0,`<style>${ts}</style>`),z=L(\"rect\",{class:\"hw-bg\",x:0,y:0,width:n,height:o,fill:s});return {svg:L(\"svg\",{xmlns:es,viewBox:`0 0 ${ke(n)} ${ke(o)}`,width:n,height:o,\"data-hw-theme\":t.name},[R,z,S].join(\"\")),bbox:{x:p.x,y:p.y,width:p.width,height:p.height},drawBox:{x:h.x,y:h.y,width:h.width,height:h.height,scale:h.scale}}}function En(i,e=I){if(i.atoms.length===0)return {x:0,y:0,width:0,height:0};let t=ue(i.atoms[0],e);for(let n=1;n<i.atoms.length;n++)t=Tt(t,ue(i.atoms[n],e));return t}function os(i,e,t,n,o=1){let r=Math.max(0,e-2*n),s=Math.max(0,t-2*n),a=1;if(i.width>0||i.height>0){let u=i.width>0?r/i.width:Number.POSITIVE_INFINITY,c=i.height>0?s/i.height:Number.POSITIVE_INFINITY;a=Math.min(u,c,o),(!Number.isFinite(a)||a<=0)&&(a=1);}let l=i.width*a,d=i.height*a;return {x:(e-l)/2,y:(t-d)/2,width:l,height:d,scale:a}}var Ct=3;function Cn(i,e,t){if(t.size===0)return L(\"g\",{class:\"hw-layer hw-highlights\"},\"\");let n=[];for(let o of i.atoms){if(!t.has(o.id))continue;let s=(me(o,e).strokeWidth+Ct)/2,a=Be(o,e,s);n.push(L(\"path\",{d:a,class:\"hw-highlight\",fill:\"none\",stroke:e.highlightColor,\"stroke-width\":Ct,\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\",\"data-symbol\":o.symbol,\"data-ring-atom-id\":o.id,\"data-testid\":`highlight-ring-${o.id}`}));}return L(\"g\",{class:\"hw-layer hw-highlights\"},n.join(\"\"))}function Ln(i,e,t){if(t.size===0)return L(\"g\",{class:\"hw-layer hw-selections\"},\"\");let n=[];for(let o of i.atoms){if(!t.has(o.id))continue;let s=(me(o,e).strokeWidth+Ct)/2,a=Be(o,e,s);n.push(L(\"path\",{d:a,class:\"hw-selection\",fill:\"none\",stroke:e.selectionColor,\"stroke-width\":Ct,\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\",\"data-symbol\":o.symbol,\"data-ring-atom-id\":o.id,\"data-testid\":`selection-ring-${o.id}`}));}return L(\"g\",{class:\"hw-layer hw-selections\"},n.join(\"\"))}function is(i,e){let t=[];for(let n of i.bonds)t.push(rs(n,e));return L(\"g\",{class:\"hw-layer hw-bonds\"},t.join(\"\"))}function rs(i,e){let t=i.a1.p,n=i.a2.p,o=ss(i,e),r=as(i),s=ls(),l={d:Oo(t,n),class:\"hw-bond__stroke\",fill:\"none\",stroke:o,\"stroke-width\":s};r!==void 0&&(l[\"stroke-dasharray\"]=r);let d=[L(\"path\",l)];return i.kind===\"hbond\"&&d.push(L(\"path\",{d:No(t,n,e.fontSize*.6),class:\"hw-bond__hash\",fill:\"none\",stroke:o,\"stroke-width\":s})),L(\"g\",{class:`hw-bond hw-bond--${i.kind}`,\"data-bond-id\":i.id,\"data-kind\":i.kind,\"data-testid\":`canvas-bond-${i.id}`},d.join(\"\"))}function ss(i,e){switch(i.kind){case \"backbone\":case \"branch\":return e.defaultStroke;case \"cross-polymer\":return e.crossPolymerBondColor;case \"hbond\":return ds(i)?e.hbondColor:e.nonCanonicalHbondColor;case \"group\":return e.defaultStroke}}function as(i){if(i.kind===\"hbond\")return \"4 3\"}function ls(i){return Sn}function ds(i){if(i.a1.biotype!==b.BASE||i.a2.biotype!==b.BASE)return false;let e=zo(i.a1),t=zo(i.a2);for(let[n,o]of ns)if(e===n&&t===o||e===o&&t===n)return true;return false}function zo(i){let e=i.monomer?.naturalAnalog,t=e!==void 0&&e!==\"\"?e:i.symbol;return t.length===0?\"\":t.charAt(0).toUpperCase()}function cs(i,e,t,n,o=e.bondLength){let r=[];for(let s of i.atoms)s.hidden||r.push(us(s,e,t,n,o));return L(\"g\",{class:\"hw-layer hw-atoms\"},r.join(\"\"))}function us(i,e,t,n,o=e.bondLength){let r=me(i,e),s=Be(i,e),a=P(i.monomer,i.biotype,e.colorTheme),l=a.background,d=a.text,u=i.symbol===\"*\"?\"3 3\":void 0,c={d:s,class:\"hw-atom__shape\",fill:l,stroke:l,\"stroke-width\":r.strokeWidth,\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\"};u!==void 0&&(c[\"stroke-dasharray\"]=u);let m=[L(\"path\",c)],p=i.monomer?.symbol??i.symbol;if(p!==\"\"){let f=p.length<=1?1:Math.min(1,2/p.length),_=t*f;m.push(L(\"text\",{class:\"hw-atom__label\",x:i.p.x,y:i.p.y+_*.35,\"text-anchor\":\"middle\",\"font-size\":_,\"font-family\":e.fontFamily,fill:d},se(p)));}if(i.bio.ambiguity!==void 0&&i.bio.ambiguity!==\"\"&&m.push(L(\"text\",{class:\"hw-atom__ambiguity\",x:i.p.x,y:i.p.y+r.size+t*.7,\"text-anchor\":\"middle\",\"font-size\":t*.7,\"font-family\":e.fontFamily,fill:d},se(i.bio.ambiguity))),n){let f=o*Mn;m.push(L(\"text\",{class:\"hw-atom__id\",x:i.p.x-f,y:i.p.y-f,\"font-size\":t*Tn,\"font-family\":e.fontFamily,fill:e.idColor},se(String(i.bio.continuousId))));}i.tag!==void 0&&i.tag!==\"\"&&m.push(L(\"circle\",{class:\"hw-atom__tag-dot\",cx:i.p.x+r.size*.7,cy:i.p.y-r.size*.7,r:Math.max(2,t*.18),fill:e.tagDotColor}));let h=ms(i);return L(\"g\",{class:\"hw-atom\",\"data-atom-id\":i.id,\"data-symbol\":i.symbol,\"data-chain-id\":i.bio.chainId,\"data-biotype\":i.biotype,\"data-testid\":`canvas-atom-${i.id}`,tabindex:0,role:\"button\",\"aria-label\":h},m.join(\"\"))}function ms(i){let e=i.symbol===\"\"?\"?\":i.symbol,t=i.bio.chainId===\"\"?\"unknown chain\":i.bio.chainId,n=i.bio.positionInChain;return `${e} at position ${n} of ${t}`}function ps(i,e,t){let n=[];for(let o of i.bonds){if(o.ratio===void 0)continue;let r=(o.a1.p.x+o.a2.p.x)/2,s=(o.a1.p.y+o.a2.p.y)/2,a=o.ratio.denominator!==void 0?`${o.ratio.numerator}/${o.ratio.denominator}`:`${o.ratio.numerator}`;n.push(L(\"text\",{class:\"hw-annotation hw-annotation--bond-ratio\",x:r,y:s-t*.4,\"text-anchor\":\"middle\",\"font-size\":t*.7,\"font-family\":e.fontFamily,fill:e.annotationColor},se(a)));}for(let o of i.atoms){let r=o.bio.annotation;if(r===void 0||r===\"\")continue;let s=me(o,e);n.push(L(\"text\",{class:\"hw-annotation hw-annotation--atom\",x:o.p.x+s.size+2,y:o.p.y-s.size,\"font-size\":t*.7,\"font-family\":e.fontFamily,fill:e.annotationColor},se(r)));}for(let o of i.chains){if(o.annotation===void 0||o.annotation===\"\")continue;let r=o.backboneAtoms[0];r!==void 0&&n.push(L(\"text\",{class:\"hw-annotation hw-annotation--chain\",x:r.p.x,y:r.p.y-e.fontSize*1.4,\"font-size\":t*.8,\"font-family\":e.fontFamily,fill:e.annotationColor},se(o.annotation)));}for(let o of i.chains){if(o.polymerType!==\"RNA\")continue;let r=o.backboneAtoms;if(r.length<2)continue;let s=r[0],a=r[r.length-1],l=r.length>=2?r[1]:null,d=r.length>=2?r[r.length-2]:null,u=e.fontSize*1.4,c=Ko(s.p,l?.p??null,u),m=Ko(a.p,d?.p??null,u),p=o.strandType!==void 0?`5'${o.strandType}`:\"5'\",h=o.strandType!==void 0?`3'${o.strandType}`:\"3'\";n.push(L(\"text\",{class:\"hw-annotation hw-annotation--prime hw-annotation--prime-5\",\"data-testid\":`prime-5-${o.id}`,x:c.x,y:c.y,\"text-anchor\":\"middle\",\"dominant-baseline\":\"central\",\"font-size\":t*.85,\"font-family\":e.fontFamily,\"font-weight\":\"bold\",fill:e.annotationColor},se(p))),n.push(L(\"text\",{class:\"hw-annotation hw-annotation--prime hw-annotation--prime-3\",\"data-testid\":`prime-3-${o.id}`,x:m.x,y:m.y,\"text-anchor\":\"middle\",\"dominant-baseline\":\"central\",\"font-size\":t*.85,\"font-family\":e.fontFamily,\"font-weight\":\"bold\",fill:e.annotationColor},se(h)));}return L(\"g\",{class:\"hw-layer hw-annotations\"},n.join(\"\"))}function Ko(i,e,t){if(e===null)return {x:i.x-t,y:i.y};let n=i.x-e.x,o=i.y-e.y,r=Math.hypot(n,o);return r===0?{x:i.x-t,y:i.y}:{x:i.x+t*(n/r),y:i.y+t*(o/r)}}function Bt(i,e,t,n={}){let o=n.theme??I,r=n.padding??16,s=fs(e,o),a=bs(s,t.width,t.height,r,n.maxScale??1),l=t.x+a.x,d=t.y+a.y;return i.save(),i.beginPath(),i.rect(t.x,t.y,t.width,t.height),i.clip(),n.backColor!==void 0&&(i.fillStyle=n.backColor,i.fillRect(t.x,t.y,t.width,t.height)),i.translate(l,d),i.scale(a.scale,a.scale),i.translate(-s.x,-s.y),ys(i,e,o),_s(i,e,o,n.fontSize??o.fontSize,n.showIds??false,n.bondLength??o.bondLength),n.showAnnotations!==false&&gs(i,e,o,n.fontSize??o.fontSize),i.restore(),{bbox:{x:s.x,y:s.y,width:s.width,height:s.height},drawBox:{x:l,y:d,width:a.width,height:a.height}}}async function Yo(i,e={}){let t=hs();if(t===null&&e.canvas===void 0)throw new Error(\"renderToPng: OffscreenCanvas is not available in this environment\");let n=e.theme??I,o=e.width??400,r=e.height??100,s=e.pixelRatio??1,a=e.canvas??new t(Math.max(1,Math.round(o*s)),Math.max(1,Math.round(r*s))),l=a.getContext(\"2d\");if(l===null)throw new Error(\"renderToPng: failed to acquire 2D context\");l.save(),l.scale(s,s),Bt(l,i,{x:0,y:0,width:o,height:r},{...e,backColor:e.backColor??n.background}),l.restore();let d=a;if(typeof d.convertToBlob!=\"function\")throw new Error(\"renderToPng: canvas.convertToBlob is not available\");let c=await(await d.convertToBlob({type:\"image/png\"})).arrayBuffer();return new Uint8Array(c)}function hs(){let i=globalThis;return typeof i.OffscreenCanvas==\"function\"?i.OffscreenCanvas:null}function fs(i,e){if(i.atoms.length===0)return {x:0,y:0,width:0,height:0};let t=ue(i.atoms[0],e);for(let n=1;n<i.atoms.length;n++)t=Tt(t,ue(i.atoms[n],e));return t}function bs(i,e,t,n,o=1){let r=Math.max(0,e-2*n),s=Math.max(0,t-2*n),a=1;if(i.width>0||i.height>0){let u=i.width>0?r/i.width:Number.POSITIVE_INFINITY,c=i.height>0?s/i.height:Number.POSITIVE_INFINITY;a=Math.min(u,c,o),(!Number.isFinite(a)||a<=0)&&(a=1);}let l=i.width*a,d=i.height*a;return {x:(e-l)/2,y:(t-d)/2,width:l,height:d,scale:a}}function ys(i,e,t){for(let n of e.bonds)i.save(),i.strokeStyle=ws(n,t),i.lineWidth=ks(),n.kind===\"hbond\"?i.setLineDash([4,3]):i.setLineDash([]),i.beginPath(),i.moveTo(n.a1.p.x,n.a1.p.y),i.lineTo(n.a2.p.x,n.a2.p.y),i.stroke(),i.restore();}function gs(i,e,t,n){i.save(),i.fillStyle=t.annotationColor,i.font=`${n*.7}px ${t.fontFamily}`,i.textAlign=\"left\",i.textBaseline=\"alphabetic\";for(let r of e.atoms){let s=r.bio.annotation;if(s===void 0||s===\"\")continue;let a=me(r,t);i.fillText(s,r.p.x+a.size+2,r.p.y-a.size);}i.font=`${n*.8}px ${t.fontFamily}`;for(let r of e.chains){if(r.annotation===void 0||r.annotation===\"\")continue;let s=r.backboneAtoms[0];s!==void 0&&i.fillText(r.annotation,s.p.x,s.p.y-t.fontSize*1.4);}i.font=`bold ${n*.85}px ${t.fontFamily}`,i.textAlign=\"center\",i.textBaseline=\"middle\";let o=t.fontSize*1.4;for(let r of e.chains){if(r.polymerType!==\"RNA\")continue;let s=r.backboneAtoms;if(s.length<2)continue;let a=s[0],l=s[s.length-1],d=s.length>=2?s[1]:null,u=s.length>=2?s[s.length-2]:null,c=Wo(a.p,d?.p??null,o),m=Wo(l.p,u?.p??null,o),p=r.strandType!==void 0?`5'${r.strandType}`:\"5'\",h=r.strandType!==void 0?`3'${r.strandType}`:\"3'\";i.fillText(p,c.x,c.y),i.fillText(h,m.x,m.y);}i.restore();}function Wo(i,e,t){if(e===null)return {x:i.x-t,y:i.y};let n=i.x-e.x,o=i.y-e.y,r=Math.hypot(n,o);return r===0?{x:i.x-t,y:i.y}:{x:i.x+t*(n/r),y:i.y+t*(o/r)}}function _s(i,e,t,n,o=false,r=t.bondLength){for(let s of e.atoms){if(s.hidden)continue;let a=me(s,t),l=P(s.monomer,s.biotype,t.colorTheme);i.save(),i.fillStyle=l.background,i.strokeStyle=l.background,i.lineWidth=a.strokeWidth,i.lineJoin=\"round\",i.lineCap=\"round\",s.symbol===\"*\"?i.setLineDash([3,3]):i.setLineDash([]),vs(i,s,a.size,a.cornerRadius??0),i.fill(),i.stroke(),i.restore();let d=s.monomer?.symbol??s.symbol;if(d!==\"\"){let u=d.length<=1?1:Math.min(1,2/d.length),c=n*u;i.save(),i.fillStyle=l.text,i.font=`${c}px ${t.fontFamily}`,i.textAlign=\"center\",i.textBaseline=\"middle\",i.fillText(d,s.p.x,s.p.y),i.restore();}if(o){let u=r*Mn;i.save(),i.fillStyle=t.idColor,i.font=`${n*Tn}px ${t.fontFamily}`,i.textAlign=\"right\",i.textBaseline=\"bottom\",i.fillText(String(s.bio.continuousId),s.p.x-u,s.p.y-u),i.restore();}}}function vs(i,e,t,n){let o=e.p,r=e.symbol===\"*\"?\"circle\":Et(e.biotype);switch(i.beginPath(),r){case \"hexagon\":jo(i,o,6,t,-30);break;case \"diamond\":i.moveTo(o.x,o.y-t),i.lineTo(o.x+t,o.y),i.lineTo(o.x,o.y+t),i.lineTo(o.x-t,o.y),i.closePath();break;case \"pentagon\":jo(i,o,5,t,-90);break;case \"rounded-rect\":case \"blob\":{let s=t/2,a=Math.max(0,Math.min(n,s)),l=o.x-s,d=o.y-s,u=s*2,c=s*2;i.moveTo(l+a,d),i.lineTo(l+u-a,d),i.quadraticCurveTo(l+u,d,l+u,d+a),i.lineTo(l+u,d+c-a),i.quadraticCurveTo(l+u,d+c,l+u-a,d+c),i.lineTo(l+a,d+c),i.quadraticCurveTo(l,d+c,l,d+c-a),i.lineTo(l,d+a),i.quadraticCurveTo(l,d,l+a,d),i.closePath();break}case \"circle\":i.ellipse(o.x,o.y,t,t,0,0,Math.PI*2);break}}function jo(i,e,t,n,o){let r=360/t;for(let s=0;s<t;s++){let a=(o+s*r)*Math.PI/180,l=e.x+n*Math.cos(a),d=e.y+n*Math.sin(a);s===0?i.moveTo(l,d):i.lineTo(l,d);}i.closePath();}function ws(i,e){switch(i.kind){case \"backbone\":case \"branch\":return e.defaultStroke;case \"cross-polymer\":return e.crossPolymerBondColor;case \"hbond\":return As(i)?e.hbondColor:e.nonCanonicalHbondColor;case \"group\":return e.defaultStroke}}function ks(i){return Sn}var xs=[[\"A\",\"T\"],[\"A\",\"U\"],[\"G\",\"C\"]];function As(i){if(i.a1.biotype!==b.BASE||i.a2.biotype!==b.BASE)return false;let e=qo(i.a1),t=qo(i.a2);for(let[n,o]of xs)if(e===n&&t===o||e===o&&t===n)return true;return false}function qo(i){let e=i.monomer?.naturalAnalog,t=e!==void 0&&e!==\"\"?e:i.symbol;return t.length===0?\"\":t.charAt(0).toUpperCase()}function pe(i){let e=new Map,t=new Map;for(let o of i.bonds){let r=o.a1.id,s=o.a2.id,a=t.get(r);a===void 0&&(a=[],t.set(r,a)),a.push(o);let l=t.get(s);l===void 0&&(l=[],t.set(s,l)),l.push(o);}for(let o of i.atoms)Xo(e,o,t.get(o.id)??[]);for(let o of i.groups){if(o.kind!==\"bracket\")continue;let r=o.repeat?.min??1;if(r===1)continue;let s=new Set(o.members.map(l=>l.target)),a=new Map;for(let l of i.atoms){if(!s.has(l.bio.chainId))continue;let d=new Map;Xo(d,l,t.get(l.id)??[]);for(let[u,c]of d)a.set(u,(a.get(u)??0)+c*(r-1));}for(let[l,d]of a)e.set(l,(e.get(l)??0)+d);}for(let[o,r]of [...e])r===0&&e.delete(o);let n=Ss(e);return {elements:e,mw:n}}var Ms={H:1.008,C:12.011,N:14.007,O:15.999,F:18.998,Na:22.99,Mg:24.305,P:30.974,S:32.06,Cl:35.45,K:39.098,Ca:40.078,Br:79.904,I:126.904,Fe:55.845,Zn:65.38,Cu:63.546},Ts={C:4,N:3,O:2,S:2,P:3,F:1,Cl:1,Br:1,I:1,H:1};function Ss(i){let e=0;for(let[t,n]of i){let o=Ms[t];o!==void 0&&(e+=o*n);}return Math.round(e*1e3)/1e3}function Xo(i,e,t){if(e.monomer===null)return;let n=Cs(e.monomer);for(let[o,r]of n.elements)i.set(o,(i.get(o)??0)+r);for(let o of t){if(o.kind===\"hbond\"||o.kind===\"group\")continue;let r=o.a1.id===e.id?o.r1:o.r2,s=Es(e.monomer,r);if(s===void 0)continue;let a=Zo(s);for(let[l,d]of a)i.set(l,(i.get(l)??0)-d);}}function Es(i,e){if(e.kind!==\"numeric\"&&e.kind!==\"positional\")return;let t=(e.kind===\"numeric\",e.r);for(let n of i.rgroups){let o=/^R([1-9][0-9]*)$/.exec(n.label);if(o!==null&&parseInt(o[1],10)===t)return n.capGroupName}}function Zo(i){let e=new Map;switch(i){case \"H\":e.set(\"H\",1);break;case \"OH\":e.set(\"H\",1),e.set(\"O\",1);break;}return e}var Jo=new WeakMap;function Cs(i){let e=Jo.get(i);if(e!==void 0)return e;let t=Ls(i);return Jo.set(i,t),t}function Ls(i){let e=new Map;if(i.molfile===void 0||i.molfile===\"\")return {elements:e};let t=Bs(i.molfile);if(t===null)return {elements:e};let{atoms:n,bondOrders:o}=t;for(let r=0;r<n.length;r++){let s=n[r];if(s===\"R\"||s===\"R#\"||s===\"*\")continue;e.set(s,(e.get(s)??0)+1);let a=Ts[s];if(a===void 0)continue;let l=o[r]??0,d=a-l;d>0&&e.set(\"H\",(e.get(\"H\")??0)+d);}for(let r of i.rgroups){let s=r.capGroupName;if(s===void 0)continue;let a=Zo(s);for(let[l,d]of a)e.set(l,(e.get(l)??0)+d);}return {elements:e}}function Bs(i){let e=i.split(/\\r\\n|\\n|\\r/);if(e.length<5)return null;let t=e[3];if(t===void 0||t.length<6)return null;let n=parseInt(t.slice(0,3),10),o=parseInt(t.slice(3,6),10);if(!Number.isFinite(n)||!Number.isFinite(o)||e.length<4+n+o)return null;let r=[];for(let a=0;a<n;a++){let l=e[4+a];if(l===void 0)return null;let d=l.slice(31,34).trim();r.push(d);}let s=new Array(n).fill(0);for(let a=0;a<o;a++){let l=e[4+n+a];if(l===void 0)return null;let d=parseInt(l.slice(0,3),10),u=parseInt(l.slice(3,6),10),c=parseInt(l.slice(6,9),10);if(!Number.isFinite(d)||!Number.isFinite(u)||!Number.isFinite(c))continue;let m=c===4?1:c;d>=1&&d<=n&&(s[d-1]=(s[d-1]??0)+m),u>=1&&u<=n&&(s[u-1]=(s[u-1]??0)+m);}return {atoms:r,bondOrders:s}}function Re(i){return pe(i).mw}var Bn={W:5.5,Y:1.49,C:.0625},Rs={AA:13.65,AC:10.67,AG:12.79,AU:12.14,CA:10.67,CC:7.52,CG:9.39,CU:8.37,GA:12.79,GC:9.39,GG:11.77,GU:10.21,UA:12.14,UC:8.37,UG:10.21,UU:8.99},Qo={A:15.4,C:7.4,G:11.7,U:10,T:8.8};function Ie(i){let e=0;for(let t of i.chains)t.polymerType===\"PEPTIDE\"?e+=Is(t.backboneAtoms):t.polymerType===\"RNA\"&&(e+=Ps(t.backboneAtoms));return Math.round(e*1e4)/1e4}function Is(i){let e=0,t=0,n=0;for(let o of i){let r=ei(o);r===\"W\"?e++:r===\"Y\"?t++:r===\"C\"&&n++;}return Bn.W*e+Bn.Y*t+Bn.C*n}function Ps(i){let e=[];for(let o of i)if(o.branchAtom!==void 0&&o.branchAtom.biotype===b.BASE){let r=ei(o.branchAtom);r===\"T\"&&(r=\"U\"),r!==\"\"&&e.push(r);}if(e.length===0)return 0;if(e.length===1){let o=e[0];return Qo[o]??0}let t=0;for(let o=0;o<e.length-1;o++){let r=e[o],s=e[o+1],a=Rs[r+s];a!==void 0&&(t+=a);}let n=0;for(let o=1;o<e.length-1;o++){let r=e[o];n+=Qo[r]??0;}return 2*t-n}function ei(i){let e=i.monomer;return e!==null&&e.naturalAnalog!==void 0&&e.naturalAnalog!==\"\"?e.naturalAnalog.charAt(0).toUpperCase():i.symbol===\"\"?\"\":i.symbol.charAt(0).toUpperCase()}function Rt(i){let e=[];e.push(\"HWE pseudo-molfile\"),e.push(\" HWE 2D\"),e.push(\"\");let t=i.atoms.length,n=i.bonds.length;e.push(Hs(t,n));for(let r of i.atoms)e.push($s(r));let o=new Map;for(let r=0;r<i.atoms.length;r++)o.set(i.atoms[r].id,r+1);for(let r of i.bonds){let s=o.get(r.a1.id),a=o.get(r.a2.id);s===void 0||a===void 0||e.push(Ds(s,a));}return e.push(\"M END\"),e.join(`\n`)+`\n`}function Hs(i,e){return Pe(i)+Pe(e)+\" 0 0 0 0 0 0 0 0999 V2000\"}function $s(i){let e=Os(i);return Rn(i.p.x)+Rn(i.p.y)+Rn(0)+\" \"+Ns(e,3)+\" 0 0 0 0 0 0 0 0 0 0 0 0\"}function Ds(i,e){return Pe(i)+Pe(e)+Pe(1)+Pe(0)}function Os(i){let e=i.monomer;return e!==null&&e.symbol!==\"\"?e.symbol:i.symbol!==\"\"?i.symbol:e!==null&&e.naturalAnalog!==void 0&&e.naturalAnalog!==\"\"?e.naturalAnalog:\"X\"}function Pe(i){let e=String(i);return e.length>=3?e:\" \".repeat(3-e.length)+e}function Ns(i,e){return i.length>=e?i:i+\" \".repeat(e-i.length)}function Rn(i){let e=i.toFixed(4);return e.length>=10?e.slice(0,10):\" \".repeat(10-e.length)+e}function Fs(i){return `${i.mode}|${i.resolveMonomers?1:0}|${i.helm}`}function Gs(i){let e=i.chains.map(o=>`${o.id}:${o.polymerType}:${o.backboneAtoms.length}`).join(\",\"),t=i.atoms.map(o=>`${o.id}@${o.symbol}@${o.bio.chainId}`).join(\";\"),n=i.bonds.map(o=>`${o.id}:${o.a1.id}-${o.a2.id}:${o.kind}`).join(\";\");return `${e}#${t}#${n}`}var Vs=256,In=class{constructor(e){this._destroyed=false;this._parseHits=0;this._parseMisses=0;this._layoutHits=0;this._layoutMisses=0;this._renderHits=0;this._renderMisses=0;if(e.monomerLib===void 0||e.monomerLib===null)throw new TypeError(\"HelmService: options.monomerLib is required\");this.monomerLib=e.monomerLib,this.theme=e.theme??I,this.logger=e.logger??new Me,this.options=Object.freeze({...e});let t=e.cacheSize??Vs;this._parseCache=new Ae({max:t}),this._layoutCache=new Ae({max:t}),this._renderCache=new Ae({max:t}),this._libUnsub=this.monomerLib.onChanged.subscribe(()=>{this.clearCaches();});}parse(e,t){this._ensureLive(),e=this._normalizeHelm(e);let n=t?.mode??\"lenient\",o=t?.resolveMonomers!==false,r=Fs({mode:n,resolveMonomers:o,helm:e}),s=this._parseCache.get(r);if(s!==void 0)return this._parseHits+=1,s;this._parseMisses+=1;let a={mode:n,resolveMonomers:o},l=Qe(e,this.monomerLib,a),d={mol:l.mol,diagnostics:Object.freeze([...l.diagnostics])};return this._parseCache.set(r,d),d}serialize(e,t){this._ensureLive();let n={...t?.canonicalize!==void 0?{canonicalize:t.canonicalize}:{},...t?.includeHighlights!==void 0?{includeHighlights:t.includeHighlights}:{},...t?.version!==void 0?{version:t.version}:{}};return Le(e,n)}validate(e,t){this._ensureLive(),e=this._normalizeHelm(e);let{mol:n,diagnostics:o}=this.parse(e,{mode:\"lenient\"}),r=t?.mode!==void 0?{mode:t.mode}:{},s=pn(n,this.monomerLib,r);return [...o,...s]}canonicalize(e){this._ensureLive(),e=this._normalizeHelm(e);let{mol:t}=this.parse(e,{mode:\"lenient\"}),n=un(t);return Le(n,{canonicalize:true,version:\"V2.0\"})}removeGaps(e){return this._ensureLive(),mn(this._normalizeHelm(e),this.monomerLib)}renderToSvg(e,t){this._ensureLive(),e=this._normalizeHelm(e);let n=this._resolveRenderOptions(t),o=this._renderKey(e,n),r=this._renderCache.get(o);if(r!==void 0)return this._renderHits+=1,r;this._renderMisses+=1;let{mol:s}=this.parse(e,{mode:\"lenient\"}),a=this._layout(s,n.bondLength),{svg:l}=Lt(a,n);return this._renderCache.set(o,l),l}renderMol(e,t){this._ensureLive();let n=this._resolveRenderOptions(t),{svg:o}=Lt(e,n);return o}renderMolResult(e,t){this._ensureLive();let n=this._resolveRenderOptions(t);return Lt(e,n)}async renderToPng(e,t){if(this._ensureLive(),e=this._normalizeHelm(e),typeof globalThis.OffscreenCanvas!=\"function\")throw new K(\"png-rendering-requires-browser\",\"HelmService.renderToPng requires OffscreenCanvas (browser-only).\");let n=this._resolveRenderOptions(t),{mol:o}=this.parse(e,{mode:\"lenient\"}),r=this._layout(o,n.bondLength);return Yo(r,n)}renderToCanvas(e,t,n,o){this._ensureLive(),t=this._normalizeHelm(t);let r=this._resolveRenderOptions(o),{mol:s}=this.parse(t,{mode:\"lenient\"}),a=this._layout(s,r.bondLength),{bbox:l,drawBox:d}=Bt(e,a,n,r);return {mol:a,bbox:l,drawBox:d}}renderMolToCanvas(e,t,n,o){this._ensureLive();let r=this._resolveRenderOptions(o),{bbox:s,drawBox:a}=Bt(e,t,n,r);return {mol:t,bbox:s,drawBox:a}}*renderMany(e,t){for(let n of e??[]){let o=this.renderToSvg(n.helm,t);yield {id:n.id,svg:o};}}getFormula(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return pe(t)}getMolWeight(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return Re(t)}getExtinctionCoefficient(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return Ie(t)}getMolfile(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return Rt(t)}hasAtomicMolfileProvider(){return typeof this.options.atomicMolfileProvider==\"function\"}async getAtomicMolfile(e){this._ensureLive(),e=this._normalizeHelm(e);let t=this.options.atomicMolfileProvider;if(typeof t!=\"function\")throw new K(\"atomic-molfile-not-configured\",\"Set HelmServiceOptions.atomicMolfileProvider to enable atomic-level expansion.\");return await t(e,this.monomerLib)}invalidate(e){if(e===void 0){this.clearCaches();return}for(let t of [this._parseCache,this._layoutCache,this._renderCache]){let n=[];for(let o of t.keys())e(o)&&n.push(o);for(let o of n)t.delete(o);}}clearCaches(){this._parseCache.clear(),this._layoutCache.clear(),this._renderCache.clear(),this._parseHits=0,this._parseMisses=0,this._layoutHits=0,this._layoutMisses=0,this._renderHits=0,this._renderMisses=0;}destroy(){this._destroyed||(this._destroyed=true,this._libUnsub(),this.clearCaches());}_ensureLive(){if(this._destroyed)throw new K(\"service-destroyed\",\"HelmService instance has been destroyed.\")}_normalizeHelm(e){return e==null?\"\":typeof e==\"string\"?e:String(e)}_resolveRenderOptions(e){let t={},n=e?.theme??this.theme;return t.theme=n,e?.width!==void 0&&(t.width=e.width),e?.height!==void 0&&(t.height=e.height),e?.backColor!==void 0&&(t.backColor=e.backColor),e?.padding!==void 0&&(t.padding=e.padding),e?.showIds!==void 0&&(t.showIds=e.showIds),e?.showAnnotations!==void 0&&(t.showAnnotations=e.showAnnotations),e?.bondLength!==void 0&&(t.bondLength=e.bondLength),e?.fontSize!==void 0&&(t.fontSize=e.fontSize),e?.maxScale!==void 0&&(t.maxScale=e.maxScale),e?.showRGroupLabels!==void 0&&(t.showRGroupLabels=e.showRGroupLabels),e?.selectedAtomIds!==void 0&&(t.selectedAtomIds=e.selectedAtomIds),e?.highlightedAtomIds!==void 0&&(t.highlightedAtomIds=e.highlightedAtomIds),e?.fixedModelBbox!==void 0&&(t.fixedModelBbox=e.fixedModelBbox),t}_renderKey(e,t){let o=(t.theme??this.theme).name,r=this._libCacheTag(),s=t.width??0,a=t.height??0,l=t.padding??-1,d=t.bondLength??-1,u=t.backColor??\"\",c=t.showIds===true?1:0,m=t.showAnnotations===false?0:1,p=t.maxScale??1;return `${r}|${o}|${s}x${a}|p${l}|b${d}|bg${u}|i${c}a${m}|s${p}|${e}`}_layout(e,t){let n=Gs(e),o=`${this._libCacheTag()}|${t??\"d\"}|${n}`,r=this._layoutCache.get(o);if(r!==void 0)return this._layoutHits+=1,r;this._layoutMisses+=1;let s=t!==void 0?ee(e,{bondLength:t}):ee(e);return this._layoutCache.set(o,s),s}get stats(){return {parseHits:this._parseHits,parseMisses:this._parseMisses,layoutHits:this._layoutHits,layoutMisses:this._layoutMisses,renderHits:this._renderHits,renderMisses:this._renderMisses}}_libCacheTag(){let e=this.monomerLib,t=typeof e.version==\"number\"?e.version:0;return `${this.monomerLib.source}@${t}`}};var J=class{constructor(e,t){this.atoms=e,this.bonds=t,this.isEmpty=e.size===0&&t.size===0,Object.freeze(this);}},ti=new J(new Set,new Set),N={empty(){return ti},fromAtoms(i){return new J(new Set(i),new Set)},fromBonds(i){return new J(new Set,new Set(i))},fromAtomsAndBonds(i,e){return new J(new Set(i),new Set(e))},union(...i){if(i.length===0)return ti;let e=new Set,t=new Set;for(let n of i){for(let o of n.atoms)e.add(o);for(let o of n.bonds)t.add(o);}return new J(e,t)},difference(i,e){let t=new Set,n=new Set;for(let o of i.atoms)e.atoms.has(o)||t.add(o);for(let o of i.bonds)e.bonds.has(o)||n.add(o);return new J(t,n)},intersect(i,e){let t=new Set,n=new Set;for(let o of i.atoms)e.atoms.has(o)&&t.add(o);for(let o of i.bonds)e.bonds.has(o)&&n.add(o);return new J(t,n)},toggle(i,e){if(e.kind===\"atom\"){let n=new Set(i.atoms);return n.has(e.id)?n.delete(e.id):n.add(e.id),new J(n,new Set(i.bonds))}let t=new Set(i.bonds);return t.has(e.id)?t.delete(e.id):t.add(e.id),new J(new Set(i.atoms),t)},hasAtom(i,e){return i.atoms.has(e)},hasBond(i,e){return i.bonds.has(e)},equals(i,e){if(i===e)return true;if(i.atoms.size!==e.atoms.size||i.bonds.size!==e.bonds.size)return false;for(let t of i.atoms)if(!e.atoms.has(t))return false;for(let t of i.bonds)if(!e.bonds.has(t))return false;return true}};function he(i){let e=i.monomer;return e===null?0:e.rgroups.length}function ni(i,e){let t=new Set;for(let r of e)r.a1.id===i.id&&r.r1.kind===\"numeric\"&&t.add(r.r1.r),r.a2.id===i.id&&r.r2.kind===\"numeric\"&&t.add(r.r2.r);let n=[],o=Array.from(t).sort((r,s)=>r-s);for(let r of o)n.push(r);return n}function U(i,e){let t=he(i);if(t===0)return [];let n=new Set(ni(i,e)),o=[];for(let r=1;r<=t;r++)n.has(r)||o.push(r);return o}function Us(i,e){return U(i,e).length>0}function It(i,e){let t=[];for(let n of e)if(n.a1.id===i.id){let o=n.r1.kind===\"numeric\"?n.r1.r:0;t.push({bond:n,side:\"r1\",rNumber:o});}else if(n.a2.id===i.id){let o=n.r2.kind===\"numeric\"?n.r2.r:0;t.push({bond:n,side:\"r2\",rNumber:o});}return t}function zs(i){switch(i){case b.AA:return v.PEPTIDE;case b.SUGAR:case b.BASE:case b.LINKER:case b.NUCLEOTIDE:return v.RNA;case b.CHEM:return v.CHEM;case b.BLOB:return v.BLOB}}function Ks(i){switch(i){case v.PEPTIDE:return \"PEPTIDE\";case v.RNA:return \"RNA\";case v.CHEM:return \"CHEM\";case v.BLOB:return \"BLOB\";case v.G:return \"G\"}}function Ws(i){let e=0;for(let t of i.atoms)t.id>e&&(e=t.id);for(let t of i.bonds)t.id>e&&(e=t.id);return e}function Pt(i,e){return i.kind!==e.kind?false:i.kind===\"numeric\"&&e.kind===\"numeric\"?i.r===e.r:i.kind===\"positional\"&&e.kind===\"positional\"?i.position===e.position&&i.r===e.r:true}var $=class{constructor(e){this._atoms=new Map;this._atomOrder=[];this._bonds=new Map;this._bondOrder=[];this._chains=new Map;this._chainOrder=[];this._addedAtoms=new Set;this._removedAtoms=new Set;this._modifiedAtoms=new Set;this._addedBonds=new Set;this._removedBonds=new Set;this._modifiedBonds=new Set;this._topologyDirty=false;this._idgen=new ye;let t=Ws(e);for(let n=0;n<t;n++)this._idgen.next();for(let n of e.chains)this._chains.set(n.id,{id:n.id,polymerType:n.polymerType,backboneAtomIds:n.backboneAtoms.map(o=>o.id),bondIds:n.bonds.map(o=>o.id),annotation:n.annotation}),this._chainOrder.push(n.id);for(let n of e.atoms)this._atoms.set(n.id,{id:n.id,p:{x:n.p.x,y:n.p.y},biotype:n.biotype,symbol:n.symbol,monomer:n.monomer,bio:{...n.bio},hidden:n.hidden,selected:n.selected,highlighted:n.highlighted,tag:n.tag,branchAtomId:n.branchAtom?.id,inlineSource:n.inlineSource}),this._atomOrder.push(n.id);for(let n of e.bonds)this._bonds.set(n.id,{id:n.id,a1Id:n.a1.id,a2Id:n.a2.id,kind:n.kind,r1:n.r1,r2:n.r2,ratio:n.ratio,tag:n.tag}),this._bondOrder.push(n.id);this._groups=[...e.groups],this._annotations=e.annotations;}addAtom(e){let t=this._idgen.next(),n=zs(e.biotype),o=e.chainId??this._pickChainId(n),r=this._chains.get(o);r===void 0&&(r={id:o,polymerType:n,backboneAtomIds:[],bondIds:[],annotation:void 0},this._chains.set(o,r),this._chainOrder.push(o));let s=e.positionInChain??r.backboneAtomIds.length+1,a={id:t,p:{x:e.p.x,y:e.p.y},biotype:e.biotype,symbol:e.symbol,monomer:null,bio:{chainId:o,positionInChain:s,continuousId:0},hidden:false,selected:false,highlighted:false,tag:void 0,branchAtomId:void 0,inlineSource:void 0};this._atoms.set(t,a),this._atomOrder.push(t);let l=Math.max(0,Math.min(s-1,r.backboneAtomIds.length));return r.backboneAtomIds.splice(l,0,t),this._addedAtoms.add(t),this._topologyDirty=true,t}removeAtom(e){let t=this._atoms.get(e);if(t===void 0)return;let n=[];for(let s of this._bonds.values())(s.a1Id===e||s.a2Id===e)&&n.push(s.id);for(let s of n)this._removeBondInternal(s);for(let s of this._atoms.values())s.branchAtomId===e&&(s.branchAtomId=void 0);let o=this._chains.get(t.bio.chainId);if(o!==void 0){let s=o.backboneAtomIds.indexOf(e);s>=0&&o.backboneAtomIds.splice(s,1);}this._atoms.delete(e);let r=this._atomOrder.indexOf(e);r>=0&&this._atomOrder.splice(r,1),this._addedAtoms.has(e)?this._addedAtoms.delete(e):this._removedAtoms.add(e),this._modifiedAtoms.delete(e),this._topologyDirty=true;}updateAtom(e,t){let n=this._atoms.get(e);n!==void 0&&(t.p!==void 0&&(n.p={x:t.p.x,y:t.p.y}),t.symbol!==void 0&&(n.symbol=t.symbol),t.selected!==void 0&&(n.selected=t.selected),t.highlighted!==void 0&&(n.highlighted=t.highlighted),\"tag\"in t&&(n.tag=t.tag),t.hidden!==void 0&&(n.hidden=t.hidden),this._addedAtoms.has(e)||this._modifiedAtoms.add(e));}addBond(e){if(!this._atoms.has(e.a1))throw new Error(`Transaction.addBond: atom ${e.a1} does not exist`);if(!this._atoms.has(e.a2))throw new Error(`Transaction.addBond: atom ${e.a2} does not exist`);for(let r of this._bonds.values()){let s=r.a1Id===e.a1&&r.a2Id===e.a2&&Pt(r.r1,e.r1)&&Pt(r.r2,e.r2),a=r.a1Id===e.a2&&r.a2Id===e.a1&&Pt(r.r1,e.r2)&&Pt(r.r2,e.r1);if(s||a)throw new Error(`Transaction.addBond: duplicate bond ${e.a1}:${oi(e.r1)}-${e.a2}:${oi(e.r2)}`)}let t=this._idgen.next();this._bonds.set(t,{id:t,a1Id:e.a1,a2Id:e.a2,kind:e.kind,r1:e.r1,r2:e.r2,ratio:void 0,tag:void 0}),this._bondOrder.push(t);let n=this._atoms.get(e.a1),o=this._atoms.get(e.a2);if(n!==void 0&&o!==void 0&&n.bio.chainId===o.bio.chainId){let r=this._chains.get(n.bio.chainId);r!==void 0&&r.bondIds.push(t);}return this._addedBonds.add(t),this._topologyDirty=true,t}removeBond(e){this._bonds.has(e)&&(this._removeBondInternal(e),this._topologyDirty=true);}updateBond(e,t){let n=this._bonds.get(e);n!==void 0&&(\"tag\"in t&&(n.tag=t.tag),\"ratio\"in t&&(n.ratio=t.ratio),this._addedBonds.has(e)||this._modifiedBonds.add(e));}commit(){let e=new Map;for(let l of this._atomOrder){let d=this._atoms.get(l);if(d===void 0)continue;let u={id:d.id,p:{x:d.p.x,y:d.p.y},biotype:d.biotype,symbol:d.symbol,monomer:d.monomer,bio:{...d.bio},hidden:d.hidden,selected:d.selected,highlighted:d.highlighted,...d.tag!==void 0?{tag:d.tag}:{},...d.inlineSource!==void 0?{inlineSource:d.inlineSource}:{}};e.set(l,u);}for(let l of this._atomOrder){let d=this._atoms.get(l);if(d===void 0||d.branchAtomId===void 0)continue;let u=e.get(l),c=e.get(d.branchAtomId);u===void 0||c===void 0||(u.branchAtom=c);}let t=new Map;for(let l of this._bondOrder){let d=this._bonds.get(l);if(d===void 0)continue;let u=e.get(d.a1Id),c=e.get(d.a2Id);if(u===void 0||c===void 0)continue;let m={id:d.id,a1:u,a2:c,kind:d.kind,r1:d.r1,r2:d.r2,...d.ratio!==void 0?{ratio:{...d.ratio}}:{},...d.tag!==void 0?{tag:d.tag}:{}};t.set(l,m);}let n=[];for(let l of this._chainOrder){let d=this._chains.get(l);if(d===void 0||d.backboneAtomIds.length===0&&d.bondIds.length===0)continue;let u=[];for(let m of d.backboneAtomIds){let p=e.get(m);p!==void 0&&u.push(p);}let c=[];for(let m of d.bondIds){let p=t.get(m);p!==void 0&&c.push(p);}n.push({id:d.id,polymerType:d.polymerType,backboneAtoms:u,bonds:c,...d.annotation!==void 0?{annotation:d.annotation}:{}});}let o=this._atomOrder.map(l=>e.get(l)).filter(l=>l!==void 0),r=this._bondOrder.map(l=>t.get(l)).filter(l=>l!==void 0),s={atoms:o,bonds:r,chains:n,groups:[...this._groups],annotations:this._annotations};this._topologyDirty&&(s=js(s));let a=Object.freeze({addedAtomIds:new Set(this._addedAtoms),removedAtomIds:new Set(this._removedAtoms),addedBondIds:new Set(this._addedBonds),removedBondIds:new Set(this._removedBonds),modifiedAtomIds:new Set(this._modifiedAtoms),modifiedBondIds:new Set(this._modifiedBonds)});return this._addedAtoms.clear(),this._removedAtoms.clear(),this._modifiedAtoms.clear(),this._addedBonds.clear(),this._removedBonds.clear(),this._modifiedBonds.clear(),this._topologyDirty=false,{mol:s,changes:a}}_removeBondInternal(e){if(this._bonds.get(e)===void 0)return;this._bonds.delete(e);let n=this._bondOrder.indexOf(e);n>=0&&this._bondOrder.splice(n,1);for(let o of this._chains.values()){let r=o.bondIds.indexOf(e);r>=0&&o.bondIds.splice(r,1);}this._addedBonds.has(e)?this._addedBonds.delete(e):this._removedBonds.add(e),this._modifiedBonds.delete(e);}_pickChainId(e){let t=Ks(e),n=1;for(;this._chains.has(`${t}${n}`);)n+=1;return `${t}${n}`}};function oi(i){switch(i.kind){case \"numeric\":return `R${i.r}`;case \"unspecified\":return \"?\";case \"wildcard\":return \"*\";case \"pair\":return \"pair\";case \"positional\":return `${i.position}pos:R${i.r}`}}function js(i){let e=Te(i),t=new Map;for(let a of i.atoms){let l=e.get(a.id);if(l===void 0||l===a.bio.continuousId){t.set(a.id,a);continue}t.set(a.id,{...a,bio:{...a.bio,continuousId:l}});}for(let a of i.atoms){if(a.branchAtom===void 0)continue;let l=t.get(a.id),d=t.get(a.branchAtom.id);l===void 0||d===void 0||(l.branchAtom=d);}let n=i.bonds.map(a=>{let l=t.get(a.a1.id),d=t.get(a.a2.id);return l===void 0||d===void 0||l===a.a1&&d===a.a2?a:{...a,a1:l,a2:d}}),o=new Map;for(let a of n)o.set(a.id,a);let r=i.chains.map(a=>{let l=[];for(let u of a.backboneAtoms)l.push(t.get(u.id)??u);let d=[];for(let u of a.bonds)d.push(o.get(u.id)??u);return {id:a.id,polymerType:a.polymerType,backboneAtoms:l,bonds:d,...a.annotation!==void 0?{annotation:a.annotation}:{}}});return {atoms:i.atoms.map(a=>t.get(a.id)??a),bonds:n,chains:r,groups:i.groups,annotations:i.annotations}}var W=class{constructor(e,t,n){this.atoms=[];this.bonds=[];this.bondHitWidth=n?.bondHitWidth??4,this.rebuild(e,t);}rebuild(e,t){let n=[];for(let r of e.atoms)r.hidden||n.push({atom:r,bbox:ue(r,t),hitRadius:Uo(r,t)});let o=[];for(let r of e.bonds)o.push({bond:r,a:r.a1.p,b:r.a2.p});this.atoms=n,this.bonds=o;}test(e){let t=null,n=null;for(let r of this.atoms){if(!Ht(e,r.bbox))continue;let s=e.x-r.atom.p.x,a=e.y-r.atom.p.y,l=Math.sqrt(s*s+a*a);l>r.hitRadius||(t===null||l<t.d?(n=t,t={entry:r,d:l}):(n===null||l<n.d)&&(n={entry:r,d:l}));}if(t!==null)return {atom:t.entry.atom};let o=null;for(let r of this.bonds){let s=qs(e,r.a,r.b);s>this.bondHitWidth||(o===null||s<o.d)&&(o={entry:r,d:s});}return o!==null?{bond:o.entry.bond}:null}testRect(e){let t=[];for(let o of this.atoms)Ht(o.atom.p,e)&&t.push(o.atom);let n=[];for(let o of this.bonds)Ht(o.a,e)&&Ht(o.b,e)&&n.push(o.bond);return {atoms:t,bonds:n}}atomCount(){return this.atoms.length}bondCount(){return this.bonds.length}};function Ht(i,e){return i.x>=e.x&&i.x<=e.x+e.width&&i.y>=e.y&&i.y<=e.y+e.height}function qs(i,e,t){let n=t.x-e.x,o=t.y-e.y,r=n*n+o*o;if(r===0){let c=i.x-e.x,m=i.y-e.y;return Math.sqrt(c*c+m*m)}let s=((i.x-e.x)*n+(i.y-e.y)*o)/r;s<0?s=0:s>1&&(s=1);let a=e.x+s*n,l=e.y+s*o,d=i.x-a,u=i.y-l;return Math.sqrt(d*d+u*u)}var He=class{constructor(){this._handlers=new Map;}on(e,t){let n=this._handlers.get(e);n===void 0&&(n=new Set,this._handlers.set(e,n));let o=t;return n.add(o),()=>{let r=this._handlers.get(e);r!==void 0&&r.delete(o);}}off(e,t){let n=this._handlers.get(e);n!==void 0&&n.delete(t);}fire(e,t){let n=this._handlers.get(e);if(n===void 0||n.size===0)return;let o=[...n];for(let r of o)r(t);}clear(){this._handlers.clear();}observerCount(e){if(e===void 0){let t=0;for(let n of this._handlers.values())t+=n.size;return t}return this._handlers.get(e)?.size??0}};var $e=class{constructor(e){this._entries=[];this._idx=-1;let t=e?.maxEntries??100;if(t<=0)throw new RangeError(\"HistoryStack: maxEntries must be > 0\");this._max=t;}push(e){for(this._idx<this._entries.length-1&&(this._entries=this._entries.slice(0,this._idx+1)),this._entries.push(e),this._idx=this._entries.length-1;this._entries.length>this._max;)this._entries.shift(),this._idx-=1;}canUndo(){return this._idx>0}canRedo(){return this._idx>=0&&this._idx<this._entries.length-1}undo(){return this.canUndo()?(this._idx-=1,this._entries[this._idx]??null):null}redo(){return this.canRedo()?(this._idx+=1,this._entries[this._idx]??null):null}clear(){this._entries=[],this._idx=-1;}get size(){return this._entries.length}current(){return this._idx<0?null:this._entries[this._idx]??null}};function ii(i,e={}){let t=e.theme??I,n=e.selectedAtomIds??new Set,o=e.highlightedAtomIds??new Set;return {highlightLayer:Cn(i,t,o),selectionLayer:Ln(i,t,n)}}function E(i){let e=i.ownerDocument;if(e!=null)return e;let t=globalThis;if(t.document!==void 0)return t.document;throw new Error(\"EditorView: no Document available (host.ownerDocument is null).\")}function y(i,e,t,n){let o=i.createElement(e);if(t!==void 0)for(let r of Object.keys(t)){let s=t[r];s===false||s===void 0||o.setAttribute(r,s===true?\"\":String(s));}if(n!==void 0)for(let r of n)typeof r==\"string\"?o.appendChild(i.createTextNode(r)):o.appendChild(r);return o}function ri(i){let e=E(i);if(e.querySelector(\"style[data-hw-editor-view-styles]\")!==null)return;let n=e.createElement(\"style\");n.setAttribute(\"data-hw-editor-view-styles\",\"\"),n.textContent=\".hw-editor-view{position:relative;display:block;overflow:hidden;outline:none;}.hw-editor-view svg{display:block;user-select:none;}.hw-editor-view.hw-view-only{cursor:default;}\";let o=e.head??e.documentElement;o!==null&&o.appendChild(n);}function si(i,e){let t=E(i),n=i.querySelector(\".hw-editor-view\");if(n===null)throw new Error(\"EditorView.replaceSvg: missing .hw-editor-view wrapper.\");let o=t.createElement(\"div\");o.innerHTML=e;let r=o.querySelector(\"svg\");if(r===null)throw new Error(\"EditorView.replaceSvg: rendered output contained no <svg>.\");for(;n.firstChild!==null;)n.removeChild(n.firstChild);return n.appendChild(r),r}function fe(i,e,t=220,n=140){if(i==null||e===\"\")return null;try{let o=i.get_mol(e);if(o===null)return null;let r=o.get_svg(t,n);return o.delete(),r}catch{return null}}function te(i,e,t){let n=\"data-testid\";for(let r=0;r<i.body.children.length;r++){let s=i.body.children[r];if(s!==void 0&&s.getAttribute(n)===e)return s}let o=y(i,\"div\",{class:t,[n]:e});return o.style.display=\"none\",i.body.appendChild(o),o}function xe(i,e,t){for(;e.firstChild!==null;)e.removeChild(e.firstChild);if(e.appendChild(y(i,\"div\",{class:\"hw-tooltip__symbol\"},[t.symbol])),t.name!==void 0&&t.name!==\"\"&&t.name!==t.symbol&&e.appendChild(y(i,\"div\",{class:\"hw-tooltip__name\"},[t.name])),t.rdkitSvg!==void 0&&t.rdkitSvg!==null&&t.rdkitSvg!==\"\"){let n={class:\"hw-tooltip__rdkit\"};t.rdkitTestid!==void 0&&(n[\"data-testid\"]=t.rdkitTestid);let o=y(i,\"div\",n);o.innerHTML=t.rdkitSvg,e.appendChild(o);}t.hint!==void 0&&t.hint!==\"\"&&e.appendChild(y(i,\"div\",{class:\"hw-tooltip__hint\"},[t.hint]));}function ai(i,e,t){for(;e.firstChild!==null;)e.removeChild(e.firstChild);e.appendChild(y(i,\"div\",{class:\"hw-tooltip__symbol\"},[t.title]));let n=y(i,\"div\",{class:\"hw-tooltip__triplet\"});for(let o of t.parts){let r=y(i,\"div\",{class:\"hw-tooltip__triplet-part\"});if(r.appendChild(y(i,\"div\",{class:\"hw-tooltip__triplet-role\"},[`${o.role}: ${o.symbol}`])),o.name!==void 0&&o.name!==\"\"&&o.name!==o.symbol&&r.appendChild(y(i,\"div\",{class:\"hw-tooltip__name\"},[o.name])),o.rdkitSvg!==void 0&&o.rdkitSvg!==null&&o.rdkitSvg!==\"\"){let s={class:\"hw-tooltip__rdkit\"};t.rdkitTestid!==void 0&&(s[\"data-testid\"]=t.rdkitTestid);let a=y(i,\"div\",s);a.innerHTML=o.rdkitSvg,r.appendChild(a);}n.appendChild(r);}e.appendChild(n),t.hint!==void 0&&t.hint!==\"\"&&e.appendChild(y(i,\"div\",{class:\"hw-tooltip__hint\"},[t.hint]));}function j(i,e,t){let n=i.style;n.display=\"block\",n.left=`${e+12}px`,n.top=`${t+12}px`;}function F(i){i!==null&&(i.style.display=\"none\");}function $t(i){let e=i.body;if(e==null)return;let t=\"data-testid\";for(let n=0;n<e.children.length;n++){let o=e.children[n];if(o===void 0)continue;let r=o.getAttribute===void 0?null:o.getAttribute(t);r!=null&&r.endsWith(\"-tooltip\")&&F(o);}}var Ot=class Ot{constructor(e,t,n){this._baseTransform=\"\";this._viewport={scale:1,offset:{x:0,y:0}};this._pinnedBbox=null;this._tooltip=null;this._bondTooltip=null;this._rdkitSvgCache=new Map;this._unsubs=[];this._destroyed=false;this.host=e,this._editor=t,this._doc=n?.documentImpl??E(e),this._width=n?.width??400,this._height=n?.height??200,ri(e);let o=this._doc.createElement(\"div\");o.setAttribute(\"class\",\"hw-editor-view\"),e.appendChild(o),this._tooltip=te(this._doc,\"atom-tooltip\",\"hw-atom-tooltip\"),this._bondTooltip=te(this._doc,\"bond-tooltip\",\"hw-bond-tooltip\"),this._svgRoot=this._renderFresh(),this._unsubs.push(t.on(\"mol:changed\",r=>{this._hideTooltip(),this._hideBondTooltip(),(r.reason===\"setHelm\"||r.reason===\"cleanLayout\"||r.reason===\"initial\")&&(this._pinnedBbox=null),this._renderFresh();})),this._unsubs.push(t.on(\"selection:change\",r=>{this._refreshOverlays(r);})),this._unsubs.push(t.on(\"highlight:change\",r=>{this._refreshOverlays(r);})),this._unsubs.push(t.on(\"theme:change\",()=>{this._renderFresh();})),this._unsubs.push(t.on(\"view:resize\",r=>{this._applyResize(r.width,r.height);})),this._unsubs.push(t.on(\"view:viewport-change\",r=>{this._viewport=r.viewport,this._applyViewport(r.viewport);})),this._unsubs.push(t.on(\"view:fit-to-content\",()=>{this._pinnedBbox=null,this._renderFresh();})),this._unsubs.push(t.on(\"monomer:hover\",r=>{this._showTooltip(r.atom,r.clientX,r.clientY);})),this._unsubs.push(t.on(\"monomer:hover-end\",()=>{this._hideTooltip();})),this._unsubs.push(t.on(\"bond:hover\",r=>{this._showBondTooltip(r.bond,r.clientX,r.clientY);})),this._unsubs.push(t.on(\"bond:hover-end\",()=>{this._hideBondTooltip();})),this._unsubs.push(t.on(\"bond:preview\",r=>{this._paintBondPreview(r.start.p,r.cursor,r.candidate!==null);})),this._unsubs.push(t.on(\"bond:preview-end\",()=>{this._clearBondPreview();})),this._unsubs.push(t.on(\"bond:cancel\",()=>{this._clearBondPreview();})),this._unsubs.push(t.on(\"selection:rectangle-start\",r=>{this._paintSelectionRect(r.origin,r.origin);})),this._unsubs.push(t.on(\"selection:rectangle-update\",r=>{this._paintSelectionRectFromRect(r.rect);})),this._unsubs.push(t.on(\"selection:rectangle-end\",()=>{this._clearSelectionRect();}));}get svgRoot(){return this._svgRoot}get width(){return this._width}get height(){return this._height}resize(e,t){this._destroyed||(this._width=e,this._height=t,this._renderFresh());}redraw(){this._destroyed||this._renderFresh();}destroy(){if(this._destroyed)return;this._destroyed=true;for(let t of this._unsubs)t();this._unsubs.length=0;let e=this.host.querySelector(\".hw-editor-view\");e!==null&&e.parentNode!==null&&e.parentNode.removeChild(e),F(this._tooltip),F(this._bondTooltip),this._tooltip=null,this._bondTooltip=null;}_renderFresh(){let e=this._editor.getService(),t=this._currentTheme(),n=this._editor.getMol();this._pinnedBbox===null&&(this._pinnedBbox=En(n,t));let o=e.renderMol(n,{width:this._width,height:this._height,theme:t,fixedModelBbox:this._pinnedBbox});this._svgRoot=si(this.host,o);let r=this._svgRoot.querySelector(\".hw-content\");return this._baseTransform=r!==null?r.getAttribute(\"transform\")??\"\":\"\",this._svgRoot.setAttribute(\"data-testid\",\"editor-svg\"),this._applyOverlaysToCurrent(),(this._viewport.scale!==1||this._viewport.offset.x!==0||this._viewport.offset.y!==0)&&this._applyViewport(this._viewport),this._svgRoot}_refreshOverlays(e){this._applyOverlaysToCurrent();}_applyOverlaysToCurrent(){let e=this._editor.getMol(),t=this._editor.getSelection(),n=ii(e,{theme:this._currentTheme(),selectedAtomIds:t.atoms,highlightedAtomIds:this._editorHighlights()});this._spliceLayer(\"hw-highlights\",n.highlightLayer),this._spliceLayer(\"hw-selections\",n.selectionLayer);}_spliceLayer(e,t){let n=this._svgRoot.querySelector(`.${e}`);if(n===null||n.parentNode===null)return;let o=this._doc.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");o.innerHTML=t;let r=o.querySelector(`.${e}`);r!==null&&n.parentNode.replaceChild(r,n);}_editorHighlights(){let e=this._editor;return typeof e._currentHighlights==\"function\"?e._currentHighlights():new Set}_currentTheme(){let e=this._editor;return typeof e._currentTheme==\"function\"?e._currentTheme():this._editor.getService().theme}_applyResize(e,t){this._width=e,this._height=t,this._pinnedBbox=null,this._renderFresh();}_applyViewport(e){let n=this._svgRoot.querySelector(\".hw-content\");if(n===null)return;let o=`translate(${e.offset.x} ${e.offset.y}) scale(${e.scale})`,r=this._baseTransform===\"\"?o:`${o} ${this._baseTransform}`;n.setAttribute(\"transform\",r);}_showTooltip(e,t,n){let o=this._tooltip;if(o===null)return;let r=e.symbol===\"\"?\"?\":e.symbol,s=e.monomer?.name??\"\",a=e.bio.positionInChain,l=e.bio.chainId===\"\"?\"?\":e.bio.chainId,d=s!==\"\"&&s!==r?`${s} @ ${l}:${a}`:`${r} @ ${l}:${a}`,u=this._renderRdkitTooltipSvg(e);xe(this._doc,o,{symbol:r,name:d,rdkitSvg:u,rdkitTestid:\"atom-tooltip-rdkit-svg\"});let c=s!==\"\"&&s!==r?`${r} \\u2014 ${s} @ ${l}:${a}`:`${r} @ ${l}:${a}`,m=this._doc.createElement(\"div\");m.setAttribute(\"class\",\"hw-atom-tooltip__text\"),m.style.display=\"none\",m.appendChild(this._doc.createTextNode(c)),o.appendChild(m),j(o,t,n);}_renderRdkitTooltipSvg(e){let n=this._editor.getService().options.rdkitModule;if(n==null)return null;let o=e.monomer;if(o===null)return null;let r=o.smiles;if(r===void 0||r===\"\")return null;let s=`${o.polymerType}:${o.symbol}`;if(this._rdkitSvgCache.has(s))return this._rdkitSvgCache.get(s)??null;let a=fe(n,r,220,140);if(this._rdkitSvgCache.size>=Ot._RDKIT_CACHE_LIMIT){let l=this._rdkitSvgCache.keys().next().value;l!==void 0&&this._rdkitSvgCache.delete(l);}return this._rdkitSvgCache.set(s,a),a}_hideTooltip(){F(this._tooltip);}_showBondTooltip(e,t,n){let o=this._bondTooltip;if(o===null)return;let r=li(e.r1),s=li(e.r2),a=`${e.a1.symbol}@${e.a1.bio.chainId}:${e.a1.bio.positionInChain}`,l=`${e.a2.symbol}@${e.a2.bio.chainId}:${e.a2.bio.positionInChain}`;xe(this._doc,o,{symbol:`${r}-${s} (${e.kind})`,name:`${a} \\u2194 ${l}`}),j(o,t,n);}_hideBondTooltip(){F(this._bondTooltip);}_paintBondPreview(e,t,n){let o=\"http://www.w3.org/2000/svg\",r=this._svgRoot.querySelector(\".hw-content\");if(r===null)return;let s=r.querySelector(\".hw-bond-preview\");s===null&&(s=this._doc.createElementNS(o,\"line\"),s.setAttribute(\"class\",\"hw-bond-preview\"),s.setAttribute(\"data-testid\",\"bond-preview\"),s.setAttribute(\"stroke-dasharray\",\"6 4\"),s.setAttribute(\"stroke-width\",\"2\"),s.setAttribute(\"fill\",\"none\"),s.setAttribute(\"pointer-events\",\"none\"),r.appendChild(s)),s.setAttribute(\"x1\",String(e.x)),s.setAttribute(\"y1\",String(e.y)),s.setAttribute(\"x2\",String(t.x)),s.setAttribute(\"y2\",String(t.y)),s.setAttribute(\"stroke\",n?\"#1f5fcd\":\"#999999\");}_clearBondPreview(){let e=this._svgRoot.querySelector(\".hw-bond-preview\");e!==null&&e.parentNode!==null&&e.parentNode.removeChild(e);}_paintSelectionRect(e,t){let n=Math.min(e.x,t.x),o=Math.min(e.y,t.y),r=Math.abs(e.x-t.x),s=Math.abs(e.y-t.y);this._paintSelectionRectAt(n,o,r,s);}_paintSelectionRectFromRect(e){this._paintSelectionRectAt(e.x,e.y,e.width,e.height);}_paintSelectionRectAt(e,t,n,o){let r=\"http://www.w3.org/2000/svg\",s=this._svgRoot.querySelector(\".hw-content\");if(s===null)return;let a=s.querySelector(\".hw-selection-rect\");a===null&&(a=this._doc.createElementNS(r,\"rect\"),a.setAttribute(\"class\",\"hw-selection-rect\"),a.setAttribute(\"data-testid\",\"selection-rect\"),a.setAttribute(\"fill\",\"rgba(31, 95, 205, 0.08)\"),a.setAttribute(\"stroke\",\"#1f5fcd\"),a.setAttribute(\"stroke-width\",\"1\"),a.setAttribute(\"stroke-dasharray\",\"4 3\"),a.setAttribute(\"pointer-events\",\"none\"),s.appendChild(a)),a.setAttribute(\"x\",String(e)),a.setAttribute(\"y\",String(t)),a.setAttribute(\"width\",String(n)),a.setAttribute(\"height\",String(o));}_clearSelectionRect(){let e=this._svgRoot.querySelector(\".hw-selection-rect\");e!==null&&e.parentNode!==null&&e.parentNode.removeChild(e);}};Ot._RDKIT_CACHE_LIMIT=256;var Dt=Ot;function li(i){switch(i.kind){case \"numeric\":return `R${i.r}`;case \"unspecified\":return \"?\";case \"wildcard\":return \"*\";case \"pair\":return \"pair\";case \"positional\":return `${i.position}pos:R${i.r}`}}var ne=class ne{constructor(e,t){this._onClose=null;this._primaryAction=null;this._host=e,this._doc=t.documentImpl??E(e);let n=this._doc,o={class:\"hw-modal-backdrop\",role:\"presentation\"};t.testId!==void 0&&(o[\"data-testid\"]=`dialog-${t.testId}`);let r=y(n,\"div\",o),s={class:\"hw-modal\",role:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":t.title};t.testId!==void 0&&(s[\"data-testid\"]=`dialog-${t.testId}-frame`);let a=y(n,\"div\",s),l=y(n,\"div\",{class:\"hw-modal__header\"},[t.title]),d=y(n,\"div\",{class:\"hw-modal__body\"});a.appendChild(l),a.appendChild(d),r.appendChild(a);let u=c=>{c.stopPropagation();};for(let c of [\"mousedown\",\"mousemove\",\"mouseup\",\"mouseover\",\"mouseenter\",\"mouseleave\",\"wheel\",\"contextmenu\",\"dblclick\",\"keydown\",\"keyup\",\"keypress\"])r.addEventListener(c,u);a.addEventListener(\"keydown\",c=>{let m=c;if(m.key!==\"Enter\"||m.target?.tagName===\"TEXTAREA\")return;let p=this._primaryAction;p!==null&&(m.preventDefault?.(),m.stopImmediatePropagation?.(),p());}),r.addEventListener(\"click\",c=>{if(c.target===r){this.close();return}c.stopPropagation();}),this.root=r,this.body=d;}static anyOpen(){return ne._openStack.length>0}static closeTopmost(){let e=ne._openStack[ne._openStack.length-1];return e===void 0?false:(e.close(),true)}open(e){this._onClose=e??null,this.root.parentNode===null&&this._host.appendChild(this.root),ne._openStack.includes(this)||ne._openStack.push(this),$t(this._doc);}close(){let e=ne._openStack.indexOf(this);e>=0&&ne._openStack.splice(e,1),this.root.parentNode!==null&&this.root.parentNode.removeChild(this.root);let t=this._onClose;this._onClose=null,t!==null&&t();}setPrimaryAction(e){this._primaryAction=e;}get isOpen(){return this.root.parentNode!==null}};ne._openStack=[];var q=ne;function De(i,e,t,n){let o=`hw-input-${Math.random().toString(36).slice(2,9)}`,r=y(i,\"label\",{for:o,class:\"hw-modal__label\"},[e]),s=i.createElement(\"input\");return s.setAttribute(\"id\",o),s.setAttribute(\"type\",\"text\"),s.setAttribute(\"class\",\"hw-modal__input\"),n!==void 0&&s.setAttribute(\"data-testid\",n),s.value=t,{row:y(i,\"div\",{class:\"hw-modal__row\"},[r,s]),input:s}}function Oe(i,e,t,n,o){let r=`hw-sel-${Math.random().toString(36).slice(2,9)}`,s=y(i,\"label\",{for:r,class:\"hw-modal__label\"},[e]),a=i.createElement(\"select\");a.setAttribute(\"id\",r),a.setAttribute(\"class\",\"hw-modal__select\"),o!==void 0&&a.setAttribute(\"data-testid\",o);for(let d of t){let u=i.createElement(\"option\");u.setAttribute(\"value\",d.value),d.value===n&&u.setAttribute(\"selected\",\"\"),u.appendChild(i.createTextNode(d.label)),a.appendChild(u);}return {row:y(i,\"div\",{class:\"hw-modal__row\"},[s,a]),select:a}}function Ne(i,e){let t=i.createElement(\"button\");t.setAttribute(\"class\",\"hw-modal__ok\"),t.setAttribute(\"type\",\"button\"),e!==void 0&&t.setAttribute(\"data-testid\",`${e}-ok`),t.appendChild(i.createTextNode(\"OK\"));let n=i.createElement(\"button\");return n.setAttribute(\"class\",\"hw-modal__cancel\"),n.setAttribute(\"type\",\"button\"),e!==void 0&&n.setAttribute(\"data-testid\",`${e}-cancel`),n.appendChild(i.createTextNode(\"Cancel\")),{row:y(i,\"div\",{class:\"hw-modal__actions\"},[t,n]),ok:t,cancel:n}}var Fe=class{constructor(e,t){this._modal=null;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"ChooseRDialog: editor has no host element.\");this._doc=t?.documentImpl??E(n);}open(e,t,n){this.close();let o=this._editor._getHost();if(o===null)return Promise.resolve(null);let r=new q(o,{documentImpl:this._doc,title:\"Choose R-Groups\",testId:\"choose-r\"});this._modal=r;let s=ci(e,n?.freeR1,n?.currentR1,this._editor),a=ci(t,n?.freeR2,n?.currentR2,this._editor),l=y(this._doc,\"div\",{class:\"hw-modal__info\"},[`${e.symbol} (${e.bio.chainId})`]),d=n?.currentR1!==void 0?String(n.currentR1):s[0]?.value??\"1\",u=n?.currentR2!==void 0?String(n.currentR2):a[0]?.value??\"1\",c=Oe(this._doc,\"R-group on side A\",s,d,\"choose-r-r1\"),m=y(this._doc,\"div\",{class:\"hw-modal__info\"},[`${t.symbol} (${t.bio.chainId})`]),p=Oe(this._doc,\"R-group on side B\",a,u,\"choose-r-r2\"),h=Ne(this._doc,\"choose-r\"),f=[];return s.length===0&&f.push(y(this._doc,\"div\",{class:\"hw-modal__info hw-modal__note-fully-booked\"},[`All R-groups on ${e.symbol} are in use.`])),a.length===0&&f.push(y(this._doc,\"div\",{class:\"hw-modal__info hw-modal__note-fully-booked\"},[`All R-groups on ${t.symbol} are in use.`])),new Promise(_=>{let k=false,g=w=>{k||(k=true,_(w));},M=w=>{g(w),this.close();},A=()=>M({r1:di(c.select),r2:di(p.select)});h.ok.addEventListener(\"click\",A),h.cancel.addEventListener(\"click\",()=>M(null)),r.setPrimaryAction(A),r.body.appendChild(l),r.body.appendChild(c.row),r.body.appendChild(m),r.body.appendChild(p.row);for(let w of f)r.body.appendChild(w);r.body.appendChild(h.row),r.open(()=>g(null));})}get isOpen(){return this._modal!==null&&this._modal.isOpen}close(){this._modal!==null&&(this._modal.close(),this._modal=null);}};function di(i){let e=i.value;if(typeof e==\"string\"&&e.length>0){let o=Number(e);if(Number.isFinite(o)&&o>=1)return o}let t=i.querySelectorAll(\"option\");for(let o of Array.from(t))if(o.getAttribute(\"selected\")!==null){let r=o.getAttribute(\"value\")??\"\",s=Number(r);if(Number.isFinite(s)&&s>=1)return s}let n=t[0];if(n!==void 0){let o=n.getAttribute(\"value\")??\"\",r=Number(o);if(Number.isFinite(r)&&r>=1)return r}return 1}function ci(i,e,t,n){let o=i.monomer?.rgroups;if(o===void 0||o.length===0)return [{value:\"1\",label:\"R1\"},{value:\"2\",label:\"R2\"},{value:\"3\",label:\"R3\"}];let r;if(e!==void 0)r=new Set(e);else if(r=new Set(U(i,n.getMol().bonds)),r.size===0)for(let l=1;l<=o.length;l++)r.add(l);t!==void 0&&t>=1&&t<=o.length&&r.add(t);let s=[],a=Array.from(r).sort((l,d)=>l-d);for(let l of a){let d=o[l-1];if(d===void 0)continue;let u=d.capGroupName!==void 0&&d.capGroupName!==\"\"?` (${d.capGroupName})`:\"\";s.push({value:String(l),label:`${d.label}${u}`});}return s}var ui=\"next-add-cursor\",nt=28,Nt=nt*2;function mi(i){let e=\"data-testid\";for(let n=0;n<i.body.children.length;n++){let o=i.body.children[n];if(o!==void 0&&o.getAttribute(e)===ui)return o}let t=i.createElement(\"div\");return t.className=\"hw-next-add-cursor\",t.setAttribute(e,ui),t.style.display=\"none\",i.body.appendChild(t),t}function pi(i,e,t,n,o,r,s){let l=Be({p:{x:0,y:0},biotype:t,symbol:e},o),u=P(n,t,o.colorTheme).background,c=_t(u),m=e.length,p=m<=1?1:Math.min(1,2/m),h=o.fontSize*p,f=`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${-nt} ${-nt} ${Nt} ${Nt}\" width=\"${Nt}\" height=\"${Nt}\" class=\"hw-next-add-cursor__svg\" aria-hidden=\"true\"><path d=\"${l}\" fill=\"${u}\" stroke=\"${u}\" stroke-width=\"5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/><text x=\"0\" y=\"0\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"Helvetica Neue, Helvetica, Arial, sans-serif\" font-size=\"${h}\" fill=\"${c}\">${Ys(e)}</text></svg>`;i.innerHTML=f;let _=i.style;_.left=`${r-nt}px`,_.top=`${s-nt}px`,_.display=\"block\";}function ot(i){i!==null&&(i.style.display=\"none\");}function Ys(i){let e=\"\";for(let t=0;t<i.length;t++){let n=i.charAt(t);n===\"<\"?e+=\"&lt;\":n===\">\"?e+=\"&gt;\":n===\"&\"?e+=\"&amp;\":e+=n;}return e}var Ft=class{constructor(e,t,n){this._hoverAtom=null;this._hoverBond=null;this._dragOrigin=null;this._bondStart=null;this._bondDragMoved=false;this._rectDragHappened=false;this._chooseRDialog=null;this._panStart=null;this._atomDragState=null;this._panMoved=false;this._atomDragMoved=false;this._nextAddCursorEl=null;this._destroyed=false;this._unsubs=[];this._host=e,this._editor=t,this._enableContextMenu=n?.enableContextMenu??true,this._tester=new W(t.getMol(),t._currentTheme()),this._unsubs.push(t.on(\"mol:changed\",()=>{this._tester=new W(this._editor.getMol(),this._editor._currentTheme()),this._hoverAtom=null,this._hoverBond=null;})),this._unsubs.push(t.on(\"option:change\",o=>{(o.key===\"mode\"||o.key===\"nextAdd\")&&ot(this._nextAddCursorEl);})),this._onMove=o=>this._handleMove(o),this._onClick=o=>this._handleClick(o),this._onDblClick=o=>this._handleDblClick(o),this._onContextMenu=o=>this._handleContextMenu(o),this._onMouseDown=o=>this._handleMouseDown(o),this._onMouseUp=o=>this._handleMouseUp(o),this._onMouseLeave=o=>this._handleMouseLeave(o),this._onWheel=o=>this._handleWheel(o),e.addEventListener(\"mousemove\",this._onMove),e.addEventListener(\"click\",this._onClick),e.addEventListener(\"dblclick\",this._onDblClick),e.addEventListener(\"contextmenu\",this._onContextMenu),e.addEventListener(\"mousedown\",this._onMouseDown),e.addEventListener(\"mouseup\",this._onMouseUp),e.addEventListener(\"mouseleave\",this._onMouseLeave),e.addEventListener(\"wheel\",this._onWheel,{passive:false});}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this._host.removeEventListener(\"mousemove\",this._onMove),this._host.removeEventListener(\"click\",this._onClick),this._host.removeEventListener(\"dblclick\",this._onDblClick),this._host.removeEventListener(\"contextmenu\",this._onContextMenu),this._host.removeEventListener(\"mousedown\",this._onMouseDown),this._host.removeEventListener(\"mouseup\",this._onMouseUp),this._host.removeEventListener(\"mouseleave\",this._onMouseLeave),this._host.removeEventListener(\"wheel\",this._onWheel),this._chooseRDialog!==null&&(this._chooseRDialog.close(),this._chooseRDialog=null),ot(this._nextAddCursorEl),this._nextAddCursorEl=null;}}_handleMove(e){if(this._panStart!==null){let s=this._toViewBox({clientX:e.clientX,clientY:e.clientY}),a=s.x-this._panStart.origin.x,l=s.y-this._panStart.origin.y;this._editor.panTo({x:this._panStart.initialOffset.x+a,y:this._panStart.initialOffset.y+l}),this._panMoved=true;return}if(this._atomDragState!==null){let s=this._toModel(e),a=s.x-this._atomDragState.pointerDownModel.x,l=s.y-this._atomDragState.pointerDownModel.y,d=[];for(let u of this._atomDragState.atomIds){let c=this._atomDragState.initialPositions.get(u);c!==void 0&&d.push({atomId:u,p:{x:c.x+a,y:c.y+l}});}this._editor.moveAtoms(d),this._atomDragMoved=true;return}let t=this._toModel(e),n=this._tester.test(t),o=n?.atom??null,r=n?.bond??null;if(this._bondStart!==null){this._bondDragMoved=true;let s=o!==null&&o.id!==this._bondStart.id?o:null;this._editor.fire(\"bond:preview\",{start:this._bondStart,cursor:t,candidate:s,kind:this._editor.getMode()===\"hbond\"?\"hbond\":\"backbone\"});}if(this._hoverAtom!==null&&(o===null||o.id!==this._hoverAtom.id)&&(this._editor.fire(\"monomer:hover-end\",{atom:this._hoverAtom}),this._hoverAtom=null),o!==null&&(this._hoverAtom===null||this._hoverAtom.id!==o.id)&&(this._hoverAtom=o,this._editor.fire(\"monomer:hover\",{atom:o,clientX:e.clientX,clientY:e.clientY,modelX:t.x,modelY:t.y})),this._hoverBond!==null&&(r===null||r.id!==this._hoverBond.id)&&(this._editor.fire(\"bond:hover-end\",{bond:this._hoverBond}),this._hoverBond=null),r!==null&&(this._hoverBond===null||this._hoverBond.id!==r.id)&&(this._hoverBond=r,this._editor.fire(\"bond:hover\",{bond:r,clientX:e.clientX,clientY:e.clientY})),this._dragOrigin!==null){let s=gi(this._dragOrigin,t);this._editor.fire(\"selection:rectangle-update\",{rect:s});}this._updateNextAddCursor(e);}_handleClick(e){if(this._bondDragMoved){this._bondDragMoved=false;return}if(this._rectDragHappened){this._rectDragHappened=false;return}if(this._panMoved){this._panMoved=false;return}if(this._atomDragMoved){this._atomDragMoved=false;return}let t=this._toModel(e),n=this._tester.test(t),o=yi(e),r=this._editor.getMode();if(r===\"eraser\"){if(n?.atom!==void 0){this._editor.removeAtom(n.atom);return}if(n?.bond!==void 0){this._editor.removeBond(n.bond);return}return}if(n?.atom!==void 0){if(r===\"select\"&&!o.ctrl&&!o.shift&&!o.meta){let s=this._editor.getNextAddSymbol();if(s!==null){if(n.atom.biotype===s.biotype){this._editor.replaceMonomer(n.atom,s.symbol);return}this._editor.fire(\"editor:status\",{message:`Cannot replace: ${n.atom.biotype} is incompatible with ${s.biotype}`,severity:\"warn\",durationMs:3e3});return}}this._editor.fire(\"monomer:click\",{atom:n.atom,modifiers:o,clientX:e.clientX,clientY:e.clientY});return}if(n?.bond!==void 0){this._editor.fire(\"bond:click\",{bond:n.bond,modifiers:o});return}if(this._addsEnabled()){let s=this._editor.getNextAddSymbol();if(s!==null){this._editor.addAtom(t,s.biotype,s.symbol);return}}!o.shift&&!o.ctrl&&!o.meta&&this._editor.clearSelection();}_handleDblClick(e){let t=this._toModel(e),n=this._tester.test(t),o=yi(e);if(n?.atom!==void 0){this._editor.fire(\"monomer:dblclick\",{atom:n.atom,modifiers:o});return}n===null&&this._editor.fitToContent();}_handleContextMenu(e){this._enableContextMenu||e.preventDefault();let t=this._toModel(e),n=this._tester.test(t),r=()=>{e.preventDefault();};n?.atom!==void 0?this._editor.fire(\"monomer:contextmenu\",{atom:n.atom,clientX:e.clientX,clientY:e.clientY,preventDefault:r}):n?.bond!==void 0&&this._editor.fire(\"bond:contextmenu\",{bond:n.bond,clientX:e.clientX,clientY:e.clientY,preventDefault:r});}_handleMouseDown(e){if(e.button!==0)return;let t=this._toModel(e),n=this._tester.test(t),o=this._editor.getMode(),r=e.ctrlKey===true||e.metaKey===true;if(n?.atom!==void 0){if(o===\"move\"||o===\"select\"&&r){let s=this._editor.getSelection(),l=s.atoms.has(n.atom.id)?Array.from(s.atoms):[n.atom.id],d=this._editor.getMol(),u=new Map;for(let c of l){let m=d.atoms.find(p=>p.id===c);m!==void 0&&u.set(c,{x:m.p.x,y:m.p.y});}this._atomDragState={atomIds:l,pointerDownModel:{x:t.x,y:t.y},initialPositions:u},this._atomDragMoved=false;return}this._bondStart=n.atom,this._bondDragMoved=false;return}if(n===null){if(o===\"move\"||o===\"select\"&&!r){let s=this._editor.getViewport();this._panStart={origin:this._toViewBox({clientX:e.clientX,clientY:e.clientY}),initialOffset:{x:s.offset.x,y:s.offset.y}},this._panMoved=false;return}o===\"select\"&&r&&(this._dragOrigin=t,this._editor.fire(\"selection:rectangle-start\",{origin:t}));}}_handleMouseUp(e){if(this._panStart!==null){this._panStart=null;return}if(this._atomDragState!==null){this._atomDragState=null;return}if(this._bondStart!==null){let a=this._bondStart,l=this._bondDragMoved;this._bondStart=null;let d=this._toModel(e),c=this._tester.test(d)?.atom;if(l&&c!==void 0&&c.id!==a.id){if(this._editor.fire(\"bond:preview-end\",{start:a}),this._editor.getMode()===\"hbond\"){try{this._editor.addHydrogenBond(a,c);}catch{this._editor.fire(\"bond:cancel\",{start:a});}return}let m=a.bio.chainId===c.bio.chainId&&bi(a,c,this._editor.getMol())?\"backbone\":\"cross-polymer\",p=hi(a,c,this._editor.getMol().bonds,m);if(p.mode===\"fail\"){this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"editor:status\",{message:p.reason,severity:\"error\",durationMs:3e3});return}if(p.mode===\"auto\"){try{this._editor.addBond(a,c,p.r1,p.r2,p.kind);}catch{this._editor.fire(\"bond:cancel\",{start:a});}return}this._openChooseR(a,c,m,p.freeR1,p.freeR2);return}if(l){let m=this._addsEnabled()?this._editor.getNextAddSymbol():null;if(m!==null){let p;try{p=this._editor.addAtom(d,m.biotype,m.symbol);}catch{this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"bond:preview-end\",{start:a});return}let h=this._editor.getMol().atoms.find(M=>M.id===a.id);if(h===void 0){this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"bond:preview-end\",{start:a});return}let f=h.bio.chainId===p.bio.chainId&&bi(h,p,this._editor.getMol())?\"backbone\":\"cross-polymer\",_=U(h,this._editor.getMol().bonds),k=U(p,this._editor.getMol().bonds);if(_.includes(2)&&k.includes(1)){try{this._editor.addBond(h,p,2,1,f);}catch{this._editor.fire(\"bond:cancel\",{start:a});}this._editor.fire(\"bond:preview-end\",{start:a});return}let g=hi(h,p,this._editor.getMol().bonds,f);if(g.mode===\"fail\"){this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"editor:status\",{message:g.reason,severity:\"error\",durationMs:3e3}),this._editor.fire(\"bond:preview-end\",{start:a});return}if(g.mode===\"auto\"){try{this._editor.addBond(h,p,g.r1,g.r2,g.kind);}catch{this._editor.fire(\"bond:cancel\",{start:a});}this._editor.fire(\"bond:preview-end\",{start:a});return}this._editor.fire(\"bond:preview-end\",{start:a}),this._openChooseR(h,p,f,g.freeR1,g.freeR2);return}this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"bond:preview-end\",{start:a});return}return}if(this._dragOrigin===null)return;let t=this._toModel(e),n=gi(this._dragOrigin,t);this._dragOrigin=null;let o=this._tester.testRect(n),r=N.fromAtomsAndBonds(o.atoms.map(a=>a.id),o.bonds.map(a=>a.id)),s=N.union(this._editor.getSelection(),r);this._editor.setSelection(s),this._editor.fire(\"selection:rectangle-end\",{rect:n,selection:s}),this._rectDragHappened=true,s.atoms.size>0&&this._editor.getMode()===\"select\"&&this._editor.setMode(\"move\");}_handleMouseLeave(e){this._hoverAtom!==null&&(this._editor.fire(\"monomer:hover-end\",{atom:this._hoverAtom}),this._hoverAtom=null),this._hoverBond!==null&&(this._editor.fire(\"bond:hover-end\",{bond:this._hoverBond}),this._hoverBond=null),this._bondStart!==null&&(this._editor.fire(\"bond:cancel\",{start:this._bondStart}),this._editor.fire(\"bond:preview-end\",{start:this._bondStart}),this._bondStart=null,this._bondDragMoved=false),this._dragOrigin=null,this._panStart=null,this._atomDragState=null,this._panMoved=false,this._atomDragMoved=false,ot(this._nextAddCursorEl);}_openChooseR(e,t,n,o,r){this._chooseRDialog===null&&(this._chooseRDialog=new Fe(this._editor)),this._chooseRDialog.open(e,t,{freeR1:o,freeR2:r}).then(a=>{if(!this._destroyed){if(a===null){this._editor.fire(\"bond:cancel\",{start:e});return}try{this._editor.addBond(e,t,a.r1,a.r2,n);}catch{this._editor.fire(\"bond:cancel\",{start:e});}}});}_updateNextAddCursor(e){let t=this._editor.getNextAddSymbol(),n=this._editor.getMode(),o=this._hoverAtom!==null,r=this._bondStart!==null||this._dragOrigin!==null||this._panStart!==null||this._atomDragState!==null;if(!(n===\"select\"&&t!==null&&!o&&!r)){this._nextAddCursorEl!==null&&ot(this._nextAddCursorEl);return}let a=this._host.ownerDocument;if(a===null)return;this._nextAddCursorEl===null&&(this._nextAddCursorEl=mi(a));let l=this._editor.getService().monomerLib,d=null;for(let u of l.getPolymerTypes()){let c=l.getMonomer(u,t.symbol);if(c!==null){d=c;break}}pi(this._nextAddCursorEl,t.symbol,t.biotype,d,this._editor._currentTheme(),e.clientX,e.clientY);}_addsEnabled(){return this._editor.getMode()===\"select\"}_handleWheel(e){if(!e.ctrlKey&&!e.metaKey)return;e.preventDefault();let t=e.deltaY<0?1.1:1/1.1,n=this._toViewBox({clientX:e.clientX,clientY:e.clientY}),o=this._editor.getViewport(),r=o.scale===0?n:{x:(n.x-o.offset.x)/o.scale,y:(n.y-o.offset.y)/o.scale};this._editor.zoom(t,r);}_toModel(e){let t=this._host.querySelector(\"svg\"),n=t!==null?t.querySelector(\".hw-content\"):null;if(t!==null&&n!==null){let r=fi(n,e.clientX,e.clientY);if(r!==null)return r;let s=this._host.getBoundingClientRect(),a=e.clientX-s.left,l=e.clientY-s.top,d=Js(n.getAttribute(\"transform\")??\"\");return d!==null?{x:(a-d.tx)/(d.scale===0?1:d.scale),y:(l-d.ty)/(d.scale===0?1:d.scale)}:{x:a,y:l}}let o=this._host.getBoundingClientRect();return {x:e.clientX-o.left,y:e.clientY-o.top}}_toViewBox(e){let t=this._host.querySelector(\"svg\");if(t!==null){let o=fi(t,e.clientX,e.clientY);if(o!==null)return o;let r=this._host.getBoundingClientRect(),s=e.clientX-r.left,a=e.clientY-r.top,l=Xs(t.getAttribute(\"viewBox\"));return l!==null&&r.width>0&&r.height>0?{x:s*(l.w/r.width),y:a*(l.h/r.height)}:{x:s,y:a}}let n=this._host.getBoundingClientRect();return {x:e.clientX-n.left,y:e.clientY-n.top}}};function hi(i,e,t,n){let o=he(i),r=he(e);if(o===0||r===0)return {mode:\"auto\",r1:2,r2:1,kind:n};let s=U(i,t),a=U(e,t);if(s.length===0)return {mode:\"fail\",reason:`${i.symbol} has no free R-groups (max ${o}).`};if(a.length===0)return {mode:\"fail\",reason:`${e.symbol} has no free R-groups (max ${r}).`};if(s.includes(2)&&a.includes(1)&&(s.length===1||a.length===1))return {mode:\"auto\",r1:2,r2:1,kind:n};if(s.length===1&&a.length===1){let l=s[0],d=a[0];return {mode:\"auto\",r1:l,r2:d,kind:n}}return {mode:\"choose\",freeR1:s,freeR2:a}}function fi(i,e,t){let n=i;if(typeof n.getScreenCTM!=\"function\")return null;let o=n.getScreenCTM();if(o===null)return null;let r=null;try{let l=o;typeof l.inverse==\"function\"&&(r=l.inverse());}catch{return null}if(r===null)return null;let s=n.ownerSVGElement;if(s!=null&&typeof s.createSVGPoint==\"function\"){let l=s.createSVGPoint();l.x=e,l.y=t;let d=l.matrixTransform(r);return {x:d.x,y:d.y}}let a=r;return {x:a.a*e+a.c*t+a.e,y:a.b*e+a.d*t+a.f}}function Xs(i){if(i===null||i===\"\")return null;let e=i.split(/[,\\s]+/).map(o=>Number(o)).filter(o=>Number.isFinite(o));if(e.length<4)return null;let t=e[2],n=e[3];return t<=0||n<=0?null:{w:t,h:n}}function Js(i){if(i===\"\")return null;let e=0,t=0,n=1,o=/(translate|scale)\\(([^)]+)\\)/g,r,s=false;for(;(r=o.exec(i))!==null;){s=true;let a=r[1],l=(r[2]??\"\").split(/[,\\s]+/).map(d=>Number(d)).filter(d=>Number.isFinite(d));if(a===\"translate\"){let d=l[0]??0,u=l[1]??0;e=e+n*d,t=t+n*u;}else if(a===\"scale\"){let d=l[0]??1;n=n*d;}}return s?{tx:e,ty:t,scale:n}:null}function bi(i,e,t){if(i.bio.chainId!==e.bio.chainId)return false;let n=t.chains.find(s=>s.id===i.bio.chainId);if(n===void 0)return false;let o=-1,r=-1;for(let s=0;s<n.backboneAtoms.length;s++){let a=n.backboneAtoms[s];a.id===i.id&&(o=s),a.id===e.id&&(r=s);}return o<0||r<0?false:Math.abs(o-r)===1}function yi(i){return {shift:i.shiftKey===true,alt:i.altKey===true,ctrl:i.ctrlKey===true,meta:i.metaKey===true}}function gi(i,e){let t=Math.min(i.x,e.x),n=Math.min(i.y,e.y);return {x:t,y:n,width:Math.abs(i.x-e.x),height:Math.abs(i.y-e.y)}}var Gt=class{constructor(e,t,n){this._destroyed=false;this._host=e,this._editor=t,this._enabled=n?.enableKeyboard!==false,this._enabled&&e.getAttribute(\"tabindex\")===null&&e.setAttribute(\"tabindex\",\"0\"),this._onKey=o=>this._handleKey(o),e.addEventListener(\"keydown\",this._onKey);}destroy(){this._destroyed||(this._destroyed=true,this._host.removeEventListener(\"keydown\",this._onKey));}_handleKey(e){if(!this._enabled)return;let t=this._classify(e),n=Zs(e);if(t===null){this._editor.fire(\"key:unhandled\",{key:e.key,modifiers:n,preventDefault:()=>e.preventDefault()});return}let o=false,r=()=>{o=true,e.preventDefault();};this._editor.fire(\"key:command\",{command:t,preventDefault:r}),!o&&(e.preventDefault(),t!==\"clearSelection\"&&(e.stopPropagation(),e.stopImmediatePropagation?.()),this._execute(t));}_classify(e){let t=e.key,n=e.ctrlKey||e.metaKey;return t===\"Delete\"||t===\"Backspace\"?\"delete\":n&&(t===\"z\"||t===\"Z\")&&!e.shiftKey?\"undo\":n&&((t===\"z\"||t===\"Z\")&&e.shiftKey||t===\"y\"||t===\"Y\")?\"redo\":n&&(t===\"a\"||t===\"A\")?\"selectAll\":n&&(t===\"c\"||t===\"C\")?\"copy\":n&&(t===\"v\"||t===\"V\")?\"paste\":n&&(t===\"x\"||t===\"X\")?\"cut\":t===\"Escape\"?\"clearSelection\":t===\"+\"||t===\"=\"?\"zoomIn\":t===\"-\"||t===\"_\"?\"zoomOut\":t===\"0\"?\"fitToContent\":t===\"ArrowUp\"?\"nudgeUp\":t===\"ArrowDown\"?\"nudgeDown\":t===\"ArrowLeft\"?\"nudgeLeft\":t===\"ArrowRight\"?\"nudgeRight\":null}_execute(e){switch(e){case \"delete\":this._editor.deleteSelection();return;case \"undo\":this._editor.undo();return;case \"redo\":this._editor.redo();return;case \"selectAll\":this._editor.selectAll();return;case \"clearSelection\":this._editor.clearSelection();return;case \"zoomIn\":this._editor.zoom(1.1);return;case \"zoomOut\":this._editor.zoom(1/1.1);return;case \"fitToContent\":this._editor.fitToContent();return;case \"nudgeUp\":this._editor.nudgeSelection(0,-5);return;case \"nudgeDown\":this._editor.nudgeSelection(0,5);return;case \"nudgeLeft\":this._editor.nudgeSelection(-5,0);return;case \"nudgeRight\":this._editor.nudgeSelection(5,0);return;case \"copy\":{let t=this._editor.getHelm();this._editor.fire(\"clipboard:copy\",{format:\"helm\",payload:t});return}case \"cut\":{let t=this._editor.getHelm();this._editor.fire(\"clipboard:copy\",{format:\"helm\",payload:t}),this._editor.deleteSelection();return}case \"paste\":this._editor.fire(\"clipboard:paste\",{format:\"helm\"});return;default:return}}};function Zs(i){return {shift:i.shiftKey===true,alt:i.altKey===true,ctrl:i.ctrlKey===true,meta:i.metaKey===true}}var Qs=\"application/x-hwe-monomer\",Vt=class{constructor(e,t){this._currentPaletteSymbol=null;this._currentPaletteBiotype=null;this._destroyed=false;this._unsubs=[];this._host=e,this._editor=t,this._tester=new W(t.getMol(),t._currentTheme()),this._unsubs.push(t.on(\"mol:changed\",()=>{this._tester=new W(this._editor.getMol(),this._editor._currentTheme());})),this._onDragOver=n=>this._handleDragOver(n),this._onDrop=n=>this._handleDrop(n),this._onDragStart=n=>this._handleDragStart(n),this._onDragEnd=n=>this._handleDragEnd(n),this._onDragEnter=n=>this._handleDragEnter(n),this._onDragLeave=n=>this._handleDragLeave(n),e.addEventListener(\"dragover\",this._onDragOver),e.addEventListener(\"drop\",this._onDrop),e.addEventListener(\"dragstart\",this._onDragStart),e.addEventListener(\"dragend\",this._onDragEnd),e.addEventListener(\"dragenter\",this._onDragEnter),e.addEventListener(\"dragleave\",this._onDragLeave);}startPaletteDrag(e,t){this._currentPaletteSymbol=e,this._currentPaletteBiotype=t,this._editor.fire(\"dnd:start\",{source:\"palette\",symbol:e});}cancelPaletteDrag(){this._currentPaletteSymbol!==null&&(this._currentPaletteSymbol=null,this._currentPaletteBiotype=null,this._editor.fire(\"dnd:cancel\",{source:\"palette\"}));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this._host.removeEventListener(\"dragover\",this._onDragOver),this._host.removeEventListener(\"drop\",this._onDrop),this._host.removeEventListener(\"dragstart\",this._onDragStart),this._host.removeEventListener(\"dragend\",this._onDragEnd),this._host.removeEventListener(\"dragenter\",this._onDragEnter),this._host.removeEventListener(\"dragleave\",this._onDragLeave);}}_activePaletteSymbol(e){if(this._currentPaletteSymbol!==null&&this._currentPaletteBiotype!==null)return {symbol:this._currentPaletteSymbol,biotype:this._currentPaletteBiotype};let t=e.dataTransfer;if(t==null)return null;try{let n=typeof t.getData==\"function\"?t.getData(Qs):\"\";if(n===\"\")return null;let o=JSON.parse(n);return typeof o.symbol!=\"string\"||typeof o.biotype!=\"string\"?null:{symbol:o.symbol,biotype:o.biotype}}catch{return null}}_handleDragEnter(e){if(this._activePaletteSymbol(e)!==null&&(e.preventDefault(),e.dataTransfer!==null&&e.dataTransfer!==void 0))try{e.dataTransfer.dropEffect=\"copy\";}catch{}}_handleDragLeave(e){}_handleDragOver(e){if(this._activePaletteSymbol(e)===null)return;if(e.preventDefault(),e.dataTransfer!==null&&e.dataTransfer!==void 0)try{e.dataTransfer.dropEffect=\"copy\";}catch{}let n=this._toModel(e),o=this._tester.test(n),r=o?.atom!==void 0?o.atom:o?.bond!==void 0?o.bond:void 0,s={clientX:e.clientX,clientY:e.clientY};r!==void 0&&(s.target=r),this._editor.fire(\"dnd:over\",s);}_handleDrop(e){let t=this._activePaletteSymbol(e);if(t===null)return;e.preventDefault();let{symbol:n,biotype:o}=t,r=this._toModel(e),s=this._tester.test(r),a=s?.atom!==void 0?s.atom:s?.bond!==void 0?s.bond:void 0,l={symbol:n,biotype:o,clientX:e.clientX,clientY:e.clientY};a!==void 0&&(l.target=a),this._editor.fire(\"dnd:drop\",l),s?.atom!==void 0?this._editor.replaceMonomer(s.atom,n):this._editor.addAtom(r,o,n),this._currentPaletteSymbol=null,this._currentPaletteBiotype=null;}_handleDragStart(e){this._editor.fire(\"dnd:start\",{source:\"canvas\"});}_handleDragEnd(e){this._currentPaletteSymbol!==null&&(this._currentPaletteSymbol=null,this._currentPaletteBiotype=null,this._editor.fire(\"dnd:cancel\",{source:\"palette\"}));}_toModel(e){let t=this._host.querySelector(\"svg\"),n=t!==null?t.querySelector(\".hw-content\"):null;if(t!==null&&n!==null){let r=ea(n,e.clientX,e.clientY);if(r!==null)return r;let s=this._host.getBoundingClientRect(),a=e.clientX-s.left,l=e.clientY-s.top,d=ta(n.getAttribute(\"transform\")??\"\");return d!==null?{x:(a-d.tx)/(d.scale===0?1:d.scale),y:(l-d.ty)/(d.scale===0?1:d.scale)}:{x:a,y:l}}let o=this._host.getBoundingClientRect();return {x:e.clientX-o.left,y:e.clientY-o.top}}};function ea(i,e,t){let n=i;if(typeof n.getScreenCTM!=\"function\")return null;let o=n.getScreenCTM();if(o===null)return null;let r=null;try{let l=o;typeof l.inverse==\"function\"&&(r=l.inverse());}catch{return null}if(r===null)return null;let s=n.ownerSVGElement;if(s!=null&&typeof s.createSVGPoint==\"function\"){let l=s.createSVGPoint();l.x=e,l.y=t;let d=l.matrixTransform(r);return {x:d.x,y:d.y}}let a=r;return {x:a.a*e+a.c*t+a.e,y:a.b*e+a.d*t+a.f}}function ta(i){if(i===\"\")return null;let e=0,t=0,n=1,o=/(translate|scale)\\(([^)]+)\\)/g,r,s=false;for(;(r=o.exec(i))!==null;){s=true;let a=r[1],l=(r[2]??\"\").split(/[,\\s]+/).map(d=>Number(d)).filter(d=>Number.isFinite(d));if(a===\"translate\"){let d=l[0]??0,u=l[1]??0;e=e+n*d,t=t+n*u;}else if(a===\"scale\"){let d=l[0]??1;n=n*d;}}return s?{tx:e,ty:t,scale:n}:null}var Ge=class{constructor(e,t){this._modal=null;this._atom=null;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"AtomPropsDialog: editor has no host element.\");this._doc=t?.documentImpl??E(n);}get isOpen(){return this._modal!==null&&this._modal.isOpen}open(e){this.close(),this._atom=e;let t=this._editor._getHost();if(t===null)return;let n=new q(t,{documentImpl:this._doc,title:\"Monomer Properties\",testId:\"atom-props\"});this._modal=n;let o=y(this._doc,\"div\",{class:\"hw-modal__info\"},[`Position ${e.bio.continuousId} in ${e.bio.chainId}`]),r=De(this._doc,\"Symbol\",e.symbol,\"atom-props-symbol\"),s=De(this._doc,\"Annotation\",e.bio.annotation??\"\",\"atom-props-annotation\"),a=Ne(this._doc,\"atom-props\"),l=()=>this._commit(r.input.value,s.input.value);a.ok.addEventListener(\"click\",l),a.cancel.addEventListener(\"click\",()=>this.close()),n.setPrimaryAction(l),n.body.appendChild(o),n.body.appendChild(r.row),n.body.appendChild(s.row),n.body.appendChild(a.row),n.open();}close(){this._modal!==null&&(this._modal.close(),this._modal=null),this._atom=null;}_commit(e,t){let n=this._atom;if(n===null){this.close();return}let o=e.trim(),r=(n.bio.annotation??\"\")!==t;if(o.length>0&&o!==n.symbol&&this._editor.replaceMonomer(n,o),r){let a=new $(this._editor.getMol()),l={};l.tag=t===\"\"?void 0:t,a.updateAtom(n.id,l);let{mol:d}=a.commit();this._editor.setMol(d);let u=d.atoms.find(c=>c.id===n.id);if(u!==void 0){let c={atom:u};n.bio.annotation!==void 0&&(c.oldAnnotation=n.bio.annotation),t!==\"\"&&(c.newAnnotation=t),this._editor.fire(\"monomer:annotate\",c);}}this.close();}};var Ve=class{constructor(e,t){this._modal=null;this._bond=null;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"BondPropsDialog: editor has no host element.\");this._doc=t?.documentImpl??E(n);}get isOpen(){return this._modal!==null&&this._modal.isOpen}open(e){this.close(),this._bond=e;let t=this._editor._getHost();if(t===null)return;let n=new q(t,{documentImpl:this._doc,title:\"Bond Properties\",testId:\"bond-props\"});this._modal=n;let o=y(this._doc,\"div\",{class:\"hw-modal__info\"},[`Kind: ${e.kind}`]),r=this._buildAtomsPreviewRow(e),s=e.r1.kind===\"numeric\",a=e.r2.kind===\"numeric\",l=s&&a,u=this._editor.getMol().bonds,c=l?_i(e.r1,e.a1,u):[],m=l?_i(e.r2,e.a2,u):[],p=null,h=null;if(l){let k=String(e.r1.r),g=String(e.r2.r);p=Oe(this._doc,`R-group on ${e.a1.symbol} (${e.a1.bio.chainId}:${e.a1.bio.positionInChain})`,c,k,\"bond-props-r1\"),h=Oe(this._doc,`R-group on ${e.a2.symbol} (${e.a2.bio.chainId}:${e.a2.bio.positionInChain})`,m,g,\"bond-props-r2\");}let f=Ne(this._doc,\"bond-props\"),_=()=>{let k=p!==null?Number(vi(p.select,e.r1.r)):null,g=h!==null?Number(vi(h.select,e.r2.r)):null;this._commit(k,g);};f.ok.addEventListener(\"click\",_),f.cancel.addEventListener(\"click\",()=>this.close()),n.setPrimaryAction(_),n.body.appendChild(o),r!==null&&n.body.appendChild(r),p!==null&&n.body.appendChild(p.row),h!==null&&n.body.appendChild(h.row),n.body.appendChild(f.row),n.open();}_buildAtomsPreviewRow(e){let t=this._rdkit(),n=this._buildAtomCell(e.a1,t,\"bond-props-atom-a1\"),o=this._buildAtomCell(e.a2,t,\"bond-props-atom-a2\"),r=y(this._doc,\"div\",{class:\"hw-bond-props__bond-arrow\"},[\"\\u2194\"]);return y(this._doc,\"div\",{class:\"hw-bond-props__atoms\",\"data-testid\":\"bond-props-atoms\"},[n,r,o])}_buildAtomCell(e,t,n){let o=e.monomer?.name??e.symbol,r=e.symbol===o?e.symbol:`${e.symbol} \\u2014 ${o}`,s=y(this._doc,\"div\",{class:\"hw-bond-props__atom-label\"},[r]),a={class:\"hw-bond-props__atom-rdkit\",\"data-testid\":`${n}-rdkit`},l=y(this._doc,\"div\",a),d=e.monomer?.smiles;if(t!==null&&d!==void 0&&d!==\"\"){let u=fe(t,d,220,140);u!==null&&u!==\"\"&&(l.innerHTML=u);}return y(this._doc,\"div\",{class:\"hw-bond-props__atom\",\"data-testid\":n},[s,l])}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}close(){this._modal!==null&&(this._modal.close(),this._modal=null),this._bond=null;}_commit(e,t){let n=this._bond;if(n===null){this.close();return}let o=n.r1.kind===\"numeric\"?n.r1.r:null,r=n.r2.kind===\"numeric\"?n.r2.r:null;if(!(e!==null&&t!==null&&(e!==o||t!==r))){this.close();return}if(e!==null&&t!==null){let a=n.kind,l=n.a1,d=n.a2;this._editor.removeBond(n);try{this._editor.addBond(l,d,e,t,a);}catch(u){if(o!==null&&r!==null)try{this._editor.addBond(l,d,o,r,n.kind);}catch{}}}this.close();}};function _i(i,e,t){let n=e.monomer?.rgroups;if(n===void 0||n.length===0)return [{value:\"1\",label:\"R1\"},{value:\"2\",label:\"R2\"},{value:\"3\",label:\"R3\"}];let o=new Set(U(e,t));o.add(i.r);let r=Array.from(o).sort((a,l)=>a-l),s=[];for(let a of r){let l=n[a-1];if(l===void 0)continue;let d=l.capGroupName!==void 0&&l.capGroupName!==\"\"?` (${l.capGroupName})`:\"\";s.push({value:String(a),label:`${l.label}${d}`});}return s}function vi(i,e){let t=i.value;if(typeof t==\"string\"&&t.length>0){let o=Number(t);if(Number.isFinite(o)&&o>=1)return o}let n=i.querySelectorAll(\"option\");for(let o of Array.from(n))if(o.getAttribute(\"selected\")!==null){let r=o.getAttribute(\"value\")??\"\",s=Number(r);if(Number.isFinite(s)&&s>=1)return s}return e}var Ue=class{constructor(e,t){this._modal=null;this._result=null;this._findInput=null;this._replaceInput=null;this._matches=[];this._cursor=-1;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"FindReplaceDialog: editor has no host element.\");this._doc=t?.documentImpl??E(n);}get isOpen(){return this._modal!==null&&this._modal.isOpen}open(){this.close();let e=this._editor._getHost();if(e===null)return;let t=new q(e,{documentImpl:this._doc,title:\"Find / Replace\",testId:\"find-replace\"});this._modal=t;let n=De(this._doc,\"Find\",\"\",\"find-replace-find\"),o=De(this._doc,\"Replace with\",\"\",\"find-replace-replace\");this._findInput=n.input,this._replaceInput=o.input;let r=this._doc.createElement(\"button\");r.setAttribute(\"class\",\"hw-modal__find-next\"),r.setAttribute(\"type\",\"button\"),r.setAttribute(\"data-testid\",\"find-replace-next\"),r.appendChild(this._doc.createTextNode(\"Find Next\")),r.addEventListener(\"click\",()=>this._findNext());let s=this._doc.createElement(\"button\");s.setAttribute(\"class\",\"hw-modal__replace\"),s.setAttribute(\"type\",\"button\"),s.setAttribute(\"data-testid\",\"find-replace-replace-one\"),s.appendChild(this._doc.createTextNode(\"Replace\")),s.addEventListener(\"click\",()=>this._replaceOne());let a=this._doc.createElement(\"button\");a.setAttribute(\"class\",\"hw-modal__replace-all\"),a.setAttribute(\"type\",\"button\"),a.setAttribute(\"data-testid\",\"find-replace-replace-all\"),a.appendChild(this._doc.createTextNode(\"Replace All\")),a.addEventListener(\"click\",()=>this._replaceAll());let l=this._doc.createElement(\"button\");l.setAttribute(\"class\",\"hw-modal__cancel\"),l.setAttribute(\"type\",\"button\"),l.setAttribute(\"data-testid\",\"find-replace-close\"),l.appendChild(this._doc.createTextNode(\"Close\")),l.addEventListener(\"click\",()=>this.close());let d=y(this._doc,\"div\",{class:\"hw-modal__actions\"},[r,s,a,l]),u=y(this._doc,\"div\",{class:\"hw-modal__result\",\"data-testid\":\"find-replace-result\"},[\"0 matches\"]);this._result=u,t.setPrimaryAction(()=>this._findNext()),t.body.appendChild(n.row),t.body.appendChild(o.row),t.body.appendChild(d),t.body.appendChild(u),t.open();}close(){this._modal!==null&&(this._modal.close(),this._modal=null),this._result=null,this._findInput=null,this._replaceInput=null,this._matches=[],this._cursor=-1;}_findNext(){let e=this._findInput?.value.trim()??\"\";if(e===\"\"){this._setResultText(\"Enter a symbol to find\");return}let t=this._editor.findMonomers(e);if(this._matches=t.map(o=>o.id),this._matches.length===0){this._cursor=-1,this._editor.setHighlights([]),this._setResultText(\"No matches\");return}this._cursor=(this._cursor+1)%this._matches.length;let n=this._matches[this._cursor];n!==void 0&&this._editor.setHighlights([n]),this._setResultText(`${this._cursor+1} / ${this._matches.length} matches`);}_replaceOne(){let e=this._findInput?.value.trim()??\"\",t=this._replaceInput?.value.trim()??\"\";if(e===\"\"||t===\"\"){this._setResultText(\"Both Find and Replace fields are required\");return}if(this._matches.length===0||this._cursor<0){this._findNext();return}let n=this._matches[this._cursor];if(n===void 0)return;let o=this._editor.getMol().atoms.find(r=>r.id===n);if(o!==void 0)if(this._editor.replaceMonomer(o,t),this._matches.splice(this._cursor,1),this._matches.length===0)this._cursor=-1,this._editor.setHighlights([]),this._setResultText(\"Replaced; no further matches\");else {this._cursor=this._cursor%this._matches.length;let r=this._matches[this._cursor];r!==void 0&&this._editor.setHighlights([r]),this._setResultText(`${this._matches.length} matches remaining`);}}_replaceAll(){let e=this._findInput?.value.trim()??\"\",t=this._replaceInput?.value.trim()??\"\";if(e===\"\"||t===\"\"){this._setResultText(\"Both Find and Replace fields are required\");return}let n=this._editor.replaceMonomers(e,t);this._matches=[],this._cursor=-1,this._editor.setHighlights([]),this._setResultText(`${n} replacement${n===1?\"\":\"s\"} made`);}_setResultText(e){if(this._result!==null){for(;this._result.firstChild!==null;)this._result.removeChild(this._result.firstChild);this._result.appendChild(this._doc.createTextNode(e));}}};var be=Object.freeze(new Set),it=class{constructor(e,t){this._events=new He;this._destroyed=false;this._view=null;this._pointer=null;this._keyboard=null;this._dnd=null;this._atomDialog=null;this._bondDialog=null;this._findReplaceDialog=null;this._viewBootstrapped=false;this._mode=\"select\";this._nextAdd=null;this._lastAction=null;this._lastTripletSugarPos=null;if(t.service===void 0||t.service===null)throw new TypeError(\"HelmEditor: options.service is required\");this._host=e,this._service=t.service,this._options=Object.freeze({...t}),this._mol=ce(),this._selection=N.empty(),this._highlights=be,this._theme=t.service.theme??I,this._viewport={scale:1,offset:{x:0,y:0}},this._viewOnly=t.viewOnly??false,this._history=new $e({maxEntries:100}),this._history.push({mol:this._mol,label:\"initial\"}),this._libUnsub=this._service.monomerLib.onChanged.subscribe(n=>{let o=this._service.monomerLib,r=typeof o.version==\"number\"?o.version:0,s=n.type===\"reload\"?\"replace\":\"update\";this._events.fire(\"monomer-lib:change\",{source:this._service.monomerLib.source,version:r,reason:s});}),t.initialHelm!==void 0&&this.setHelm(t.initialHelm),this._bootstrapWaveB();}_bootstrapWaveB(){if(this._viewBootstrapped||this._host===null)return;let e=this._resolveDocument(this._host);if(e===null)return;this._viewBootstrapped=true;let t={documentImpl:e};this._options.width!==void 0&&(t.width=this._options.width),this._options.height!==void 0&&(t.height=this._options.height),this._view=new Dt(this._host,this,t),this._viewOnly!==true&&(this._pointer=new Ft(this._host,this,{enableContextMenu:this._options.enableContextMenu??true})),this._options.enableKeyboard!==false&&(this._keyboard=new Gt(this._host,this,{enableKeyboard:true})),this._options.enableDragDrop!==false&&(this._dnd=new Vt(this._host,this)),this._events.on(\"monomer:hover\",n=>{this.setHighlights([n.atom.id]);}),this._events.on(\"monomer:hover-end\",()=>{this.clearHighlights();}),this._events.on(\"monomer:click\",n=>{let o=n.modifiers;if(o.ctrl===true||o.meta===true){this.setSelection(N.toggle(this._selection,{kind:\"atom\",id:n.atom.id}));return}if(o.shift===true){this.setSelection(N.union(this._selection,N.fromAtoms([n.atom.id])));return}this.setSelection(N.fromAtoms([n.atom.id]));});}_resolveDocument(e){let t=e.ownerDocument;if(t!=null)return t;let n=globalThis;return n.document!==void 0?n.document:null}destroy(){this._destroyed||(this._destroyed=true,this._atomDialog!==null&&(this._atomDialog.close(),this._atomDialog=null),this._bondDialog!==null&&(this._bondDialog.close(),this._bondDialog=null),this._findReplaceDialog!==null&&(this._findReplaceDialog.close(),this._findReplaceDialog=null),this._dnd!==null&&(this._dnd.destroy(),this._dnd=null),this._keyboard!==null&&(this._keyboard.destroy(),this._keyboard=null),this._pointer!==null&&(this._pointer.destroy(),this._pointer=null),this._view!==null&&(this._view.destroy(),this._view=null),this._libUnsub(),this._events.clear(),this._history.clear());}resize(e,t){this._ensureLive(),this._view!==null&&this._view.resize(e,t),this._events.fire(\"view:resize\",{width:e,height:t});}redraw(){if(this._ensureLive(),this._view!==null){this._view.redraw();return}this._events.fire(\"render:skip\",{reason:\"no-view-mounted\"});}setHelm(e,t){this._ensureLive();let n=t?.canonicalize??this._options.canonicalize??false,o=this._service.parse(e,{mode:\"lenient\"}),r=o.diagnostics;r.filter(d=>d.severity===\"error\").length>0&&this._events.fire(\"helm:parse-error\",{helm:e,diagnostics:r});for(let d of r)d.severity===\"error\"?this._events.fire(\"validation:error\",{diagnostic:d}):d.severity===\"warning\"&&this._events.fire(\"validation:warning\",{diagnostic:d});let a=o.mol;if(n){let d=this._service.canonicalize(e);a=this._service.parse(d,{mode:\"lenient\"}).mol;}let l=ee(a,this._options.bondLength!==void 0?{bondLength:this._options.bondLength}:void 0);return this._replaceMol(l,\"setHelm\",\"api\"),{mol:l,diagnostics:r}}getHelm(e){this._ensureLive();let t={};return e?.canonicalize!==void 0&&(t.canonicalize=e.canonicalize),e?.includeHighlights!==void 0&&(t.includeHighlights=e.includeHighlights),this._service.serialize(this._mol,t)}setMol(e){this._ensureLive(),this._replaceMol(e,\"setMol\",\"api\");}getMol(){return this._mol}getService(){return this._service}getSelection(){return this._selection}setSelection(e){if(this._ensureLive(),N.equals(this._selection,e))return;let t=N.difference(e,this._selection),n=N.difference(this._selection,e);this._selection=e,this._events.fire(\"selection:change\",{selection:e,addedAtomIds:t.atoms,removedAtomIds:n.atoms,addedBondIds:t.bonds,removedBondIds:n.bonds});}selectAll(){this._ensureLive();let e=this._mol.atoms.map(n=>n.id),t=this._mol.bonds.map(n=>n.id);this.setSelection(N.fromAtomsAndBonds(e,t));}clearSelection(){this._ensureLive(),!this._selection.isEmpty&&this.setSelection(N.empty());}setHighlights(e){this._ensureLive();let t=new Set(e);this._highlights=t,this._events.fire(\"highlight:change\",{atomIds:t,bondIds:be});}clearHighlights(){this._ensureLive(),this._highlights.size!==0&&(this._highlights=be,this._events.fire(\"highlight:change\",{atomIds:be,bondIds:be}));}addAtom(e,t,n){this._ensureLive();let o=new $(this._mol),r=o.addAtom({p:e,biotype:t,symbol:n}),{mol:s}=o.commit(),a=ve(s,this._service.monomerLib,{mode:\"lenient\"}).mol;this._replaceMol(a,`addAtom:${n}`,\"api\");let l=Y(a,r);if(l===void 0)throw new Error(\"HelmEditor.addAtom: lost atom after commit\");return this._events.fire(\"monomer:add\",{atom:l,source:\"api\"}),l}removeAtom(e){this._ensureLive();let t=typeof e==\"number\"?e:e.id,n=Y(this._mol,t);if(n===void 0)return;let o=new $(this._mol);o.removeAtom(t);let{mol:r}=o.commit();this._replaceMol(r,`removeAtom:${n.symbol}`,\"api\"),this._events.fire(\"monomer:remove\",{atom:n,source:\"api\"});}addBond(e,t,n,o,r){this._ensureLive();let s,a;try{this._validateAddBondConstraints(e,t,n,o);let d=r??\"backbone\",u=this._maybeMergeForLinearExtend(e,t,n,o,d);if(u!==null)({id:s,mol:a}=u);else {let c=new $(this._mol);s=c.addBond({a1:e.id,a2:t.id,kind:r??\"backbone\",r1:{kind:\"numeric\",r:n},r2:{kind:\"numeric\",r:o}}),{mol:a}=c.commit();}}catch(d){let u=d instanceof B?d.message:this._friendlyBondError(d instanceof Error?d.message:String(d),e,t,n,o);throw this._events.fire(\"editor:status\",{message:`Could not add bond: ${u}`,severity:\"error\",durationMs:3e3}),d}this._replaceMol(a,\"addBond\",\"api\");let l=yt(a,s);if(l===void 0)throw new Error(\"HelmEditor.addBond: lost bond after commit\");return this._events.fire(\"bond:add\",{bond:l,source:\"api\"}),l}_maybeMergeForLinearExtend(e,t,n,o,r){if(e.bio.chainId===t.bio.chainId||r!==\"backbone\"&&r!==\"cross-polymer\")return null;let s=this._mol.chains.find(l=>l.id===e.bio.chainId),a=this._mol.chains.find(l=>l.id===t.bio.chainId);if(s===void 0||a===void 0||s.polymerType!==a.polymerType)return null;if(n===2&&o===1){let l=s.backboneAtoms[s.backboneAtoms.length-1],d=a.backboneAtoms[0];if(l!==void 0&&d!==void 0&&l.id===e.id&&d.id===t.id)return this._mergeChains(s,a,r)}if(n===1&&o===2){let l=s.backboneAtoms[0],d=a.backboneAtoms[a.backboneAtoms.length-1];if(l!==void 0&&d!==void 0&&l.id===e.id&&d.id===t.id)return this._mergeChains(a,s,r)}return null}_mergeChains(e,t,n){let o=e.backboneAtoms.length,r=new Set;for(let g of t.backboneAtoms)r.add(g.id),g.branchAtom!==void 0&&r.add(g.branchAtom.id);let s=new Map,a=o;for(let g of t.backboneAtoms){a+=1;let M={...g,bio:{...g.bio,chainId:e.id,positionInChain:a}};if(s.set(g.id,M),g.branchAtom!==void 0){let A=g.branchAtom,w={...A,bio:{...A.bio,chainId:e.id,positionInChain:a}};s.set(A.id,w);}}for(let g of t.backboneAtoms){let M=s.get(g.id);if(M===void 0||g.branchAtom===void 0)continue;let A=s.get(g.branchAtom.id);A!==void 0&&(M.branchAtom=A);}for(let g of this._mol.atoms)s.has(g.id)||s.set(g.id,g);let l=0;for(let g of this._mol.atoms)g.id>l&&(l=g.id);for(let g of this._mol.bonds)g.id>l&&(l=g.id);let d=l+1,u=s.get(e.backboneAtoms[e.backboneAtoms.length-1].id),c=s.get(t.backboneAtoms[0].id),m={id:d,a1:u,a2:c,kind:\"backbone\",r1:{kind:\"numeric\",r:2},r2:{kind:\"numeric\",r:1}},p=[];for(let g of this._mol.bonds){let M=s.get(g.a1.id)??g.a1,A=s.get(g.a2.id)??g.a2;M===g.a1&&A===g.a2?p.push(g):p.push({...g,a1:M,a2:A});}p.push(m);let h=[],f=[...e.backboneAtoms];for(let g of t.backboneAtoms)f.push(s.get(g.id));for(let g of this._mol.chains)if(g.id!==t.id)if(g.id===e.id){let M=g.bonds.map(A=>{let w=s.get(A.a1.id)??A.a1,T=s.get(A.a2.id)??A.a2;return w===A.a1&&T===A.a2?A:{...A,a1:w,a2:T}});for(let A of t.bonds){let w=s.get(A.a1.id)??A.a1,T=s.get(A.a2.id)??A.a2;M.push(w===A.a1&&T===A.a2?A:{...A,a1:w,a2:T});}M.push(m),h.push({id:g.id,polymerType:g.polymerType,backboneAtoms:f,bonds:M,...g.annotation!==void 0?{annotation:g.annotation}:{}});}else {let M=g.backboneAtoms.map(w=>s.get(w.id)??w),A=g.bonds.map(w=>{let T=s.get(w.a1.id)??w.a1,S=s.get(w.a2.id)??w.a2;return T===w.a1&&S===w.a2?w:{...w,a1:T,a2:S}});h.push({id:g.id,polymerType:g.polymerType,backboneAtoms:M,bonds:A,...g.annotation!==void 0?{annotation:g.annotation}:{}});}let k={atoms:this._mol.atoms.map(g=>s.get(g.id)??g),bonds:p,chains:h,groups:this._mol.groups,annotations:this._mol.annotations};return k=this._refreshContinuousIdsLocal(k),{id:d,mol:k}}_refreshContinuousIdsLocal(e){let t=Te(e),n=new Map;for(let l of e.atoms){let d=t.get(l.id);if(d===void 0||d===l.bio.continuousId){n.set(l.id,l);continue}n.set(l.id,{...l,bio:{...l.bio,continuousId:d}});}for(let l of e.atoms){if(l.branchAtom===void 0)continue;let d=n.get(l.id),u=n.get(l.branchAtom.id);d===void 0||u===void 0||(d.branchAtom=u);}let o=e.bonds.map(l=>{let d=n.get(l.a1.id)??l.a1,u=n.get(l.a2.id)??l.a2;return d===l.a1&&u===l.a2?l:{...l,a1:d,a2:u}}),r=new Map;for(let l of o)r.set(l.id,l);let s=e.chains.map(l=>{let d=l.backboneAtoms.map(c=>n.get(c.id)??c),u=l.bonds.map(c=>r.get(c.id)??c);return {id:l.id,polymerType:l.polymerType,backboneAtoms:d,bonds:u,...l.annotation!==void 0?{annotation:l.annotation}:{}}});return {atoms:e.atoms.map(l=>n.get(l.id)??l),bonds:o,chains:s,groups:e.groups,annotations:e.annotations}}_friendlyBondError(e,t,n,o,r){return e.includes(\"duplicate bond\")?`bond ${t.symbol}:R${o} \\u2194 ${n.symbol}:R${r} already exists`:e.includes(\"does not exist\")?\"one of the endpoint atoms is missing\":e}_validateAddBondConstraints(e,t,n,o){let r=this._mol.bonds,s=he(e);if(s>0&&(n<1||n>s))throw new B(\"rgroup-not-on-monomer\",`R-group R${n} is not defined on monomer '${e.symbol}' (has R1..R${s})`,{atomId:e.id,requested:n,total:s});let a=he(t);if(a>0&&(o<1||o>a))throw new B(\"rgroup-not-on-monomer\",`R-group R${o} is not defined on monomer '${t.symbol}' (has R1..R${a})`,{atomId:t.id,requested:o,total:a});if(s>0){let l=It(e,r).find(d=>d.rNumber===n);if(l!==void 0){let d=l.side===\"r1\"?l.bond.a2:l.bond.a1;throw new B(\"rgroup-already-bonded\",`R-group R${n} on '${e.symbol}' is already bonded to '${d.symbol}' (${d.bio.chainId}:${d.bio.positionInChain})`,{atomId:e.id,requested:n,conflictingBondId:l.bond.id})}}if(a>0){let l=It(t,r).find(d=>d.rNumber===o);if(l!==void 0){let d=l.side===\"r1\"?l.bond.a2:l.bond.a1;throw new B(\"rgroup-already-bonded\",`R-group R${o} on '${t.symbol}' is already bonded to '${d.symbol}' (${d.bio.chainId}:${d.bio.positionInChain})`,{atomId:t.id,requested:o,conflictingBondId:l.bond.id})}}for(let l of r){if(l.r1.kind!==\"numeric\"||l.r2.kind!==\"numeric\")continue;let d=l.a1.id===e.id&&l.a2.id===t.id&&l.r1.r===n&&l.r2.r===o,u=l.a1.id===t.id&&l.a2.id===e.id&&l.r1.r===o&&l.r2.r===n;if(d||u)throw new B(\"duplicate-bond\",`bond ${e.symbol}:R${n} \\u2194 ${t.symbol}:R${o} already exists`,{atomId:e.id,bondId:l.id})}}_freeRgroupsOn(e){return U(e,this._mol.bonds)}addHydrogenBond(e,t){this._ensureLive();let n=new $(this._mol),o={kind:\"pair\"},r=n.addBond({a1:e.id,a2:t.id,kind:\"hbond\",r1:o,r2:o}),{mol:s}=n.commit();this._replaceMol(s,\"addHydrogenBond\",\"api\");let a=yt(s,r);if(a===void 0)throw new Error(\"HelmEditor.addHydrogenBond: lost bond after commit\");return this._events.fire(\"bond:add\",{bond:a,source:\"api\"}),a}removeBond(e){this._ensureLive();let t=typeof e==\"number\"?e:e.id,n=yt(this._mol,t);if(n===void 0)return;let o=new $(this._mol);o.removeBond(t);let{mol:r}=o.commit();this._replaceMol(r,\"removeBond\",\"api\"),this._events.fire(\"bond:remove\",{bond:n,source:\"api\"});}replaceMonomer(e,t){this._ensureLive();let n=Y(this._mol,e.id);if(n===void 0)return;let o=n.symbol;if(o===t)return;let r=new $(this._mol);r.updateAtom(e.id,{symbol:t});let{mol:s}=r.commit(),a=ve(s,this._service.monomerLib,{mode:\"lenient\"}).mol;this._replaceMol(a,`replaceMonomer:${o}->${t}`,\"api\");let l=Y(a,e.id);l!==void 0&&this._events.fire(\"monomer:replace\",{atom:l,oldSymbol:o,newSymbol:t});}hitTest(e,t){this._ensureLive();let o=new W(this._mol,this._theme).test({x:e,y:t});return o===null?null:o.atom!==void 0?{atom:o.atom}:o.bond!==void 0?{bond:o.bond}:null}moveAtom(e,t){this._ensureLive();let n=Y(this._mol,e);if(n===void 0||n.p.x===t.x&&n.p.y===t.y)return;let o=new $(this._mol);o.updateAtom(e,{p:{x:t.x,y:t.y}});let{mol:r}=o.commit();this._replaceMol(r,\"moveAtom\",\"user\");}moveAtoms(e){if(this._ensureLive(),e.length===0)return;let t=new $(this._mol),n=0;for(let r of e){let s=Y(this._mol,r.atomId);s!==void 0&&(s.p.x===r.p.x&&s.p.y===r.p.y||(t.updateAtom(r.atomId,{p:{x:r.p.x,y:r.p.y}}),n+=1));}if(n===0)return;let{mol:o}=t.commit();this._replaceMol(o,\"moveAtom\",\"user\");}cleanLayout(e){this._ensureLive(),this._resetLastAction();let t=ee(this._mol,this._options.bondLength!==void 0?{bondLength:this._options.bondLength}:void 0);this._mol=t,this._history.push({mol:t,label:\"cleanLayout\"}),this._events.fire(\"layout:change\",{mol:t,strategy:\"auto\"}),this._events.fire(\"mol:changed\",{mol:t,changedAtomIds:new Set(t.atoms.map(n=>n.id)),changedBondIds:be,reason:\"cleanLayout\"});}canUndo(){return this._history.canUndo()}canRedo(){return this._history.canRedo()}undo(){this._ensureLive();let e=this._history.undo();e!==null&&this._restoreFromHistory(e.mol,\"undo\");}redo(){this._ensureLive();let e=this._history.redo();e!==null&&this._restoreFromHistory(e.mol,\"redo\");}on(e,t){return this._events.on(e,t)}off(e,t){this._events.off(e,t);}fire(e,t){this._events.fire(e,t);}zoom(e,t){if(this._ensureLive(),!Number.isFinite(e)||e<=0)return;let n=this._viewport.scale,o=n*e,r={...this._viewport.offset},s=r;t!==void 0&&(s={x:r.x+(n-o)*t.x,y:r.y+(n-o)*t.y});let a={scale:o,offset:s};this._viewport=a;let l=t??{x:0,y:0};this._events.fire(\"view:zoom\",{scale:o,center:l,previousScale:n}),this._events.fire(\"view:viewport-change\",{viewport:a});}panTo(e){this._ensureLive();let t={...this._viewport.offset},n={scale:this._viewport.scale,offset:{...e}};this._viewport=n,this._events.fire(\"view:pan\",{offset:n.offset,previousOffset:t}),this._events.fire(\"view:viewport-change\",{viewport:n});}getViewport(){return {scale:this._viewport.scale,offset:{...this._viewport.offset}}}fitToContent(e){this._ensureLive();let t=0,n=0,o=0,r=0,s=false;for(let c of this._mol.atoms){if(!s){t=o=c.p.x,n=r=c.p.y,s=true;continue}c.p.x<t&&(t=c.p.x),c.p.x>o&&(o=c.p.x),c.p.y<n&&(n=c.p.y),c.p.y>r&&(r=c.p.y);}let a=s?{x:t,y:n,width:o-t,height:r-n}:{x:0,y:0,width:0,height:0},l={...this._viewport.offset},d=this._viewport.scale,u={scale:1,offset:{x:0,y:0}};this._viewport=u,d!==1&&this._events.fire(\"view:zoom\",{scale:1,center:{x:0,y:0},previousScale:d}),(l.x!==0||l.y!==0)&&this._events.fire(\"view:pan\",{offset:u.offset,previousOffset:l}),this._events.fire(\"view:viewport-change\",{viewport:u}),this._events.fire(\"view:fit-to-content\",{bbox:a});}setViewOnly(e){this._ensureLive();let t=this._viewOnly;t!==e&&(this._viewOnly=e,this._events.fire(\"option:change\",{key:\"viewOnly\",oldValue:t,newValue:e}));}setTheme(e){this._ensureLive();let t=this._theme;t!==e&&(this._theme=e,this._events.fire(\"theme:change\",{theme:e,previousTheme:t}));}toSvg(e){this._ensureLive();let t=this.getHelm(),n={};return e?.width!==void 0&&(n.width=e.width),e?.height!==void 0&&(n.height=e.height),this._service.renderToSvg(t,n)}async toPng(e){this._ensureLive();let t=this.getHelm(),n={};return e?.width!==void 0&&(n.width=e.width),e?.height!==void 0&&(n.height=e.height),this._service.renderToPng(t,n)}_getHost(){return this._host}_observerCount(){return this._events.observerCount()}_currentHighlights(){return this._highlights}_currentTheme(){return this._theme}_getView(){return this._view}_getViewport(){return this._viewport}openAtomProps(e){this._ensureLive(),this._host!==null&&(this._atomDialog===null&&(this._atomDialog=new Ge(this)),this._atomDialog.open(e));}openBondProps(e){this._ensureLive(),this._host!==null&&(this._bondDialog===null&&(this._bondDialog=new Ve(this)),this._bondDialog.open(e));}openFindReplace(){this._ensureLive(),this._host!==null&&(this._findReplaceDialog===null&&(this._findReplaceDialog=new Ue(this)),this._findReplaceDialog.open());}getMode(){return this._mode}setMode(e){this._ensureLive();let t=this._mode;t!==e&&(this._mode=e,this._events.fire(\"option:change\",{key:\"mode\",oldValue:t,newValue:e}));}getNextAddSymbol(){return this._nextAdd}setNextAddSymbol(e,t){this._ensureLive();let n=this._nextAdd;if(e===null)this._nextAdd=null;else {if(t===void 0)return;this._nextAdd={symbol:e,biotype:t};}this._events.fire(\"option:change\",{key:\"nextAdd\",oldValue:n,newValue:this._nextAdd});}startPaletteDrag(e,t){if(this._ensureLive(),this._dnd===null){this._events.fire(\"dnd:start\",{source:\"palette\",symbol:e});return}this._dnd.startPaletteDrag(e,t);}findMonomers(e){this._ensureLive();let t=[];for(let n of this._mol.atoms)n.symbol===e&&t.push(n);return t}replaceMonomers(e,t){this._ensureLive();let n,o;if(typeof e==\"string\"){let d=e,u=t;if(n=this.findMonomers(d),n.length===0)return 0;if(d===u)return n.length;o=`${d}->${u}`;}else {let d=t,u=new Set,c=[];for(let m of e){if(u.has(m.id))continue;u.add(m.id);let p=Y(this._mol,m.id);p!==void 0&&p.symbol!==d&&c.push(p);}if(c.length===0)return 0;n=c,o=`atoms[${c.length}]->${d}`;}let r=t,s=new $(this._mol);for(let d of n)s.updateAtom(d.id,{symbol:r});let{mol:a}=s.commit(),l=ve(a,this._service.monomerLib,{mode:\"lenient\"}).mol;return this._replaceMol(l,`replaceMonomers:${o}`,\"api\"),n.length}nudgeSelection(e,t){this._ensureLive();let n=this._selection;if(n.atoms.size===0)return;let o=new $(this._mol);for(let s of n.atoms){let a=Y(this._mol,s);a!==void 0&&o.updateAtom(s,{p:{x:a.p.x+e,y:a.p.y+t}});}let{mol:r}=o.commit();this._replaceMol(r,\"nudge\",\"user\");}deleteSelection(){this._ensureLive();let e=this._selection;if(e.atoms.size===0&&e.bonds.size===0)return;let t=new $(this._mol);for(let o of e.atoms)t.removeAtom(o);for(let o of e.bonds)t.removeBond(o);let{mol:n}=t.commit();this._selection=N.empty(),this._replaceMol(n,\"delete-selection\",\"user\"),this._events.fire(\"selection:change\",{selection:this._selection,addedAtomIds:be,removedAtomIds:e.atoms,addedBondIds:be,removedBondIds:e.bonds});}appendRnaTriplet(e,t,n){this._ensureLive();let o=ze(e,t,n),r=this.getHelm(),s=oa(r,o);this.setHelm(s);}placeRnaTriplet(e,t,n){this._ensureLive();let o=1.6*(this._options.bondLength??28),r,s=this._mol.atoms;if(this._lastAction===\"add-triplet\"&&this._lastTripletSugarPos!==null)r={x:this._lastTripletSugarPos.x+o*2,y:this._lastTripletSugarPos.y};else if(s.length===0)r={x:0,y:0};else {let M=s[0].p.x,A=s[0].p.y;for(let w of s)w.p.x<M&&(M=w.p.x),w.p.y>A&&(A=w.p.y);r={x:M,y:A+o};}let a={x:r.x+o,y:r.y},l={x:r.x,y:r.y+o},d=new Set;for(let M of this._mol.chains)d.add(M.id);let u=1;for(;d.has(`RNA${u}`);)u+=1;let c=`RNA${u}`,m=new $(this._mol),p=m.addAtom({p:r,biotype:b.SUGAR,symbol:e,chainId:c,positionInChain:1}),h=m.addAtom({p:a,biotype:b.LINKER,symbol:n,chainId:c,positionInChain:2}),f=m.addAtom({p:l,biotype:b.BASE,symbol:t,chainId:c,positionInChain:0});m.addBond({a1:p,a2:f,kind:\"branch\",r1:{kind:\"numeric\",r:3},r2:{kind:\"numeric\",r:1}}),m.addBond({a1:p,a2:h,kind:\"backbone\",r1:{kind:\"numeric\",r:2},r2:{kind:\"numeric\",r:1}});let{mol:_}=m.commit(),k=this._postProcessTripletMol(_,p,f,c),g=ve(k,this._service.monomerLib,{mode:\"lenient\"}).mol;this._replaceMol(g,\"placeRnaTriplet\",\"user\"),this._lastAction=\"add-triplet\",this._lastTripletSugarPos=r;}_postProcessTripletMol(e,t,n,o){let r=new Map,s=Y(e,n),a=Y(e,t);if(s===void 0||a===void 0)return e;let l={...a,branchAtom:s};r.set(t,l);let d=e.bonds.map(h=>{let f=r.get(h.a1.id)??h.a1,_=r.get(h.a2.id)??h.a2;return f===h.a1&&_===h.a2?h:{...h,a1:f,a2:_}}),u=new Map;for(let h of d)u.set(h.id,h);let c=e.chains.map(h=>{let f=[];for(let k of h.backboneAtoms)h.id===o&&k.id===n||f.push(r.get(k.id)??k);let _=h.bonds.map(k=>u.get(k.id)??k);return {id:h.id,polymerType:h.polymerType,backboneAtoms:f,bonds:_,...h.annotation!==void 0?{annotation:h.annotation}:{}}}),p={atoms:e.atoms.map(h=>r.get(h.id)??h),bonds:d,chains:c,groups:e.groups,annotations:e.annotations};return p=this._refreshContinuousIdsLocal(p),p}_resetLastAction(){this._lastAction=\"other\",this._lastTripletSugarPos=null;}_ensureLive(){if(this._destroyed)throw new Error(\"HelmEditor: this instance has been destroyed.\")}_replaceMol(e,t,n){let o=this._service.serialize(this._mol),r=this._service.serialize(e);this._mol=e,this._history.push({mol:e,label:t}),this._resetLastAction(),this._events.fire(\"mol:changed\",{mol:e,changedAtomIds:new Set(e.atoms.map(s=>s.id)),changedBondIds:new Set(e.bonds.map(s=>s.id)),reason:t}),o!==r&&this._events.fire(\"helm:changed\",{helm:r,mol:e,source:n});}_restoreFromHistory(e,t){let n=this._service.serialize(this._mol),o=this._service.serialize(e);this._mol=e,this._resetLastAction(),this._events.fire(\"mol:changed\",{mol:e,changedAtomIds:new Set(e.atoms.map(r=>r.id)),changedBondIds:new Set(e.bonds.map(r=>r.id)),reason:t}),n!==o&&this._events.fire(\"helm:changed\",{helm:o,mol:e,source:t});}};function Pn(i){return i.startsWith(\"[\")&&i.endsWith(\"]\")||i.length===1&&/^[A-Za-z]$/.test(i)?i:`[${i}]`}function ze(i,e,t){return `${Pn(i)}(${Pn(e)})${Pn(t)}`}function oa(i,e){if(i===\"\")return `RNA1{${e}}$$$$V2.0`;let t=/(^|\\|)(RNA\\d+)\\{([^}]*)\\}/g,n=null,o;for(;(o=t.exec(i))!==null;)n={name:o[2],body:o[3],matchText:o[0]};if(n!==null){let h=n.body===\"\"?\"\":\".\",f=`${n.matchText.startsWith(\"|\")?\"|\":\"\"}${n.name}{${n.body}${h}${e}}`,_=i.lastIndexOf(n.matchText);return i.slice(0,_)+f+i.slice(_+n.matchText.length)}let r=new Set,s=/RNA(\\d+)\\{/g,a;for(;(a=s.exec(i))!==null;)r.add(Number(a[1]));let l=1;for(;r.has(l);)l+=1;let d=`RNA${l}{${e}}`,u=i.indexOf(\"$\");if(u<0)return `${i}|${d}$$$$V2.0`;let c=i.slice(0,u),m=i.slice(u);return `${c}${c===\"\"?\"\":\"|\"}${d}${m}`}var ia=5,ra=3,sa=14,aa=11,la=9,da=8,ca=48,ua=96;function ma(i){return i<=ra?sa:i<=6?aa:i<=9?la:da}function wi(i,e){let t=P(e.monomer,e.biotype,e.theme.colorTheme),n=vt(t.background),o=t.text,r=qn(o,n)<ia,s=e.monomer.symbol,a=ma(s.length),d=s.length>=10?\"line-height:1.1;letter-spacing:-0.02em;\":\"\",u=`font-size:${a}px;${d}white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:${ua-16}px;display:inline-block;`,c=y(i,\"span\",{class:\"hw-palette__star\"},[e.favorite?\"\\u2605\":\"\\u2606\"]),m=y(i,\"span\",{class:\"hw-palette__label\",style:u},[s]),p=[\"hw-palette__tile\"];e.primed&&p.push(\"hw-palette__tile--primed\"),e.favorite&&p.push(\"hw-palette__tile--favorite\"),r&&p.push(\"hw-palette__tile--low-contrast\");let h=e.monomer.name!==void 0?`${s} \\u2014 ${e.monomer.name}`:s,f=`background:${n};color:${o};width:100%;min-width:${ca}px;padding:4px 6px;height:40px;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;`;return {root:y(i,\"div\",{class:p.join(\" \"),draggable:\"true\",role:\"button\",\"aria-pressed\":e.primed?\"true\":\"false\",\"aria-label\":h,\"data-symbol\":s,\"data-biotype\":e.biotype,\"data-bg\":n,\"data-raw-bg\":t.background,\"data-testid\":`palette-tile-${s}`,title:h,style:f},[c,m]),star:c}}function ki(i,e){let t=e.showStar!==false,n=y(i,\"span\",{class:\"hw-triplet-chip__star\"},[e.favorite?\"\\u2605\":\"\\u2606\"]),o=y(i,\"span\",{class:\"hw-triplet-chip__label\"},[e.label]),r=[\"hw-triplet-chip\"];e.favorite&&r.push(\"hw-triplet-chip--favorite\");let s=t?[n,o]:[o];return {root:y(i,\"div\",{class:r.join(\" \"),role:\"button\",tabindex:\"0\",\"aria-label\":e.title,\"data-sugar\":e.sugar,\"data-base\":e.base,\"data-linker\":e.linker,\"data-triplet\":e.label,\"data-testid\":`palette-triplet-${e.label}`,title:e.title,style:`background:${e.background};color:${e.textColor};`},s),star:n}}var ae=\"http://www.w3.org/2000/svg\",xi={sugar:b.SUGAR,base:b.BASE,linker:b.LINKER},pa={sugar:[\"r\",\"R\"],base:[\"A\"],linker:[\"p\",\"P\"]},ha=200,fa=180,rt={x:70,y:60},Hn={x:140,y:60},$n={x:70,y:130},Ke=18,Ai=18,st=22,zt=class zt{constructor(e,t,n){this.onValueSet=new X;this.onPickModeChange=new X;this._slots=new Map;this._favStar=null;this._pickMode=null;this._destroyed=false;this._builderRdkitCache=new Map;this._editor=t,this._doc=n?.documentImpl??E(e),this._hooks=n?.paletteHooks??null,this._favHooks=n?.favoriteHooks??null,this.element=y(this._doc,\"div\",{class:\"hw-rna-builder\",\"data-testid\":\"rna-builder\"});let o=y(this._doc,\"div\",{class:\"hw-rna-builder__header\"});if(o.appendChild(y(this._doc,\"div\",{class:\"hw-rna-builder__title\"},[\"RNA builder\"])),this._favHooks!==null){let l=y(this._doc,\"span\",{class:\"hw-rna-builder__fav hw-rna-builder__fav--disabled\",role:\"button\",tabindex:\"0\",\"data-testid\":\"rna-builder-fav-star\",title:\"Favorite this triplet\",\"aria-pressed\":\"false\",\"aria-disabled\":\"true\"},[\"\\u2606\"]),d=u=>{u.stopPropagation();let c=this.getSelection();c.preview===\"\"||this._favHooks===null||this._favHooks.toggleFavoriteTriplet(c.sugar,c.base,c.linker);};l.addEventListener(\"click\",d),l.addEventListener(\"keydown\",u=>{let c=u;(c.key===\"Enter\"||c.key===\" \")&&d(u);}),this._favStar=l,o.appendChild(l);}this.element.appendChild(o),this._hintEl=y(this._doc,\"div\",{class:\"hw-rna-builder__hint\",\"data-testid\":\"rna-builder-hint\",hidden:true}),this.element.appendChild(this._hintEl);let r=this._buildSvg();this.element.appendChild(r),this._preview=y(this._doc,\"div\",{class:\"hw-rna-builder__preview\",\"data-testid\":\"rna-builder-preview\"}),this.element.appendChild(this._preview),this._addBtn=y(this._doc,\"button\",{class:\"hw-rna-builder__add\",type:\"button\",\"data-testid\":\"rna-builder-add-btn\"},[\"Add triplet\"]),this._addBtn.addEventListener(\"click\",()=>this._onAddClicked()),this.element.appendChild(this._addBtn),e.appendChild(this.element);let s=t.getService().monomerLib.onChanged.subscribe(()=>{this._destroyed||this.refresh();}),a=t.on(\"theme:change\",()=>{this._destroyed||this._repaintSlotColors();});this._libUnsub=()=>{try{s();}catch{}try{a();}catch{}},this._populateDefaults(),this._updatePreview(),this._repaintSlotColors();}refresh(){this._populateDefaults(),this._updatePreview(),this._repaintSlotColors();}getSelection(){let e=this._slots.get(\"sugar\")?.value??\"\",t=this._slots.get(\"base\")?.value??\"\",n=this._slots.get(\"linker\")?.value??\"\",o=e!==\"\"&&t!==\"\"&&n!==\"\"?ze(e,t,n):\"\";return {sugar:e,base:t,linker:n,preview:o}}setField(e,t){let n=this._slots.get(e);n!==void 0&&(n.value=t,this._setLabelText(n.labelEl,t),this._repaintSlot(n),this._updatePreview(),this.onValueSet.next({field:e,symbol:t}));}startPickMode(e){if(this._pickMode===e){this.cancelPickMode();return}this._pickMode!==null&&this._setSlotPressed(this._pickMode,false),this._pickMode=e,this._setSlotPressed(e,true),this._setHintActive(e),this.onPickModeChange.next({field:e}),this._hooks!==null&&this._hooks.beginBiotypeFilter(xi[e],t=>{this.setField(e,t),this._exitPickMode();},()=>{this._exitPickMode();});}cancelPickMode(){this._pickMode!==null&&(this._hooks!==null&&this._hooks.endBiotypeFilter(),this._exitPickMode());}getPickMode(){return this._pickMode}triggerAdd(){this._onAddClicked();}destroy(){this._destroyed||(this._destroyed=true,this._pickMode!==null&&this._hooks!==null&&this._hooks.endBiotypeFilter(),this._libUnsub(),this.onValueSet.complete(),this.onPickModeChange.complete(),this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element));}_buildSvg(){let e=this._doc.createElementNS(ae,\"svg\");e.setAttribute(\"class\",\"hw-rna-builder__triplet\"),e.setAttribute(\"viewBox\",`0 0 ${ha} ${fa}`),e.setAttribute(\"data-testid\",\"rna-builder-triplet-svg\"),e.setAttribute(\"role\",\"group\"),e.setAttribute(\"aria-label\",\"Triplet preview\");let t=this._doc.createElementNS(ae,\"line\");t.setAttribute(\"class\",\"hw-rna-builder__bond\"),t.setAttribute(\"x1\",String(rt.x+Ke)),t.setAttribute(\"y1\",String(rt.y)),t.setAttribute(\"x2\",String(Hn.x-Ai)),t.setAttribute(\"y2\",String(Hn.y)),e.appendChild(t);let n=this._doc.createElementNS(ae,\"line\");n.setAttribute(\"class\",\"hw-rna-builder__bond\"),n.setAttribute(\"x1\",String(rt.x)),n.setAttribute(\"y1\",String(rt.y+Ke)),n.setAttribute(\"x2\",String($n.x)),n.setAttribute(\"y2\",String($n.y-st)),e.appendChild(n);let o=this._doc.createElementNS(ae,\"rect\");o.setAttribute(\"class\",\"hw-rna-builder__slot-shape\"),o.setAttribute(\"x\",String(-Ke)),o.setAttribute(\"y\",String(-Ke)),o.setAttribute(\"width\",String(Ke*2)),o.setAttribute(\"height\",String(Ke*2)),o.setAttribute(\"rx\",\"8\"),o.setAttribute(\"ry\",\"8\");let r=this._buildSlot(\"sugar\",\"Pick sugar (backbone)\",rt,o),s=this._doc.createElementNS(ae,\"circle\");s.setAttribute(\"class\",\"hw-rna-builder__slot-shape\"),s.setAttribute(\"cx\",\"0\"),s.setAttribute(\"cy\",\"0\"),s.setAttribute(\"r\",String(Ai));let a=this._buildSlot(\"linker\",\"Pick linker\",Hn,s),l=this._doc.createElementNS(ae,\"path\");l.setAttribute(\"class\",\"hw-rna-builder__slot-shape\"),l.setAttribute(\"d\",`M ${-st} 0 L 0 ${-st} L ${st} 0 L 0 ${st} Z`);let d=this._buildSlot(\"base\",\"Pick base\",$n,l);return e.appendChild(a.groupEl),e.appendChild(r.groupEl),e.appendChild(d.groupEl),this._slots.set(\"sugar\",r),this._slots.set(\"linker\",a),this._slots.set(\"base\",d),e}_buildSlot(e,t,n,o){let r=this._doc.createElementNS(ae,\"g\");r.setAttribute(\"class\",\"hw-rna-builder__slot\"),r.setAttribute(\"data-slot\",e),r.setAttribute(\"data-testid\",`rna-builder-slot-${e}`),r.setAttribute(\"role\",\"button\"),r.setAttribute(\"tabindex\",\"0\"),r.setAttribute(\"aria-label\",t),r.setAttribute(\"aria-pressed\",\"false\"),r.setAttribute(\"transform\",`translate(${n.x} ${n.y})`),r.appendChild(o);let s=this._doc.createElementNS(ae,\"text\");s.setAttribute(\"class\",\"hw-rna-builder__slot-label\"),s.setAttribute(\"data-testid\",`rna-builder-${e}-value`),s.setAttribute(\"x\",\"0\"),s.setAttribute(\"y\",\"0\"),s.setAttribute(\"text-anchor\",\"middle\"),s.setAttribute(\"dominant-baseline\",\"central\"),r.appendChild(s);let a=l=>{l.stopPropagation(),this.startPickMode(e);};return r.addEventListener(\"click\",a),r.addEventListener(\"keydown\",l=>{let d=l;(d.key===\"Enter\"||d.key===\" \")&&a(l);}),r.addEventListener(\"mouseenter\",l=>this._showSlotTooltip(e,l)),r.addEventListener(\"mouseleave\",()=>this._hideSlotTooltip()),r.addEventListener(\"focus\",()=>this._showSlotTooltip(e,null)),r.addEventListener(\"blur\",()=>this._hideSlotTooltip()),{id:e,biotype:xi[e],groupEl:r,shapeEl:o,labelEl:s,value:\"\"}}_setLabelText(e,t){let n=[];for(let a=e.firstChild;a!==null;a=a.nextSibling)a.nodeName===\"title\"||a.nodeName===\"TITLE\"||n.push(a);for(let a of n)e.removeChild(a);let o=ba(t);e.setAttribute(\"font-size\",String(o)),e.setAttribute(\"text-anchor\",\"middle\"),e.setAttribute(\"dominant-baseline\",\"central\");let r=t.length>10?`${t.slice(0,9)}\\u2026`:t;e.appendChild(this._doc.createTextNode(r));let s=e.parentNode;if(s!==null){let a=null;for(let l=s.firstChild;l!==null;l=l.nextSibling)if(l.nodeName===\"title\"||l.nodeName===\"TITLE\"){a=l;break}for(a===null&&(a=this._doc.createElementNS(ae,\"title\"),s.insertBefore(a,s.firstChild));a.firstChild!==null;)a.removeChild(a.firstChild);a.appendChild(this._doc.createTextNode(t));}}_repaintSlotColors(){for(let e of this._slots.values())this._repaintSlot(e);}_repaintSlot(e){let t=this._editor.getService().monomerLib,n=this._theme(),o=e.value===\"\"?null:_a(t,e.biotype,e.value),r=P(o,e.biotype,n.colorTheme);e.shapeEl.style.fill=r.background,e.shapeEl.style.stroke=r.line,e.labelEl.style.fill=r.text;}_populateDefaults(){let e=this._editor.getService().monomerLib;for(let[t,n]of this._slots.entries()){let o=ya(e,n.biotype),r=ga(o,pa[t]),s=n.value!==\"\"&&o.some(a=>a.symbol===n.value)?n.value:r??o[0]?.symbol??\"\";n.value=s,this._setLabelText(n.labelEl,s);}}_updatePreview(){let e=this.getSelection();for(;this._preview.firstChild!==null;)this._preview.removeChild(this._preview.firstChild);this._preview.appendChild(this._doc.createTextNode(e.preview===\"\"?\"-\":e.preview)),this._updateFavStar(e);}_updateFavStar(e){if(this._favStar===null||this._favHooks===null)return;let t=e.preview!==\"\",n=t&&this._favHooks.isFavoriteTriplet(e.sugar,e.base,e.linker);for(;this._favStar.firstChild!==null;)this._favStar.removeChild(this._favStar.firstChild);this._favStar.appendChild(this._doc.createTextNode(n?\"\\u2605\":\"\\u2606\")),this._favStar.setAttribute(\"aria-pressed\",n?\"true\":\"false\"),t?this._favStar.removeAttribute(\"aria-disabled\"):this._favStar.setAttribute(\"aria-disabled\",\"true\");let o=\"hw-rna-builder__fav\"+(n?\" hw-rna-builder__fav--active\":\"\")+(t?\"\":\" hw-rna-builder__fav--disabled\");this._favStar.setAttribute(\"class\",o);}_onAddClicked(){let e=this.getSelection();e.preview!==\"\"&&this._editor.placeRnaTriplet(e.sugar,e.base,e.linker);}_exitPickMode(){if(this._pickMode===null)return;let e=this._pickMode;this._setSlotPressed(e,false),this._pickMode=null,this._setHintActive(null),this.onPickModeChange.next({field:null});}_setHintActive(e){let t=this._hintEl;for(;t.firstChild!==null;)t.removeChild(t.firstChild);if(e===null){t.setAttribute(\"hidden\",\"\");return}t.removeAttribute(\"hidden\");let n=e===\"sugar\"?\"sugar\":e===\"base\"?\"base\":\"linker\";t.appendChild(this._doc.createTextNode(`Pick ${n} from palette`));}_setSlotPressed(e,t){let n=this._slots.get(e);if(n===void 0)return;n.groupEl.setAttribute(\"aria-pressed\",t?\"true\":\"false\");let r=(n.groupEl.getAttribute(\"class\")??\"\").split(/\\s+/).filter(s=>s!==\"hw-rna-builder__slot--active\").join(\" \");n.groupEl.setAttribute(\"class\",t?`${r} hw-rna-builder__slot--active`:r);}_theme(){let e=this._editor;return typeof e._currentTheme==\"function\"?e._currentTheme():this._editor.getService().theme}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}_builderRdkitSvgFor(e){if(e===null)return null;let t=e.smiles;if(t===void 0||t===\"\")return null;let n=this._rdkit();if(n===null)return null;let o=`${e.polymerType}:${e.symbol}`;if(this._builderRdkitCache.has(o))return this._builderRdkitCache.get(o)??null;let r=fe(n,t,220,140);if(this._builderRdkitCache.size>=zt._BUILDER_RDKIT_CACHE_LIMIT){let s=this._builderRdkitCache.keys().next().value;s!==void 0&&this._builderRdkitCache.delete(s);}return this._builderRdkitCache.set(o,r),r}_slotHint(e){switch(e){case \"sugar\":return \"Click to choose a different sugar\";case \"base\":return \"Click to choose a different base\";case \"linker\":return \"Click to choose a different linker\"}}_slotTitle(e,t){let n=t===\"\"?\"?\":t;switch(e){case \"sugar\":return `Sugar: ${n}`;case \"base\":return `Base: ${n}`;case \"linker\":return `Linker: ${n}`}}_showSlotTooltip(e,t){let n=this._slots.get(e);if(n===void 0)return;let r=this._editor.getService().monomerLib.getMonomerSet(n.biotype),s=n.value===\"\"?null:r.get(n.value)??null,a=te(this._doc,\"builder-tooltip\",\"hw-builder-tooltip\");xe(this._doc,a,{symbol:this._slotTitle(e,n.value),name:s?.name??\"\",rdkitSvg:this._builderRdkitSvgFor(s),rdkitTestid:\"builder-tooltip-rdkit-svg\",hint:this._slotHint(e)});let l=t;if(l!==null&&typeof l.clientX==\"number\"&&typeof l.clientY==\"number\")j(a,l.clientX,l.clientY);else {let d=n.groupEl,u=typeof d.getBoundingClientRect==\"function\"?d.getBoundingClientRect():null;u!==null?j(a,u.left+u.width/2,u.top+u.height/2):j(a,0,0);}}_hideSlotTooltip(){let e=this._doc.body.querySelector('[data-testid=\"builder-tooltip\"]');F(e);}};zt._BUILDER_RDKIT_CACHE_LIMIT=256;var Ut=zt;function ba(i){let e=i.length;return e<=2?16:e<=4?11:e<=7?8:e<=10?6:5}function ya(i,e){let t=i.getMonomerSet(e),n=[];for(let o of t.values())n.push(o);return n.sort((o,r)=>o.symbol.localeCompare(r.symbol)),n}function ga(i,e){let t=new Set;for(let n of i)t.add(n.symbol);for(let n of e)if(t.has(n))return n;return null}function _a(i,e,t){return i.getMonomerSet(e).get(t)??null}var le=\"Favorites\",Dn={[le]:\"\\u2605 Favorites\",[v.PEPTIDE]:\"Peptides\",[v.RNA]:\"RNA\",[v.CHEM]:\"CHEM\",[v.BLOB]:\"BLOB\",G:\"G\"},Kt=[le,v.PEPTIDE,v.RNA,v.CHEM,v.BLOB,\"G\"],Mi=\"hwe:palette:favorites\",Ti=\"hwe:palette:active-tab\",va=\"hwe.palette.favorites\";function Wt(i){return `${i.sugar}|${i.base}|${i.linker}`}var We=class We{constructor(e,t,n){this.favoritesChanged=new X;this._nextAddUnsub=()=>{};this._favorites=new Set;this._favoriteTriplets=[];this._pendingRnaSelection=null;this._visibleTabs=[le];this._activeTab=le;this._searchInput=null;this._filter=\"\";this._destroyed=false;this._rnaBuilder=null;this._activeBiotypeFilter=null;this._pickResolver=null;this._pickCanceller=null;this._pickEscapeListener=null;this._pickOutsideClickListener=null;this._paletteRdkitCache=new Map;this._editor=t,this._doc=n?.documentImpl??E(e),this._opts={documentImpl:this._doc,groupByNaturalAnalog:n?.groupByNaturalAnalog??true,allowFavorites:n?.allowFavorites??true},this._loadFavorites(),this._activeTab=this._resolveInitialTab(n?.initialTab),this.element=y(this._doc,\"div\",{class:\"hw-palette\",\"data-testid\":\"palette\"}),e.appendChild(this.element),this._render(),this._libUnsub=t.getService().monomerLib.onChanged.subscribe(()=>{this._destroyed||this.refresh();}),this._themeUnsub=t.on(\"theme:change\",()=>{this._destroyed||this.refresh();}),this._nextAddUnsub=t.on(\"option:change\",o=>{this._destroyed||o.key===\"nextAdd\"&&this._updatePrimedClasses();});}refresh(){this._render();}setFilter(e){this._filter=e.trim().toLowerCase(),this._searchInput!==null&&this._searchInput.value!==e&&(this._searchInput.value=e),this._applyFilter();}setActiveTab(e){this._visibleTabs.includes(e)&&(this._activeTab=e,this._persistActiveTab(),this._applyActiveTabClasses(),this._applyFilter());}getActiveTab(){return this._activeTab}getFavorites(){let e=this._editor.getService().monomerLib,t=[];for(let n of this._favorites)this._findMonomer(e,n)!==null&&t.push(n);return t}setFavorite(e,t){let n=this._favorites.has(e);t!==n&&(t?this._favorites.add(e):this._favorites.delete(e),this._saveFavorites(),this._hidePaletteTooltips(),this._render(),this._emitFavoritesChanged());}clearFavorites(){this._favorites.size===0&&this._favoriteTriplets.length===0||(this._favorites.clear(),this._favoriteTriplets.length=0,this._saveFavorites(),this._render(),this._emitFavoritesChanged());}getFavoriteTriplets(){return this._favoriteTriplets.map(e=>({...e}))}isFavoriteTriplet(e,t,n){let o=Wt({sugar:e,base:t,linker:n});return this._favoriteTriplets.some(r=>Wt(r)===o)}setFavoriteTriplet(e,t,n,o){let r=Wt({sugar:e,base:t,linker:n}),s=this._favoriteTriplets.findIndex(l=>Wt(l)===r),a=s>=0;o!==a&&(o?this._favoriteTriplets.push({sugar:e,base:t,linker:n}):this._favoriteTriplets.splice(s,1),this._saveFavorites(),this._hidePaletteTooltips(),this._render(),this._emitFavoritesChanged());}_hidePaletteTooltips(){let e=this._doc.body;F(e.querySelector('[data-testid=\"palette-tooltip\"]')),F(e.querySelector('[data-testid=\"palette-triplet-tooltip\"]'));}_emitFavoritesChanged(){this.favoritesChanged.next({favorites:this.getFavorites(),triplets:this.getFavoriteTriplets()});}destroy(){this._destroyed||(this._destroyed=true,this._rnaBuilder!==null&&(this._rnaBuilder.destroy(),this._rnaBuilder=null),this._libUnsub(),this._themeUnsub(),this._nextAddUnsub(),this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element));}getRnaBuilder(){return this._rnaBuilder}hasActiveBiotypeFilter(){return this._activeBiotypeFilter!==null}getActiveBiotypeFilter(){return this._activeBiotypeFilter}cancelBiotypeFilter(){if(this._activeBiotypeFilter===null)return;let e=this._pickCanceller;this._teardownPickMode(),e?.();}_buildPaletteFilterHooks(){return {beginBiotypeFilter:(e,t,n)=>{this._activeBiotypeFilter!==null&&this._teardownPickMode(),this._activeBiotypeFilter=e,this._pickResolver=t,this._pickCanceller=n,this._applyFilter();let o=l=>{l.key===\"Escape\"&&this.cancelBiotypeFilter();};this._pickEscapeListener=o,this._doc.defaultView?.addEventListener(\"keydown\",o);let s=l=>{if(this._activeBiotypeFilter===null)return;let d=l.target;if(d==null)return;let u=this._activeBiotypeFilter,c=d;for(;c!==null;){let m=c.getAttribute===void 0?null:c.getAttribute(\"class\");if(m!==null){let p=m.split(/\\s+/);if(p.includes(\"hw-palette__tile\")){if((c.getAttribute(\"data-biotype\")??\"\")===u)return;break}if(p.includes(\"hw-rna-builder__slot\")){if(this._isInsideOwnPalette(c))return;break}}c=c.parentElement;}this.cancelBiotypeFilter();};this._pickOutsideClickListener=s,this._doc.addEventListener(\"mousedown\",s,true);},endBiotypeFilter:()=>this._teardownPickMode()}}_scrollActivePaneToTop(){let e=this.element.querySelector(`.hw-palette__pane[data-tab=\"${this._activeTab}\"]`);if(e===null)return;let t=e;try{if(typeof t.scrollTo==\"function\"){t.scrollTo({top:0,behavior:\"smooth\"});return}}catch{}typeof t.scrollTop==\"number\"&&(t.scrollTop=0);}_isInsideOwnPalette(e){let t=e;for(;t!==null;){if(t===this.element)return true;t=t.parentElement;}return false}_teardownPickMode(){this._activeBiotypeFilter!==null&&(this._activeBiotypeFilter=null,this._pickResolver=null,this._pickCanceller=null,this._pickEscapeListener!==null&&(this._doc.defaultView?.removeEventListener(\"keydown\",this._pickEscapeListener),this._pickEscapeListener=null),this._pickOutsideClickListener!==null&&(this._doc.removeEventListener(\"mousedown\",this._pickOutsideClickListener,true),this._pickOutsideClickListener=null),this._applyFilter());}_render(){for(this._rnaBuilder!==null&&(this._pendingRnaSelection=this._rnaBuilder.getSelection(),this._rnaBuilder.destroy(),this._rnaBuilder=null);this.element.firstChild!==null;)this.element.removeChild(this.element.firstChild);let e=this._doc.createElement(\"input\");e.setAttribute(\"type\",\"search\"),e.setAttribute(\"class\",\"hw-palette__search\"),e.setAttribute(\"placeholder\",\"Search monomers...\"),e.setAttribute(\"data-testid\",\"palette-search\"),this._filter!==\"\"&&(e.value=this._filter),e.addEventListener(\"input\",()=>this.setFilter(e.value)),this._searchInput=e,this.element.appendChild(e),this._visibleTabs=this._computeVisibleTabs(),this._visibleTabs.includes(this._activeTab)||(this._activeTab=le);let t=y(this._doc,\"div\",{class:\"hw-palette__tabs\",role:\"tablist\",\"data-testid\":\"palette-tabs\"});for(let s of this._visibleTabs){let a=s===this._activeTab,l=y(this._doc,\"button\",{class:\"hw-palette__tab\",type:\"button\",role:\"tab\",\"aria-controls\":`hw-palette-pane-${s}`,\"aria-selected\":a?\"true\":\"false\",\"data-testid\":`palette-tab-${s}`,\"data-tab\":s,title:Dn[s]},[Dn[s]]);l.addEventListener(\"click\",()=>this.setActiveTab(s)),t.appendChild(l);}this.element.appendChild(t);let n=y(this._doc,\"div\",{class:\"hw-palette__panes\"}),o=this._theme(),r=this._editor.getService().monomerLib;for(let s of this._visibleTabs){let a=s===this._activeTab,l=y(this._doc,\"div\",{class:\"hw-palette__pane\",id:`hw-palette-pane-${s}`,role:\"tabpanel\",\"data-testid\":`palette-pane-${s}`,\"data-tab\":s,hidden:!a});s===le?this._buildFavoritesPane(l,r,o):this._buildPolymerPane(l,s,r,o),n.appendChild(l);}this.element.appendChild(n),this._applyFilter();}_computeVisibleTabs(){let e=this._editor.getService().monomerLib,t=new Set;for(let o of e.getPolymerTypes())t.add(o);let n=[];n.push(le);for(let o of Kt)o!==le&&t.has(o)&&n.push(o);return n}_buildFavoritesPane(e,t,n){let o=this._resolveFavoriteMonomers(t),r=this._favoriteTriplets;if(o.length===0&&r.length===0){let s=y(this._doc,\"div\",{class:\"hw-palette__placeholder\",\"data-testid\":\"palette-favorites-empty\"},[\"No favorites yet \\u2014 click the \\u2606 on any tile to add one.\"]);e.appendChild(s);return}for(let[s,a]of this._groupByPolymerAndType(o))e.appendChild(this._renderGroup(s,a));r.length>0&&e.appendChild(this._renderTripletGroup(\"RNA \\xB7 Triplets\",r,t));}_groupByPolymerAndType(e){let t=new Map;for(let s of e){let a=s.polymerType,l=s.monomerType??\"Undefined\",d=`${a}|${l}`,u=t.get(d);u===void 0&&(u={pt:a,mt:l,list:[]},t.set(d,u)),u.list.push(s);}let n=s=>{let a=Kt.indexOf(s);return a<0?99:a},o={Backbone:0,Branch:1,Terminal:2,Undefined:3};return Array.from(t.values()).sort((s,a)=>n(s.pt)-n(a.pt)||(o[s.mt]??9)-(o[a.mt]??9)||s.mt.localeCompare(a.mt)).map(s=>[`${this._polymerLabel(s.pt)} \\xB7 ${s.mt}`,s.list])}_polymerLabel(e){return Dn[e]??e}_renderTripletGroup(e,t,n){let o=y(this._doc,\"div\",{class:\"hw-palette__group\",\"data-natural-analog\":e}),r=y(this._doc,\"div\",{class:\"hw-palette__group-header\",\"data-testid\":`palette-group-${e}`},[e]),s=y(this._doc,\"div\",{class:\"hw-triplet-chips\",\"data-testid\":\"palette-triplet-favorites\"});for(let a of t)s.appendChild(this._renderTripletChip(a,n));return o.appendChild(r),o.appendChild(s),o}_renderTripletChip(e,t){let n=ze(e.sugar,e.base,e.linker),o=t.getMonomerSet(b.BASE).get(e.base)??null,r=P(o,b.BASE,this._theme().colorTheme),s=this.isFavoriteTriplet(e.sugar,e.base,e.linker),a=o?.name!==void 0&&o.name!==\"\"?`${n} \\u2014 ${o.name}`:n,{root:l}=ki(this._doc,{sugar:e.sugar,base:e.base,linker:e.linker,label:n,title:a,background:vt(r.background),textColor:r.text,favorite:s,showStar:this._opts.allowFavorites});return this._wireTripletChip(l,e),l}_wireTripletChip(e,t){e.addEventListener(\"mouseenter\",n=>{let o=n,r=te(this._doc,\"palette-triplet-tooltip\",\"hw-palette-tooltip hw-triplet-tooltip\");ai(this._doc,r,{title:ze(t.sugar,t.base,t.linker),parts:this._tripletTooltipParts(t),hint:\"Click to add this triplet\",rdkitTestid:\"palette-triplet-tooltip-rdkit-svg\"}),j(r,typeof o.clientX==\"number\"?o.clientX:0,typeof o.clientY==\"number\"?o.clientY:0);}),e.addEventListener(\"mouseleave\",()=>{F(this._doc.body.querySelector('[data-testid=\"palette-triplet-tooltip\"]'));}),e.addEventListener(\"click\",n=>{let o=n.target;if(this._opts.allowFavorites&&o?.classList?.contains(\"hw-triplet-chip__star\")===true){this.setFavoriteTriplet(t.sugar,t.base,t.linker,!this.isFavoriteTriplet(t.sugar,t.base,t.linker)),n.stopPropagation();return}this._editor.placeRnaTriplet(t.sugar,t.base,t.linker);}),e.addEventListener(\"keydown\",n=>{let o=n;(o.key===\"Enter\"||o.key===\" \")&&this._editor.placeRnaTriplet(t.sugar,t.base,t.linker);});}_buildRnaDefaultChips(e){let t=this._pickSymbol(e.getMonomerSet(b.SUGAR),[\"r\",\"R\"]),n=this._pickSymbol(e.getMonomerSet(b.LINKER),[\"p\",\"P\"]),o=e.getMonomerSet(b.BASE);if(t===null||n===null)return null;let r=We._DEFAULT_TRIPLET_BASES.filter(a=>o.has(a));if(r.length===0)return null;let s=y(this._doc,\"div\",{class:\"hw-triplet-chips hw-triplet-chips--defaults\",\"data-testid\":\"rna-default-triplets\"});for(let a of r)s.appendChild(this._renderTripletChip({sugar:t,base:a,linker:n},e));return s}_tripletTooltipParts(e){let t=this._editor.getService().monomerLib,n=(o,r,s)=>{let a=t.getMonomerSet(r).get(s)??null;return {role:o,symbol:s,...a?.name!==void 0?{name:a.name}:{},rdkitSvg:a===null?null:this._paletteRdkitSvg(a)}};return [n(\"Sugar\",b.SUGAR,e.sugar),n(\"Base\",b.BASE,e.base),n(\"Linker\",b.LINKER,e.linker)]}_pickSymbol(e,t){for(let o of t)if(e.has(o))return o;let n=e.keys().next();return n.done===true?null:n.value}_restoreRnaSelection(){let e=this._pendingRnaSelection;if(this._pendingRnaSelection=null,e===null||this._rnaBuilder===null)return;let t=this._editor.getService().monomerLib;e.sugar!==\"\"&&t.getMonomerSet(b.SUGAR).has(e.sugar)&&this._rnaBuilder.setField(\"sugar\",e.sugar),e.base!==\"\"&&t.getMonomerSet(b.BASE).has(e.base)&&this._rnaBuilder.setField(\"base\",e.base),e.linker!==\"\"&&t.getMonomerSet(b.LINKER).has(e.linker)&&this._rnaBuilder.setField(\"linker\",e.linker);}_resolveFavoriteMonomers(e){let t=[];for(let n of this._favorites){let o=this._findMonomer(e,n);o!==null&&t.push(o);}return t}_findMonomer(e,t){for(let n of e.getPolymerTypes()){let o=e.getMonomer(n,t);if(o!==null)return o}return null}_buildPolymerPane(e,t,n,o){let r=t,s=this._monomersForPolymer(r,n);if(s.length===0)return;if(r===v.RNA){this._rnaBuilder=new Ut(e,this._editor,{documentImpl:this._doc,paletteHooks:this._buildPaletteFilterHooks(),favoriteHooks:this._opts.allowFavorites?{isFavoriteTriplet:(m,p,h)=>this.isFavoriteTriplet(m,p,h),toggleFavoriteTriplet:(m,p,h)=>this.setFavoriteTriplet(m,p,h,!this.isFavoriteTriplet(m,p,h))}:null}),this._restoreRnaSelection();let u=this._buildRnaDefaultChips(n);u!==null&&e.appendChild(u);let c=this._groupRna(s);for(let[m,p]of c)p.length!==0&&e.appendChild(this._renderGroup(m,p));return}if(r===v.PEPTIDE&&this._opts.groupByNaturalAnalog){let u=this._groupByAnalog(s);for(let[c,m]of u){let p=c===\"\"?\"Other\":c;e.appendChild(this._renderGroup(p,m));}return}let a=y(this._doc,\"div\",{class:\"hw-palette__group-tiles\"}),l=this._editor.getNextAddSymbol(),d=this._sortByColor(s);for(let u of d){let c=this._biotype(u,r);a.appendChild(this._renderTile(u,c,l));}e.appendChild(a);}_renderGroup(e,t){let n=y(this._doc,\"div\",{class:\"hw-palette__group\",\"data-natural-analog\":e}),o=y(this._doc,\"div\",{class:\"hw-palette__group-header\",\"data-testid\":`palette-group-${e}`},[e]),r=y(this._doc,\"div\",{class:\"hw-palette__group-tiles\"}),s=this._editor.getNextAddSymbol(),a=this._sortByColor(t);for(let l of a){let d=this._biotype(l,l.polymerType);r.appendChild(this._renderTile(l,d,s));}return n.appendChild(o),n.appendChild(r),n}_sortByColor(e){let t=this._theme(),n=e.map((o,r)=>{let s=this._biotype(o,o.polymerType),a=P(o,s,t.colorTheme),l=Yn(a.background),d=l.s===0?1:0;return {m:o,idx:r,h:l.h,s:l.s,l:l.l,isGrey:d}});return n.sort((o,r)=>o.isGrey!==r.isGrey?o.isGrey-r.isGrey:o.h!==r.h?o.h-r.h:o.s!==r.s?o.s-r.s:o.l!==r.l?o.l-r.l:o.idx-r.idx),n.map(o=>o.m)}_monomersForPolymer(e,t){let n=t.getMonomerSymbolsByType(e),o=[];for(let r of n){let s=t.getMonomer(e,r);s!==null&&o.push(s);}return o.sort((r,s)=>r.symbol.localeCompare(s.symbol)),o}_groupByAnalog(e){let t=new Map;for(let r of e){let s=r.naturalAnalog??\"\",a=t.get(s);a===void 0&&(a=[],t.set(s,a)),a.push(r);}let n=[],o=Array.from(t.keys()).sort((r,s)=>r===\"\"&&s!==\"\"?1:s===\"\"&&r!==\"\"?-1:r.localeCompare(s));for(let r of o)n.push([r,t.get(r)]);return new Map(n)}_groupRna(e){let t=[],n=[],o=[],r=[];for(let a of e){let l=Z(a);l===b.SUGAR?t.push(a):l===b.BASE?n.push(a):l===b.LINKER?o.push(a):r.push(a);}let s=new Map;return s.set(\"Backbones\",t),s.set(\"Bases\",n),s.set(\"Linkers\",o),r.length>0&&s.set(\"Other\",r),s}_renderTile(e,t,n){let o=this._favorites.has(e.symbol),r=n!==null&&n.symbol===e.symbol&&n.biotype===t,{root:s,star:a}=wi(this._doc,{monomer:e,biotype:t,theme:this._theme(),favorite:o,primed:r});return this._wireTile(s,a,e,t),s}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}_paletteRdkitSvg(e){let t=e.smiles;if(t===void 0||t===\"\")return null;let n=this._rdkit();if(n===null)return null;let o=`${e.polymerType}:${e.symbol}`;if(this._paletteRdkitCache.has(o))return this._paletteRdkitCache.get(o)??null;let r=fe(n,t,220,140);if(this._paletteRdkitCache.size>=We._PALETTE_RDKIT_CACHE_LIMIT){let s=this._paletteRdkitCache.keys().next().value;s!==void 0&&this._paletteRdkitCache.delete(s);}return this._paletteRdkitCache.set(o,r),r}_wireTile(e,t,n,o){e.addEventListener(\"mouseenter\",r=>{let s=r,a=te(this._doc,\"palette-tooltip\",\"hw-palette-tooltip\");xe(this._doc,a,{symbol:n.symbol,name:n.name??\"\",rdkitSvg:this._paletteRdkitSvg(n),rdkitTestid:\"palette-tooltip-rdkit-svg\"});let l=typeof s.clientX==\"number\"?s.clientX:0,d=typeof s.clientY==\"number\"?s.clientY:0;j(a,l,d);}),e.addEventListener(\"mouseleave\",()=>{F(this._doc.body.querySelector('[data-testid=\"palette-tooltip\"]'));}),e.addEventListener(\"click\",r=>{let s=r.target;if(this._opts.allowFavorites&&s!==void 0&&s?.classList?.contains(\"hw-palette__star\")===true){this.setFavorite(n.symbol,!this._favorites.has(n.symbol)),r.stopPropagation();return}if(this._activeBiotypeFilter!==null&&this._activeBiotypeFilter===o){let d=this._pickResolver;this._teardownPickMode(),d?.(n.symbol),this._scrollActivePaneToTop(),r.stopPropagation();return}let a=this._editor.getSelection();if(a.atoms.size>0){let d=this._editor.getMol(),u=[];for(let m of a.atoms){let p=d.atoms.find(h=>h.id===m);p!==void 0&&u.push(p);}if(u.length>0&&u.every(m=>m.biotype===o)){this._editor.replaceMonomers(u,n.symbol),r.stopPropagation();return}this._editor.fire(\"editor:status\",{message:`Cannot bulk-replace ${u.length} selected atom(s) with ${n.symbol}: selection contains incompatible biotypes for ${o}.`,severity:\"warn\",durationMs:3e3}),r.stopPropagation();return}let l=this._editor.getNextAddSymbol();if(l!==null&&l.symbol===n.symbol&&l.biotype===o){this._editor.setNextAddSymbol(null),this._updatePrimedClasses();return}this._editor.setNextAddSymbol(n.symbol,o),this._updatePrimedClasses();}),e.addEventListener(\"dragstart\",r=>{let s=r.dataTransfer;if(s!=null)try{s.setData(\"application/x-hwe-monomer\",JSON.stringify({symbol:n.symbol,biotype:o})),s.effectAllowed=\"copy\";}catch{}F(this._doc.body.querySelector('[data-testid=\"palette-tooltip\"]')),this._editor.startPaletteDrag(n.symbol,o);});}_biotype(e,t){let n=Z(e);if(n!==null)return n;switch(t){case v.PEPTIDE:return b.AA;case v.RNA:return b.SUGAR;case v.CHEM:return b.CHEM;case v.BLOB:return b.BLOB;default:return b.CHEM}}_theme(){let e=this._editor;return typeof e._currentTheme==\"function\"?e._currentTheme():this._editor.getService().theme}_applyFilter(){let e=this._filter,t=this._activeBiotypeFilter,n=this.element.querySelector(`.hw-palette__pane[data-tab=\"${this._activeTab}\"]`),o=(n??this.element).querySelectorAll(\".hw-palette__tile\");for(let a=0;a<o.length;a++){let l=o[a],d=(l.getAttribute(\"data-symbol\")??\"\").toLowerCase(),u=(l.getAttribute(\"title\")??\"\").toLowerCase(),c=l.getAttribute(\"data-biotype\")??\"\",h=(e===\"\"||d.indexOf(e)>=0||u.indexOf(e)>=0)&&(t===null||c===t);l.style.display=h?\"\":\"none\";}let r=(n??this.element).querySelectorAll(\".hw-triplet-chip\");for(let a=0;a<r.length;a++){let l=r[a],d=[l.getAttribute(\"data-triplet\")??\"\",l.getAttribute(\"data-sugar\")??\"\",l.getAttribute(\"data-base\")??\"\",l.getAttribute(\"data-linker\")??\"\"].join(\" \").toLowerCase(),u=(e===\"\"||d.indexOf(e)>=0)&&t===null;l.style.display=u?\"\":\"none\";}let s=(n??this.element).querySelectorAll(\".hw-palette__group\");for(let a=0;a<s.length;a++){let l=s[a],d=l.querySelectorAll(\".hw-palette__tile, .hw-triplet-chip\"),u=false;for(let c=0;c<d.length;c++)if(d[c].style.display!==\"none\"){u=true;break}u?(l.removeAttribute(\"hidden\"),l.removeAttribute(\"data-section-empty\")):(l.setAttribute(\"hidden\",\"\"),l.setAttribute(\"data-section-empty\",\"true\"));}}_updatePrimedClasses(){let e=this._editor.getNextAddSymbol(),t=this.element.querySelectorAll(\".hw-palette__tile\");for(let n=0;n<t.length;n++){let o=t[n],r=o.getAttribute(\"data-symbol\")??\"\",s=o.getAttribute(\"data-biotype\")??\"\",a=e!==null&&e.symbol===r&&e.biotype===s,d=(o.getAttribute(\"class\")??\"\").split(/\\s+/).filter(u=>u!==\"hw-palette__tile--primed\").join(\" \");o.setAttribute(\"class\",a?`${d} hw-palette__tile--primed`:d),o.setAttribute(\"aria-pressed\",a?\"true\":\"false\");}}_applyActiveTabClasses(){let e=this.element.querySelectorAll(\".hw-palette__tab\");for(let n=0;n<e.length;n++){let o=e[n],r=o.getAttribute(\"data-tab\")??\"\";o.setAttribute(\"aria-selected\",r===this._activeTab?\"true\":\"false\");}let t=this.element.querySelectorAll(\".hw-palette__pane\");for(let n=0;n<t.length;n++){let o=t[n];(o.getAttribute(\"data-tab\")??\"\")===this._activeTab?o.removeAttribute(\"hidden\"):o.setAttribute(\"hidden\",\"\");}}_localStorage(){if(!this._opts.allowFavorites)return null;let e=this._doc.defaultView;if(e==null)return null;try{return e.localStorage??null}catch{return null}}_resolveInitialTab(e){if(e!==void 0&&Kt.includes(e))return e;let t=this._localStorage();if(t!==null)try{let n=t.getItem(Ti);if(n!==null&&Kt.includes(n))return n}catch{}return le}_persistActiveTab(){let e=this._localStorage();if(e!==null)try{e.setItem(Ti,this._activeTab);}catch{}}_loadFavorites(){let e=this._localStorage();if(e!==null){try{let t=e.getItem(Mi);if(t!==null&&t!==\"\"){let n=JSON.parse(t),o=this._extractSymbols(n);for(let r of o)this._favorites.add(r);for(let r of this._extractTriplets(n))this._favoriteTriplets.push(r);return}}catch{}try{let t=e.getItem(va);if(t===null||t===\"\")return;let n=JSON.parse(t);if(Array.isArray(n)){for(let o of n){if(typeof o!=\"string\")continue;let r=o.indexOf(\"|\"),s=r>=0?o.slice(r+1):o;s!==\"\"&&this._favorites.add(s);}this._saveFavorites();}}catch{}}}_extractSymbols(e){if(Array.isArray(e)){let t=[];for(let n of e)typeof n==\"string\"&&t.push(n);return t}if(e!==null&&typeof e==\"object\"){let t=e;if(Array.isArray(t.symbols)){let n=[];for(let o of t.symbols)typeof o==\"string\"&&n.push(o);return n}}return []}_extractTriplets(e){if(e===null||typeof e!=\"object\")return [];let t=e;if(!Array.isArray(t.triplets))return [];let n=[];for(let o of t.triplets){if(o===null||typeof o!=\"object\")continue;let r=o;typeof r.sugar==\"string\"&&typeof r.base==\"string\"&&typeof r.linker==\"string\"&&n.push({sugar:r.sugar,base:r.base,linker:r.linker});}return n}_saveFavorites(){let e=this._localStorage();if(e!==null)try{let t={symbols:Array.from(this._favorites)};this._favoriteTriplets.length>0&&(t.triplets=this._favoriteTriplets.map(n=>({...n}))),e.setItem(Mi,JSON.stringify(t));}catch{}}};We._DEFAULT_TRIPLET_BASES=[\"A\",\"C\",\"G\",\"U\",\"T\"],We._PALETTE_RDKIT_CACHE_LIMIT=256;var at=We;var G='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">',wa={new:`${G}<path d=\"M13 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9z\"/><path d=\"M13 3v6h6\"/><line x1=\"12\" y1=\"12.5\" x2=\"12\" y2=\"17.5\"/><line x1=\"9.5\" y1=\"15\" x2=\"14.5\" y2=\"15\"/></svg>`,open:`${G}<path d=\"m6 14 1.45-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.55 6a2 2 0 0 1-1.94 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H18a2 2 0 0 1 2 2v2\"/></svg>`,save:`${G}<rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"/><path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"/><path d=\"m9 14 2 2 4-4\"/></svg>`,undo:`${G}<path d=\"M3 12a9 9 0 1 0 9-9 9.7 9.7 0 0 0-6.7 2.8L3 8\"/><path d=\"M3 3v5h5\"/></svg>`,redo:`${G}<path d=\"M21 12a9 9 0 1 1-9-9 9.7 9.7 0 0 1 6.7 2.8L21 8\"/><path d=\"M21 3v5h-5\"/></svg>`,eraser:`${G}<path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\"/><path d=\"M22 21H7\"/><path d=\"m5 11 9 9\"/></svg>`,select:`${G}<path d=\"m4 4 7.07 17 2.51-7.39L21 11.07z\"/></svg>`,hbond:`${G}<path d=\"M9 17H7A5 5 0 0 1 7 7h2\"/><path d=\"M15 7h2a5 5 0 1 1 0 10h-2\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/></svg>`,\"zoom-in\":`${G}<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>`,\"zoom-out\":`${G}<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>`,fit:`${G}<polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"/><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"/></svg>`,move:`${G}<polyline points=\"5 9 2 12 5 15\"/><polyline points=\"9 5 12 2 15 5\"/><polyline points=\"15 19 12 22 9 19\"/><polyline points=\"19 9 22 12 19 15\"/><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\"/></svg>`,clean:`${G}<path d=\"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72Z\"/><path d=\"m14 7 3 3\"/><path d=\"M5 6v4\"/><path d=\"M19 14v4\"/><path d=\"M10 2v2\"/><path d=\"M7 8H3\"/><path d=\"M21 16h-4\"/><path d=\"M11 3H9\"/></svg>`,find:`${G}<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>`,theme:`${G}<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 3a9 9 0 0 1 0 18z\" fill=\"currentColor\" stroke=\"none\"/></svg>`},ka={new:\"New \\u2014 clear the canvas\",open:\"Open \\u2014 paste a HELM string\",save:\"Save \\u2014 copy HELM string to clipboard\",undo:\"Undo last action\",redo:\"Redo last undone action\",eraser:\"Eraser \\u2014 click an atom or bond to delete it\",select:\"Select mode (default)\",hbond:\"H-Bond mode \\u2014 drag between two RNA bases to add a Watson-Crick pair\",\"zoom-in\":\"Zoom in\",\"zoom-out\":\"Zoom out\",fit:\"Fit to content \\u2014 reset zoom and pan\",move:\"Move/Pan mode \\u2014 drag the canvas to scroll\",clean:\"Clean layout \\u2014 re-run automatic layout\",find:\"Find / Replace monomer\",theme:\"Toggle dark / light theme\"},Si=[{id:\"new\",label:\"New\",icon:\"New\"},{id:\"open\",label:\"Open\",icon:\"Open\"},{id:\"save\",label:\"Save\",icon:\"Save\"},{id:\"undo\",label:\"Undo\",icon:\"\\u21BA\",shortcut:\"Ctrl+Z\",separator:true},{id:\"redo\",label:\"Redo\",icon:\"\\u21BB\",shortcut:\"Ctrl+Y\"},{id:\"eraser\",label:\"Eraser\",icon:\"Eraser\",separator:true},{id:\"select\",label:\"Select\",icon:\"Select\"},{id:\"hbond\",label:\"H-Bond\",icon:\"H-Bond\"},{id:\"zoom-in\",label:\"Zoom In\",icon:\"+\",shortcut:\"Ctrl++\",separator:true},{id:\"zoom-out\",label:\"Zoom Out\",icon:\"\\u2212\",shortcut:\"Ctrl+\\u2212\"},{id:\"fit\",label:\"Fit\",icon:\"Fit\",shortcut:\"0\"},{id:\"move\",label:\"Move\",icon:\"Move\"},{id:\"clean\",label:\"Clean\",icon:\"Clean\",separator:true},{id:\"find\",label:\"Find\",icon:\"Find\",shortcut:\"Ctrl+F\"},{id:\"theme\",label:\"Theme\",icon:\"Theme\",separator:true}],lt=class{constructor(e,t,n){this._buttons=new Map;this._unsubs=[];this._destroyed=false;this._editor=t,this._doc=n?.documentImpl??E(e);let o=n?.buttons??Si;this.element=y(this._doc,\"div\",{class:\"hw-toolbar\",\"data-testid\":\"toolbar\"}),e.appendChild(this.element);for(let s of o){if(s.separator===true){let l=y(this._doc,\"span\",{class:\"hw-toolbar__separator\"});this.element.appendChild(l);}let a=this._buildButton(s);this.element.appendChild(a),this._buttons.set(s.id,a);}let r=()=>this._refreshHistoryState();this._unsubs.push(t.on(\"mol:changed\",r)),this._unsubs.push(t.on(\"helm:changed\",r)),r(),this._reflectMode(),this._unsubs.push(t.on(\"option:change\",s=>{s.key===\"mode\"&&this._reflectMode();}));}setButtonEnabled(e,t){let n=this._buttons.get(e);n!==void 0&&(t?n.removeAttribute(\"disabled\"):n.setAttribute(\"disabled\",\"\"));}destroy(){if(!this._destroyed){this._destroyed=true,this._hideTip();for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_buildButton(e){let t=this._doc.createElement(\"button\");t.setAttribute(\"class\",\"hw-toolbar__btn\"),t.setAttribute(\"type\",\"button\"),t.setAttribute(\"data-action\",e.id),t.setAttribute(\"data-testid\",`toolbar-${e.id}`);let n=ka[e.id]??e.label,o=e.shortcut!==void 0?`${n} (${e.shortcut})`:n;t.setAttribute(\"data-tooltip\",o),t.setAttribute(\"aria-label\",n),t.addEventListener(\"mouseenter\",s=>{let a=s;this._showTip(o,typeof a.clientX==\"number\"?a.clientX:0,typeof a.clientY==\"number\"?a.clientY:0);}),t.addEventListener(\"mouseleave\",()=>this._hideTip()),t.addEventListener(\"click\",()=>this._hideTip());let r=wa[e.id];if(r!==void 0){let s=this._doc.createElement(\"span\");s.setAttribute(\"class\",\"hw-toolbar__btn-icon\"),s.setAttribute(\"aria-hidden\",\"true\"),s.innerHTML=r,t.appendChild(s);}else {let s=e.icon??e.label;t.appendChild(this._doc.createTextNode(s));}return t.addEventListener(\"click\",()=>this._invoke(e.id)),t}_showTip(e,t,n){let o=te(this._doc,\"toolbar-tooltip\",\"hw-toolbar-tooltip\");for(;o.firstChild!==null;)o.removeChild(o.firstChild);o.appendChild(this._doc.createTextNode(e)),j(o,t,n);}_hideTip(){F(this._doc.body.querySelector('[data-testid=\"toolbar-tooltip\"]'));}_invoke(e){let t=false;this._editor.fire(\"key:command\",{command:e,preventDefault:()=>{t=true;}}),!t&&this._execute(e);}_execute(e){switch(e){case \"new\":this._editor.setHelm(\"\");return;case \"open\":{let t=this._doc.defaultView;if(t!=null&&typeof t.prompt==\"function\"){let n=t.prompt(\"Enter HELM string\");n!==null&&this._editor.setHelm(n);}return}case \"save\":{let t=this._editor.getHelm();this._editor.fire(\"clipboard:copy\",{format:\"helm\",payload:t});return}case \"undo\":this._editor.undo();return;case \"redo\":this._editor.redo();return;case \"eraser\":{if(!this._editor.getSelection().isEmpty){this._editor.deleteSelection();return}this._editor.setMode(\"eraser\");return}case \"select\":case \"hbond\":case \"move\":this._editor.setMode(e);return;case \"zoom-in\":this._editor.zoom(1.1,this._molCenterOrUndefined());return;case \"zoom-out\":this._editor.zoom(1/1.1,this._molCenterOrUndefined());return;case \"fit\":this._editor.fitToContent();return;case \"clean\":this._editor.cleanLayout();return;case \"find\":this._editor.openFindReplace();return;case \"theme\":{let t=this._editor,n=typeof t._currentTheme==\"function\"?t._currentTheme():null,o=n!==null&&n.name===\"dark\";this._editor.setTheme(o?I:An);return}default:return}}_refreshHistoryState(){this.setButtonEnabled(\"undo\",this._editor.canUndo()),this.setButtonEnabled(\"redo\",this._editor.canRedo());}_molCenterOrUndefined(){let e=this._editor.getMol();if(e.atoms.length===0)return;let t=e.atoms[0].p.x,n=t,o=e.atoms[0].p.y,r=o;for(let s=1;s<e.atoms.length;s++){let a=e.atoms[s].p;a.x<t&&(t=a.x),a.x>n&&(n=a.x),a.y<o&&(o=a.y),a.y>r&&(r=a.y);}return {x:(t+n)/2,y:(o+r)/2}}_reflectMode(){let e=this._editor.getMode();for(let t of [\"select\",\"eraser\",\"hbond\",\"move\"]){let n=this._buttons.get(t);if(n===void 0)continue;let r=(n.getAttribute(\"class\")??\"\").split(/\\s+/).filter(s=>s!==\"hw-toolbar__btn--active\").join(\" \");n.setAttribute(\"class\",t===e?`${r} hw-toolbar__btn--active`:r);}}};var dt=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._editor=t,this._doc=n?.documentImpl??E(e),this._content=y(this._doc,\"pre\",{class:\"hw-pane__content hw-pane__sequence\",\"data-testid\":\"sequence-pane-content\"}),this.element=y(this._doc,\"div\",{class:\"hw-pane hw-pane--sequence\",\"data-testid\":\"pane-sequence\"},[this._content]),e.appendChild(this.element),this.refresh(),this._unsubs.push(t.on(\"helm:changed\",()=>this.refresh())),this._unsubs.push(t.on(\"mol:changed\",()=>this.refresh()));}refresh(){if(this._destroyed)return;let e=this._compute();for(;this._content.firstChild!==null;)this._content.removeChild(this._content.firstChild);this._content.appendChild(this._doc.createTextNode(e));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_compute(){let e=this._editor.getMol(),t=[],n;for(let o of e.atoms){let r=o.bio.chainId;n!==void 0&&r!==n&&t.push(\"|\"),n=r;let s=o.monomer?.naturalAnalog;t.push(s!==void 0&&s!==\"\"?s:o.symbol);}return t.join(\"\")}};var ct=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._suppressNext=false;this._editor=t,this._doc=n?.documentImpl??E(e),this._input=y(this._doc,\"div\",{class:\"hw-pane__content hw-pane__notation\",contenteditable:\"true\",spellcheck:\"false\",\"data-testid\":\"notation-pane-content\"}),this._error=y(this._doc,\"div\",{class:\"hw-pane__error\",\"data-testid\":\"notation-pane-error\"}),this.element=y(this._doc,\"div\",{class:\"hw-pane hw-pane--notation\",\"data-testid\":\"pane-helm\"},[this._input,this._error]),e.appendChild(this.element),this.refresh(),this._input.addEventListener(\"blur\",()=>this._commit()),this._input.addEventListener(\"keydown\",o=>{o.key===\"Enter\"&&(o.preventDefault(),o.stopPropagation(),o.stopImmediatePropagation(),this._commit());}),this._unsubs.push(t.on(\"helm:changed\",()=>{if(this._suppressNext){this._suppressNext=false;return}this.refresh();})),this._unsubs.push(t.on(\"mol:changed\",()=>this.refresh()));}refresh(){if(this._destroyed)return;let e=this._editor.getHelm();for(;this._input.firstChild!==null;)this._input.removeChild(this._input.firstChild);this._input.appendChild(this._doc.createTextNode(e)),this._clearError();}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_commit(){if(this._destroyed)return;let e=(this._input.textContent??\"\").trim(),t=this._editor.getHelm();if(e===t){this._clearError();return}let r=this._editor.getService().validate(e).filter(s=>s.severity===\"error\");if(r.length>0){this._showError(r.map(s=>s.message).join(\"; \"));return}this._clearError(),this._suppressNext=true,this._editor.setHelm(e);}_showError(e){for(;this._error.firstChild!==null;)this._error.removeChild(this._error.firstChild);this._error.appendChild(this._doc.createTextNode(e)),this._error.setAttribute(\"class\",\"hw-pane__error hw-pane__error--visible\");}_clearError(){for(;this._error.firstChild!==null;)this._error.removeChild(this._error.firstChild);this._error.setAttribute(\"class\",\"hw-pane__error\");}};var xa=1e3,ut=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._editor=t,this._doc=n?.documentImpl??E(e),this._body=y(this._doc,\"div\",{class:\"hw-pane__content hw-pane__properties\",\"data-testid\":\"properties-pane-content\"}),this.element=y(this._doc,\"div\",{class:\"hw-pane hw-pane--properties\",\"data-testid\":\"pane-properties\"},[this._body]),e.appendChild(this.element),this.refresh(),this._unsubs.push(t.on(\"helm:changed\",()=>this.refresh())),this._unsubs.push(t.on(\"mol:changed\",()=>this.refresh()));}refresh(){if(this._destroyed)return;for(;this._body.firstChild!==null;)this._body.removeChild(this._body.firstChild);let e=this._editor.getHelm();if(e.length>xa){this._body.appendChild(y(this._doc,\"div\",{class:\"hw-pane__placeholder\"},[\"(too long)\"]));return}let t=this._editor.getService(),n=\"\",o=0,r=0;try{let s=t.getFormula(e);n=Aa(s.elements),o=s.mw;}catch{n=\"\\u2014\";}try{o=t.getMolWeight(e);}catch{}try{r=t.getExtinctionCoefficient(e);}catch{}this._body.appendChild(this._makeRow(\"Formula\",n,\"formula\")),this._body.appendChild(this._makeRow(\"Molecular Weight\",o===0?\"\\u2014\":o.toFixed(2),\"mw\")),this._body.appendChild(this._makeRow(\"Extinction Coefficient\",r===0?\"\\u2014\":r.toFixed(0),\"extinction\"));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_makeRow(e,t,n){let o=y(this._doc,\"span\",{class:\"hw-pane__prop-label\"},[e]),r=y(this._doc,\"span\",{class:\"hw-pane__prop-value\",\"data-testid\":`properties-${n}`},[t]);return y(this._doc,\"div\",{class:\"hw-pane__prop-row\"},[o,r])}};function Aa(i){let e=Array.from(i.keys()).sort((n,o)=>n===o?0:n===\"C\"?-1:o===\"C\"?1:n===\"H\"?-1:o===\"H\"?1:n.localeCompare(o)),t=\"\";for(let n of e){let o=i.get(n);o===void 0||o===0||(t+=o===1?n:`${n}${o}`);}return t===\"\"?\"\\u2014\":t}var mt=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._refreshToken=0;this._editor=t,this._doc=n?.documentImpl??E(e),this._content=y(this._doc,\"pre\",{class:\"hw-pane__content hw-pane__atomic\",\"data-testid\":\"atomic-pane-content\"}),this.element=y(this._doc,\"div\",{class:\"hw-pane hw-pane--atomic\",\"data-testid\":\"pane-atomic\"},[this._content]),e.appendChild(this.element),this.refresh(),this._unsubs.push(t.on(\"helm:changed\",()=>{this.refresh();}));}async refresh(){if(this._destroyed)return;let e=++this._refreshToken,t=this._editor.getHelm(),n=this._editor.getService();if(!n.hasAtomicMolfileProvider()){this._render(\"Atomic structure unavailable\");return}try{let o=await n.getAtomicMolfile(t);if(this._destroyed||e!==this._refreshToken)return;this._render(o);}catch(o){if(this._destroyed||e!==this._refreshToken)return;let r=o instanceof Error?o.message:String(o);this._render(`Atomic structure unavailable: ${r}`);}}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_render(e){for(;this._content.firstChild!==null;)this._content.removeChild(this._content.firstChild);this._content.appendChild(this._doc.createTextNode(e));}};var Ma=[{id:\"sequence\",label:\"Sequence\"},{id:\"helm\",label:\"HELM\"},{id:\"properties\",label:\"Properties\"},{id:\"atomic\",label:\"Atomic Structure\"}],pt=class{constructor(e,t){this._paneByName=new Map;this._tabsByName=new Map;this._unsubs=[];this._activePane=\"helm\";this._destroyed=false;this._statusModeNode=null;this._statusMessageNode=null;this._statusMessageTimeout=null;this._host=e,this._doc=t.documentImpl??E(e);let o=(t.theme??I).name===\"dark\"?\"hw-app hw-app--dark\":\"hw-app\";this.element=y(this._doc,\"div\",{class:o,\"data-testid\":\"app-root\"}),this._toolbarHost=y(this._doc,\"div\",{class:\"hw-app__toolbar\"}),this._paletteHost=y(this._doc,\"div\",{class:\"hw-app__palette\"}),this._canvasHost=y(this._doc,\"div\",{class:\"hw-app__canvas\",\"data-testid\":\"canvas-host\"});let r=y(this._doc,\"div\",{class:\"hw-app__main\"},[this._paletteHost,this._canvasHost]);this._tabsHost=y(this._doc,\"div\",{class:\"hw-app__tabs\",role:\"tablist\"}),this._paneBody=y(this._doc,\"div\",{class:\"hw-app__pane-body\"});let s=y(this._doc,\"div\",{class:\"hw-app__panes\"},[this._tabsHost,this._paneBody]);this.element.appendChild(this._toolbarHost),this.element.appendChild(r),this.element.appendChild(s),e.appendChild(this.element);let a={service:t.service};t.initialHelm!==void 0&&(a.initialHelm=t.initialHelm),t.width!==void 0&&(a.width=t.width),t.height!==void 0&&(a.height=t.height),this.canvas=new it(this._canvasHost,a),t.theme!==void 0&&this.canvas.setTheme(t.theme);let l={documentImpl:this._doc};t.toolbarButtons!==void 0&&(l.buttons=t.toolbarButtons),this.toolbar=new lt(this._toolbarHost,this.canvas,l),this.palette=new at(this._paletteHost,this.canvas,{documentImpl:this._doc,...t.paletteOptions}),this.sequencePane=new dt(this._paneBody,this.canvas,{documentImpl:this._doc}),this.notationPane=new ct(this._paneBody,this.canvas,{documentImpl:this._doc}),this.propertiesPane=new ut(this._paneBody,this.canvas,{documentImpl:this._doc}),t.service.hasAtomicMolfileProvider()?this.atomicStructurePane=new mt(this._paneBody,this.canvas,{documentImpl:this._doc}):this.atomicStructurePane=null,this._paneByName.set(\"sequence\",this.sequencePane.element),this._paneByName.set(\"helm\",this.notationPane.element),this._paneByName.set(\"properties\",this.propertiesPane.element),this.atomicStructurePane!==null&&this._paneByName.set(\"atomic\",this.atomicStructurePane.element);let d=this._resolveVisiblePanes(t);for(let c of d){let m=Ma.find(h=>h.id===c);if(m===void 0)continue;let p=this._doc.createElement(\"button\");p.setAttribute(\"type\",\"button\"),p.setAttribute(\"class\",\"hw-app__tab\"),p.setAttribute(\"role\",\"tab\"),p.setAttribute(\"data-pane\",c),p.setAttribute(\"data-testid\",`tab-${c}`),p.appendChild(this._doc.createTextNode(m.label)),p.addEventListener(\"click\",()=>this.activatePane(c)),this._tabsHost.appendChild(p),this._tabsByName.set(c,p);}let u=d.includes(\"helm\")?\"helm\":d[0]??\"helm\";this.activatePane(u),this._unsubs.push(this.canvas.on(\"theme:change\",c=>this._applyTheme(c.theme))),this._buildStatusBar(),this._applyMode(this.canvas.getMode()),this._unsubs.push(this.canvas.on(\"option:change\",c=>{c.key===\"mode\"&&this._applyMode(c.newValue),c.key===\"nextAdd\"&&this._refreshStatus();})),this._unsubs.push(this.canvas.on(\"mol:changed\",()=>this._refreshStatus())),this._unsubs.push(this.canvas.on(\"helm:changed\",()=>this._refreshStatus())),this._unsubs.push(this.canvas.on(\"editor:status\",c=>{this._showStatusMessage(c.message,c.severity,c.durationMs);})),this._unsubs.push(this.canvas.on(\"monomer:contextmenu\",c=>{c.preventDefault(),this.canvas.openAtomProps(c.atom);})),this._unsubs.push(this.canvas.on(\"bond:contextmenu\",c=>{c.preventDefault(),this.canvas.openBondProps(c.bond);})),this._onDocKeydown=c=>this._handleEscape(c),this._doc.addEventListener(\"keydown\",this._onDocKeydown,true);}_handleEscape(e){let t=e;t.key===\"Escape\"&&($t(this._doc),q.closeTopmost()&&(t.stopImmediatePropagation?.(),t.preventDefault?.()));}_buildStatusBar(){let e=y(this._doc,\"div\",{class:\"hw-status-bar\",\"data-testid\":\"status-bar\"}),t=y(this._doc,\"span\",{class:\"hw-status-bar__mode\",\"data-testid\":\"status-mode\"}),n=y(this._doc,\"span\",{class:\"hw-status-bar__message\",\"data-testid\":\"status-message\",role:\"status\",\"aria-live\":\"polite\"});e.appendChild(t),e.appendChild(n),this._canvasHost.appendChild(e),this._statusModeNode=t,this._statusMessageNode=n,this._refreshStatus();}_refreshStatus(){let e=this._statusModeNode;if(e===null)return;let t=this.canvas.getMode(),n=this.canvas.getNextAddSymbol();for(;e.firstChild!==null;)e.removeChild(e.firstChild);if(n===null){e.appendChild(this._doc.createTextNode(`Mode: ${t} | Next add: none`));return}e.appendChild(this._doc.createTextNode(`Mode: ${t} | Next add: `));let o=y(this._doc,\"span\",{class:\"hw-status-bar__next-add-symbol\",\"data-testid\":\"status-next-add-symbol\"},[n.symbol]);e.appendChild(o);let r=y(this._doc,\"button\",{type:\"button\",class:\"hw-status-bar__next-add-clear\",\"data-testid\":\"status-next-add-clear\",\"aria-label\":\"Clear next-add monomer\",title:\"Clear (Esc)\"},[\"\\xD7\"]);r.addEventListener(\"click\",s=>{s.preventDefault(),s.stopPropagation(),this.canvas.setNextAddSymbol(null);}),e.appendChild(r);}_showStatusMessage(e,t,n){let o=this._statusMessageNode;if(o!==null){for(this._statusMessageTimeout!==null&&(clearTimeout(this._statusMessageTimeout),this._statusMessageTimeout=null);o.firstChild!==null;)o.removeChild(o.firstChild);o.appendChild(this._doc.createTextNode(e)),o.setAttribute(\"data-severity\",t),n>0&&(this._statusMessageTimeout=setTimeout(()=>{let r=this._statusMessageNode;if(r!==null){for(;r.firstChild!==null;)r.removeChild(r.firstChild);r.removeAttribute(\"data-severity\"),this._statusMessageTimeout=null;}},n));}}_applyMode(e){let t=this._canvasHost.querySelector(\".hw-editor-view\");if(t===null)return;let o=(t.getAttribute(\"class\")??\"\").split(/\\s+/).filter(r=>!r.startsWith(\"hw-editor-view--\")).join(\" \");t.setAttribute(\"class\",`${o} hw-editor-view--${e}`.trim()),this._refreshStatus();}setHelm(e){this.canvas.setHelm(e);}getHelm(){return this.canvas.getHelm()}on(e,t){return this.canvas.on(e,t)}activatePane(e){if(!(!this._paneByName.has(e)&&!this._tabsByName.has(e))){this._activePane=e;for(let[t,n]of this._paneByName.entries())n.style.display=t===e?\"\":\"none\";for(let[t,n]of this._tabsByName.entries()){let r=(n.getAttribute(\"class\")??\"\").split(/\\s+/).filter(s=>s!==\"hw-app__tab--active\").join(\" \");n.setAttribute(\"class\",t===e?`${r} hw-app__tab--active`:r);}}}getActivePane(){return this._activePane}destroy(){if(!this._destroyed){this._destroyed=true,this._statusMessageTimeout!==null&&(clearTimeout(this._statusMessageTimeout),this._statusMessageTimeout=null),this._doc.removeEventListener(\"keydown\",this._onDocKeydown,true);for(let e of this._unsubs)e();this.atomicStructurePane!==null&&this.atomicStructurePane.destroy(),this.propertiesPane.destroy(),this.notationPane.destroy(),this.sequencePane.destroy(),this.palette.destroy(),this.toolbar.destroy(),this.canvas.destroy(),this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element),this._host;}}_resolveVisiblePanes(e){let t=e.service.hasAtomicMolfileProvider(),n=e.visiblePanes??[\"sequence\",\"helm\",\"properties\",\"atomic\"];return t||(n=n.filter(o=>o!==\"atomic\")),n}_applyTheme(e){let t=e.name===\"dark\",o=(this.element.getAttribute(\"class\")??\"\").split(/\\s+/).filter(r=>r!==\"hw-app--dark\").join(\" \");this.element.setAttribute(\"class\",t?`${o} hw-app--dark`:o);}};var On=class{constructor(e){this.T=\"ATOM\";this.selected=e.selected,this.highlighted=e.highlighted,this.p={x:e.p.x,y:e.p.y},this.elem=e.symbol,this.bio={type:e.biotype,continuousId:e.bio.continuousId,chainId:e.bio.chainId,positionInChain:e.bio.positionInChain,...e.bio.annotation!==void 0?{annotation:e.bio.annotation}:{},...e.bio.blobtype!==void 0?{blobtype:e.bio.blobtype}:{},...e.bio.ambiguity!==void 0?{ambiguity:e.bio.ambiguity}:{},id:e.id},e.inlineSource!==void 0&&(this.inlineSource=e.inlineSource);}biotype(){return this.bio.type}},Nn=class{constructor(e,t,n){this.a1=t,this.a2=n,this.r1=Ei(e.r1),this.r2=Ei(e.r2),this.kind=e.kind;}};function Ei(i){switch(i.kind){case \"numeric\":return i.r;case \"positional\":return i.r;default:return 0}}function oe(i){let e=[],t=new Map;for(let r of i.atoms){let s=new On(r);e.push(s),t.set(r.id,s);}let n=[];for(let r of i.bonds){let s=t.get(r.a1.id),a=t.get(r.a2.id);s===void 0||a===void 0||n.push(new Nn(r,s,a));}return {atoms:e,bonds:n,clone(r){return oe(i)},_internalMol:i}}var Ta=400,Sa=100,Ea=14,ie=class{constructor(e,t,n){this._laidMol=null;this._currentHelm=\"\";this._drawOptions={fontsize:Ea};this._noDraw=false;this._svgEl=null;this.host=e,this._service=t,this._doc=n?.documentImpl??E(e),this._width=n?.width??Ta,this._height=n?.height??Sa,this._mol=ce(),this._molView=oe(this._mol),this.editor=this._buildEditor();}resizeEditor(e,t){this._width=e,this._height=t,this._redraw();}_buildEditor(){let e=this,t={get noDraw(){return e._noDraw},set noDraw(n){e._noDraw=n;},get jsd(){return e.editor}};return {get div(){return e.host},get m(){return e._molView},set m(n){e._molView=n;},get helm(){return t},get options(){return {width:e._width,height:e._height}},setData(n,o){if(o!==\"helm\")throw new Error(`LegacyEditorWrapper: only 'helm' format supported (got '${o}').`);e._setHelm(n);},setHelm(n){e._setHelm(n);},setMol(n){e._mol=n._internalMol,e._molView=e._buildView(e._mol),e._currentHelm=e._service.serialize(e._mol),e._redraw();},getHelm(n){return e._currentHelm},getMolfile(){return Rt(e._mol)},resize(n,o){e._width=n,e._height=o,e._redraw();},setSize(n,o){e._width=n,e._height=o,e._redraw();},redraw(){e._redraw();},reset(){e._mol=ce(),e._laidMol=null,e._molView=oe(e._mol),e._currentHelm=\"\",e._removeSvg();},getFormula(n){return Ca(pe(e._mol))},getMolWeight(){return Re(e._mol)},getExtinctionCoefficient(){return Ie(e._mol)},getDrawOptions(){return e._drawOptions}}}_setHelm(e){this._currentHelm=e;let t=this._service.parse(e,{mode:\"lenient\",resolveMonomers:true});this._mol=t.mol,this._molView=this._buildView(this._mol),this._redraw();}_buildView(e){return this._laidMol=this._noDraw?null:ee(e),oe(this._laidMol??e)}_redraw(){if(this._noDraw){this._removeSvg();return}if(this._currentHelm===\"\"||this._laidMol===null){this._removeSvg();return}let e=new Set,t=new Set;for(let o of this._molView.atoms){let r=o.bio.id;r!==void 0&&(o.selected&&e.add(r),o.highlighted&&t.add(r));}let n=this._service.renderMolResult(this._laidMol,{width:this._width,height:this._height,maxScale:1/0,showIds:true,selectedAtomIds:e,highlightedAtomIds:t});this._bakeViewToSurface(n.bbox,n.drawBox),this._mountSvg(n.svg);}_bakeViewToSurface(e,t){if(this._laidMol===null)return;let n=t.scale,o=t.x-e.x*n,r=t.y-e.y*n,s=this._laidMol.atoms,a=this._molView.atoms,l=Math.min(s.length,a.length);for(let d=0;d<l;d++){let u=s[d].p,c=a[d].p;c.x=u.x*n+o,c.y=u.y*n+r;}}_mountSvg(e){this._removeSvg();let t=La(this._doc,e,this._width,this._height);t.setAttribute(\"pointer-events\",\"none\"),this.host.firstChild!==null?this.host.insertBefore(t,this.host.firstChild):this.host.appendChild(t),this._svgEl=t;}_removeSvg(){this._svgEl!==null&&this._svgEl.parentNode!==null&&this._svgEl.parentNode.removeChild(this._svgEl),this._svgEl=null;}},Ci=[\"C\",\"H\",\"N\",\"O\",\"S\",\"P\"];function Ca(i){let e=o=>{let r=Ci.indexOf(o);return r===-1?Ci.length:r},t=[...i.elements.keys()].sort((o,r)=>{let s=e(o),a=e(r);return s!==a?s-a:o<r?-1:o>r?1:0}),n=[];for(let o of t){let r=i.elements.get(o);n.push(r===1?o:`${o}${r}`);}return n.join(\"\")}function La(i,e,t,n){let o=Ba(i,e);if(o!==null)return o;let r=i.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");return r.setAttribute(\"width\",String(t)),r.setAttribute(\"height\",String(n)),r}function Ba(i,e){let t=globalThis.DOMParser;if(t===void 0)return null;try{let r=new t().parseFromString(e,\"image/svg+xml\").documentElement;return r==null?null:i.importNode(r,!0)}catch{return null}}var Ra=800,Ia=400,Pa=32,Ha=14,Fn=class{constructor(e){this._width=0;this._height=0;this._doc=e;}resize(e,t){this._width=e,this._height=t;}select(){}dblclick(){}createMonomerDiv(e,t,n){let o=y(this._doc,\"div\",{\"data-monomer\":t,\"data-biotype\":n,\"data-testid\":`legacy-mex-monomer-${t}`});return e.appendChild(o),o}getSize(){return {width:this._width,height:this._height}}},ht=class{constructor(e,t,n){this.toolbarheight=Pa;this._drawOptions={fontsize:Ha};this._unsubs=[];this._destroyed=false;this._host=e,this._service=t,this._doc=n?.documentImpl??E(e),this._width=n?.width??Ra,this._height=n?.height??Ia;let o={service:t};n?.initialHelm!==void 0&&(o.initialHelm=n.initialHelm),n?.documentImpl!==void 0&&(o.documentImpl=n.documentImpl),n?.width!==void 0&&(o.width=n.width),n?.height!==void 0&&(o.height=n.height),this._app=new pt(e,o),this.sequence=this._app.sequencePane.element,this.notation=this._app.notationPane.element,this.properties={parent:this._app.propertiesPane.element},this._structureviewHost=y(this._doc,\"div\",{class:\"hwe-legacy-app__structureview\",\"data-testid\":\"legacy-app-structureview\"}),this._structureviewWrapper=new ie(this._structureviewHost,t,{documentImpl:this._doc}),this.structureview=this._structureviewWrapper,this.mex=new Fn(this._doc),this._editorFacade=this._buildEditorFacade();let r=this._editorFacade;this.canvas={get host(){return r.div},get editor(){return r},get helm(){return r.helm},resizeEditor:(a,l)=>{this._resize(a,l);},getHelm:a=>r.getHelm(a),setHelm:a=>{r.setHelm(a);}};let s=()=>{this._structureviewWrapper.editor.setHelm(this._app.getHelm());};this._unsubs.push(this._app.canvas.on(\"helm:changed\",s)),n?.initialHelm!==void 0&&n.initialHelm.length>0&&s();}get editorApp(){return this._app}_buildEditorFacade(){let e=this,t=this._app,n={noDraw:false,get jsd(){return e._editorFacade}};return {get div(){return t.element},get m(){return e._currentMolView()},set m(o){o!=null&&o._internalMol!==void 0&&t.canvas.setMol(o._internalMol);},get helm(){return n},get options(){return {width:e._width,height:e._height}},setData(o,r){if(r!==\"helm\")throw new Error(`LegacyAppWrapper: only 'helm' format supported (got '${r}').`);t.setHelm(o);},setHelm(o){t.setHelm(o);},setMol(o){t.canvas.setMol(o._internalMol);},getHelm(o){return t.getHelm()},getMolfile(){return e._service.getMolfile(t.getHelm())},resize(o,r){e._resize(o,r);},setSize(o,r){e._resize(o,r);},redraw(){t.canvas.redraw();},reset(){t.setHelm(\"\");},getFormula(o){return $a(pe(t.canvas.getMol()))},getMolWeight(){return Re(t.canvas.getMol())},getExtinctionCoefficient(){return Ie(t.canvas.getMol())},getDrawOptions(){return e._drawOptions}}}_currentMolView(){let e=this._app.canvas.getMol(),t=oe(e),n=this._app.canvas.getSelection();if(!n.isEmpty)for(let o of t.atoms){let r=o.bio.id;typeof r==\"number\"&&(o.selected=n.atoms.has(r));}return t}_resize(e,t){this._width=e,this._height=t,this._app.canvas.resize(e,t);}calculateSizes(){let e=Li(this._host.clientWidth,this._width),t=Li(this._host.clientHeight,this._height);this._resize(e,Math.max(50,t-this.toolbarheight));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this._unsubs.length=0,this._app.destroy();}}};function $a(i){let e=[];for(let[t,n]of i.elements.entries())e.push(n===1?t:`${t}${n}`);return e.join(\"\")}function Li(i,e){return typeof i!=\"number\"||isNaN(i)||i<=0?e:i}var Da=240,Oa=80,ft=class{constructor(e,t,n){this._tooltip=null;this._destroyed=false;this.name=e,this._service=t;let o=n?.documentImpl??Na();if(o===null)throw new Error(\"LegacyInputWrapper: no Document available.\");this._doc=o,this._host=y(this._doc,\"div\",{class:\"hwe-legacy-input\",\"data-testid\":\"legacy-input-host\"}),this.viewer=new ie(this._host,t,{width:n?.editorOptions?.width??Da,height:n?.editorOptions?.height??Oa,documentImpl:this._doc});}get value(){return this.viewer.editor.getHelm()}set value(e){this._ensureLive(),this.viewer.editor.setHelm(e);}get molValue(){return this.viewer.editor.m}set molValue(e){this._ensureLive(),this.viewer.editor.setMol(e);}redraw(){this._ensureLive(),this.viewer.editor.redraw();}showTooltip(e,t){this._ensureLive(),this._tooltip!==null&&this._tooltip.parentNode!==null&&this._tooltip.parentNode.removeChild(this._tooltip);let n=y(this._doc,\"div\",{class:\"hwe-legacy-input__tooltip\",\"data-testid\":\"legacy-input-tooltip\",style:`position: absolute; left: ${t.p.x}px; top: ${t.p.y}px;`});typeof e==\"string\"?n.appendChild(this._doc.createTextNode(e)):n.appendChild(e),this._host.appendChild(n),this._tooltip=n;}destroy(){this._destroyed||(this._destroyed=true,this._tooltip!==null&&this._tooltip.parentNode!==null&&this._tooltip.parentNode.removeChild(this._tooltip),this._host.parentNode!==null&&this._host.parentNode.removeChild(this._host));}getHost(){return this._host}getTooltip(){return this._tooltip}_ensureLive(){if(this._destroyed)throw new Error(\"LegacyInputWrapper: this instance has been destroyed.\");this._service;}};function Na(){return globalThis.document??null}var Fa=/^R([1-9][0-9]*)$/,Ri=new Set([v.PEPTIDE,v.RNA,v.CHEM,v.BLOB]),Ga=new Set([\"Backbone\",\"Branch\",\"Terminal\",\"Undefined\"]);function Bi(i){if(typeof i.symbol!=\"string\"||i.symbol.length===0||typeof i.molfile!=\"string\"||!Ri.has(i.polymerType)||!Ga.has(i.monomerType))return null;let e=[];for(let n of i.rgroups??[]){if(typeof n.label!=\"string\"||!Fa.test(n.label))continue;let o={label:n.label,capGroupName:typeof n.capGroupName==\"string\"?n.capGroupName:\"\",capGroupSMILES:Xe(n)??\"\"};typeof n.alternateId==\"string\"&&(o.alternateId=n.alternateId),e.push(o);}let t={symbol:i.symbol,molfile:i.molfile,polymerType:i.polymerType,monomerType:i.monomerType,rgroups:e};return typeof i.name==\"string\"&&(t.name=i.name),typeof i.smiles==\"string\"&&(t.smiles=i.smiles),typeof i.naturalAnalog==\"string\"&&(t.naturalAnalog=i.naturalAnalog),i.meta!==void 0&&i.meta!==null&&(t.meta={...i.meta}),typeof i.author==\"string\"&&(t.author=i.author),i.createDate!==void 0&&(t.createDate=i.createDate),typeof i.id==\"number\"&&(t.id=i.id),t}function Va(i){return i===v.PEPTIDE?b.AA:i===v.RNA?b.SUGAR:i===v.CHEM?b.CHEM:i===v.BLOB?b.BLOB:b.AA}function Gn(i,e,t){if(i===v.PEPTIDE)return b.AA;if(i===v.CHEM)return b.CHEM;if(i===v.BLOB)return b.BLOB;if(i===v.RNA){if(e===\"Branch\")return b.BASE;if(e===\"Backbone\")return t===\"P\"||t===\"p\"?b.LINKER:b.SUGAR}return b.AA}function Ua(i,e){let t=i.subscribe(e);return ()=>{t!=null&&typeof t.unsubscribe==\"function\"&&t.unsubscribe();}}var jt=class{constructor(e,t){this._cache=new Map;this._polymerTypesCache=null;this._version=0;this._base=e,this.source=t??(typeof e.source==\"string\"?e.source:\"datagrok-bridge\"),this.onChanged=new X,this._unsub=Ua(e.onChanged,()=>{this._cache.clear(),this._polymerTypesCache=null,this._version+=1,this.onChanged.next({type:\"reload\"});});}get version(){return this._version}get isEmpty(){return typeof this._base.isEmpty==\"boolean\"?this._base.isEmpty:this.getPolymerTypes().length===0}getMonomer(e,t){let n=`${e}|${t}`;if(this._cache.has(n))return this._cache.get(n)??null;let o=this._base.getMonomer(e,t),r=o==null?null:this._enrichColors(Bi(o));return this._cache.set(n,r),r}_enrichColors(e){if(e===null)return null;let t=this._base;if(typeof t.getMonomerColors!=\"function\")return e;let n=Gn(e.polymerType,e.monomerType,e.naturalAnalog),o=null;try{o=t.getMonomerColors(n,e.symbol);}catch{o=null;}if(o==null)return e;let r=o.backgroundcolor,s=o.textcolor,a=o.linecolor;if(typeof r!=\"string\"||typeof s!=\"string\"||typeof a!=\"string\")return e;let l={...e.meta??{},colors:{...e.meta?.colors??{},default:{line:a,text:s,background:r}}};return {...e,meta:l}}registerInlineSmilesMonomer(e,t){let n=this._base;typeof n.getWebEditorMonomer==\"function\"&&n.getWebEditorMonomer(Va(e),t);let o=n.getMonomer(e,t),r=o==null?null:this._enrichColors(Bi(o));if(r===null)throw new Error(`BridgedMonomerLib: could not register inline SMILES monomer '${t}'`);return this._cache.set(`${e}|${t}`,r),this._cache.set(`${e}|${r.symbol}`,r),r}getMonomerSet(e){let t=new Map;for(let n of this.getPolymerTypes())for(let o of this.getMonomerSymbolsByType(n)){let r=this.getMonomer(n,o);r!==null&&Gn(r.polymerType,r.monomerType,r.naturalAnalog)===e&&t.set(o,r);}return t}getMonomerSymbolsByType(e){return this._base.getMonomerSymbolsByType(e)}getByNaturalAnalog(e,t){let n=[];for(let o of this.getMonomerSymbolsByType(e)){let r=this.getMonomer(e,o);r!==null&&r.naturalAnalog===t&&n.push(r);}return n}getPolymerTypes(){if(this._polymerTypesCache!==null)return this._polymerTypesCache;let e=[],t=typeof this._base.getPolymerTypes==\"function\"?this._base.getPolymerTypes():Object.values(v);for(let n of t){if(!Ri.has(n))continue;let o=this._base.getMonomerSymbolsByType(n);Array.isArray(o)&&o.length>0&&e.push(n);}return this._polymerTypesCache=e,e}getColors(e,t){let n=t===\"dark\"?Ce:_e,o=e===null?b.AA:Gn(e.polymerType,e.monomerType,e.naturalAnalog);return P(e,o,n)}addMonomer(e){throw new Error(\"BridgedMonomerLib: mutation is not supported on a Datagrok-bridged library.\")}removeMonomer(e,t){return false}merge(e){throw new Error(\"BridgedMonomerLib: mutation is not supported on a Datagrok-bridged library.\")}toJSON(){let e=[];for(let t of this.getPolymerTypes())for(let n of this.getMonomerSymbolsByType(t)){let o=this.getMonomer(t,n);o!==null&&e.push(o);}return e}destroy(){this._unsub(),this.onChanged.complete(),this._cache.clear();}};function Vn(i,e){return new jt(i,e)}var qt=class qt{constructor(e){this._overriddenFuncs=null;this._originalFuncs=null;this._molfilesEditor=null;this._molfilesEditorHost=null;this._molfilesGcTimer=null;if(e.service===void 0||e.service===null)throw new TypeError(\"HelmHelperAdapter: options.service is required\");this._service=e.service,this.seqHelper=e.seqHelper??null,this._logger=e.logger??new Me,this._bridge=e.monomerLibBridge??(t=>Vn(t)),this._doc=e.documentImpl??Ii();}get service(){return this._service}createHelmInput(e,t){let n={...t};return n.documentImpl===void 0&&this._doc!==null&&(n.documentImpl=this._doc),new ft(e,this._service,n)}createHelmWebEditor(e,t){let n=e??this._createDetachedHost();return new ie(n,this._service,{...t?.width!==void 0?{width:t.width}:{},...t?.height!==void 0?{height:t.height}:{},...this._doc!==null?{documentImpl:this._doc}:{}})}createWebEditorApp(e,t){return new ht(e,this._service,{...t!==void 0?{initialHelm:t}:{},...this._doc!==null?{documentImpl:this._doc}:{}})}get originalMonomersFuncs(){return this._originalFuncs}buildMonomersFuncsFromLib(e){let t=this._bridge(e),n=e;function o(s,a){if(typeof n.getWebEditorMonomer==\"function\"){let p=n.getWebEditorMonomer(s,a);if(p!=null)return p}let{biotype:l,symbol:d}=Pi(s,a);if(d===null)return null;let u=Ka(d),c=Hi(l),m=t.getMonomer(c,u);return m===null?null:$i(m,u)}function r(s){let{biotype:a}=Pi(s,void 0),l=Hi(a),d={};for(let u of t.getMonomerSymbolsByType(l)){let c=t.getMonomer(l,u);c!==null&&(d[u]=$i(c,u));}return d}return {getMonomer:o,getMonomerSet:r}}overrideMonomersFuncs(e){let t=this._overriddenFuncs;return this._originalFuncs===null&&(this._originalFuncs=t??this._defaultFuncs()),this._overriddenFuncs=e,t??this._originalFuncs}revertOriginalMonomersFuncs(){let e=this._originalFuncs??this._defaultFuncs(),t=this._overriddenFuncs??e;return this._overriddenFuncs=e,this._originalFuncs=null,t}getHoveredAtom(e,t,n,o){let s=new W(n._internalMol,I).test({x:e,y:t});if(s===null||s.atom===void 0)return null;for(let a of n.atoms)if(a.bio.id===s.atom.id||a.bio.id===void 0&&a.bio.continuousId===s.atom.bio.continuousId)return a;return null}getMolfiles(e){let t=this._ensureMolfilesEditor();t.editor.helm.noDraw=true;try{let n=[];for(let o of e){if(typeof o!=\"string\"||o.length===0){n.push(\"\");continue}t.editor.setHelm(o),n.push(t.editor.getMolfile());}return n}finally{t.editor.helm.noDraw=false,this._scheduleMolfilesEditorGc();}}parse(e,t){let n=this._service.parse(e,{mode:\"lenient\",resolveMonomers:false}),o=ee(n.mol);return oe(o)}removeGaps(e){let t;try{t=this._service.removeGaps(e);}catch(o){throw o instanceof K&&o.type===void 0&&(o.type=\"HelmNotSupportedError\"),o}let n=za(this._service,e);return {srcHelm:t.srcHelm,resHelm:t.resHelm,monomerMap:n?new Map(t.monomerMap):null}}destroy(){this._molfilesGcTimer!==null&&(clearTimeout(this._molfilesGcTimer),this._molfilesGcTimer=null),this._removeMolfilesEditorNow();}_defaultFuncs(){return {getMonomer:(e,t)=>null,getMonomerSet:e=>({})}}_createDetachedHost(){let e=this._doc??Ii();if(e===null)throw new Error(\"HelmHelperAdapter: no Document available\");let t=e.createElement(\"div\");return t.style.width=\"0px\",t.style.height=\"0px\",t.style.position=\"fixed\",t}_ensureMolfilesEditor(){if(this._molfilesEditor!==null)return this._molfilesGcTimer!==null&&(clearTimeout(this._molfilesGcTimer),this._molfilesGcTimer=null),this._molfilesEditor;let e=this._createDetachedHost();return this._molfilesEditorHost=e,this._molfilesEditor=new ie(e,this._service,{width:100,height:100,...this._doc!==null?{documentImpl:this._doc}:{}}),this._logger,this._molfilesEditor}_scheduleMolfilesEditorGc(){this._molfilesGcTimer!==null&&clearTimeout(this._molfilesGcTimer),typeof setTimeout==\"function\"&&(this._molfilesGcTimer=setTimeout(()=>{this._molfilesGcTimer=null,this._removeMolfilesEditorNow();},qt._MOLFILES_GC_MS));}_removeMolfilesEditorNow(){this._molfilesEditor=null,this._molfilesEditorHost!==null&&this._molfilesEditorHost.parentNode!==null&&this._molfilesEditorHost.parentNode.removeChild(this._molfilesEditorHost),this._molfilesEditorHost=null;}};qt._MOLFILES_GC_MS=1e3;var bt=qt;function Ii(){return globalThis.document??null}function za(i,e){try{let t=i.parse(e,{mode:\"lenient\",resolveMonomers:!1});for(let n of t.mol.atoms)if(n.symbol===\"*\")return !0;return !1}catch{return false}}function Ka(i){return i.length>=2&&i.charAt(0)===\"[\"&&i.charAt(i.length-1)===\"]\"?i.slice(1,i.length-1):i}function Pi(i,e){if(typeof i==\"string\")return {biotype:i,symbol:e??null};if(i!==null&&typeof i==\"object\"&&i.T===\"ATOM\"){let t=i;return {biotype:t.bio.type,symbol:e??t.elem}}return {biotype:b.AA,symbol:e??null}}function Hi(i){switch(i){case b.AA:return v.PEPTIDE;case b.SUGAR:case b.BASE:case b.LINKER:case b.NUCLEOTIDE:return v.RNA;case b.CHEM:return v.CHEM;case b.BLOB:return v.BLOB;default:return v.PEPTIDE}}function $i(i,e){let t={};for(let o of i.rgroups)t[o.label]=o.capGroupName;let n={id:e??i.symbol,m:i.molfile,rs:i.rgroups.length,type:i.polymerType,mt:i.monomerType,at:t};return i.name!==void 0&&(n.n=i.name),i.naturalAnalog!==void 0&&(n.na=i.naturalAnalog),i.smiles!==void 0&&(n.smiles=i.smiles),n}function Wa(i,e){if(e==null)throw new TypeError(\"registerWithDatagrok: options is required\");let t=new bt({service:e.service,...e.seqHelper!==void 0?{seqHelper:e.seqHelper}:{},...e.logger!==void 0?{logger:e.logger}:{},...e.documentImpl!==void 0?{documentImpl:e.documentImpl}:{}}),n=()=>{};if(typeof e.libProvider==\"function\"){let o=e.libProvider;Promise.resolve().then(()=>o()).then(r=>{if(r==null)return;let s=r.onChanged.subscribe(()=>{t.buildMonomersFuncsFromLib(r);});n=()=>{s!=null&&typeof s.unsubscribe==\"function\"&&s.unsubscribe();};}).catch(()=>{});}return {adapter:t,unsubscribe(){n();}}}\nexport{Ge as AtomPropsDialog,mt as AtomicStructurePane,Ve as BondPropsDialog,jt as BridgedMonomerLib,Fe as ChooseRDialog,Si as DEFAULT_TOOLBAR_BUTTONS,He as EventBus,Ue as FindReplaceDialog,it as HelmEditor,pt as HelmEditorApp,bt as HelmHelperAdapter,K as HelmNotSupportedError,D as HelmParseError,In as HelmService,b as HelmTypes,qe as HelmValidationError,$e as HistoryStack,B as HwError,ht as LegacyAppWrapper,ie as LegacyEditorWrapper,ft as LegacyInputWrapper,rn as MonomerLib,Yt as MonomerNotFoundError,at as MonomerPalette,Ui as MonomerTypes,ct as NotationPane,v as PolymerTypes,ut as PropertiesPane,N as Selection,dt as SequencePane,lt as Toolbar,It as bondsOnAtom,Vn as bridgeMonomerLib,oe as buildHelmMolView,An as darkTheme,Xr as defineTheme,U as freeRgroups,Us as hasFreeRgroup,I as lightTheme,Wa as registerWithDatagrok,ni as takenRgroups,he as totalRgroups};","// HELM type vocabulary is owned by `@datagrok-libraries/hwe` (the standalone\n// HELM editor) and re-exported here as the single source of truth. The string\n// values match the canonical Pistoia HELM Web Editor, except `NUCLEOTIDE` which\n// uses the corrected spelling `HELM_NUCLEOTIDE` (was `HELM_NUCLETIDE`).\nimport { HelmTypes, MonomerTypes, PolymerTypes } from '@datagrok-libraries/hwe';\nexport { HelmTypes, MonomerTypes, PolymerTypes };\n// hwe migration: these two small enums are not part of the hwe value vocabulary.\n// They are defined here locally (replicating the legacy HELM Web Editor values)\n// so `@datagrok-libraries/bio` no longer depends on\n// `@datagrok-libraries/helm-web-editor`.\nexport var MonomerNumberingTypes;\n(function (MonomerNumberingTypes) {\n MonomerNumberingTypes[MonomerNumberingTypes[\"default\"] = 0] = \"default\";\n MonomerNumberingTypes[MonomerNumberingTypes[\"continuous\"] = 1] = \"continuous\";\n})(MonomerNumberingTypes || (MonomerNumberingTypes = {}));\nexport var HelmTabKeys;\n(function (HelmTabKeys) {\n HelmTabKeys[\"Sequence\"] = \"sequence\";\n HelmTabKeys[\"Helm\"] = \"notation\";\n HelmTabKeys[\"Properties\"] = \"properties\";\n HelmTabKeys[\"StructureView\"] = \"structureview\";\n})(HelmTabKeys || (HelmTabKeys = {}));\n//# sourceMappingURL=consts.js.map","export const R_GROUP_ELEMENT_SYMBOL = 'R#';\nexport const HYDROGEN_SYMBOL = 'H';\nexport var V2K_CONST;\n(function (V2K_CONST) {\n V2K_CONST[\"TYPE\"] = \"V2000\";\n V2K_CONST[V2K_CONST[\"NUM_OF_HEADER_LINES\"] = 3] = \"NUM_OF_HEADER_LINES\";\n V2K_CONST[V2K_CONST[\"NUM_OF_COUNTS_DIGITS\"] = 3] = \"NUM_OF_COUNTS_DIGITS\";\n V2K_CONST[V2K_CONST[\"ATOM_TYPE_COL\"] = 4] = \"ATOM_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"FIRST_BONDED_ATOM_COL\"] = 1] = \"FIRST_BONDED_ATOM_COL\";\n V2K_CONST[V2K_CONST[\"BOND_TYPE_COL\"] = 3] = \"BOND_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"RGP_SHIFT\"] = 8] = \"RGP_SHIFT\";\n V2K_CONST[V2K_CONST[\"MAX_ATOM_COUNT\"] = 999] = \"MAX_ATOM_COUNT\";\n V2K_CONST[\"RGP_LINE_START\"] = \"M RGP\";\n V2K_CONST[\"ATOM_ALIAS_LINE_START\"] = \"A \";\n V2K_CONST[\"END\"] = \"M END\";\n})(V2K_CONST || (V2K_CONST = {}));\nexport const MALFORMED_MOL_V2000 = `\nMalformed\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\nM END`;\nexport const EMPTY_MOL_V3000 = `\nEmpty input\n\n 0 0 0 0 0 0 999 V3000\nM END`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1jb25zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtY29uc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVksU0FnQlg7QUFoQkQsV0FBWSxTQUFTO0lBQ25CLDJCQUFjLENBQUE7SUFDZCx1RUFBdUIsQ0FBQTtJQUV2Qix5RUFBd0IsQ0FBQTtJQUN4QiwyREFBaUIsQ0FBQTtJQUNqQiwyRUFBeUIsQ0FBQTtJQUN6QiwyREFBaUIsQ0FBQTtJQUVqQixtREFBYSxDQUFBO0lBQ2IsK0RBQW9CLENBQUE7SUFFcEIsc0NBQXlCLENBQUE7SUFDekIsMENBQTZCLENBQUE7SUFFN0IsMkJBQWMsQ0FBQTtBQUNoQixDQUFDLEVBaEJXLFNBQVMsS0FBVCxTQUFTLFFBZ0JwQjtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHOzs7O09BSTVCLENBQUM7QUF1Q1IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHOzs7O09BSXhCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUl9HUk9VUF9FTEVNRU5UX1NZTUJPTCA9ICdSIyc7XG5leHBvcnQgY29uc3QgSFlEUk9HRU5fU1lNQk9MID0gJ0gnO1xuXG5leHBvcnQgZW51bSBWMktfQ09OU1Qge1xuICBUWVBFID0gJ1YyMDAwJyxcbiAgTlVNX09GX0hFQURFUl9MSU5FUyA9IDMsXG5cbiAgTlVNX09GX0NPVU5UU19ESUdJVFMgPSAzLFxuICBBVE9NX1RZUEVfQ09MID0gNCxcbiAgRklSU1RfQk9OREVEX0FUT01fQ09MID0gMSxcbiAgQk9ORF9UWVBFX0NPTCA9IDMsXG5cbiAgUkdQX1NISUZUID0gOCxcbiAgTUFYX0FUT01fQ09VTlQgPSA5OTksXG5cbiAgUkdQX0xJTkVfU1RBUlQgPSAnTSAgUkdQJyxcbiAgQVRPTV9BTElBU19MSU5FX1NUQVJUID0gJ0EgICcsXG5cbiAgRU5EID0gJ00gIEVORCcsXG59XG5cbmV4cG9ydCBjb25zdCBNQUxGT1JNRURfTU9MX1YyMDAwID0gYFxuTWFsZm9ybWVkXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMDk5OSBWMjAwMFxuTSAgRU5EYDtcblxuZXhwb3J0IGNvbnN0IGVudW0gVjNLX0NPTlNUIHtcbiAgVFlQRSA9ICdWMzAwMCcsXG4gIEhFQURFUl9TRUNPTkRfTElORSA9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nLFxuXG4gIEJFR0lOX0RBVEFfTElORSA9ICdNICBWMzAgJyxcblxuICBCRUdJTl9DT1VOVFNfTElORSA9ICdNICBWMzAgQ09VTlRTICcsXG4gIC8qKiBJbmRleCBzaGlmdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlICdDT1VOVFMnIGxpbmUgdG8gdGhlIG51bWJlciBvZiBhdG9tcyAgKi9cbiAgQ09VTlRTX1NISUZUID0gMTQsXG5cbiAgQkVHSU5fQ1RBQl9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQ1RBQicsXG4gIEVORF9DVEFCX0JMT0NLID0gJ00gIFYzMCBFTkQgQ1RBQicsXG5cbiAgQkVHSU5fQVRPTV9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQVRPTScsXG4gIEVORF9BVE9NX0JMT0NLID0gJ00gIFYzMCBFTkQgQVRPTScsXG5cbiAgQkVHSU5fQk9ORF9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQk9ORCcsXG4gIEVORF9CT05EX0JMT0NLID0gJ00gIFYzMCBFTkQgQk9ORCcsXG4gIEJPTkRfQ09ORklHID0gJyBDRkc9JyxcblxuICBBVE9NX1RZUEVfQ09MID0gNCxcbiAgWF9DT0wgPSA1LFxuICBGSVJTVF9CT05ERURfQVRPTV9DT0wgPSA1LFxuICBCT05EX1RZUEVfQ09MID0gNCxcbiAgRFVNTVlfSEVBREVSID0gYFxuICAgICBEYXRhZ3Jva1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDA5OTkgVjMwMDBgLFxuICBCRUdJTl9DVEFCID0gJ00gIFYzMCBCRUdJTiBDVEFCJyxcbiAgQ09VTlRTX0xJTkVfU1RBUlQgPSAnTSAgVjMwIENPVU5UUyAnLFxuICBDT1VOVFNfTElORV9EVU1NWV9FTkQgPSAnIDAgMCAwJyxcbiAgQkVHSU5fQ09MTEVDVElPTl9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTicsXG4gIEVORF9DT0xMRUNUSU9OX0JMT0NLID0gJ00gIFYzMCBFTkQgQ09MTEVDVElPTicsXG4gIEVORF9DVEFCID0gJ00gIFYzMCBFTkQgQ1RBQicsXG4gIEVORCA9ICdNICBFTkQnLFxufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfTU9MX1YzMDAwID0gYFxuRW1wdHkgaW5wdXRcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgOTk5IFYzMDAwXG5NICBFTkRgO1xuIl19","import * as DG from 'datagrok-api/dg';\nimport { SeqPaletteBase } from './seq-palettes';\nimport { getMonomerLibHelper } from './types/monomer-library';\nimport { PolymerTypes } from './helm/consts';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color color in string format either hex or rgb.\n * @param {boolean} scale if scale is needed to 210 brightness.\n * @return {string} color in rgb format.\n * */\nfunction correctColor(color, scale = true) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n if (scale) {\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}\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(_m, _polymerType) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static get palette() {\n if (!UnknownColorPalette._pallete)\n UnknownColorPalette._pallete = UnknownColorPalette.buildPalette();\n return UnknownColorPalette._pallete;\n }\n static buildPalette() {\n getMonomerLibHelper().then((lh) => {\n lh.awaitLoaded(Infinity).then(() => {\n const monLib = lh.getMonomerLib();\n monLib.onChanged.subscribe(() => {\n UnknownColorPalette.customMonomerColors = {};\n UnknownColorPalette.polymerTypes = monLib.getPolymerTypes();\n for (const polymerType of this.polymerTypes) {\n const monomerSymbols = monLib.getMonomerSymbolsByType(polymerType);\n for (const monomerSymbol of monomerSymbols) {\n const monomer = monLib.getMonomer(polymerType, monomerSymbol);\n if (monomer?.meta?.colors?.default?.background) {\n if (!this.customMonomerColors[monomerSymbol])\n this.customMonomerColors[monomerSymbol] = {};\n this.customMonomerColors[monomerSymbol][polymerType] =\n correctColor(monomer.meta.colors.default.background);\n }\n }\n }\n });\n });\n });\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m, polymerType) {\n const palleteLength = UnknownColorPalette.palette.length;\n const colorObj = UnknownColorPalette.customMonomerColors[m];\n const polType = polymerType ?? PolymerTypes.PEPTIDE;\n if (colorObj && colorObj[polType])\n return colorObj[polType];\n const hash = StringUtils.hashCode(m);\n const pI = hash % palleteLength;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette._pallete = null;\n// this way is just more future-proof, when we start distinguishing\n// between different polymer types for coloring of non natural aa's or nucleotides\nUnknownColorPalette.customMonomerColors = {};\nUnknownColorPalette.polymerTypes = [];\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 * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\nimport {fromEvent} from 'rxjs';\n\nimport {\n after, before, category, test, expect, awaitCheck, delay, testEvent\n} from '@datagrok-libraries/test/src/test';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {awaitGrid, initHelmMainPackage} from './utils';\nimport {TAGS as helmTAGS} from '../constants';\n\nimport {_package} from '../package-test';\n\ncategory('renderers', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n\n test('missedInLib', async () => { await _testMissedInLib(); });\n\n test('scatterPlotTooltip', async () => { await _testScatterPlotTooltip(); });\n\n async function _testMissedInLib() {\n const df: DG.DataFrame = await grok.dapi.files.readCsv('System:AppData/Helm/tests/sample_HELM-missedInLib.csv');\n const helmCol: DG.Column<string> = df.getCol('HELM');\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n await awaitCheck(() => {\n return $(tv.root).find('.d4-grid canvas').length > 0;\n }, 'Table view canvas not found', 100);\n\n await grok.data.detectSemanticTypes(df);\n\n expect(helmCol.semType, DG.SEMTYPE.MACROMOLECULE);\n expect(helmCol.meta.units, NOTATION.HELM);\n expect(helmCol.getTag(DG.TAGS.CELL_RENDERER), 'helm');\n\n const cellRendererErrorJson: string = helmCol.getTag(helmTAGS.cellRendererRenderError);\n if (!!cellRendererErrorJson) {\n const cellRendererError: any = JSON.parse(cellRendererErrorJson);\n const err = new Error(cellRendererError['message']);\n err.stack = cellRendererError['stack'];\n throw err;\n }\n }\n\n const helmCoordsCsv = `seq,x,y\nPEPTIDE1{I.H.A.N.T.Thr_PO3H2.Aca.D-Tyr_Et}$$$$,0,0\nRNA1{r(A)p.r(C)p.r(G)p.r(U)p}$$$$,1,0\nRNA1{d(A)p.d(C)p.d(G)p.d(U)p}|PEPTIDE1{I.H.A.N.T.Thr_PO3H2}$$$$,0,1\n`;\n\n async function _testScatterPlotTooltip(): Promise<void> {\n const df = DG.DataFrame.fromCsv(helmCoordsCsv);\n df.currentRowIdx = 0;\n const view = grok.shell.addTableView(df);\n await grok.data.detectSemanticTypes(df);\n const sp: DG.ScatterPlotViewer = df.plot.scatter({x: 'x', y: 'y'});\n view.dockManager.dock(sp, DG.DOCK_TYPE.RIGHT, null);\n await Promise.all([\n testEvent(sp.onAfterDrawScene, () => {}, () => { sp.invalidateCanvas(); }, 1000),\n awaitGrid(view.grid, 500)\n ]);\n\n const spBcr = sp.root.getBoundingClientRect();\n const wp = sp.worldToScreen(1, 0);\n const ev = new MouseEvent('mousemove', {\n cancelable: true, bubbles: true, view: window, button: 0,\n clientX: spBcr.left + wp.x, clientY: spBcr.top + wp.y\n });\n const spCanvas = $(sp.root).find('canvas').get()[0] as HTMLCanvasElement;\n await testEvent(fromEvent(spCanvas, 'mousemove'), () => {\n _package.logger.debug(`Test: event, currentRowIdx=${df.currentRowIdx}`);\n expect($(ui.tooltip.root).find('div table.d4-row-tooltip-table tr td canvas').length, 1);\n expect(sp.hitTest(wp.x, wp.y), 1);\n }, () => {\n spCanvas.dispatchEvent(ev);\n }, 500);\n // TODO: Any error occurred become 'Cannot read properties of null (reading 'get$columns')' because of scatter plot\n //await testEvent(sp.onAfterDrawScene, () => {}, () => { sp.invalidateCanvas(); }, 200);\n await awaitGrid(view.grid, 1000);\n }\n});\n","/** Base for Molfile or Mol2 parser/handler */\nexport class ChemicalTableParserBase {\n constructor(fileContent) {\n this.init(fileContent);\n }\n ;\n init(fileContent) {\n this.fileContent = fileContent.replace(/\\r/g, '');\n this._atomCount = undefined;\n this._atomTypes = undefined;\n this._bondCount = undefined;\n this._bondTypes = undefined;\n this.xyzAtomCoordinates = undefined;\n this._pairsOfBondedAtoms = undefined;\n }\n /** Total number of atoms in a molecule */\n get atomCount() {\n if (this._atomCount === undefined)\n this.setAtomAndBondCounts();\n return this._atomCount;\n }\n /** Number of bonds in a molecule */\n get bondCount() {\n if (this._bondCount === undefined)\n this.setAtomAndBondCounts();\n return this._bondCount;\n }\n /** X coordinates of all atoms in a molecule */\n get x() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.x;\n }\n ;\n /** Y coordinates of all atoms in a molecule */\n get y() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.y;\n }\n ;\n /** Z coordinates of all atoms in a molecule */\n get z() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.z;\n }\n ;\n get atomTypes() {\n var _a;\n (_a = this._atomTypes) !== null && _a !== void 0 ? _a : (this._atomTypes = this.parseAtomTypes());\n return this._atomTypes;\n }\n get pairsOfBondedAtoms() {\n var _a;\n (_a = this._pairsOfBondedAtoms) !== null && _a !== void 0 ? _a : (this._pairsOfBondedAtoms = this.parseBondedAtomPairs());\n return this._pairsOfBondedAtoms;\n }\n get bondTypes() {\n var _a;\n (_a = this._bondTypes) !== null && _a !== void 0 ? _a : (this._bondTypes = this.parseBondTypes());\n return this._bondTypes;\n }\n setAtomAndBondCounts() {\n const { atomCount, bondCount } = this.parseAtomAndBondCounts();\n this._atomCount = atomCount;\n this._bondCount = bondCount;\n }\n getNextColumnIdx(idx) {\n // skip non-whitespace, if necessary\n while (!this.isWhitespace(idx))\n ++idx;\n // skip whitespace\n while (this.isWhitespace(idx))\n ++idx;\n return idx;\n }\n shiftIdxToSpecifiedColumn(lineStartIdx, columnNumber) {\n let idx = lineStartIdx;\n const numberOfJumps = this.isWhitespace(idx) ? columnNumber : columnNumber - 1;\n for (let i = 0; i < numberOfJumps; i++)\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n parseAtomTypes() {\n const atomCount = this.atomCount;\n const atomTypes = new Array(atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n atomTypes[i] = this.parseAtomType(idx);\n idx = this.getNextLineIdx(idx);\n }\n return atomTypes;\n }\n ;\n parseAtomCoordinates() {\n const x = new Float32Array(this.atomCount);\n const y = new Float32Array(this.atomCount);\n const z = new Float32Array(this.atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++) {\n idx = this.shiftIdxToXColumn(idx);\n for (const item of [x, y, z]) {\n item[i] = this.parseFloatValue(idx);\n idx = this.getNextColumnIdx(idx);\n }\n idx = this.getNextLineIdx(idx);\n }\n return { x: x, y: y, z: z };\n }\n parseBondedAtomPairs() {\n const bondedAtomPairs = new Array(this.bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < this.bondCount; i++) {\n idx = this.shiftIdxToBondedAtomsPair(idx);\n const pair = new Uint16Array(2);\n pair[0] = this.parseIntValue(idx);\n idx = this.getNextColumnIdx(idx);\n pair[1] = this.parseIntValue(idx);\n bondedAtomPairs[i] = pair;\n idx = this.getNextLineIdx(idx);\n }\n return bondedAtomPairs;\n }\n parseBondTypes() {\n const bondCount = this.bondCount;\n const bondTypes = new Uint16Array(bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < bondCount; i++) {\n idx = this.shiftIdxToBondType(idx);\n bondTypes[i] = this.parseIntValue(idx);\n idx = this.getNextLineIdx(idx);\n }\n return bondTypes;\n }\n ;\n isWhitespace(idx) {\n const symbol = this.fileContent[idx];\n return symbol === ' ' || symbol === '\\t';\n }\n getNextLineIdx(idx) {\n if (this.fileContent[idx] !== '\\n')\n return this.fileContent.indexOf('\\n', idx) + 1;\n else\n return idx + 1;\n }\n parseFloatValue(idxOfNumber) {\n return this.parseNumericValue(parseFloat, idxOfNumber);\n }\n parseIntValue(idxOfNumber) {\n return this.parseNumericValue(parseInt, idxOfNumber);\n }\n parseNumericValue(parserFunction, idxOfNumber) {\n let end = idxOfNumber + 1;\n while (!this.isWhitespace(end))\n ++end;\n const value = parserFunction(this.fileContent.substring(idxOfNumber, end));\n return value;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGVtaWNhbC10YWJsZS1wYXJzZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSw4Q0FBOEM7QUFDOUMsTUFBTSxPQUFnQix1QkFBdUI7SUFDM0MsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQSxDQUFDO0lBVVEsSUFBSSxDQUFDLFdBQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxDQUFDOztRQUNILE1BQUEsSUFBSSxDQUFDLGtC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QVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXRvbUFuZEJvbmRDb3VudHMgPSB7XG4gIGF0b21Db3VudDogbnVtYmVyLFxuICBib25kQ291bnQ6IG51bWJlclxufVxuXG50eXBlIENvb3JkaW5hdGVBcnJheXMgPSB7XG4gIHg6IEZsb2F0MzJBcnJheSxcbiAgeTogRmxvYXQzMkFycmF5LFxuICB6OiBGbG9hdDMyQXJyYXksXG59XG5cbi8qKiBCYXNlIGZvciBNb2xmaWxlIG9yIE1vbDIgcGFyc2VyL2hhbmRsZXIgKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSB7XG4gIGNvbnN0cnVjdG9yKGZpbGVDb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmluaXQoZmlsZUNvbnRlbnQpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBmaWxlQ29udGVudCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hdG9tQ291bnQ/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfYm9uZENvdW50PzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgeHl6QXRvbUNvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZUFycmF5cztcbiAgcHJvdGVjdGVkIF9hdG9tVHlwZXM/OiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF9wYWlyc09mQm9uZGVkQXRvbXM/OiBVaW50MTZBcnJheVtdO1xuICBwcm90ZWN0ZWQgX2JvbmRUeXBlcz86IFVpbnQxNkFycmF5O1xuXG4gIHByb3RlY3RlZCBpbml0KGZpbGVDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVDb250ZW50ID0gZmlsZUNvbnRlbnQucmVwbGFjZSgvXFxyL2csICcnKTtcbiAgICB0aGlzLl9hdG9tQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYXRvbVR5cGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9ib25kVHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54eXpBdG9tQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFpcnNPZkJvbmRlZEF0b21zID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBhdG9tcyBpbiBhIG1vbGVjdWxlICovXG4gIGdldCBhdG9tQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYXRvbUNvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2F0b21Db3VudCE7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGJvbmRzIGluIGEgbW9sZWN1bGUgICovXG4gIGdldCBib25kQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYm9uZENvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRDb3VudCE7XG4gIH1cblxuICAvKiogWCBjb29yZGluYXRlcyBvZiBhbGwgYXRvbXMgaW4gYSBtb2xlY3VsZSAgKi9cbiAgZ2V0IHgoKTogRmxvYXQzMkFycmF5IHtcbiAgICB0aGlzLnh5ekF0b21Db29yZGluYXRlcyA/Pz0gdGhpcy5wYXJzZUF0b21Db29yZGluYXRlcygpO1xuICAgIHJldHVybiB0aGlzLnh5ekF0b21Db29yZGluYXRlcy54O1xuICB9O1xuXG4gIC8qKiBZIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeSgpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS55O1xuICB9O1xuXG4gIC8qKiBaIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeigpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS56O1xuICB9O1xuXG4gIGdldCBhdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHRoaXMuX2F0b21UeXBlcyA/Pz0gdGhpcy5wYXJzZUF0b21UeXBlcygpO1xuICAgIHJldHVybiB0aGlzLl9hdG9tVHlwZXM7XG4gIH1cblxuICBnZXQgcGFpcnNPZkJvbmRlZEF0b21zKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIHRoaXMuX3BhaXJzT2ZCb25kZWRBdG9tcyA/Pz0gdGhpcy5wYXJzZUJvbmRlZEF0b21QYWlycygpO1xuICAgIHJldHVybiB0aGlzLl9wYWlyc09mQm9uZGVkQXRvbXMhO1xuICB9XG5cbiAgZ2V0IGJvbmRUeXBlcygpOiBVaW50MTZBcnJheSB7XG4gICAgdGhpcy5fYm9uZFR5cGVzID8/PSB0aGlzLnBhcnNlQm9uZFR5cGVzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRUeXBlcyE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VBdG9tQW5kQm9uZENvdW50cygpOiBBdG9tQW5kQm9uZENvdW50cztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENvdW50c0xpbmVJZHgoKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBzZXRBdG9tQW5kQm9uZENvdW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB7YXRvbUNvdW50LCBib25kQ291bnR9ID0gdGhpcy5wYXJzZUF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgdGhpcy5fYXRvbUNvdW50ID0gYXRvbUNvdW50O1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IGJvbmRDb3VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0Q29sdW1uSWR4KGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBza2lwIG5vbi13aGl0ZXNwYWNlLCBpZiBuZWNlc3NhcnlcbiAgICB3aGlsZSAoIXRoaXMuaXNXaGl0ZXNwYWNlKGlkeCkpXG4gICAgICArK2lkeDtcbiAgICAvLyBza2lwIHdoaXRlc3BhY2VcbiAgICB3aGlsZSAodGhpcy5pc1doaXRlc3BhY2UoaWR4KSlcbiAgICAgICsraWR4O1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlciwgY29sdW1uTnVtYmVyOiBudW1iZXIpIHtcbiAgICBsZXQgaWR4ID0gbGluZVN0YXJ0SWR4O1xuICAgIGNvbnN0IG51bWJlck9mSnVtcHMgPSB0aGlzLmlzV2hpdGVzcGFjZShpZHgpID8gY29sdW1uTnVtYmVyIDogY29sdW1uTnVtYmVyIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mSnVtcHM7IGkrKylcbiAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VBdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGNvbnN0IGF0b21UeXBlcyA9IG5ldyBBcnJheTxzdHJpbmc+KGF0b21Db3VudCk7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdG9tQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQXRvbVR5cGUoaWR4KTtcbiAgICAgIGF0b21UeXBlc1tpXSA9IHRoaXMucGFyc2VBdG9tVHlwZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbVR5cGVzO1xuICB9O1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21Db29yZGluYXRlcygpOiBDb29yZGluYXRlQXJyYXlzIHtcbiAgICBjb25zdCB4ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmF0b21Db3VudCk7XG4gICAgY29uc3QgeSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hdG9tQ291bnQpO1xuICAgIGNvbnN0IHogPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXRvbUNvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb1hDb2x1bW4oaWR4KTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBbeCwgeSwgel0pIHtcbiAgICAgICAgaXRlbVtpXSA9IHRoaXMucGFyc2VGbG9hdFZhbHVlKGlkeCk7XG4gICAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgICAgfVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4ge3g6IHgsIHk6IHksIHo6IHp9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZGVkQXRvbVBhaXJzKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIGNvbnN0IGJvbmRlZEF0b21QYWlycyA9IG5ldyBBcnJheTxVaW50MTZBcnJheT4odGhpcy5ib25kQ291bnQpO1xuICAgIGxldCBpZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib25kQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGlkeCk7XG4gICAgICBjb25zdCBwYWlyID0gbmV3IFVpbnQxNkFycmF5KDIpO1xuICAgICAgcGFpclswXSA9IHRoaXMucGFyc2VJbnRWYWx1ZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGlkeCk7XG4gICAgICBwYWlyWzFdID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBib25kZWRBdG9tUGFpcnNbaV0gPSBwYWlyO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYm9uZGVkQXRvbVBhaXJzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZFR5cGVzKCk6IFVpbnQxNkFycmF5IHtcbiAgICBjb25zdCBib25kQ291bnQgPSB0aGlzLmJvbmRDb3VudDtcbiAgICBjb25zdCBib25kVHlwZXMgPSBuZXcgVWludDE2QXJyYXkoYm9uZENvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvbmRDb3VudDsgaSsrKSB7XG4gICAgICBpZHggPSB0aGlzLnNoaWZ0SWR4VG9Cb25kVHlwZShpZHgpO1xuICAgICAgYm9uZFR5cGVzW2ldID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiBib25kVHlwZXM7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGlzV2hpdGVzcGFjZShpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltYm9sID09PSAnICcgfHwgc3ltYm9sID09PSAnXFx0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0TGluZUlkeChpZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZmlsZUNvbnRlbnRbaWR4XSAhPT0gJ1xcbicpXG4gICAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCdcXG4nLCBpZHgpICsgMTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gaWR4ICsgMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUZsb2F0VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VGbG9hdCwgaWR4T2ZOdW1iZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlSW50VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VJbnQsIGlkeE9mTnVtYmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZU51bWVyaWNWYWx1ZShcbiAgICBwYXJzZXJGdW5jdGlvbjogKHN0cjogc3RyaW5nKSA9PiBudW1iZXIsXG4gICAgaWR4T2ZOdW1iZXI6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBlbmQgPSBpZHhPZk51bWJlciArIDE7XG4gICAgd2hpbGUgKCF0aGlzLmlzV2hpdGVzcGFjZShlbmQpKVxuICAgICAgKytlbmQ7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZXJGdW5jdGlvbih0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhpZHhPZk51bWJlciwgZW5kKSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=","import { ChemicalTableParserBase } from './chemical-table-parser-base';\nimport { ASTERISK, D_QUOTE, L, R, S_QUOTE } from './const';\nimport { isAlpha } from './utils';\nexport class MolfileHandlerBase extends ChemicalTableParserBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n init(molfile) {\n super.init(molfile);\n }\n parseAtomType(idx) {\n let begin = idx;\n let end = begin;\n if (this.isQuote(begin)) {\n end = this.getNextIdenticalChar(begin);\n begin++;\n }\n else {\n end = this.fileContent.indexOf(' ', end);\n }\n return this.fileContent.substring(begin, end);\n }\n isQuote(idx) {\n const letter = this.fileContent[idx].charCodeAt(0);\n return letter === S_QUOTE || letter === D_QUOTE;\n }\n getNextIdenticalChar(idx) {\n const sym = this.fileContent[idx];\n return sym ? this.fileContent.indexOf(sym, idx + 1) : -1;\n }\n isQuery() {\n return this.isQueryOrFragment((char, idx) => {\n return char === S_QUOTE || char === D_QUOTE ||\n (char === L && !isAlpha(this.fileContent.charCodeAt(idx + 1)));\n });\n }\n ;\n isFragment() {\n return this.isQueryOrFragment((char) => {\n return char === R || char === ASTERISK;\n });\n }\n ;\n isQueryOrFragment(condition) {\n const atomCount = this.atomCount;\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n const char = this.fileContent.charCodeAt(idx);\n if (condition(char, idx))\n return true;\n idx = this.getNextLineIdx(idx);\n }\n return false;\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLWhhbmRsZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQW9CLE1BQU0sOEJBQThCLENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDekQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLE9BQWdCLGtCQUFtQixTQUFRLHVCQUF1QjtJQUN0RSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsSUFBSSxDQUFDLE9BQWU7UUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBV1MsYUFBYSxDQUFDLEdBQVc7UUFDakMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLEVBQUUsQ0FBQztTQUNUO2FBQU07WUFDTCxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVTLE9BQU8sQ0FBQyxHQUFXO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssT0FBTyxDQUFDO0lBQ2xELENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxHQUFXO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUU7WUFDMUQsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPO2dCQUMzQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQSxDQUFDO0lBRUssVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDN0MsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUEsQ0FBQztJQUVRLGlCQUFpQixDQUFDLFNBQWlEO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQztZQUNkLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQUEsQ0FBQztDQUtIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSwgQXRvbUFuZEJvbmRDb3VudHN9IGZyb20gJy4vY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UnO1xuaW1wb3J0IHtBU1RFUklTSywgRF9RVU9URSwgTCwgUiwgU19RVU9URX0gZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQge2lzQWxwaGF9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9sZmlsZUhhbmRsZXJCYXNlIGV4dGVuZHMgQ2hlbWljYWxUYWJsZVBhcnNlckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtb2xmaWxlKTtcbiAgICB0aGlzLmluaXQobW9sZmlsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdChtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQXRvbUFuZEJvbmRDb3VudHMoKTogQXRvbUFuZEJvbmRDb3VudHM7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEF0b21CbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hpZnRJZHhUb0JvbmRUeXBlKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBsZXQgYmVnaW4gPSBpZHg7XG4gICAgbGV0IGVuZCA9IGJlZ2luO1xuICAgIGlmICh0aGlzLmlzUXVvdGUoYmVnaW4pKSB7XG4gICAgICBlbmQgPSB0aGlzLmdldE5leHRJZGVudGljYWxDaGFyKGJlZ2luKTtcbiAgICAgIGJlZ2luKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhiZWdpbiwgZW5kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1F1b3RlKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGV0dGVyID0gdGhpcy5maWxlQ29udGVudFtpZHhdLmNoYXJDb2RlQXQoMCk7XG4gICAgcmV0dXJuIGxldHRlciA9PT0gU19RVU9URSB8fCBsZXR0ZXIgPT09IERfUVVPVEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dElkZW50aWNhbENoYXIoaWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN5bSA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltID8gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKHN5bSwgaWR4ICsgMSkgOiAtMTtcbiAgfVxuXG4gIHB1YmxpYyBpc1F1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUXVlcnlPckZyYWdtZW50KChjaGFyOiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhciA9PT0gU19RVU9URSB8fCBjaGFyID09PSBEX1FVT1RFIHx8XG4gICAgICAoY2hhciA9PT0gTCAmJiAhaXNBbHBoYSh0aGlzLmZpbGVDb250ZW50LmNoYXJDb2RlQXQoaWR4ICsgMSkpKTtcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgaXNGcmFnbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5T3JGcmFnbWVudCgoY2hhcjogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhciA9PT0gUiB8fCBjaGFyID09PSBBU1RFUklTSztcbiAgICB9KTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgaXNRdWVyeU9yRnJhZ21lbnQoY29uZGl0aW9uOiAoY2hhcjogbnVtYmVyLCBpZHg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGxldCBpZHggPSB0aGlzLmdldEF0b21CbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb0F0b21UeXBlKGlkeCk7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5maWxlQ29udGVudC5jaGFyQ29kZUF0KGlkeCk7XG4gICAgICBpZiAoY29uZGl0aW9uKGNoYXIsIGlkeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgYWJzdHJhY3QgZ2V0QXRvbUxpbmVzKCk6IHN0cmluZ1tdO1xuICBhYnN0cmFjdCBnZXRCb25kTGluZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IGdldFJHcm91cElkVG9BdG9taWNJZHhNYXAoKTogTWFwPG51bWJlciwgbnVtYmVyPjtcbn1cbiJdfQ==","export const R = 82;\nexport const L = 76;\nexport const D_QUOTE = 34;\nexport const S_QUOTE = 39;\nexport const ASTERISK = 42;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUiA9IDgyO1xuZXhwb3J0IGNvbnN0IEwgPSA3NjtcbmV4cG9ydCBjb25zdCBEX1FVT1RFID0gMzQ7XG5leHBvcnQgY29uc3QgU19RVU9URSA9IDM5O1xuZXhwb3J0IGNvbnN0IEFTVEVSSVNLID0gNDI7XG4iXX0=","export function isAlpha(charCode) {\n return (charCode > 64 && charCode < 91) ||\n (charCode > 96 && charCode < 123);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzQWxwaGEoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY2hhckNvZGUgPiA2NCAmJiBjaGFyQ29kZSA8IDkxKSB8fFxuICAgICAgICAoY2hhckNvZGUgPiA5NiAmJiBjaGFyQ29kZSA8IDEyMyk7XG59XG4iXX0=","import { R_GROUP_ELEMENT_SYMBOL, V2K_CONST } from '../formats/molfile-const';\nimport { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV2KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n }\n getAtomLines() {\n const atomBlockIdx = this.getAtomBlockIdx();\n const end = this.getBondBlockIdx();\n return this.fileContent.substring(atomBlockIdx, end).split('\\n').slice(0, this.atomCount);\n }\n getBondLines() {\n const bondBlockIdx = this.getBondBlockIdx();\n return this.fileContent.substring(bondBlockIdx).split('\\n').slice(0, this.bondCount);\n }\n getRGroupIdToAtomicIdxMap() {\n const map = new Map();\n const lines = this.fileContent.split('\\n');\n const rgroupLines = lines.filter((line) => line.startsWith(V2K_CONST.RGP_LINE_START));\n rgroupLines.forEach((line) => {\n const atomIdxToRgpIdxList = this.getAtomIdxToRgpIdxList(line);\n for (const [key, value] of atomIdxToRgpIdxList) {\n if (map.has(key))\n throw new Error(`R group ${key} is already in the map`);\n map.set(key, value);\n }\n });\n const atomAliasLinesIndices = lines.map((line, idx) => {\n if (line.startsWith(V2K_CONST.ATOM_ALIAS_LINE_START))\n return idx;\n }).filter((idx) => idx !== undefined);\n const atomAliasLines = atomAliasLinesIndices.map((idx) => lines[idx]);\n const atomAliasTextLines = atomAliasLinesIndices.map((idx) => lines[idx + 1]);\n atomAliasLines.forEach((line, idx) => {\n const rgpAtomIdx = parseInt(line.split(/\\s+/)[1]) - 1;\n const rgpId = parseInt(atomAliasTextLines[idx].substring(1));\n if (map.has(rgpId))\n throw new Error(`R group ${rgpId} is already in the map`);\n map.set(rgpId, rgpAtomIdx);\n });\n const rGroupAtomicIndices = this.getRGroupAtomicIndices();\n const unaccounted = rGroupAtomicIndices.filter((idx) => !Array.from(map.values()).includes(idx));\n if (unaccounted.length !== 0)\n throw new Error(`Unaccounted R group indices: ${unaccounted}`);\n return map;\n }\n getAtomIdxToRgpIdxList(rgpLine) {\n const indices = rgpLine.split(/\\s+/).filter((item) => item)\n .slice(3).map((item) => parseInt(item));\n const atomIdxToRgpIdxList = new Array(indices.length / 2);\n for (let i = 0; i < indices.length; i += 2)\n atomIdxToRgpIdxList[i / 2] = [indices[i + 1], indices[i] - 1];\n return atomIdxToRgpIdxList;\n }\n getRGroupAtomicIndices() {\n return this.atomTypes.map((line, idx) => {\n if (line.includes(R_GROUP_ELEMENT_SYMBOL))\n return idx;\n }).filter((idx) => idx !== undefined);\n }\n static isValidMolfile(molfile) {\n return (molfile.indexOf(V2K_CONST.TYPE) !== -1 &&\n molfile.indexOf(V2K_CONST.END) !== -1);\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.ATOM_TYPE_COL);\n }\n getCountsLineIdx() {\n let idx = 0;\n for (let i = 0; i < V2K_CONST.NUM_OF_HEADER_LINES; ++i)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n getAtomBlockIdx() {\n let idx = this.getCountsLineIdx();\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n return this.getNextColumnIdx(lineStartIdx);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.FIRST_BONDED_ATOM_COL);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.BOND_TYPE_COL);\n }\n getBondBlockIdx() {\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n parseAtomAndBondCounts() {\n let begin = this.getCountsLineIdx();\n let end = begin + V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const atomCount = parseInt(this.fileContent.substring(begin, end));\n begin = end;\n end += V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const bondCount = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: atomCount, bondCount: bondCount };\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjJrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTNFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTFELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7SUFDdkQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxD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QztRQUNqRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNaLEdBQUcsSUFBSSxTQUFTLENBQUMsb0JBQW9CLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUEsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSX0dST1VQX0VMRU1FTlRfU1lNQk9MLCBWMktfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS1jb25zdCc7XG5pbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWMktIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gIH1cblxuICBnZXRBdG9tTGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21CbG9ja0lkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYXRvbUJsb2NrSWR4LCBlbmQpLnNwbGl0KCdcXG4nKS5zbGljZSgwLCB0aGlzLmF0b21Db3VudCk7XG4gIH1cblxuICBnZXRCb25kTGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJvbmRCbG9ja0lkeCA9IHRoaXMuZ2V0Qm9uZEJsb2NrSWR4KCk7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJvbmRCbG9ja0lkeCkuc3BsaXQoJ1xcbicpLnNsaWNlKDAsIHRoaXMuYm9uZENvdW50KTtcbiAgfVxuXG4gIGdldFJHcm91cElkVG9BdG9taWNJZHhNYXAoKTogTWFwPG51bWJlciwgbnVtYmVyPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBjb25zdCBsaW5lcyA9IHRoaXMuZmlsZUNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHJncm91cExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lOiBzdHJpbmcpID0+IGxpbmUuc3RhcnRzV2l0aChWMktfQ09OU1QuUkdQX0xJTkVfU1RBUlQpKTtcbiAgICByZ3JvdXBMaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGF0b21JZHhUb1JncElkeExpc3QgPSB0aGlzLmdldEF0b21JZHhUb1JncElkeExpc3QobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhdG9tSWR4VG9SZ3BJZHhMaXN0KSB7XG4gICAgICAgIGlmIChtYXAuaGFzKGtleSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSIGdyb3VwICR7a2V5fSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcbiAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGF0b21BbGlhc0xpbmVzSW5kaWNlcyA9IGxpbmVzLm1hcCgobGluZTogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChWMktfQ09OU1QuQVRPTV9BTElBU19MSU5FX1NUQVJUKSlcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9KS5maWx0ZXIoKGlkeCkgPT4gaWR4ICE9PSB1bmRlZmluZWQpIGFzIG51bWJlcltdO1xuICAgIGNvbnN0IGF0b21BbGlhc0xpbmVzID0gYXRvbUFsaWFzTGluZXNJbmRpY2VzLm1hcCgoaWR4KSA9PiBsaW5lc1tpZHhdKTtcbiAgICBjb25zdCBhdG9tQWxpYXNUZXh0TGluZXMgPSBhdG9tQWxpYXNMaW5lc0luZGljZXMubWFwKChpZHgpID0+IGxpbmVzW2lkeCArIDFdKTtcbiAgICBhdG9tQWxpYXNMaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCByZ3BBdG9tSWR4ID0gcGFyc2VJbnQobGluZS5zcGxpdCgvXFxzKy8pWzFdKSAtIDE7XG4gICAgICBjb25zdCByZ3BJZCA9IHBhcnNlSW50KGF0b21BbGlhc1RleHRMaW5lc1tpZHhdLnN1YnN0cmluZygxKSk7XG4gICAgICBpZiAobWFwLmhhcyhyZ3BJZCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCAke3JncElkfSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcbiAgICAgIG1hcC5zZXQocmdwSWQsIHJncEF0b21JZHgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgckdyb3VwQXRvbWljSW5kaWNlcyA9IHRoaXMuZ2V0Ukdyb3VwQXRvbWljSW5kaWNlcygpO1xuICAgIGNvbnN0IHVuYWNjb3VudGVkID0gckdyb3VwQXRvbWljSW5kaWNlcy5maWx0ZXIoKGlkeCkgPT4gIUFycmF5LmZyb20obWFwLnZhbHVlcygpKS5pbmNsdWRlcyhpZHgpKTtcbiAgICBpZiAodW5hY2NvdW50ZWQubGVuZ3RoICE9PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFjY291bnRlZCBSIGdyb3VwIGluZGljZXM6ICR7dW5hY2NvdW50ZWR9YCk7XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdG9tSWR4VG9SZ3BJZHhMaXN0KHJncExpbmU6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHJncExpbmUuc3BsaXQoL1xccysvKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0pXG4gICAgICAuc2xpY2UoMykubWFwKChpdGVtKSA9PiBwYXJzZUludChpdGVtKSk7XG4gICAgY29uc3QgYXRvbUlkeFRvUmdwSWR4TGlzdCA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPihpbmRpY2VzLmxlbmd0aCAvIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGF0b21JZHhUb1JncElkeExpc3RbaSAvIDJdID0gW2luZGljZXNbaSArIDFdLCBpbmRpY2VzW2ldIC0gMV07XG4gICAgcmV0dXJuIGF0b21JZHhUb1JncElkeExpc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldFJHcm91cEF0b21pY0luZGljZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLmF0b21UeXBlcy5tYXAoKGxpbmU6IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChsaW5lLmluY2x1ZGVzKFJfR1JPVVBfRUxFTUVOVF9TWU1CT0wpKVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH0pLmZpbHRlcigoaWR4KSA9PiBpZHggIT09IHVuZGVmaW5lZCkgYXMgbnVtYmVyW107XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1vbGZpbGUobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChtb2xmaWxlLmluZGV4T2YoVjJLX0NPTlNULlRZUEUpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWMktfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5BVE9NX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBWMktfQ09OU1QuTlVNX09GX0hFQURFUl9MSU5FUzsgKytpKVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0Q291bnRzTGluZUlkeCgpO1xuICAgIGlkeCA9IHRoaXMuZ2V0TmV4dExpbmVJZHgoaWR4KTtcbiAgICByZXR1cm4gaWR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9YQ29sdW1uKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGxpbmVTdGFydElkeCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb0JvbmRlZEF0b21zUGFpcihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5GSVJTVF9CT05ERURfQVRPTV9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5CT05EX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRCb25kQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspXG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21BbmRCb25kQ291bnRzKCk6IEF0b21BbmRCb25kQ291bnRzIHtcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmdldENvdW50c0xpbmVJZHgoKTtcbiAgICBsZXQgZW5kID0gYmVnaW4gKyBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYXRvbUNvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIGJlZ2luID0gZW5kO1xuICAgIGVuZCArPSBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYm9uZENvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIHJldHVybiB7YXRvbUNvdW50OiBhdG9tQ291bnQsIGJvbmRDb3VudDogYm9uZENvdW50fTtcbiAgfTtcbn1cbiJdfQ==","import { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV3KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n getAtomLines() {\n const atomBlockIdx = this.getAtomBlockIdx();\n const end = this.getBondBlockIdx();\n return this.fileContent.substring(atomBlockIdx, end).split('\\n').slice(0, this.atomCount);\n }\n getBondLines() {\n const bondBlockIdx = this.getBondBlockIdx();\n return this.fileContent.substring(bondBlockIdx).split('\\n').slice(0, this.bondCount);\n }\n getRGroupIdToAtomicIdxMap() {\n const map = new Map();\n this.getAtomLines().forEach((line, idx) => {\n const rGroupMatches = line.match(/RGROUPS=\\(([\\d\\s]+)\\)/);\n if (rGroupMatches) {\n const rGroupData = rGroupMatches[1].split(/\\s+/).map((rgId) => parseInt(rgId));\n // todo: handle cases when there are more than 2 r groups\n if (rGroupData.length > 2)\n throw new Error(`R group data ${rGroupData} has more than 2 elements`);\n const rGroupId = rGroupData[1];\n if (map.has(rGroupId))\n throw new Error(`R group ${rGroupId} is already in the map`);\n map.set(rGroupId, idx);\n }\n });\n return map;\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.ATOM_TYPE_COL */);\n }\n getCountsLineIdx() {\n return this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */);\n }\n getAtomBlockIdx() {\n let idx = this.fileContent.indexOf(\"M V30 BEGIN ATOM\" /* V3K_CONST.BEGIN_ATOM_BLOCK */);\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n let idx = this.shiftIdxToAtomType(lineStartIdx);\n if (this.isQuote(idx)) {\n idx = this.getNextIdenticalChar(idx);\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.X_COL */);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.FIRST_BONDED_ATOM_COL */);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.BOND_TYPE_COL */);\n }\n getBondBlockIdx() {\n return this.getNextLineIdx(this.fileContent.indexOf(\"M V30 BEGIN BOND\" /* V3K_CONST.BEGIN_BOND_BLOCK */));\n }\n static isValidMolfile(molfile) {\n return (molfile.indexOf(\"V3000\" /* V3K_CONST.TYPE */) !== -1 &&\n molfile.indexOf(\"M END\" /* V3K_CONST.END */) !== -1);\n }\n parseAtomAndBondCounts() {\n // parse atom count\n let begin = this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */) + 14 /* V3K_CONST.COUNTS_SHIFT */;\n let end = this.fileContent.indexOf(' ', begin + 1);\n const numOfAtoms = parseInt(this.fileContent.substring(begin, end));\n // parse bond count\n begin = end + 1;\n end = this.fileContent.indexOf(' ', begin + 1);\n const numOfBonds = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: numOfAtoms, bondCount: numOfBonds };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12M2staGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjNrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGtCQUFrQjtJQUN2RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxD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LENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFcEUsbUJBQW1CO1FBQ25CLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwRSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWM0tfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS1jb25zdCc7XG5pbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWM0tIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gICAgdGhpcy5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgZ2V0QXRvbUxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdG9tQmxvY2tJZHggPSB0aGlzLmdldEF0b21CbG9ja0lkeCgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0Qm9uZEJsb2NrSWR4KCk7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGF0b21CbG9ja0lkeCwgZW5kKS5zcGxpdCgnXFxuJykuc2xpY2UoMCwgdGhpcy5hdG9tQ291bnQpO1xuICB9XG5cbiAgZ2V0Qm9uZExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBib25kQmxvY2tJZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhib25kQmxvY2tJZHgpLnNwbGl0KCdcXG4nKS5zbGljZSgwLCB0aGlzLmJvbmRDb3VudCk7XG4gIH1cblxuICBnZXRSR3JvdXBJZFRvQXRvbWljSWR4TWFwKCk6IE1hcDxudW1iZXIsIG51bWJlcj4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgdGhpcy5nZXRBdG9tTGluZXMoKS5mb3JFYWNoKChsaW5lLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHJHcm91cE1hdGNoZXMgPSBsaW5lLm1hdGNoKC9SR1JPVVBTPVxcKChbXFxkXFxzXSspXFwpLyk7XG5cbiAgICAgIGlmIChyR3JvdXBNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHJHcm91cERhdGEgPSByR3JvdXBNYXRjaGVzWzFdLnNwbGl0KC9cXHMrLykubWFwKChyZ0lkKSA9PiBwYXJzZUludChyZ0lkKSk7XG4gICAgICAgIC8vIHRvZG86IGhhbmRsZSBjYXNlcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiByIGdyb3Vwc1xuICAgICAgICBpZiAockdyb3VwRGF0YS5sZW5ndGggPiAyKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCBkYXRhICR7ckdyb3VwRGF0YX0gaGFzIG1vcmUgdGhhbiAyIGVsZW1lbnRzYCk7XG4gICAgICAgIGNvbnN0IHJHcm91cElkID0gckdyb3VwRGF0YVsxXTtcbiAgICAgICAgaWYgKG1hcC5oYXMockdyb3VwSWQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCAke3JHcm91cElkfSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcblxuICAgICAgICBtYXAuc2V0KHJHcm91cElkLCBpZHgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQXRvbVR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuQVRPTV9UWVBFX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q291bnRzTGluZUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoVjNLX0NPTlNULkJFR0lOX0NPVU5UU19MSU5FKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBdG9tQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9BVE9NX0JMT0NLKTtcbiAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuc2hpZnRJZHhUb0F0b21UeXBlKGxpbmVTdGFydElkeCk7XG4gICAgaWYgKHRoaXMuaXNRdW90ZShpZHgpKSB7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRJZGVudGljYWxDaGFyKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRDb2x1bW5JZHgoaWR4KTtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuWF9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuRklSU1RfQk9OREVEX0FUT01fQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuQk9ORF9UWVBFX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Qm9uZEJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV4dExpbmVJZHgodGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9CT05EX0JMT0NLKSk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1vbGZpbGUobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChtb2xmaWxlLmluZGV4T2YoVjNLX0NPTlNULlRZUEUpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWM0tfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQXRvbUFuZEJvbmRDb3VudHMoKTogQXRvbUFuZEJvbmRDb3VudHMge1xuICAgIC8vIHBhcnNlIGF0b20gY291bnRcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoVjNLX0NPTlNULkJFR0lOX0NPVU5UU19MSU5FKSArIFYzS19DT05TVC5DT1VOVFNfU0hJRlQ7XG4gICAgbGV0IGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGJlZ2luICsgMSk7XG4gICAgY29uc3QgbnVtT2ZBdG9tcyA9IHBhcnNlSW50KHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICAgIC8vIHBhcnNlIGJvbmQgY291bnRcbiAgICBiZWdpbiA9IGVuZCArIDE7XG4gICAgZW5kID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCcgJywgYmVnaW4gKyAxKTtcbiAgICBjb25zdCBudW1PZkJvbmRzID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuXG4gICAgcmV0dXJuIHthdG9tQ291bnQ6IG51bU9mQXRvbXMsIGJvbmRDb3VudDogbnVtT2ZCb25kc307XG4gIH1cbn1cbiJdfQ==","import { MolfileV2KHandler } from './molfile-v2k-handler';\nimport { MolfileV3KHandler } from './molfile-v3k-handler';\n/** Defines the proper handler based on the molfile type */\nexport class MolfileHandler {\n constructor() { }\n static getInstance(molfile) {\n if (MolfileHandler.isMolfileV2K(molfile))\n return new MolfileV2KHandler(molfile);\n else if (MolfileHandler.isMolfileV3K(molfile))\n return new MolfileV3KHandler(molfile);\n else\n throw new Error('Malformed molfile');\n }\n static isMolfileV2K(molfile) {\n return MolfileV2KHandler.isValidMolfile(molfile);\n }\n static isMolfileV3K(molfile) {\n return MolfileV3KHandler.isValidMolfile(molfile);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9sZmlsZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELDREQUE0RDtBQUM1RCxNQUFNLE9BQU8sY0FBYztJQUN6QixnQkFBdUIsQ0FBQztJQUV4QixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7O1lBRXRDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ2pDLE9BQU8saUJBQWlCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQWU7UUFDakMsT0FBTyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2xmaWxlSGFuZGxlckJhc2V9IGZyb20gJy4vbW9sZmlsZS1oYW5kbGVyLWJhc2UnO1xuaW1wb3J0IHtNb2xmaWxlVjJLSGFuZGxlcn0gZnJvbSAnLi9tb2xmaWxlLXYyay1oYW5kbGVyJztcbmltcG9ydCB7TW9sZmlsZVYzS0hhbmRsZXJ9IGZyb20gJy4vbW9sZmlsZS12M2staGFuZGxlcic7XG5cbi8qKiBEZWZpbmVzIHRoZSBwcm9wZXIgaGFuZGxlciBiYXNlZCBvbiB0aGUgbW9sZmlsZSB0eXBlICAqL1xuZXhwb3J0IGNsYXNzIE1vbGZpbGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKG1vbGZpbGU6IHN0cmluZyk6IE1vbGZpbGVIYW5kbGVyQmFzZSB7XG4gICAgaWYgKE1vbGZpbGVIYW5kbGVyLmlzTW9sZmlsZVYySyhtb2xmaWxlKSlcbiAgICAgIHJldHVybiBuZXcgTW9sZmlsZVYyS0hhbmRsZXIobW9sZmlsZSk7XG4gICAgZWxzZSBpZiAoTW9sZmlsZUhhbmRsZXIuaXNNb2xmaWxlVjNLKG1vbGZpbGUpKVxuICAgICAgcmV0dXJuIG5ldyBNb2xmaWxlVjNLSGFuZGxlcihtb2xmaWxlKTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBtb2xmaWxlJyk7XG4gIH1cblxuICBzdGF0aWMgaXNNb2xmaWxlVjJLKG1vbGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBNb2xmaWxlVjJLSGFuZGxlci5pc1ZhbGlkTW9sZmlsZShtb2xmaWxlKTtcbiAgfVxuXG4gIHN0YXRpYyBpc01vbGZpbGVWM0sobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1vbGZpbGVWM0tIYW5kbGVyLmlzVmFsaWRNb2xmaWxlKG1vbGZpbGUpO1xuICB9XG59XG4iXX0=","import * as DG from 'datagrok-api/dg';\nexport async function getSeqHelper() {\n const packageName = 'Bio';\n const funcList = DG.Func.find({ package: packageName, name: `getSeqHelper` });\n if (funcList.length === 0)\n throw new Error(`Package '${packageName}' must be installed for SeqHelper.`);\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=seq-helper.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/test/src/test';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {\n getUserLibSettings, setUserLibSettings,\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';\n\nimport {awaitGrid, initHelmMainPackage} from './utils';\n\nimport {_package} from '../package-test';\n\ncategory('getMolfiles', () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n await monomerLibHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true);\n });\n\n const csv = `Helm, atoms, bonds\nPEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et.Tyr_ab-dehydroMe.dV}$$$$,11,10\nPEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV}$$$$,11,10\nPEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2}$$$$,9,8`;\n\n test('linear1', async () => {\n const df = DG.DataFrame.fromCsv(csv);\n const helmCol = df.getCol('Helm');\n const view = grok.shell.addTableView(df);\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 1');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 1');\n\n const resCol: DG.Column<string> = await grok.functions.call('Helm:getMolfiles', {col: helmCol});\n expect(resCol.length, helmCol.length);\n const resMolfileList: MolfileHandlerBase[] = resCol.toList().map((molfile) => MolfileHandler.getInstance(molfile));\n expectArray(resMolfileList.map((mf) => mf.atomCount), df.getCol('atoms').toList());\n expectArray(resMolfileList.map((mf) => mf.bondCount), df.getCol('bonds').toList());\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 2');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 2');\n });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {ISeqHandler} from '@datagrok-libraries/bio/src/utils/macromolecule/seq-handler';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\n\nimport {removeGapsFromHelm} from '../utils';\n\nexport class SeqPropertiesError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n }\n}\n\n// hwe migration (Phase 7): formula / MW / extinction coefficient now come from\n// the standalone `@datagrok-libraries/hwe` editor (via the adapter's\n// `LegacyEditorWrapper`), replacing the legacy `new JSDraw2.Editor(...)`. The\n// helper is obtained through the async `getHelmHelper()` factory (which ensures\n// the Helm package is initialized) rather than `_package.helmHelper` — the\n// latter is not initialized in the standalone test bundle. This makes the\n// property calc async (it previously relied on the eagerly-loaded JSDraw2\n// global). The adapter emits the formula in the legacy element order\n// (C,H,N,O,S,P) with no `<sub>` markup, so the strip below is a defensive no-op.\nexport async function getPropertiesDict(seq: string, sh: ISeqHandler): Promise<{}> {\n const host = ui.div([], {style: {width: '0', height: '0'}});\n document.documentElement.appendChild(host);\n try {\n if (seq.length > 1000)\n throw new SeqPropertiesError('Too long sequence to calculate molecular properties.');\n\n const helmString = sh.isHelm() ? seq : sh.getConverter(NOTATION.HELM)(seq);\n // Remove gap symbols for compatibility with the editor\n const helmString2 = removeGapsFromHelm(helmString);\n\n const helmHelper = await getHelmHelper();\n const editor = helmHelper.createHelmWebEditor(host).editor;\n editor.setHelm(helmString2);\n\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient() * 100) / 100;\n return {\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n };\n } finally {\n $(host).empty();\n host.remove();\n }\n}\n\n\nexport async function getPropertiesWidget(value: DG.SemanticValue<string>): Promise<DG.Widget> {\n const helmHelper = await getHelmHelper();\n const sh = helmHelper.seqHelper.getSeqHandler(value.cell.column as DG.Column<string>);\n try {\n const propDict = await getPropertiesDict(value.value, sh);\n return new DG.Widget(\n ui.tableFromMap(propDict, true)\n );\n } catch (err: any) {\n if (err instanceof SeqPropertiesError) {\n // Display warning from err.message\n return new DG.Widget(ui.divText(err.message));\n }\n throw err;\n }\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {after, before, category, expect, expectObject, test, timeout} from '@datagrok-libraries/test/src/test';\nimport {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {generateLongSequence} from '@datagrok-libraries/bio/src/utils/generator';\nimport {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';\n\nimport {initHelmMainPackage} from './utils';\nimport {getPropertiesDict, SeqPropertiesError} from '../widgets/properties-widget';\n\nconst enum MolProps {\n formula = 'formula',\n mw = 'molecular weight',\n extinctCoef = 'extinction coefficient',\n}\n\nconst enum Tests {\n helm = 'Helm',\n separator = 'separator',\n separator2 = 'separator2', // with a few gaps in a row\n separatorGaps = 'separator-gaps',\n fastaPt = 'fasta-PT',\n fastaPtMsa = 'fasta-PT-MSA',\n fastaRna = 'fasta-RNA',\n fastaDna = 'fasta-DNA',\n}\n\n// hwe migration (Phase 7): molecular-weight goldens updated to the standalone\n// `@datagrok-libraries/hwe` calculator, which uses IUPAC-2013 standard atomic\n// weights (C 12.011, O 15.999, S 32.06, P 30.974) instead of the legacy\n// JSDraw2 PT.Lite table (C 12.0107, O 15.9994, S 32.065, P 30.9738). Formulas\n// (legacy C,H,N,O,S,P order) and extinction coefficients are unchanged; only\n// MW shifts by ≤0.04 Da. Source: hwe src/calc/formula.ts.\nconst TestsData: {\n [testName: string]: { seq: string, units: NOTATION, separator?: string, alphabet?: ALPHABET, res: {} }\n} = {\n [Tests.helm]: {\n seq: 'PEPTIDE1{I.H.A.C.T.[Thr_PO3H2].[Aca].[D-Tyr_Et]}|PEPTIDE2{E.A.[meG]}$PEPTIDE1,PEPTIDE2,4:R3-1:R1$$$V2.0',\n units: NOTATION.HELM,\n res: {[MolProps.formula]: 'C58H94N13O21SP', [MolProps.mw]: 1372.49, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator]: {\n seq: 'I/H/A/C/T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C47H77N10O15SP', [MolProps.mw]: 1085.22, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator2]: {\n seq: 'meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca/D-Tyr_Et/Aze/dV/E/N////Phe_4Me',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C91H146N19O25P', [MolProps.mw]: 1937.25, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.separatorGaps]: {\n seq: 'I/H/A//T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C44H72N9O14P', [MolProps.mw]: 982.08, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.fastaPt]: {\n seq: 'IHACTTAY',\n units: NOTATION.FASTA, alphabet: ALPHABET.PT,\n res: {[MolProps.formula]: 'C38H58N10O12S', [MolProps.mw]: 879, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.fastaRna]: {\n seq: 'ACGUAUUCC',\n units: NOTATION.FASTA, alphabet: ALPHABET.RNA,\n // hwe migration: EC now uses hwe's nearest-neighbor stacking model\n // (ε = 2·ΣNN − Σinternal-singletons) instead of the legacy Pistoia\n // sum-of-single-base ε (which gave 96.27). T is scored as U.\n res: {[MolProps.formula]: 'C84H107N30O65P9', [MolProps.mw]: 2855.69, [MolProps.extinctCoef]: 86.96}\n },\n [Tests.fastaDna]: {\n seq: 'ACGTATTCC',\n units: NOTATION.FASTA, alphabet: ALPHABET.DNA,\n // hwe NN model with T≈U (was 91.74 under the legacy sum-of-singles model).\n res: {[MolProps.formula]: 'C87H113N30O56P9', [MolProps.mw]: 2753.78, [MolProps.extinctCoef]: 86.96}\n }\n};\n\ncategory('properties-widget', () => {\n let seqHelper: ISeqHelper;\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: any = null;\n\n before(async () => {\n await initHelmMainPackage();\n seqHelper = await getSeqHelper();\n\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = getUserLibSettings();\n\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n for (const [testName, testData] of Object.entries(TestsData)) {\n test(testName, async () => {\n await testPropertiesDict(testData.seq, testData.units, testData.separator, testData.alphabet, testData.res);\n });\n }\n\n test('too-long', async () => {\n const colList = generateLongSequence();\n const df = DG.DataFrame.fromColumns(colList);\n const col = df.getCol('MSA');\n\n const sh = seqHelper.getSeqHandler(col);\n let errCatched = true;\n try {\n const _actPropDict = await getPropertiesDict(col.get(0), sh);\n const k = 11;\n } catch (err: any) {\n if (err instanceof SeqPropertiesError) errCatched = true;\n }\n expect(errCatched, true);\n });\n\n async function testPropertiesDict(\n seq: string, units: NOTATION, separator: string | undefined, alphabet: ALPHABET | undefined, expPropDict: {}\n ) {\n const col = DG.Column.fromStrings('seq', [seq]) as DG.Column<string>;\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.meta.units = units;\n if (separator) col.setTag(bioTAGS.separator, separator);\n if (alphabet) col.setTag(bioTAGS.alphabet, alphabet);\n const sh = seqHelper.getSeqHandler(col);\n const actPropDict = await getPropertiesDict(seq, sh);\n expectObject(actPropDict, expPropDict);\n }\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n\nimport {after, before, category, delay, expect, test, expectArray, timeout} from '@datagrok-libraries/test/src/test';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {HelmAtom} from '@datagrok-libraries/bio/src/helm/types';\n\nimport {initHelmMainPackage} from './utils';\n\ntype TestTgtType = { atomCount: number, bondCount: number, helm: string };\n\n// hwe migration (Phase 7): `helmHelper.parse` now delegates to the standalone\n// `@datagrok-libraries/hwe` parser (immutable `Mol`, exposed as a legacy\n// `HelmMol`-shaped view). The legacy variants that drove `org.helm.webeditor.IO`\n// / `new JSDraw2.Editor(...)` directly were removed with the forked editor.\ncategory('parseHelm', () => {\n const testData: { [testName: string]: { src: string, tgt: TestTgtType } } = {\n 'PT': {\n src: 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n tgt: {\n atomCount: 6, bondCount: 5,\n helm: 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0'\n }\n },\n 'PT-cyclic': {\n src: 'PEPTIDE1{[meI].C.[Aca].[Cys_SEt].T.C.[Thr_PO3H2].[Aca]}$PEPTIDE1,PEPTIDE1,8:R2-1:R1$$$V2.0',\n tgt: {\n atomCount: 8, bondCount: 8,\n helm: 'PEPTIDE1{[meI].C.[Aca].[Cys_SEt].T.C.[Thr_PO3H2].[Aca]}$PEPTIDE1,PEPTIDE1,8:R2-1:R1$$$V2.0'\n },\n },\n 'RNA': {\n src: 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n tgt: {\n atomCount: 12, bondCount: 11,\n helm: 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n }\n },\n 'PT-with-gap': {\n src: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$$$$V2.0',\n tgt: {\n atomCount: 8, bondCount: 7,\n helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$$$$V2.0',\n }\n },\n 'PT-with-gap-at-connection': {\n src: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0',\n tgt: {\n atomCount: 8, bondCount: 8,\n helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0',\n }\n },\n };\n\n let helmHelper: IHelmHelper;\n let libHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n\n helmHelper = await getHelmHelper();\n\n libHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // parseHelm is dependent on monomers RGroups available, test requires default monomer library\n await libHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await libHelper.loadMonomerLib(true);\n });\n\n for (const [testName, {src, tgt}] of Object.entries(testData)) {\n test(`HelmHelper-${testName}`, async () => {\n _testParseHelmWithHelmHelper(src, tgt, helmHelper);\n });\n }\n});\n\nfunction _testParseHelmWithHelmHelper(src: string, tgt: TestTgtType, helmHelper: IHelmHelper): void {\n const resMol = helmHelper.parse(src);\n\n expect(resMol.atoms.length, tgt.atomCount);\n expect(resMol.bonds.length, tgt.bondCount);\n expect(resMol.atoms.every((a: HelmAtom) => !a.elem.startsWith('[') && !a.elem.endsWith(']')), true,\n 'Atoms should not contain square braces.');\n}\n","export var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzNCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpbVJlZHVjdGlvbk1ldGhvZHN7XG4gICAgVU1BUCA9ICdVTUFQJyxcbiAgICBUX1NORSA9ICd0LVNORSdcbn07XG4iXX0=","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { ALPHABET, getAlphabet, NOTATION, TAGS } from './macromolecule';\nimport { StringListSeqSplitted } from './macromolecule/utils';\nimport { PolymerTypes } from '../helm/consts';\nimport { GapOriginals } from './macromolecule/consts';\nexport function generateManySequences() {\n const columns = [];\n columns.push(DG.Column.fromList('string', 'MSA', new Array(10 ** 6).fill('meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me')));\n columns.push(DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'Activity', new Array(10 ** 6).fill(5.30751)));\n return columns;\n}\n/** Generates the column 'MSA' with sequences length of order 10^5 and the 'Activity' float column. */\nexport function generateLongSequence(length = 10 ** 4) {\n const longSequence = `meI/hHis/Aca/N//dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe`.repeat(Math.ceil(length / 10)).slice(0, -1);\n const msaCol = DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'MSA', new Array(10 ** 2).fill(longSequence));\n msaCol.semType = DG.SEMTYPE.MACROMOLECULE;\n msaCol.meta.units = NOTATION.SEPARATOR;\n msaCol.setTag(TAGS.separator, '/');\n msaCol.setTag(TAGS.alphabet, ALPHABET.UN);\n msaCol.setTag(TAGS.alphabetIsMultichar, 'true');\n const columns = [];\n columns.push(msaCol);\n columns.push(DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'Activity', new Array(10 ** 2).fill(7.30751)));\n return columns;\n}\nexport function generateLongSequence2(seqHelper, notation = NOTATION.SEPARATOR, alphabet = ALPHABET.PT, separator = (notation === NOTATION.SEPARATOR ? '-' : undefined), monomerLib = undefined, colName = 'seq', rowCount = 100, seqLength = 10 ** 6) {\n const alphabetSet = alphabet === ALPHABET.UN ?\n monomerLib?.getMonomerSymbolsByType(PolymerTypes.PEPTIDE) ?? [] : Array.from(getAlphabet(alphabet));\n const alphabetSize = alphabetSet.length;\n const col = DG.Column.fromType(DG.COLUMN_TYPE.STRING, colName, rowCount);\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.meta.units = notation;\n col.setTag(TAGS.alphabet, alphabet);\n if (notation == NOTATION.SEPARATOR)\n col.setTag(TAGS.separator, separator);\n const sh = seqHelper.getSeqHandler(col);\n for (let rowI = 0; rowI < rowCount; rowI++) {\n const seqMList = wu.count(0).take(seqLength)\n .map((i) => { return alphabetSet[Math.floor(Math.random() * alphabetSize)]; })\n .toArray();\n const seq = sh.joiner(new StringListSeqSplitted(seqMList, GapOriginals[notation]));\n col.set(rowI, seq);\n }\n return col;\n}\n//# sourceMappingURL=generator.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/test/src/test';\nimport {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {initHelmMainPackage} from './utils';\n\ncategory('helm-web-editor', async () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n let hh: IHelmHelper;\n\n before(async () => {\n await initHelmMainPackage();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n await monomerLibHelper.loadMonomerLibForTests();\n\n hh = await getHelmHelper();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true);\n });\n\n test('helm-web-editor', async () => {\n const editor = hh.createHelmWebEditor();\n });\n\n test('web-editor-app', async () => {\n const helmStr: string = 'PEPTIDE1{I.H.A.N.T.Thr_PO3H2.Aca.D-Tyr_Et}$$$$';\n\n const appHost = ui.div([],\n {style: {width: '700px', height: '432px'}});\n const app = hh.createWebEditorApp(appHost, helmStr);\n\n const dlg = ui.dialog().add(appHost).show();\n try {\n\n } finally {\n dlg.close();\n }\n });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {after, before, category, delay, expect, test, testEvent} from '@datagrok-libraries/test/src/test';\nimport {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings,\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\n\nimport type {HelmInput} from '../widgets/helm-input';\n\ncategory('HelmInput', () => {\n let helmHelper: IHelmHelper;\n\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n helmHelper = await getHelmHelper();\n\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n test('inDialog', async () => {\n const helmValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = helmValue;\n const dlg = ui.dialog('Helm Input Test')\n .add(helmInput)\n .show();\n await delay(500);\n\n const mol = helmInput.molValue;\n expect(mol.atoms.length, 4);\n expect(mol.bonds.length, 3);\n });\n\n test('renders-with-nonzero-height (root in a dialog)', async () => {\n // Regression: `ui.input.helmAsync` placed in a content-sized container\n // (no explicit height) used to collapse the editor host to 0 px, rendering\n // an empty div. Assert the editor host AND its mounted SVG are visibly tall.\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm Input Height Test').add(helmInput).show();\n try {\n await delay(500);\n const hostEl = helmInput.getInput();\n expect(hostEl.clientHeight > 0, true, `editor host height must be > 0 (was ${hostEl.clientHeight})`);\n const svg = hostEl.querySelector('svg');\n expect(svg != null, true, 'an SVG must be mounted in the editor host');\n const svgH = (svg as SVGSVGElement).getBoundingClientRect().height;\n expect(svgH > 0, true, `mounted SVG height must be > 0 (was ${svgH})`);\n } finally {\n dlg.close();\n }\n });\n\n test('default size is 250x250', async () => {\n // `ui.input.helmAsync` with no `editorOptions` should render a compact\n // 250×250 box, NOT stretch to the form row or fall back to hwe's 400×100.\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm Input Default Size').add(helmInput).show();\n try {\n await delay(500);\n const host = helmInput.getInput();\n expect(Math.abs(host.clientWidth - 250) <= 4, true, `default width ~250 (was ${host.clientWidth})`);\n expect(Math.abs(host.clientHeight - 250) <= 4, true, `default height ~250 (was ${host.clientHeight})`);\n } finally {\n dlg.close();\n }\n });\n\n test('editorOptions.width/height override the default size', async () => {\n const helmInput = await ui.input.helmAsync('Macromolecule', {editable: true, editorOptions: {width: 320, height: 180}});\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm Input Custom Size').add(helmInput).show();\n try {\n await delay(500);\n const host = helmInput.getInput();\n expect(Math.abs(host.clientWidth - 320) <= 4, true, `width ~320 from editorOptions (was ${host.clientWidth})`);\n expect(Math.abs(host.clientHeight - 180) <= 4, true, `height ~180 from editorOptions (was ${host.clientHeight})`);\n } finally {\n dlg.close();\n }\n });\n\n test('editor canvas sizes from getInput() box (consumer sets height on the host)', async () => {\n // The real consumer pattern (e.g. libraries/db-explorer/renderer.ts) sets an\n // explicit size directly on `getInput()` (the editor host). The editor\n // canvas must follow the HOST's own box — the old code derived the size from\n // `this.root` and painted a 0-height SVG when a consumer sized only the host\n // (the reported \"height 0 / width 105\" bug). Mount via the input so layout\n // is real, then size the host and assert the SVG tracks it.\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm getInput() Size Test').add(helmInput).show();\n try {\n await delay(300);\n const host = helmInput.getInput();\n // Consumer sizes the host element directly (the db-explorer pattern).\n host.style.setProperty('width', '360px', 'important');\n host.style.setProperty('height', '260px', 'important');\n await delay(500); // ResizeObserver → editor.setSize → re-render\n\n expect(host.clientWidth, 360, `host width (was ${host.clientWidth})`);\n expect(host.clientHeight, 260, `host height (was ${host.clientHeight})`);\n const svg = host.querySelector('svg') as SVGSVGElement | null;\n expect(svg != null, true, 'an SVG must be mounted');\n const r = svg!.getBoundingClientRect();\n // The canvas tracks the host box (NOT root): both dimensions filled.\n expect(r.height >= host.clientHeight - 8, true,\n `SVG height should track the host's ${host.clientHeight} (was ${r.height})`);\n expect(r.width >= host.clientWidth - 8, true,\n `SVG width should track the host's ${host.clientWidth} (was ${r.width})`);\n } finally {\n dlg.close();\n }\n });\n\n test('tooltip', async () => {\n await _testTooltipOnHelmInput();\n }, {timeout: 300000});\n});\n\nasync function _testTooltipOnHelmInput(): Promise<void> {\n const helmValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const helmInput = (await ui.input.helmAsync('Macromolecule')) as HelmInput;\n helmInput.stringValue = helmValue;\n // Show dialog to the right of the TestManager test tree\n // to prevent interfering mousemove position for tooltip.\n const tmBcr = grok.shell.v ? grok.shell.v.root.getBoundingClientRect() : null;\n const dlg = ui.dialog('Helm Input Test')\n .add(helmInput)\n .show({...(tmBcr ? {x: tmBcr.right + 20, y: tmBcr.top + 20} : {})});\n try {\n const dialogInputEl = $(dlg.root)\n .find('div.d4-dialog-contents > div.ui-input-helm > div.ui-input-editor').get(0);\n expect(helmInput.getInput(), dialogInputEl);\n\n const mon = {i: 0, elem: 'meY'};\n const a = helmInput.molValue.atoms[mon.i];\n const iEl = helmInput.getInput();\n const iBcr = iEl.getBoundingClientRect();\n const ev = new MouseEvent('mousemove', {\n cancelable: true, bubbles: true, view: window, button: 0,\n clientX: iBcr.left + a.p.x, clientY: iBcr.top + a.p.y\n });\n await testEvent(ui.tooltip.onTooltipShown, () => { /* tooltip shown*/ },\n () => {\n iEl.dispatchEvent(ev);\n // do not await after event dispatch before test tooltip content\n // await leads to tooltip changed (with TestManager tree node tooltip)\n }, 100, 'timeout await ui.tooltip.onTooltipShown');\n const tooltipEl = $(document).find('body > div.d4-tooltip').get(0) as HTMLElement;\n const elemDiv = $(tooltipEl).find('div > div.d4-flex-row.ui-div > div:nth-child(1)').get(0);\n expect(tooltipEl.style.display != 'none', true);\n expect(elemDiv?.innerText, mon.elem);\n } finally {\n await delay(50);\n ui.tooltip.hide();\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n/* eslint-disable max-len */\nimport {after, before, category, delay, expect, expectArray, test, testEvent} from '@datagrok-libraries/test/src/test';\nimport {HelmNotSupportedError, HelmNotSupportedErrorType, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\n/* eslint-enable max-len */\n\nimport {_package} from '../package-test';\n\ntype TestSrcType = { helm: string };\ntype TestTgtType = { helm: string | null, map: [number, number][], errType?: string };\n\ncategory('HelmHelper: removeGaps', () => {\n let helmHelper: IHelmHelper;\n let libHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n helmHelper = await getHelmHelper();\n libHelper = await getMonomerLibHelper();\n\n userLibSettings = await getUserLibSettings();\n // Cysteine has different R-groups in other libraries\n await libHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await libHelper.loadMonomerLib(true);\n });\n\n const tests: { [testName: string]: { src: TestSrcType, tgt: TestTgtType } } = {\n 'single-linear-start': {\n src: {helm: 'PEPTIDE1{*.[meY].A.G.T}$$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',\n map: [[1, 0], [2, 1], [3, 2], [4, 3]],\n }\n },\n 'single-linear-end': {\n src: {helm: 'PEPTIDE1{[meY].A.G.T.*}$$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',\n map: [[0, 0], [1, 1], [2, 2], [3, 3]],\n }\n },\n 'single-linear-middle': {\n src: {helm: 'PEPTIDE1{[meY].A.*.G.T}$$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',\n map: [[0, 0], [1, 1], [3, 2], [4, 3]],\n }\n },\n 'single-cycle-start': {\n src: {helm: 'PEPTIDE1{*.[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,3:R3-7:R3$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',\n map: [[1, 0], [2, 1], [3, 2], [4, 3], [5, 4], [6, 5], [7, 6]],\n }\n },\n 'single-cycle-end': {\n src: {helm: 'PEPTIDE1{[meY].C.R.N.P.C.T.*}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',\n map: [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]],\n }\n },\n 'single-cycle-middle': {\n src: {helm: 'PEPTIDE1{[meY].C.R.N.*.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',\n map: [[0, 0], [1, 1], [2, 2], [3, 3], [5, 4], [6, 5], [7, 6]],\n }\n },\n 'single-cycle-gap-at-connection': {\n src: {helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},\n tgt: {helm: null, map: [], errType: HelmNotSupportedErrorType}\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(`${testName}`, async () => {\n let resErr: HelmNotSupportedError | null = null;\n try {\n const res = helmHelper.removeGaps(testData.src.helm);\n expect(res.resHelm, testData.tgt.helm);\n expectArray(Array.from(res.monomerMap!.entries()), testData.tgt.map);\n } catch (err: any) {\n resErr = err;\n }\n\n if (testData.tgt.errType)\n expect(resErr?.type, testData.tgt.errType, 'HelmNotSupportedError thrown expected');\n });\n }\n});\n","import { Subject } from 'rxjs';\n/** Fasta and Helm */\nexport class BioFilterProps {\n constructor(substructure, \n /** Pass false from an inheritors constructor, at the end set true. */ readOnly = true, logger) {\n this.substructure = substructure;\n this.readOnly = readOnly;\n this.logger = logger;\n return new Proxy(this, {\n set: (target, key, value) => {\n this.logger?.debug(`BioFilterProps.set ${key.toString()}( '${value}' )`);\n if (this.readOnly)\n throw new Error('Properties are immutable.');\n target[key] = value;\n return true;\n }\n });\n }\n}\n/** Encapsulates input controls handling */\nexport class BioFilterBase {\n constructor() {\n this.onChanged = new Subject();\n this._props = null;\n this._propsChanging = false;\n }\n get props() {\n if (!this._props)\n this._props = this.emptyProps;\n return this._props;\n }\n ;\n set props(value) {\n this._propsChanging = true;\n try {\n this._props = value;\n this.applyProps();\n this.onChanged.next();\n }\n finally {\n this._propsChanging = false;\n }\n }\n ;\n saveProps() {\n const propsObj = {};\n for (const [key, value] of Object.entries(this.props)) {\n if (key !== '_onChanged' && key !== 'logger') {\n // @ts-ignore\n propsObj[key] = this.props[key];\n }\n }\n return propsObj;\n }\n async detach() { }\n get filterSummary() { return this.props.substructure; }\n ;\n get isFiltering() { return this.props.substructure !== ''; }\n resetFilter() {\n this.props = this.emptyProps;\n this.onChanged.next();\n }\n}\n//# sourceMappingURL=bio-substructure-filter-types.js.map","/* eslint-disable max-lines */\n/* eslint-disable max-lines-per-function */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, test, expect, delay, testEvent} from '@datagrok-libraries/test/src/test';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';\n\nimport {awaitGrid, readDataframe} from './utils';\n\nimport {BioFilterProps, IBioFilter}\n from '@datagrok-libraries/bio/src/substructure-filter/bio-substructure-filter-types';\n\nimport {_package} from '../package-test';\n\ncategory('bio-substructure-filters', async () => {\n let seqHelper: ISeqHelper;\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n seqHelper = await getSeqHelper();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n\n test('helm-dialog', async () => {\n const logPrefix = 'Bio tests: substructureFilters/helm-dialog';\n const df = await readDataframe('tests/filter_HELM.csv');\n const view = grok.shell.addTableView(df);\n await grok.data.detectSemanticTypes(df);\n await df.meta.detectSemanticTypes();\n\n _package.logger.debug(`${logPrefix}, filter attaching.`);\n const filter = await grok.functions.call('Bio:bioSubstructureFilterTest');\n filter.attach(df);\n const dlg = ui.dialog('Test filters').add(filter.root).show(); // to waitForElementInDom\n await filter.awaitRendered();\n try {\n const bf = filter.bioFilter as IBioFilter;\n expect(filter.bioFilter !== null, true, 'bioFilter is not created');\n\n // filter 1\n _package.logger.debug(`${logPrefix}, filter 1 change awaiting...`);\n await testEvent(df.onRowsFiltered, () => {}, () => {\n bf.props = new BioFilterProps('PEPTIDE1{A.C}$$$$V2.0', undefined, _package.logger);\n }, 20000);\n _package.logger.debug(`${logPrefix}, filter 1 changed.`);\n expect(filter.dataFrame!.filter.trueCount, 1);\n expect(filter.dataFrame!.filter.toBinaryString(), '0001');\n\n // filter 2\n _package.logger.debug(`${logPrefix}, filter 2 change awaiting...`);\n await testEvent(df.onRowsFiltered, () => {}, () => {\n bf.props = new BioFilterProps('PEPTIDE1{C}$$$$V2.0', undefined, _package.logger);\n }, 20000);\n setTimeout(() => view.grid.invalidate(), 500);\n await awaitGrid(view.grid);\n await delay(1000);\n _package.logger.debug(`${logPrefix}, filter 2 changed.`);\n expect(filter.dataFrame!.filter.trueCount, 2);\n expect(filter.dataFrame!.filter.toBinaryString(), '1001');\n } finally {\n dlg.close();\n }\n await filter.awaitRendered();\n await delay(3000); //TODO: await for grid.onLookChanged\n }, {});\n\n\n // Generates unhandled exception accessing isFiltering before bioFilter created\n test('helm-view', async () => {\n const logPrefix = 'Bio tests: substructureFilters/helm-view';\n const df = await readDataframe('tests/filter_HELM.csv');\n const col = df.getCol('HELM string');\n await grok.data.detectSemanticTypes(df);\n const view = grok.shell.addTableView(df);\n\n const fg = view.getFiltersGroup();\n\n // await awaitCheck(() => fg.filters.length == 1, 'await filters.length == 1', 1000);\n // const filter = fg.filters.filter((f) => f.columnName == col.name)[0] as BioSubstructureFilter;\n await awaitGrid(view.grid);\n });\n\n\n test('sync-helm', async () => {\n const df = await _package.files.readCsv('tests/filter_HELM.csv');\n await grok.data.detectSemanticTypes(df);\n const view = grok.shell.addTableView(df);\n\n const fSubStr: string = 'PEPTIDE1{A.C}$$$$V2.0';\n const fTrueCount: number = 1;\n\n const f1 = await createFilter('HELM string', df);\n const f2 = await createFilter('HELM string', df);\n const dlg = ui.dialog('Test filters').add(f1.root).add(f2.root).show(); // to waitForElementInDom\n await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);\n try {\n expect(!!f1.bioFilter, true);\n expect(!!f2.bioFilter, true);\n expect(f1.bioFilter!.type, 'HelmBioFilter');\n expect(f2.bioFilter!.type, 'HelmBioFilter');\n const bf1 = f1.bioFilter as IBioFilter;\n const bf2 = f2.bioFilter as IBioFilter;\n\n await testEvent(df.onRowsFiltered, () => {}, () => {\n bf1.props = new BioFilterProps(fSubStr, undefined, _package.logger);\n }, 60000, 'await onRowsFiltered'); // wait to load monomers\n await awaitGrid(view.grid);\n //debugger;\n\n _package.logger.debug('Bio tests: substructureFilters/sync-helm, before changed event');\n await delay(f1.debounceTime * 2);\n _package.logger.debug('Bio tests: substructureFilters/sync-helm, after changed event');\n expect(df.filter.trueCount, fTrueCount);\n\n await f1.awaitRendered();\n expect((bf2.props as BioFilterProps).substructure, fSubStr);\n } finally {\n f1.detach();\n f2.detach();\n dlg.close();\n }\n await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);\n await awaitGrid(view.grid);\n await delay(3000); //TODO: await for grid.onLookChanged\n });\n\n\n async function createFilter(colName: string, df: DG.DataFrame): Promise<any> {\n if (!df.columns.names().includes(colName)) {\n throw new Error(`The column '${colName}' not found. ` +\n `Available in data frame are ${JSON.stringify(df.columns.names())}`);\n }\n\n const filter = await grok.functions.call('Bio:bioSubstructureFilterTest');\n filter.attach(df);\n filter.applyState({columnName: colName});\n filter.column = df.col(colName);\n filter.columnName = colName;\n //filter.tableName = df.name;\n return filter;\n };\n} );\n\n","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","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunsch } 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[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunsch,\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: hamming\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25EOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFLWDtBQUxELFdBQVksd0JBQXdCO0lBQ2xDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0lBQ3ZDLG1GQUF1RCxDQUFBO0FBQ3pELENBQUMsRUFMVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBS25DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxlQUFlO0lBQzdELENBQUMsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsRUFBRSxPQUFPO0NBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bnNjaH0gZnJvbSAnLi9uZWVkbGVtYW4td3Vuc2NoJztcbmltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKiBFbnVtIGNvbnRhaW5pbmcgY3VycmVudGx5IHN1cHBvcnRlZCBtYWNyb21vbGVjdWxlIGRpc3RhbmNlIGZ1bmN0aW9uc1xuICogSGFtbWluZyBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgaWYgdGhlIHNlcXVlbmNlcyBhcmUgYWxyZWFkeSBhbGlnbmVkXG4gKiBOZWVkbGVtYW4gZGlzdGFuY2Ugd2lsbCBiZSB1c2VkIGZvciBwcm90ZWluIHNlcXVlbmNlcyB3aXRoIGtub3duIEJMT1NVTTYyIG1hdHJpeFxuICogTGV2ZW5zaHRlaW4gZGlzdGFuY2Ugd2lsbCBiZSB1c2VkIGZvciBudWNsZW90aWRlIHNlcXVlbmNlcyBhcyBmb3IgdGhlbSBzdWJzdGl0dXRpb24gbWF0cml4IGlzIHNhbWUgYXMgaWRlbnRpdHkgbWF0cml4XG4gKi9cbmV4cG9ydCBlbnVtIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB7XG4gIEhBTU1JTkcgPSAnSGFtbWluZycsXG4gIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgTkVFRExFTUFOTl9XVU5TQ0ggPSAnTmVlZGxlbWFubi1XdW5zY2gnLFxuICBNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFID0gJ01vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2UnXG59O1xuXG5leHBvcnQgY29uc3QgbW1EaXN0YW5jZUZ1bmN0aW9uczogUmVjb3JkPE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcywgKHZhbHVlPzogYW55KSA9PiBtbURpc3RhbmNlRnVuY3Rpb25UeXBlPiA9IHtcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogaGFtbWluZyxcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IGxldmVuc3RlaW4sXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdOiBuZWVkbGVtYW5XdW5zY2gsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IGhhbW1pbmdcbn07XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, awaitCheck, before, category, test} from '@datagrok-libraries/test/src/test';\n\nimport {BitArrayMetricsNames} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';\nimport {getHelmHelper, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {expect} from '@datagrok-libraries/test/src/test';\nimport {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport {BitArrayMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {BYPASS_LARGE_DATA_WARNING} from '@datagrok-libraries/ml/src/functionEditors/consts';\n\nimport {_package} from '../package-test';\n\n\ncategory('activityCliffs', async () => {\n let helmHelper: IHelmHelper;\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n const helmEncodingFunc = DG.Func.find({name: 'macromoleculePreprocessingFunction', package: 'Bio'})[0];\n before(async () => {\n helmHelper = await getHelmHelper(); // init Helm package\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n\n test('Helm', async () => {\n const df = await _package.files.readCsv('samples/HELM_50.csv');\n const _view = grok.shell.addTableView(df);\n\n await _testActivityCliffsOpen(_view, df, DimReductionMethods.UMAP,\n 'HELM', 'Activity', 65, 311, MmDistanceFunctionsNames.HAMMING, helmEncodingFunc);\n });\n});\n\n\nasync function _testActivityCliffsOpen(tv: DG.TableView, df: DG.DataFrame, drMethod: DimReductionMethods,\n seqColName: string, activityColName: string, similarityThr: number, tgtNumberCliffs: number,\n similarityMetric: MmDistanceFunctionsNames | BitArrayMetrics, preprocessingFunction: DG.Func,\n): Promise<void> {\n await grok.data.detectSemanticTypes(df);\n (await grok.functions.call('Bio:activityCliffs', {\n table: df,\n molecules: df.getCol(seqColName),\n activities: df.getCol(activityColName),\n similarity: similarityThr,\n methodName: drMethod,\n similarityMetric: similarityMetric,\n preprocessingFunction: preprocessingFunction,\n options: {[`${BYPASS_LARGE_DATA_WARNING}`]: true},\n demo: false,\n })) as DG.Viewer | undefined;\n const scatterPlot = Array.from(tv.viewers).find((v) => v.type === DG.VIEWER.SCATTER_PLOT);\n\n expect(scatterPlot != null, true);\n\n const checkScatterPlotInitialized = () => {\n const cliffsLink = scatterPlot!.root.getElementsByClassName('scatter_plot_link');\n return cliffsLink.length > 0 &&\n ((cliffsLink[0] as HTMLElement).innerText.toLowerCase() === `${tgtNumberCliffs} cliffs`);\n };\n await awaitCheck(() => {\n return checkScatterPlotInitialized();\n }, 'activity cliffs failed');\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {after, before, category, expect, test} from '@datagrok-libraries/test/src/test';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\n\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {getRdKitModule} from '@datagrok-libraries/bio/src/chem/rdkit-module';\nimport {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';\n\ntype TestDataTargetType = { atomCount: number, bondCount: number };\ntype TestDataType = {\n src: { seq: string, units: NOTATION },\n tgt: TestDataTargetType,\n};\n\ncategory('toAtomicLevel-ui', () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n let monomerLib: IMonomerLib;\n let rdKitModule: RDModule;\n\n before(async () => {\n rdKitModule = await getRdKitModule();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n\n monomerLib = monomerLibHelper.getMonomerLib();\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n const tests: { [testName: string]: TestDataType } = {\n 'fasta': {\n src: {seq: 'MDYKETLLMPK', units: NOTATION.FASTA},\n tgt: {atomCount: 94, bondCount: 95},\n },\n 'fasta-with-gap': {\n src: {seq: 'MD-YKETLLMPK', units: NOTATION.FASTA},\n tgt: {atomCount: 94, bondCount: 95},\n },\n 'helm': {\n src: {seq: 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2}$$$$', units: NOTATION.HELM},\n tgt: {atomCount: 68, bondCount: 68},\n },\n 'helm-with-gap': {\n src: {seq: 'PEPTIDE1{meI.hHis.*.Aca.N.T.dK.Thr_PO3H2}$$$$', units: NOTATION.HELM},\n tgt: {atomCount: 68, bondCount: 68},\n },\n };\n\n const getDfAndSeqCol = async (testData: TestDataType): Promise<{df: DG.DataFrame, seqCol: DG.Column<string>}> => {\n const seq = testData.src.seq;\n const df = DG.DataFrame.fromColumns([DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'seq', [seq])]);\n await grok.data.detectSemanticTypes(df);\n return {df: df, seqCol: df.getCol('seq')};\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(`${testName}-nonlinear`, async () => {\n const res = await getDfAndSeqCol(testData);\n await _testToAtomicLevelFunc(res.df, res.seqCol, true, testData.tgt);\n });\n }\n\n async function _testToAtomicLevelFunc(\n df: DG.DataFrame, seqCol: DG.Column<string>, nonlinear: boolean, tgt: TestDataTargetType,\n ): Promise<void> {\n await grok.functions.call('Bio:toAtomicLevel', {\n table: df, seqCol: seqCol, nonlinear: true, highlight: false\n });\n const molCol = df.col('molfile(seq)');\n expect(molCol?.semType, DG.SEMTYPE.MOLECULE);\n const resMolStr = molCol?.get(0)!;\n const resRdMol = rdKitModule.get_mol(resMolStr);\n expect(resRdMol != null, true, 'No molecule generated');\n try {\n const resAtomCount = resRdMol.get_num_atoms();\n const resBondCount = resRdMol.get_num_bonds();\n expect(resAtomCount, tgt.atomCount);\n expect(resBondCount, tgt.bondCount);\n } finally {\n resRdMol.delete();\n }\n }\n});\n","import * as DG from 'datagrok-api/dg';\nexport async function getRdKitModule() {\n const funcList = DG.Func.find({ package: 'Chem', name: 'getRdKitModule' });\n if (funcList.length === 0)\n throw new Error('Package \"Chem\" must be installed for getRdKitModule.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=rdkit-module.js.map","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\n// Do not import anything from JsDrawLite or HelmWebEditor, only to the main Helm package\n// import {JSDraw2ModuleType} from '@datagrok/js-draw-lite/src/types/jsdraw2';\n// import {HelmType, OrgHelmModuleType} from '@datagrok/helm-web-editor/src/types/org-helm';\n\nimport {runTests, tests, TestContext, initAutoTests as initTests} from '@datagrok-libraries/test/src/test';\n\nimport './tests/_first-tests';\nimport './tests/helm-tests';\nimport './tests/findMonomers-tests';\nimport './tests/renderers-tests';\nimport './tests/get-molfiles-tests';\nimport './tests/properties-widget-tests';\nimport './tests/parse-helm-tests';\nimport './tests/helm-web-editor-tests';\nimport './tests/helm-input-tests';\nimport './tests/helm-helper-tests';\nimport './tests/helm-substructure-filter';\nimport './tests/helm-activity-cliffs';\nimport './tests/to-atomic-level-ui-non-linear';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n // verbose: true - for tests returning dataframe\n const data = await runTests({category, test, testContext, verbose: true});\n return DG.DataFrame.fromObjects(data)!;\n}\n\n//name: initAutoTests\nexport async function initAutoTests() {\n await initTests(_package, _package.getModule('package-test.js'));\n}\n"],"names":["__WEBPACK_AMD_DEFINE_RESULT__","exports","__esModule","digestLength","blockSize","K","Uint32Array","hashBlocks","w","v","p","pos","len","a","b","c","d","e","f","g","h","u","i","j","t1","t2","Hash","this","state","Int32Array","temp","buffer","Uint8Array","bufferLength","bytesHashed","finished","reset","prototype","clean","length","update","data","dataLength","Error","dataPos","finish","out","left","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","from","HMAC","key","inner","outer","pad","istate","ostate","hash","hmac","fillBuffer","info","counter","num","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","fill","pbkdf2","password","iterations","dkLen","prf","ctr","t","dk","k","factory","sha256","module","undefined","call","__webpack_require__","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","n","getter","definition","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","value","external_DG_namespaceObject","DG","testData","DataFrame","fromCsv","columns","add","Column","fromList","TYPE","BYTE_ARRAY","Array","test_awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","STANDART_TIMEOUT","BENCHMARK_TIMEOUT","stdLog","console","log","bind","stdInfo","stdWarn","warn","stdError","error","tests","autoTestsCatName","demoCatName","detectorsCatName","coreCatName","wasRegistered","currentCategory","assure","notNull","name","TestContext","constructor","catchUnhandled","report","returnOnFail","closeAll","Test","category","test","options","_a","timeout","_b","isInDebug","res","toString","test_testEvent","event","handler","trigger","ms","reason","sub","subscribe","args","unsubscribe","clearTimeout","setTimeout","push","test_expect","actual","expected","expectFloat","tolerance","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","NaN","isNaN","areEqual","Math","abs","expectObject","expectedKey","expectedValue","entries","actualValue","expectArray","isFinite","actualLength","expectedLength","tests_","clear","benchmarks","stressTests","owner","before","after","addNamespace","s","replace","RegExp","nqName","initAutoTests","package_","_c","_d","_e","_f","_g","_h","_j","_k","packageId","id","moduleTests","_package","window","dartTests","arr","split","pop","cat","join","fullName","unshift","isAggregated","skipReason","benchmark","moduleAutoTests","moduleDemo","moduleDetectors","packFunctions","grok","dapi","functions","filter","list","reg","demo","isArray","matchAll","map","forEach","startsWith","parseInt","eval","wait","test_delay","skip","isInBenchmark","benchmarkTimeout","friendlyName","shell","clearLastError","unhandled","lastError","hasTag","detectorsTestData","files","openTable","col","clone","semType","resArr","getResult","x","stack","Logger","translateStackTrace","execTest","predicate","logs","testTimeout","packageName","verbose","_l","_m","_o","_p","toLowerCase","start","Date","now","startDate","toISOString","date","success","skipped","package","flaking","isReproducing","timeout_","isProfiling","profile","profileEnd","stats","sum","df","remove","rows","removeWhere","toCsv","params","keys","reduce","acc","assign","JSON","stringify","toJson","reportTest","shuffle","array","newArr","slice","sort","random","awaitCheck","checkHandler","interval","clearInterval","intervalId","setInterval","func","timeoutReason","timeoutPromise","_","race","fromColumns","fromStrings","async","helmGapStartRe","helmGapIntRe","helmGapEndRe","parseHelm","monomers","seqs","detachAnnotation","str","indexOf","substring","ss","monomer","includes","closingIndex","findClosing","element","residue","endsWith","openingIndex","findOpening","firstPiece","thirdPiece","lastIndexOf","elements","el","open","close","count","sep","ret","frag","parentheses","bracket","braces","quote","c2","_detachAppendix","tag","repeat","m","utils_unescape","external_ui_namespaceObject","ui","JsInputBase","getHelmHelper","funcList","Func","find","prepare","getOutputParamValue","initHelmMainPackage","awaitGrid","grid","onAfterDrawContent","invalidate","readDataframe","tableName","file","readAsText","loadFileAsText","getMonomerLibHelper","input","helmAsync","createHelmInput","complexMonomersExpected","complexTestNames","expectedResults","helmStrings","idx","monomerSet","Set","monomerArray","helm","monomersArray","external_grok_namespaceObject","LIB_STORAGE_NAME","LIB_SETTINGS_KEY","DUPLICATE_MONOMER_PREFERENCES_KEY","MAX_USER_SETTINGS_STRING_LENGTH","CHUNK_KEY_SUFFIX","userLibSettingsPromise","getUserLibSettings","resStr","userSettings","getValue","parse","exclude","explicit","duplicateMonomerPreferences","duplicatePrefs","nextChunkKey","charAt","nextChunkStr","getDuplicatePrefsFull","polymerType","libraryName","monomerSymbol","setUserLibSettings","duplicatePrefsShortHand","valueStr","chunksCount","ceil","nextKey","chunkStr","chunkStrToStore","setDuplicatePrefsFull","monomerLibHelper","userLibSettings","loadMonomerLibForTests","loadMonomerLib","withoutMissed","tgt","withMissed","testName","_testFindMonomers","testHelmValue","tgtMissedSet","monomerLib","getMonomerLib","resMissedSet","seqMonomerSymbolList","getMonomer","findMonomers","external_$_namespaceObject","$","external_rxjs_namespaceObject","rxjs","NOTATION","ALPHABET","TAGS","CandidateType","alphabet","cutoff","Alphabets","fasta","peptide","dna","rna","PT","DNA","RNA","FASTA","SEPARATOR","HELM","BILN","wu","SeqPaletteBase","makePalette","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","orange","all_green","all_blue","magenta","red","st_blue","dark_blue","light_blue","lilac_blue","dark_green","green","light_green","st_green","pink","brown","gray","yellow","white","AminoacidsPalettes","Lesk","lesk","GrokGroups","grokGroups","RasMol","rasMol","D","E","C","M","R","S","T","F","Y","N","Q","G","L","V","I","A","W","H","others","resM","aaSynonyms","super","MeNle","MeA","MeG","MeF","Aminoacids","getPalette","scheme","getInnerOuter","isInner","char","getColorAAPivot","chemPaletteInstance","outerMonomer","innerMonomer","amino","toUpperCase","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Ala","Arg","Asn","Asp","Cys","Gln","Glu","Gly","His","Ile","Leu","Lys","Met","Phe","Pro","Ser","Thr","Trp","Tyr","Val","Nucleotides","U","performance","PROCESS","process","AC","globalThis","AbortController","AS","AbortSignal","onabort","_onabort","aborted","addEventListener","fn","warnACPolyfill","signal","abort","printACPolyfillWarning","env","LRU_CACHE_IGNORE_AC_WARNING","msg","type","code","emitWarning","iterator","Map","PEPTIDE","CHEM","BLOB","X","_listeners","_completed","delete","complete","observerCount","size","line","text","background","ji","en","Ee","exec","Zt","padStart","tn","nn","max","min","l","Qt","jn","round","vt","Wn","pow","gt","qi","_t","Yi","Xn","Jn","Zn","Qn","eo","to","B","no","fallback","errorTriple","b_BASE","b_SUGAR","b_LINKER","b_AA","b_CHEM","b_BLOB","b_NUCLEOTIDE","ge","Ce","meta","colors","light","dark","default","naturalAnalog","Z","monomerType","PI","Tt","y","width","height","isInteger","is","vn","Ro","cos","sin","wn","kn","xn","sqrt","Fo","Go","aa","strokeWidth","sugar","cornerRadius","base","linker","chem","blob","nucleotide","defaultStroke","defaultFill","selectionColor","highlightColor","errorColor","fontSize","fontFamily","bondLength","textColor","idColor","annotationColor","tagDotColor","hbondColor","nonCanonicalHbondColor","crossPolymerBondColor","colorTheme","softenCanvas","shapes","tt","Et","Be","biotype","symbol","Do","Io","Po","Ho","$o","ue","me","Jr","Qr","ke","Cn","class","atoms","has","stroke","Ln","WeakMap","J","bonds","isEmpty","freeze","ownerDocument","document","createElement","setAttribute","String","appendChild","createTextNode","fe","get_mol","get_svg","te","body","children","getAttribute","style","display","xe","firstChild","removeChild","rdkitSvg","rdkitTestid","innerHTML","hint","top","$t","Ot","_baseTransform","_viewport","scale","offset","_pinnedBbox","_tooltip","_bondTooltip","_rdkitSvgCache","_unsubs","_destroyed","host","_editor","_doc","documentImpl","_width","_height","querySelector","textContent","head","documentElement","ri","_svgRoot","_renderFresh","on","_hideTooltip","_hideBondTooltip","_refreshOverlays","_applyResize","viewport","_applyViewport","_showTooltip","atom","clientX","clientY","_showBondTooltip","bond","_paintBondPreview","cursor","candidate","_clearBondPreview","_paintSelectionRect","origin","_paintSelectionRectFromRect","rect","_clearSelectionRect","svgRoot","resize","redraw","destroy","parentNode","getService","_currentTheme","getMol","En","renderMol","theme","fixedModelBbox","si","_applyOverlaysToCurrent","getSelection","selectedAtomIds","highlightLayer","highlightedAtomIds","selectionLayer","ii","_editorHighlights","_spliceLayer","createElementNS","replaceChild","_currentHighlights","bio","positionInChain","chainId","_renderRdkitTooltipSvg","rdkitModule","smiles","_RDKIT_CACHE_LIMIT","set","li","r1","r2","a1","a2","kind","_paintSelectionRectAt","position","ne","_onClose","_primaryAction","_host","role","testId","title","stopPropagation","target","tagName","preventDefault","stopImmediatePropagation","root","anyOpen","_openStack","closeTopmost","splice","setPrimaryAction","isOpen","Pn","ze","ae","xi","pa","rt","Hn","$n","zt","onValueSet","onPickModeChange","_slots","_favStar","_pickMode","_builderRdkitCache","_hooks","paletteHooks","_favHooks","favoriteHooks","tabindex","preview","toggleFavoriteTriplet","_hintEl","hidden","_buildSvg","_preview","_addBtn","_onAddClicked","onChanged","refresh","_repaintSlotColors","_libUnsub","_populateDefaults","_updatePreview","setField","_setLabelText","labelEl","_repaintSlot","field","startPickMode","_setSlotPressed","_setHintActive","beginBiotypeFilter","_exitPickMode","cancelPickMode","endBiotypeFilter","getPickMode","triggerAdd","Ke","_buildSlot","groupEl","_showSlotTooltip","_hideSlotTooltip","shapeEl","nextSibling","nodeName","ba","insertBefore","values","_theme","getMonomerSet","ya","ga","some","_updateFavStar","isFavoriteTriplet","removeAttribute","placeRnaTriplet","_rdkit","_builderRdkitSvgFor","_BUILDER_RDKIT_CACHE_LIMIT","_slotHint","_slotTitle","getBoundingClientRect","Ut","localeCompare","le","Dn","Kt","Mi","Ti","Wt","We","favoritesChanged","_nextAddUnsub","_favorites","_favoriteTriplets","_pendingRnaSelection","_visibleTabs","_activeTab","_searchInput","_filter","_rnaBuilder","_activeBiotypeFilter","_pickResolver","_pickCanceller","_pickEscapeListener","_pickOutsideClickListener","_paletteRdkitCache","_opts","groupByNaturalAnalog","allowFavorites","_loadFavorites","_resolveInitialTab","initialTab","_render","_themeUnsub","_updatePrimedClasses","setFilter","trim","_applyFilter","setActiveTab","_persistActiveTab","_applyActiveTabClasses","getActiveTab","getFavorites","_findMonomer","setFavorite","_saveFavorites","_hidePaletteTooltips","_emitFavoritesChanged","clearFavorites","getFavoriteTriplets","setFavoriteTriplet","findIndex","favorites","triplets","getRnaBuilder","hasActiveBiotypeFilter","getActiveBiotypeFilter","cancelBiotypeFilter","_teardownPickMode","_buildPaletteFilterHooks","defaultView","_isInsideOwnPalette","parentElement","_scrollActivePaneToTop","scrollTo","behavior","scrollTop","removeEventListener","_computeVisibleTabs","_buildFavoritesPane","_buildPolymerPane","getPolymerTypes","_resolveFavoriteMonomers","_groupByPolymerAndType","_renderGroup","_renderTripletGroup","pt","mt","Backbone","Branch","Terminal","Undefined","_polymerLabel","_renderTripletChip","showStar","favorite","label","star","ki","_wireTripletChip","parts","ai","_tripletTooltipParts","classList","contains","_buildRnaDefaultChips","_pickSymbol","_DEFAULT_TRIPLET_BASES","_paletteRdkitSvg","_restoreRnaSelection","_monomersForPolymer","_groupRna","_groupByAnalog","getNextAddSymbol","_sortByColor","_biotype","_renderTile","Yn","isGrey","getMonomerSymbolsByType","qn","ma","primed","draggable","wi","_wireTile","_PALETTE_RDKIT_CACHE_LIMIT","every","replaceMonomers","fire","message","severity","durationMs","setNextAddSymbol","dataTransfer","setData","effectAllowed","startPaletteDrag","querySelectorAll","_localStorage","localStorage","getItem","setItem","_extractSymbols","_extractTriplets","symbols","MonomerNumberingTypes","HelmTabKeys","V2K_CONST","correctColor","color","dgColor","Color","fromHtml","distToBlack","toRgb","StringUtils","hashCode","charCodeAt","UnknownSeqPalette","UnknownColorPalette","_pallete","buildPalette","lh","awaitLoaded","Infinity","monLib","customMonomerColors","polymerTypes","monomerSymbols","concat","palleteLength","colorObj","polType","pI","readCsv","helmCol","getCol","tv","addTableView","external_$_default","detectSemanticTypes","SEMTYPE","MACROMOLECULE","units","getTag","CELL_RENDERER","cellRendererErrorJson","cellRendererError","err","_testMissedInLib","helmCoordsCsv","currentRowIdx","view","sp","plot","scatter","dockManager","dock","DOCK_TYPE","RIGHT","all","onAfterDrawScene","invalidateCanvas","spBcr","wp","worldToScreen","ev","MouseEvent","cancelable","bubbles","button","spCanvas","fromEvent","logger","debug","tooltip","hitTest","dispatchEvent","_testScatterPlotTooltip","ChemicalTableParserBase","fileContent","init","_atomCount","_atomTypes","_bondCount","_bondTypes","xyzAtomCoordinates","_pairsOfBondedAtoms","atomCount","setAtomAndBondCounts","bondCount","parseAtomCoordinates","z","atomTypes","parseAtomTypes","pairsOfBondedAtoms","parseBondedAtomPairs","bondTypes","parseBondTypes","parseAtomAndBondCounts","getNextColumnIdx","isWhitespace","shiftIdxToSpecifiedColumn","lineStartIdx","columnNumber","numberOfJumps","getAtomBlockIdx","shiftIdxToAtomType","parseAtomType","getNextLineIdx","Float32Array","shiftIdxToXColumn","item","parseFloatValue","bondedAtomPairs","getBondBlockIdx","shiftIdxToBondedAtomsPair","pair","Uint16Array","parseIntValue","shiftIdxToBondType","idxOfNumber","parseNumericValue","parseFloat","parserFunction","end","MolfileHandlerBase","molfile","begin","isQuote","getNextIdenticalChar","letter","sym","isQuery","isQueryOrFragment","charCode","isFragment","condition","MolfileV2KHandler","getAtomLines","atomBlockIdx","getBondLines","bondBlockIdx","getRGroupIdToAtomicIdxMap","lines","RGP_LINE_START","atomIdxToRgpIdxList","getAtomIdxToRgpIdxList","atomAliasLinesIndices","ATOM_ALIAS_LINE_START","atomAliasLines","atomAliasTextLines","rgpAtomIdx","rgpId","unaccounted","getRGroupAtomicIndices","rgpLine","indices","isValidMolfile","END","ATOM_TYPE_COL","getCountsLineIdx","NUM_OF_HEADER_LINES","FIRST_BONDED_ATOM_COL","BOND_TYPE_COL","NUM_OF_COUNTS_DIGITS","MolfileV3KHandler","rGroupMatches","match","rGroupData","rgId","rGroupId","numOfAtoms","MolfileHandler","getInstance","isMolfileV2K","isMolfileV3K","getSeqHelper","resCol","resMolfileList","toList","mf","SeqPropertiesError","getPropertiesDict","seq","sh","div","helmString2","isHelm","getConverter","replaceAll","editor","createHelmWebEditor","setHelm","formula","getFormula","molWeight","getMolWeight","coef","getExtinctionCoefficient","empty","TestsData","Helm","separator","UN","separator2","_testParseHelmWithHelmHelper","src","helmHelper","resMol","elem","DimReductionMethods","seqHelper","testPropertiesDict","expPropDict","setTag","getSeqHandler","colList","longSequence","msaCol","COLUMN_TYPE","STRING","alphabetIsMultichar","FLOAT","generateLongSequence","errCatched","libHelper","hh","appHost","createWebEditorApp","dialog","show","helmInput","stringValue","mol","molValue","dlg","hostEl","getInput","clientHeight","svg","svgH","clientWidth","editable","editorOptions","setProperty","tmBcr","right","dialogInputEl","mon","iEl","iBcr","onTooltipShown","tooltipEl","elemDiv","innerText","hide","_testTooltipOnHelmInput","errType","resErr","removeGaps","resHelm","monomerMap","BioFilterProps","substructure","readOnly","Proxy","createFilter","colName","names","attach","applyState","columnName","column","logPrefix","awaitRendered","bf","bioFilter","onRowsFiltered","props","dataFrame","trueCount","toBinaryString","getFiltersGroup","fSubStr","f1","f2","bf1","bf2","debounceTime","detach","MmDistanceFunctionsNames","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","helmEncodingFunc","_view","drMethod","seqColName","activityColName","similarityThr","tgtNumberCliffs","similarityMetric","preprocessingFunction","table","molecules","activities","similarity","methodName","bypassLargeDataWarning","scatterPlot","viewers","VIEWER","SCATTER_PLOT","cliffsLink","getElementsByClassName","checkScatterPlotInitialized","_testActivityCliffsOpen","UMAP","rdKitModule","getRdKitModule","getDfAndSeqCol","seqCol","_testToAtomicLevelFunc","nonlinear","highlight","molCol","MOLECULE","resMolStr","resRdMol","resAtomCount","get_num_atoms","resBondCount","get_num_bonds","Package","package_test_test","testContext","nodeOptions","getCurrentCall","packageOwner","results","redefineConsole","categoriesToInvoke","skippingCategories","skipToCategory","isTargetCategory","skippedCount","beforeStatus","invokeCategoryMethod","stressTest","tags","testElem","widgetsDifference","invokeTestsInCategory","afterStatus","skipToTest","invokeTests","method","invokationResult","_q","_r","_s","_u","widgetsBefore","getWidgetsCountSafe","skippingTests","testRun","Balloon","Widget","getAll","runTests","fromObjects","package_test_initAutoTests","getModule"],"sourceRoot":""}
1
+ {"version":3,"file":"package-test.js","mappings":"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","sources":["webpack://helm/./node_modules/fast-sha256/sha256.js","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 \"DG\"","webpack://helm/./node_modules/@datagrok-libraries/test/src/dataframe-utils.js","webpack://helm/./node_modules/@datagrok-libraries/test/src/test.js","webpack://helm/./src/tests/_first-tests.ts","webpack://helm/./src/utils/index.ts","webpack://helm/external var \"ui\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/helm/helm-helper.js","webpack://helm/./src/tests/utils.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/types/monomer-library.js","webpack://helm/./src/tests/helm-tests.ts","webpack://helm/external var \"grok\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/lib-settings.js","webpack://helm/./src/tests/findMonomers-tests.ts","webpack://helm/external var \"$\"","webpack://helm/external var \"rxjs\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/external var \"wu\"","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/lru-cache/dist/esm/index.js","webpack://helm/./node_modules/@datagrok-libraries/hwe/dist/index.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/helm/consts.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-const.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./src/tests/renderers-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/chemical-table-parser-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/utils.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v2k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v3k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/seq-helper.js","webpack://helm/./src/tests/get-molfiles-tests.ts","webpack://helm/./src/widgets/properties-widget.ts","webpack://helm/./src/tests/properties-widget-tests.ts","webpack://helm/./src/tests/parse-helm-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/generator.js","webpack://helm/./src/tests/helm-web-editor-tests.ts","webpack://helm/./src/tests/helm-input-tests.ts","webpack://helm/./src/tests/helm-helper-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/substructure-filter/bio-substructure-filter-types.js","webpack://helm/./src/tests/helm-substructure-filter.ts","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./src/tests/helm-activity-cliffs.ts","webpack://helm/./src/tests/to-atomic-level-ui-non-linear.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/chem/rdkit-module.js","webpack://helm/./src/package-test.ts"],"sourcesContent":["(function (root, factory) {\n // Hack to make all exports of this module sha256 function object properties.\n var exports = {};\n factory(exports);\n var sha256 = exports[\"default\"];\n for (var k in exports) {\n sha256[k] = exports[k];\n }\n \n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = sha256;\n } else if (typeof define === 'function' && define.amd) {\n define(function() { return sha256; }); \n } else {\n root.sha256 = sha256;\n }\n})(this, function(exports) {\n\"use strict\";\nexports.__esModule = true;\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n// sha256(message) -> hash\n// sha256.hmac(key, message) -> mac\n// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n// Classes:\n//\n// new sha256.Hash()\n// new sha256.HMAC(key)\n//\nexports.digestLength = 32;\nexports.blockSize = 64;\n// SHA-256 constants\nvar K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\nfunction hashBlocks(w, v, p, pos, len) {\n var a, b, c, d, e, f, g, h, u, i, j, t1, t2;\n while (len >= 64) {\n a = v[0];\n b = v[1];\n c = v[2];\n d = v[3];\n e = v[4];\n f = v[5];\n g = v[6];\n h = v[7];\n for (i = 0; i < 16; i++) {\n j = pos + i * 4;\n w[i] = (((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) |\n ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff));\n }\n for (i = 16; i < 64; i++) {\n u = w[i - 2];\n t1 = (u >>> 17 | u << (32 - 17)) ^ (u >>> 19 | u << (32 - 19)) ^ (u >>> 10);\n u = w[i - 15];\n t2 = (u >>> 7 | u << (32 - 7)) ^ (u >>> 18 | u << (32 - 18)) ^ (u >>> 3);\n w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0);\n }\n for (i = 0; i < 64; i++) {\n t1 = (((((e >>> 6 | e << (32 - 6)) ^ (e >>> 11 | e << (32 - 11)) ^\n (e >>> 25 | e << (32 - 25))) + ((e & f) ^ (~e & g))) | 0) +\n ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n t2 = (((a >>> 2 | a << (32 - 2)) ^ (a >>> 13 | a << (32 - 13)) ^\n (a >>> 22 | a << (32 - 22))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n h = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n v[0] += a;\n v[1] += b;\n v[2] += c;\n v[3] += d;\n v[4] += e;\n v[5] += f;\n v[6] += g;\n v[7] += h;\n pos += 64;\n len -= 64;\n }\n return pos;\n}\n// Hash implements SHA256 hash algorithm.\nvar Hash = /** @class */ (function () {\n function Hash() {\n this.digestLength = exports.digestLength;\n this.blockSize = exports.blockSize;\n // Note: Int32Array is used instead of Uint32Array for performance reasons.\n this.state = new Int32Array(8); // hash state\n this.temp = new Int32Array(64); // temporary state\n this.buffer = new Uint8Array(128); // buffer for data to hash\n this.bufferLength = 0; // number of bytes in buffer\n this.bytesHashed = 0; // number of total bytes hashed\n this.finished = false; // indicates whether the hash was finalized\n this.reset();\n }\n // Resets hash state making it possible\n // to re-use this instance to hash other data.\n Hash.prototype.reset = function () {\n this.state[0] = 0x6a09e667;\n this.state[1] = 0xbb67ae85;\n this.state[2] = 0x3c6ef372;\n this.state[3] = 0xa54ff53a;\n this.state[4] = 0x510e527f;\n this.state[5] = 0x9b05688c;\n this.state[6] = 0x1f83d9ab;\n this.state[7] = 0x5be0cd19;\n this.bufferLength = 0;\n this.bytesHashed = 0;\n this.finished = false;\n return this;\n };\n // Cleans internal buffers and re-initializes hash state.\n Hash.prototype.clean = function () {\n for (var i = 0; i < this.buffer.length; i++) {\n this.buffer[i] = 0;\n }\n for (var i = 0; i < this.temp.length; i++) {\n this.temp[i] = 0;\n }\n this.reset();\n };\n // Updates hash state with the given data.\n //\n // Optionally, length of the data can be specified to hash\n // fewer bytes than data.length.\n //\n // Throws error when trying to update already finalized hash:\n // instance must be reset to use it again.\n Hash.prototype.update = function (data, dataLength) {\n if (dataLength === void 0) { dataLength = data.length; }\n if (this.finished) {\n throw new Error(\"SHA256: can't update because hash was finished.\");\n }\n var dataPos = 0;\n this.bytesHashed += dataLength;\n if (this.bufferLength > 0) {\n while (this.bufferLength < 64 && dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n if (this.bufferLength === 64) {\n hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n this.bufferLength = 0;\n }\n }\n if (dataLength >= 64) {\n dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n dataLength %= 64;\n }\n while (dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n return this;\n };\n // Finalizes hash state and puts hash into out.\n //\n // If hash was already finalized, puts the same value.\n Hash.prototype.finish = function (out) {\n if (!this.finished) {\n var bytesHashed = this.bytesHashed;\n var left = this.bufferLength;\n var bitLenHi = (bytesHashed / 0x20000000) | 0;\n var bitLenLo = bytesHashed << 3;\n var padLength = (bytesHashed % 64 < 56) ? 64 : 128;\n this.buffer[left] = 0x80;\n for (var i = left + 1; i < padLength - 8; i++) {\n this.buffer[i] = 0;\n }\n this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n this.finished = true;\n }\n for (var i = 0; i < 8; i++) {\n out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n }\n return this;\n };\n // Returns the final hash digest.\n Hash.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._saveState = function (out) {\n for (var i = 0; i < this.state.length; i++) {\n out[i] = this.state[i];\n }\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._restoreState = function (from, bytesHashed) {\n for (var i = 0; i < this.state.length; i++) {\n this.state[i] = from[i];\n }\n this.bytesHashed = bytesHashed;\n this.finished = false;\n this.bufferLength = 0;\n };\n return Hash;\n}());\nexports.Hash = Hash;\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nvar HMAC = /** @class */ (function () {\n function HMAC(key) {\n this.inner = new Hash();\n this.outer = new Hash();\n this.blockSize = this.inner.blockSize;\n this.digestLength = this.inner.digestLength;\n var pad = new Uint8Array(this.blockSize);\n if (key.length > this.blockSize) {\n (new Hash()).update(key).finish(pad).clean();\n }\n else {\n for (var i = 0; i < key.length; i++) {\n pad[i] = key[i];\n }\n }\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36;\n }\n this.inner.update(pad);\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36 ^ 0x5c;\n }\n this.outer.update(pad);\n this.istate = new Uint32Array(8);\n this.ostate = new Uint32Array(8);\n this.inner._saveState(this.istate);\n this.outer._saveState(this.ostate);\n for (var i = 0; i < pad.length; i++) {\n pad[i] = 0;\n }\n }\n // Returns HMAC state to the state initialized with key\n // to make it possible to run HMAC over the other data with the same\n // key without creating a new instance.\n HMAC.prototype.reset = function () {\n this.inner._restoreState(this.istate, this.inner.blockSize);\n this.outer._restoreState(this.ostate, this.outer.blockSize);\n return this;\n };\n // Cleans HMAC state.\n HMAC.prototype.clean = function () {\n for (var i = 0; i < this.istate.length; i++) {\n this.ostate[i] = this.istate[i] = 0;\n }\n this.inner.clean();\n this.outer.clean();\n };\n // Updates state with provided data.\n HMAC.prototype.update = function (data) {\n this.inner.update(data);\n return this;\n };\n // Finalizes HMAC and puts the result in out.\n HMAC.prototype.finish = function (out) {\n if (this.outer.finished) {\n this.outer.finish(out);\n }\n else {\n this.inner.finish(out);\n this.outer.update(out, this.digestLength).finish(out);\n }\n return this;\n };\n // Returns message authentication code.\n HMAC.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n return HMAC;\n}());\nexports.HMAC = HMAC;\n// Returns SHA256 hash of data.\nfunction hash(data) {\n var h = (new Hash()).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hash = hash;\n// Function hash is both available as module.hash and as default export.\nexports[\"default\"] = hash;\n// Returns HMAC-SHA256 of data under the key.\nfunction hmac(key, data) {\n var h = (new HMAC(key)).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hmac = hmac;\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(buffer, hmac, info, counter) {\n // Counter is a byte value: check if it overflowed.\n var num = counter[0];\n if (num === 0) {\n throw new Error(\"hkdf: cannot expand more\");\n }\n // Prepare HMAC instance for new data with old key.\n hmac.reset();\n // Hash in previous output if it was generated\n // (i.e. counter is greater than 1).\n if (num > 1) {\n hmac.update(buffer);\n }\n // Hash in info if it exists.\n if (info) {\n hmac.update(info);\n }\n // Hash in the counter.\n hmac.update(counter);\n // Output result to buffer and clean HMAC instance.\n hmac.finish(buffer);\n // Increment counter inside typed array, this works properly.\n counter[0]++;\n}\nvar hkdfSalt = new Uint8Array(exports.digestLength); // Filled with zeroes.\nfunction hkdf(key, salt, info, length) {\n if (salt === void 0) { salt = hkdfSalt; }\n if (length === void 0) { length = 32; }\n var counter = new Uint8Array([1]);\n // HKDF-Extract uses salt as HMAC key, and key as data.\n var okm = hmac(salt, key);\n // Initialize HMAC for expanding with extracted key.\n // Ensure no collisions with `hmac` function.\n var hmac_ = new HMAC(okm);\n // Allocate buffer.\n var buffer = new Uint8Array(hmac_.digestLength);\n var bufpos = buffer.length;\n var out = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n if (bufpos === buffer.length) {\n fillBuffer(buffer, hmac_, info, counter);\n bufpos = 0;\n }\n out[i] = buffer[bufpos++];\n }\n hmac_.clean();\n buffer.fill(0);\n counter.fill(0);\n return out;\n}\nexports.hkdf = hkdf;\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nfunction pbkdf2(password, salt, iterations, dkLen) {\n var prf = new HMAC(password);\n var len = prf.digestLength;\n var ctr = new Uint8Array(4);\n var t = new Uint8Array(len);\n var u = new Uint8Array(len);\n var dk = new Uint8Array(dkLen);\n for (var i = 0; i * len < dkLen; i++) {\n var c = i + 1;\n ctr[0] = (c >>> 24) & 0xff;\n ctr[1] = (c >>> 16) & 0xff;\n ctr[2] = (c >>> 8) & 0xff;\n ctr[3] = (c >>> 0) & 0xff;\n prf.reset();\n prf.update(salt);\n prf.update(ctr);\n prf.finish(u);\n for (var j = 0; j < len; j++) {\n t[j] = u[j];\n }\n for (var j = 2; j <= iterations; j++) {\n prf.reset();\n prf.update(u).finish(u);\n for (var k = 0; k < len; k++) {\n t[k] ^= u[k];\n }\n }\n for (var j = 0; j < len && i * len + j < dkLen; j++) {\n dk[i * len + j] = t[j];\n }\n }\n for (var i = 0; i < len; i++) {\n t[i] = u[i] = 0;\n }\n for (var i = 0; i < 4; i++) {\n ctr[i] = 0;\n }\n prf.clean();\n return dk;\n}\nexports.pbkdf2 = pbkdf2;\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\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__ = DG;","import * as sha256 from 'fast-sha256';\n/**\n * For columns of string type. Checks whether column contains empty values and removes corresponding rows in case user selects to remove.\n *\n */\nexport function removeEmptyStringRows(table, col) {\n const cats = col.categories;\n const emptyRawInd = cats.map((val, ind) => !val ? ind : null).filter((it) => it !== null);\n const rawData = [...col.getRawData()];\n const emptyRawsIndexes = [];\n let removedRowsCounter = 0;\n for (let i = 0; i < table.rowCount; i++) {\n if (emptyRawInd.includes(rawData[i])) {\n table.rows.removeAt(i - removedRowsCounter);\n emptyRawsIndexes.push(i);\n removedRowsCounter += 1;\n }\n }\n return emptyRawsIndexes;\n}\nexport function hashDataFrame(table, names) {\n names !== null && names !== void 0 ? names : (names = table.columns.names());\n const hasher = new sha256.Hash();\n const order = table.getSortedOrder(names);\n const encoder = new TextEncoder();\n for (const name of names) {\n const column = table.columns.byName(name);\n const dataArray = column.getRawData();\n const isString = column.type == DG.TYPE.STRING;\n const cats = column.categories;\n for (let i = 0; i < dataArray.length; i++) {\n if (isString) {\n const data = cats[dataArray[order[i]]];\n hasher.update(encoder.encode(data));\n }\n else {\n const data = dataArray[order[i]];\n hasher.update(Uint8Array.from([data]));\n }\n }\n }\n return hasher.digest();\n}\nexport const testData = DG.DataFrame.fromCsv(`countries,fasta,smiles,molregno,LON,Zip Code,Street Address Line 1,ImageUrl,user_id,error_message,xray,flag,magnitude,CS-id,pdb_id,accel_a,time_offset,chart,fit,Questions,empty_number,empty_string\nBelgium,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C(=O)OCCCc1cccnc1)c2cccc(c2)C(=O)c3ccccc3,1480014,36.276729583740234,995042300,14016 ROUTE 31W,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,1,1,1QBS,1,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.497360340644872, 1.7058694986686864, 5.278052678195135, 0.16000320889028383],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.374499797821045},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.6242473125457764},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.367267608642578},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.6723148822784424},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.6537344455718994},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.3651671409606934},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.5654284954071045},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.4160959720611572},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.286726713180542},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.5100042819976807},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6676985025405884},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.680136501789093},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3391543924808502},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.09038983285427094},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.19802775979042053}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[7.525235855508179, 1.3186911876809984, 5.335672608564294, 0.7860743343958098],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":7.988070487976074},{\"\"x\"\":0.6000000238418579,\"\"y\"\":7.018453121185303},{\"\"x\"\":1.100000023841858,\"\"y\"\":8.115279197692871},{\"\"x\"\":1.600000023841858,\"\"y\"\":7.486658096313477},{\"\"x\"\":2.0999999046325684,\"\"y\"\":7.396438121795654},{\"\"x\"\":2.5999999046325684,\"\"y\"\":7.477052211761475},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.913095474243164},{\"\"x\"\":3.5999999046325684,\"\"y\"\":8.01385498046875},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.985900402069092},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.970335960388184},{\"\"x\"\":5.099999904632568,\"\"y\"\":5.448817253112793},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.5534818172454834},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.893947958946228},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6340042352676392},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8403874039649963}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,100,abc\nBurundi,MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW,COc1ccc2cc(ccc2c1)C(C)C(=O)Oc3ccc(C)cc3OC,1480015,36.276729583740234,995073444,80 STATE HIGHWAY 310,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,2,2,1ZP8,2,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.431460753103398, 2.1691498799246745, 5.266445597102774, 0.7825762827017926],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.751083850860596},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.203000068664551},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.415858745574951},{\"\"x\"\":1.600000023841858,\"\"y\"\":4.68414306640625},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.198400974273682},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.179222106933594},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.638473987579346},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.708553314208984},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.291589260101318},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.038082599639893},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4349939823150635},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.2194708585739136},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.1920831203460693},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.5352635979652405},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.3346920311450958}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.339458017970126, -1.0734184310171178, 4.746332950550934, 0.2482416857595658],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.2139337658882141},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.4269562065601349},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.2441573292016983},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.146635964512825},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.08818462491035461},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.2560656666755676},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.42434045672416687},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.37111231684684753},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.5581737160682678},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.183590054512024},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.5629843473434448},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3211288452148438},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.229961633682251},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.2560226917266846},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.2142398357391357}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCameroon,MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL,COc1ccc2cc(ccc2c1)C(C)C(=O)OCCCc3cccnc3,1480016,36.26095962524414,995153596,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,3,3,2BDJ,3,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.6760652578642325, 0.9046956320756703, 5.651408971856738, 0.07738846012184185],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.32425594329834},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.668442249298096},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.379785060882568},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.0345139503479},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.878653526306152},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.3451313972473145},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.336992263793945},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.037430286407471},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.0092692375183105},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.151902675628662},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4066951274871826},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3732759952545166},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.673728108406067},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48574790358543396},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.2783052325248718}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.938395863010111, -1.4658480661392117, 5.462702751996584, 0.3473139023615039],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.4941710829734802},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.15323974192142487},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.46373432874679565},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.3370431363582611},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.5179030299186707},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.27899765968322754},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.22075064480304718},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.5789918899536133},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.21169911324977875},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.27857646346092224},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0906332731246948},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8520300388336182},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.7177059650421143},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.8680918216705322},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.2413077354431152}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCanada,MMELVLKTIIGPIVVGVVLRIVDKWLNKDK,CC(C(=O)NCCS)c1cccc(c1)C(=O)c2ccccc2,1480017,36.26095962524414,99515,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,4,4,1IAN,4,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[0.8597390975430008, 1.0957625732481946, 5.260537067987958, 0.07974187998177736],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.8190152645111084},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.8421689867973328},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.8740922212600708},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.8924275040626526},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.8249067664146423},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.9327669143676758},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.8522974252700806},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.8174492716789246},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.8394647240638733},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.7139387726783752},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.5561167597770691},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3276226818561554},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.12479474395513535},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.13006797432899475},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.059702079743146896}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.760930219582546, 1.6591793293833013, 4.667155929720851, 0.7858109544121652],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.156993389129639},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.236701965332031},{\"\"x\"\":1.100000023841858,\"\"y\"\":6.010560512542725},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.495512962341309},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.087770462036133},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.79986572265625},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.597546577453613},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.520902156829834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.360654354095459},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.5539746284484863},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.577236294746399},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.0001264810562134},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.9305797815322876},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6033638715744019},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.4203685522079468}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nColombia,MDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN,FC(F)(F)c1ccc(OC2CCNCC2)cc1,1480029,36.3309440612793,995152050,1 COURT HOUSE SQUARE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,5,5,4UJ1,5,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[6.4995088314153655, 2.4270351004539914, 5.178659535348579, 0.625653346241577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.496231555938721},{\"\"x\"\":0.6000000238418579,\"\"y\"\":6.42543363571167},{\"\"x\"\":1.100000023841858,\"\"y\"\":7.040063858032227},{\"\"x\"\":1.600000023841858,\"\"y\"\":6.1115403175354},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.680728435516357},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.406774520874023},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.611269474029541},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.889094352722168},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.75344705581665},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.361435890197754},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.1666975021362305},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.172118902206421},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.801048994064331},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.4640021026134491},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.0010357667924836278}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.4734381347446401, 1.1649805188074196, 4.82958608866421, 0.09500545496710007],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.5279096364974976},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.3559974431991577},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.5246378183364868},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.5567657947540283},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.4114240407943726},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.4045010805130005},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.4769829511642456},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.4875500202178955},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.2991987466812134},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.922961413860321},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.6520044803619385},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.15350978076457977},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1078903079032898},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.17276449501514435},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.14066608250141144}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCosta Rica,MKSTKEEIQTIKTLLKDSRTAKYHKRLQIVL,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCCc3ccccc3,1480018,36.3309440612793,995084218,4041 SOUTHWESTERN BLVD,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,6,6,2BPW,6,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.4833641843311227, -1.8945978742090062, 4.671127708092568, 0.24159861311815153],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.0969524160027504},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.028483040630817413},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.22087176144123077},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.0068915546871721745},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.4305879771709442},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.44774115085601807},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.45346319675445557},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.2370593100786209},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.4657953977584839},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.155200719833374},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.2294070720672607},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.4311530590057373},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.33846116065979},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.608201026916504},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.8136143684387207}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.224573521642033, 1.4454033924198528, 5.6014197746076535, 0.2823216054197577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.95027494430542},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.1754679679870605},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.276752948760986},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.589294910430908},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.616994857788086},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.120813846588135},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.340766906738281},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.876471042633057},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.94999361038208},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.162564754486084},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.399557590484619},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.7977969646453857},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.0229872465133667},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48275601863861084},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.10408931970596313}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCuba,MHAILRYFIRRLFYHIFYKIYSLISKKHQSLPSDVRQF,COc1ccc2c(c1)c(CC(=O)N3CCCC3C(=O)Oc4ccc(C)cc4OC)c(C)n2C(=O)c5ccc(Cl)cc5,1480019,36.33115768432617,995081928,1227 US HIGHWAY 11,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,7,7,1QBS,7,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.320838679713925, -1.2421619987316728, 4.831325425225256, 0.3236011098403072],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.3727470338344574},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.12365014106035233},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.48422467708587646},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.2264465093612671},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.16821794211864471},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.3879014551639557},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.5470244884490967},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.3419053554534912},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.7655120491981506},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.2346516847610474},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.453336715698242},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.9565491676330566},{\"\"x\"\":6.099999904632568,\"\"y\"\":3.335299491882324},{\"\"x\"\":6.599999904632568,\"\"y\"\":3.240290880203247},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.1107218265533447}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.6401853521511094, 1.26211588875013, 5.399028074402744, 0.5089580830068091],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.8585598468780518},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.6077206134796143},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.855252265930176},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.619039297103882},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.839388370513916},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.335283041000366},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.571141481399536},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.4155046939849854},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7316646575927734},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.0680155754089355},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.891066551208496},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.6022753715515137},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.7652576565742493},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6875326037406921},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5828871726989746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nItaly,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO[N+](=O)[O-],1480020,36.33115768432617,99502,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,8,8,1ZP8,8,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.293592105923809, 1.3781586549141835, 5.1025898038676605, 0.03493851245291291],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.1287283897399902},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.267972230911255},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.398442506790161},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.5130622386932373},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.3255116939544678},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.127340793609619},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.47259783744812},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.131181478500366},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.090421438217163},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.02299165725708},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.1105059385299683},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.4494485855102539},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1375635862350464},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.036351121962070465},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.1619771122932434}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.953125499439879, 1.2528620255306528, 5.187637440149802, 0.3110348753260886],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.6585283279418945},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.911152362823486},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.924920082092285},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.8469438552856445},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.929472923278809},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.190037727355957},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.236179828643799},{\"\"x\"\":3.5999999046325684,\"\"y\"\":6.141019344329834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.295210838317871},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.265801906585693},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.3722851276397705},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8299226760864258},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.32690900564193726},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6274543404579163},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8441857099533081}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nRwanda,MPNSEPASLLELFNSIATQGELVRSLKAGNASK,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO,1480021,36.33137130737305,995037247,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,9,2BDJ,9,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.8209972202654474, 1.3779216716448506, 5.299882228439686, 0.06040645519069608],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.7821109294891357},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.542433023452759},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.7008674144744873},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.717301607131958},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.024452209472656},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.013899326324463},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.945094347000122},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.866621971130371},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7461626529693604},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.3454740047454834},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.61944317817688},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.999405026435852},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.46259793639183044},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.054134611040353775},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.05711187422275543}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.6318079657726035, 1.8495493770000595, 5.391793312471116, 0.17060707587348442],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.458079814910889},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.554427146911621},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.799983024597168},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.364140033721924},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.864485740661621},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.4509806632995605},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.702574729919434},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.7314534187316895},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.5123443603515625},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.724395751953125},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.354506969451904},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.7307666540145874},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.6305936574935913},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.035183437168598175},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.7575169205665588}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nSwitzerland,IRVVGRYLIEVWKAAGMDMDKVLFLWSSDEI,CN1CCC(CC1)Oc2ccc(cc2)C(F)(F)F,1480028,36.33137130737305,99504,92-11 179TH PLACE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,10,1IAN,10,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.1190255865097471, 2.3163895161544437, 5.4968866182279195, 0.2035204047289052],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.1057683229446411},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.1019697189331055},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.0818607807159424},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.062997817993164},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.046447515487671},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.1217249631881714},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.2166996002197266},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.215477705001831},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.0581893920898438},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.1747995615005493},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0181127786636353},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.5344523191452026},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.2569526433944702},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.1912207305431366},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.15060538053512573}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.1038581025805785, 2.0032224204185245, 5.087602825989163, 0.13277988512492753],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.0498509407043457},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.805217742919922},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.3415253162384033},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.0549843311309814},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.250074863433838},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.0432586669921875},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.265852451324463},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.9475724697113037},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.1929898262023926},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.7460060119628906},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6175861358642578},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3006608486175537},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3444803059101105},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.015537971630692482},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5527358055114746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\n,,,,,,,,,,,,,,,,,,,,,`);\ntestData.columns.add(DG.Column.fromList(DG.TYPE.BYTE_ARRAY, 'BinaryImage', Array.from(new Uint8Array(11))));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFvQixFQUFFLEdBQWU7SUFDekUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzVCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsa0JBQWtCLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0tBQ0Y7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQW9CLEVBQUUsS0FBZ0I7SUFDbEUsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLElBQUwsS0FBSyxHQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQStCdkIsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHR5cGUgKiBhcyBfREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmRlY2xhcmUgbGV0IERHOiB0eXBlb2YgX0RHO1xuaW1wb3J0ICogYXMgc2hhMjU2IGZyb20gJ2Zhc3Qtc2hhMjU2Jztcbi8qKlxuICogRm9yIGNvbHVtbnMgb2Ygc3RyaW5nIHR5cGUuIENoZWNrcyB3aGV0aGVyIGNvbHVtbiBjb250YWlucyBlbXB0eSB2YWx1ZXMgYW5kIHJlbW92ZXMgY29ycmVzcG9uZGluZyByb3dzIGluIGNhc2UgdXNlciBzZWxlY3RzIHRvIHJlbW92ZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbXB0eVN0cmluZ1Jvd3ModGFibGU6IF9ERy5EYXRhRnJhbWUsIGNvbDogX0RHLkNvbHVtbik6IG51bWJlcltdIHtcbiAgY29uc3QgY2F0cyA9IGNvbC5jYXRlZ29yaWVzO1xuICBjb25zdCBlbXB0eVJhd0luZCA9IGNhdHMubWFwKCh2YWwsIGluZCkgPT4gIXZhbCA/IGluZCA6IG51bGwpLmZpbHRlcigoaXQpID0+IGl0ICE9PSBudWxsKTtcbiAgY29uc3QgcmF3RGF0YSA9IFsuLi5jb2wuZ2V0UmF3RGF0YSgpXTtcbiAgY29uc3QgZW1wdHlSYXdzSW5kZXhlcyA9IFtdO1xuICBsZXQgcmVtb3ZlZFJvd3NDb3VudGVyID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dDb3VudDsgaSsrKSB7XG4gICAgaWYgKGVtcHR5UmF3SW5kLmluY2x1ZGVzKHJhd0RhdGFbaV0pKSB7XG4gICAgICB0YWJsZS5yb3dzLnJlbW92ZUF0KGkgLSByZW1vdmVkUm93c0NvdW50ZXIpO1xuICAgICAgZW1wdHlSYXdzSW5kZXhlcy5wdXNoKGkpO1xuICAgICAgcmVtb3ZlZFJvd3NDb3VudGVyICs9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbXB0eVJhd3NJbmRleGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzaERhdGFGcmFtZSh0YWJsZTogX0RHLkRhdGFGcmFtZSwgbmFtZXM/OiBzdHJpbmdbXSk6IFVpbnQ4QXJyYXkge1xuICBuYW1lcyA/Pz0gdGFibGUuY29sdW1ucy5uYW1lcygpO1xuICBjb25zdCBoYXNoZXIgPSBuZXcgc2hhMjU2Lkhhc2goKTtcbiAgY29uc3Qgb3JkZXIgPSB0YWJsZS5nZXRTb3J0ZWRPcmRlcihuYW1lcyk7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGFibGUuY29sdW1ucy5ieU5hbWUobmFtZSk7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gY29sdW1uLmdldFJhd0RhdGEoKTtcbiAgICBjb25zdCBpc1N0cmluZyA9IGNvbHVtbi50eXBlID09IERHLlRZUEUuU1RSSU5HO1xuICAgIGNvbnN0IGNhdHMgPSBjb2x1bW4uY2F0ZWdvcmllcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjYXRzW2RhdGFBcnJheVtvcmRlcltpXV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKGVuY29kZXIuZW5jb2RlKGRhdGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhQXJyYXlbb3JkZXJbaV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKFVpbnQ4QXJyYXkuZnJvbShbZGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc2hlci5kaWdlc3QoKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRlc3REYXRhID0gREcuRGF0YUZyYW1lLmZyb21Dc3YoYGNvdW50cmllcyxmYXN0YSxzbWlsZXMsbW9scmVnbm8sTE9OLFppcCBDb2RlLFN0cmVldCBBZGRyZXNzIExpbmUgMSxJbWFnZVVybCx1c2VyX2lkLGVycm9yX21lc3NhZ2UseHJheSxmbGFnLG1hZ25pdHVkZSxDUy1pZCxwZGJfaWQsYWNjZWxfYSx0aW1lX29mZnNldCxjaGFydCxmaXQsUXVlc3Rpb25zLGVtcHR5X251bWJlcixlbXB0eV9zdHJpbmdcbkJlbGdpdW0sTVNORkhORUhWTVFGWVJOTkxLVEtHVkZHUlEsQ0MoQyg9TylPQ0NDYzFjY2NuYzEpYzJjY2NjKGMyKUMoPU8pYzNjY2NjYzMsMTQ4MDAxNCwzNi4yNzY3Mjk1ODM3NDAyMzQsOTk1MDQyMzAwLDE0MDE2IFJPVVRFIDMxVyxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDEsMSwxUUJTLDEsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsyLjQ5NzM2MDM0MDY0NDg3MiwgMS43MDU4Njk0OTg2Njg2ODY0LCA1LjI3ODA1MjY3ODE5NTEzNSwgMC4xNjAwMDMyMDg4OTAyODM4M10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Mi4zNzQ0OTk3OTc4MjEwNDV9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoyLjYyNDI0NzMxMjU0NTc3NjR9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuMzY3MjY3NjA4NjQyNTc4fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjY3MjMxNDg4MjI3ODQ0MjR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjY1MzczNDQ0NTU3MTg5OTR9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjM2NTE2NzE0MDk2MDY5MzR9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjU2NTQyODQ5NTQwNzEwNDV9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjQxNjA5NTk3MjA2MTE1NzJ9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjg2NzI2NzEzMTgwNTQyfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjUxMDAwNDI4MTk5NzY4MDd9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjY3Njk4NTAyNTQwNTg4NH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42ODAxMzY1MDE3ODkwOTN9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzM5MTU0MzkyNDgwODUwMn0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wOTAzODk4MzI4NTQyNzA5NH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xOTgwMjc3NTk3OTA0MjA1M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNy41MjUyMzU4NTU1MDgxNzksIDEuMzE4NjkxMTg3NjgwOTk4NCwgNS4zMzU2NzI2MDg1NjQyOTQsIDAuNzg2MDc0MzM0Mzk1ODA5OF0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ny45ODgwNzA0ODc5NzYwNzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo3LjAxODQ1MzEyMTE4NTMwM30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6OC4xMTUyNzkxOTc2OTI4NzF9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjcuNDg2NjU4MDk2MzEzNDc3fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ny4zOTY0MzgxMjE3OTU2NTR9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo3LjQ3NzA1MjIxMTc2MTQ3NX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuOTEzMDk1NDc0MjQzMTY0fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6OC4wMTM4NTQ5ODA0Njg3NX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Ni45ODU5MDA0MDIwNjkwOTJ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuOTcwMzM1OTYwMzg4MTg0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjQ0ODgxNzI1MzExMjc5M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi41NTM0ODE4MTcyNDU0ODM0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjg5Mzk0Nzk1ODk0NjIyOH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42MzQwMDQyMzUyNjc2MzkyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjg0MDM4NzQwMzk2NDk5NjN9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LDEwMCxhYmNcbkJ1cnVuZGksTURZS0VUTExNUEtUREZQTVJHR0xQTktFUFFJUUVLVyxDT2MxY2NjMmNjKGNjYzJjMSlDKEMpQyg9TylPYzNjY2MoQyljYzNPQywxNDgwMDE1LDM2LjI3NjcyOTU4Mzc0MDIzNCw5OTUwNzM0NDQsODAgU1RBVEUgSElHSFdBWSAzMTAsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZywyLDIsMVpQOCwyLDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNC40MzE0NjA3NTMxMDMzOTgsIDIuMTY5MTQ5ODc5OTI0Njc0NSwgNS4yNjY0NDU1OTcxMDI3NzQsIDAuNzgyNTc2MjgyNzAxNzkyNl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC43NTEwODM4NTA4NjA1OTZ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo0LjIwMzAwMDA2ODY2NDU1MX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NC40MTU4NTg3NDU1NzQ5NTF9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjQuNjg0MTQzMDY2NDA2MjV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjE5ODQwMDk3NDI3MzY4Mn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMTc5MjIyMTA2OTMzNTk0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC42Mzg0NzM5ODc1NzkzNDZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjcwODU1MzMxNDIwODk4NH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC4yOTE1ODkyNjAxMDEzMTh9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMDM4MDgyNTk5NjM5ODkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjQzNDk5Mzk4MjMxNTA2MzV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMjE5NDcwODU4NTczOTEzNn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xOTIwODMxMjAzNDYwNjkzfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjUzNTI2MzU5Nzk2NTI0MDV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzM0NjkyMDMxMTQ1MDk1OH1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi4zMzk0NTgwMTc5NzAxMjYsIC0xLjA3MzQxODQzMTAxNzExNzgsIDQuNzQ2MzMyOTUwNTUwOTM0LCAwLjI0ODI0MTY4NTc1OTU2NThdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuMjEzOTMzNzY1ODg4MjE0MX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuNDI2OTU2MjA2NTYwMTM0OX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4yNDQxNTczMjkyMDE2OTgzfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjE0NjYzNTk2NDUxMjgyNX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMDg4MTg0NjI0OTEwMzU0NjF9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjI1NjA2NTY2NjY3NTU2NzZ9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjQyNDM0MDQ1NjcyNDE2Njg3fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zNzExMTIzMTY4NDY4NDc1M30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41NTgxNzM3MTYwNjgyNjc4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE4MzU5MDA1NDUxMjAyNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS41NjI5ODQzNDczNDM0NDQ4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjMyMTEyODg0NTIxNDg0Mzh9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjI5OTYxNjMzNjgyMjUxfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjI1NjAyMjY5MTcyNjY4NDZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjE0MjM5ODM1NzM5MTM1N31dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ2FtZXJvb24sTUlFVkZMRkdJVkxHTElQSVRMQUdMRlZUQVlMUVlSUkdEUUxETCxDT2MxY2NjMmNjKGNjYzJjMSlDKEMpQyg9TylPQ0NDYzNjY2NuYzMsMTQ4MDAxNiwzNi4yNjA5NTk2MjUyNDQxNCw5OTUxNTM1OTYsMzAtNTYgV0hJVEVTVE9ORSBFWFBZLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsMywzLDJCREosMywxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzQuNjc2MDY1MjU3ODY0MjMyNSwgMC45MDQ2OTU2MzIwNzU2NzAzLCA1LjY1MTQwODk3MTg1NjczOCwgMC4wNzczODg0NjAxMjE4NDE4NV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC4zMjQyNTU5NDMyOTgzNH0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjQuNjY4NDQyMjQ5Mjk4MDk2fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo0LjM3OTc4NTA2MDg4MjU2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4wMzQ1MTM5NTAzNDc5fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC44Nzg2NTM1MjYzMDYxNTJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjM0NTEzMTM5NzI0NzMxNDV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjMzNjk5MjI2Mzc5Mzk0NX0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMDM3NDMwMjg2NDA3NDcxfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjAwOTI2OTIzNzUxODMxMDV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMTUxOTAyNjc1NjI4NjYyfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjQwNjY5NTEyNzQ4NzE4MjZ9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMzczMjc1OTk1MjU0NTE2Nn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42NzM3MjgxMDg0MDYwNjd9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDg1NzQ3OTAzNTg1NDMzOTZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMjc4MzA1MjMyNTI0ODcxOH1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi45MzgzOTU4NjMwMTAxMTEsIC0xLjQ2NTg0ODA2NjEzOTIxMTcsIDUuNDYyNzAyNzUxOTk2NTg0LCAwLjM0NzMxMzkwMjM2MTUwMzldLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuNDk0MTcxMDgyOTczNDgwMn0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuMTUzMjM5NzQxOTIxNDI0ODd9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuNDYzNzM0MzI4NzQ2Nzk1NjV9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMzM3MDQzMTM2MzU4MjYxMX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNTE3OTAzMDI5OTE4NjcwN30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMjc4OTk3NjU5NjgzMjI3NTR9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjIyMDc1MDY0NDgwMzA0NzE4fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC41Nzg5OTE4ODk5NTM2MTMzfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjIxMTY5OTExMzI0OTc3ODc1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI3ODU3NjQ2MzQ2MDkyMjI0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjA5MDYzMzI3MzEyNDY5NDh9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuODUyMDMwMDM4ODMzNjE4Mn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi43MTc3MDU5NjUwNDIxMTQzfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjg2ODA5MTgyMTY3MDUzMjJ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMjQxMzA3NzM1NDQzMTE1Mn1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ2FuYWRhLE1NRUxWTEtUSUlHUElWVkdWVkxSSVZES1dMTktESyxDQyhDKD1PKU5DQ1MpYzFjY2NjKGMxKUMoPU8pYzJjY2NjYzIsMTQ4MDAxNywzNi4yNjA5NTk2MjUyNDQxNCw5OTUxNSwzMC01NiBXSElURVNUT05FIEVYUFksaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw0LDQsMUlBTiw0LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMC44NTk3MzkwOTc1NDMwMDA4LCAxLjA5NTc2MjU3MzI0ODE5NDYsIDUuMjYwNTM3MDY3OTg3OTU4LCAwLjA3OTc0MTg3OTk4MTc3NzM2XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjgxOTAxNTI2NDUxMTEwODR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjg0MjE2ODk4Njc5NzMzMjh9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuODc0MDkyMjIxMjYwMDcwOH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC44OTI0Mjc1MDQwNjI2NTI2fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC44MjQ5MDY3NjY0MTQ2NDIzfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC45MzI3NjY5MTQzNjc2NzU4fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC44NTIyOTc0MjUyNzAwODA2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC44MTc0NDkyNzE2Nzg5MjQ2fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjgzOTQ2NDcyNDA2Mzg3MzN9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzEzOTM4NzcyNjc4Mzc1Mn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41NTYxMTY3NTk3NzcwNjkxfSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMyNzYyMjY4MTg1NjE1NTR9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTI0Nzk0NzQzOTU1MTM1MzV9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTMwMDY3OTc0MzI4OTk0NzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDU5NzAyMDc5NzQzMTQ2ODk2fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1Ljc2MDkzMDIxOTU4MjU0NiwgMS42NTkxNzkzMjkzODMzMDEzLCA0LjY2NzE1NTkyOTcyMDg1MSwgMC43ODU4MTA5NTQ0MTIxNjUyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo2LjE1Njk5MzM4OTEyOTYzOX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuMjM2NzAxOTY1MzMyMDMxfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo2LjAxMDU2MDUxMjU0MjcyNX0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS40OTU1MTI5NjIzNDEzMDl9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjA4Nzc3MDQ2MjAzNjEzM30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNzk5ODY1NzIyNjU2MjV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjU5NzU0NjU3NzQ1MzYxM30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNTIwOTAyMTU2ODI5ODM0fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjM2MDY1NDM1NDA5NTQ1OX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My41NTM5NzQ2Mjg0NDg0ODYzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjU3NzIzNjI5NDc0NjM5OX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wMDAxMjY0ODEwNTYyMTM0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjkzMDU3OTc4MTUzMjI4NzZ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjAzMzYzODcxNTc0NDAxOX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40MjAzNjg1NTIyMDc5NDY4fV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5Db2xvbWJpYSxNRFJUREVWU05IVEhES1BUTFRXRkVFSUZFRVlIU1BGSE4sRkMoRikoRiljMWNjYyhPQzJDQ05DQzIpY2MxLDE0ODAwMjksMzYuMzMwOTQ0MDYxMjc5Myw5OTUxNTIwNTAsMSBDT1VSVCBIT1VTRSBTUVVBUkUsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw1LDUsNFVKMSw1LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNi40OTk1MDg4MzE0MTUzNjU1LCAyLjQyNzAzNTEwMDQ1Mzk5MTQsIDUuMTc4NjU5NTM1MzQ4NTc5LCAwLjYyNTY1MzM0NjI0MTU3N10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ni40OTYyMzE1NTU5Mzg3MjF9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo2LjQyNTQzMzYzNTcxMTY3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo3LjA0MDA2Mzg1ODAzMjIyN30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ni4xMTE1NDAzMTc1MzU0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni42ODA3Mjg0MzU1MTYzNTd9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjQwNjc3NDUyMDg3NDAyM30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuNjExMjY5NDc0MDI5NTQxfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS44ODkwOTQzNTI3MjIxNjh9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuNzUzNDQ3MDU1ODE2NjV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuMzYxNDM1ODkwMTk3NzU0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjE2NjY5NzUwMjEzNjIzMDV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTcyMTE4OTAyMjA2NDIxfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjgwMTA0ODk5NDA2NDMzMX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NjQwMDIxMDI2MTM0NDkxfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjAwMTAzNTc2Njc5MjQ4MzYyNzh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzEuNDczNDM4MTM0NzQ0NjQwMSwgMS4xNjQ5ODA1MTg4MDc0MTk2LCA0LjgyOTU4NjA4ODY2NDIxLCAwLjA5NTAwNTQ1NDk2NzEwMDA3XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjoxLjUyNzkwOTYzNjQ5NzQ5NzZ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoxLjM1NTk5NzQ0MzE5OTE1Nzd9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuNTI0NjM3ODE4MzM2NDg2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MS41NTY3NjU3OTQ3NTQwMjgzfSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40MTE0MjQwNDA3OTQzNzI2fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40MDQ1MDEwODA1MTMwMDA1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40NzY5ODI5NTExNjQyNDU2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS40ODc1NTAwMjAyMTc4OTU1fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjI5OTE5ODc0NjY4MTIxMzR9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuOTIyOTYxNDEzODYwMzIxfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjY1MjAwNDQ4MDM2MTkzODV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTUzNTA5NzgwNzY0NTc5Nzd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTA3ODkwMzA3OTAzMjg5OH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xNzI3NjQ0OTUwMTUxNDQzNX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xNDA2NjYwODI1MDE0MTE0NH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ29zdGEgUmljYSxNS1NUS0VFSVFUSUtUTExLRFNSVEFLWUhLUkxRSVZMLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NDYzNjY2NjYzMsMTQ4MDAxOCwzNi4zMzA5NDQwNjEyNzkzLDk5NTA4NDIxOCw0MDQxIFNPVVRIV0VTVEVSTiBCTFZELGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNiw2LDJCUFcsNiwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuNDgzMzY0MTg0MzMxMTIyNywgLTEuODk0NTk3ODc0MjA5MDA2MiwgNC42NzExMjc3MDgwOTI1NjgsIDAuMjQxNTk4NjEzMTE4MTUxNTNdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuMDk2OTUyNDE2MDAyNzUwNH0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuMDI4NDgzMDQwNjMwODE3NDEzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjIyMDg3MTc2MTQ0MTIzMDc3fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjAwNjg5MTU1NDY4NzE3MjE3NDV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjQzMDU4Nzk3NzE3MDk0NDJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjQ0Nzc0MTE1MDg1NjAxODA3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40NTM0NjMxOTY3NTQ0NTU1N30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMjM3MDU5MzEwMDc4NjIwOX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NjU3OTUzOTc3NTg0ODM5fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE1NTIwMDcxOTgzMzM3NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4yMjk0MDcwNzIwNjcyNjA3fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjQzMTE1MzA1OTAwNTczNzN9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMzM4NDYxMTYwNjU5Nzl9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNjA4MjAxMDI2OTE2NTA0fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjgxMzYxNDM2ODQzODcyMDd9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzUuMjI0NTczNTIxNjQyMDMzLCAxLjQ0NTQwMzM5MjQxOTg1MjgsIDUuNjAxNDE5Nzc0NjA3NjUzNSwgMC4yODIzMjE2MDU0MTk3NTc3XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo0Ljk1MDI3NDk0NDMwNTQyfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NS4xNzU0Njc5Njc5ODcwNjA1fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjI3Njc1Mjk0ODc2MDk4Nn0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS41ODkyOTQ5MTA0MzA5MDh9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjYxNjk5NDg1Nzc4ODA4Nn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMTIwODEzODQ2NTg4MTM1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS4zNDA3NjY5MDY3MzgyODF9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0Ljg3NjQ3MTA0MjYzMzA1N30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC45NDk5OTM2MTAzODIwOH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4xNjI1NjQ3NTQ0ODYwODR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMzk5NTU3NTkwNDg0NjE5fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjc5Nzc5Njk2NDY0NTM4NTd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDIyOTg3MjQ2NTEzMzY2N30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40ODI3NTYwMTg2Mzg2MTA4NH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xMDQwODkzMTk3MDU5NjMxM31dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ3ViYSxNSEFJTFJZRklSUkxGWUhJRllLSVlTTElTS0tIUVNMUFNEVlJRRixDT2MxY2NjMmMoYzEpYyhDQyg9TylOM0NDQ0MzQyg9TylPYzRjY2MoQyljYzRPQyljKEMpbjJDKD1PKWM1Y2NjKENsKWNjNSwxNDgwMDE5LDM2LjMzMTE1NzY4NDMyNjE3LDk5NTA4MTkyOCwxMjI3IFVTIEhJR0hXQVkgMTEsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw3LDcsMVFCUyw3LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy4zMjA4Mzg2Nzk3MTM5MjUsIC0xLjI0MjE2MTk5ODczMTY3MjgsIDQuODMxMzI1NDI1MjI1MjU2LCAwLjMyMzYwMTEwOTg0MDMwNzJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjAuMzcyNzQ3MDMzODM0NDU3NH0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjAuMTIzNjUwMTQxMDYwMzUyMzN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuNDg0MjI0Njc3MDg1ODc2NDZ9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMjI2NDQ2NTA5MzYxMjY3MX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMTY4MjE3OTQyMTE4NjQ0NzF9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjM4NzkwMTQ1NTE2Mzk1NTd9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjU0NzAyNDQ4ODQ0OTA5Njd9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjM0MTkwNTM1NTQ1MzQ5MTJ9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzY1NTEyMDQ5MTk4MTUwNn0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4yMzQ2NTE2ODQ3NjEwNDc0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjQ1MzMzNjcxNTY5ODI0Mn0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi45NTY1NDkxNjc2MzMwNTY2fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjMzNTI5OTQ5MTg4MjMyNH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4yNDAyOTA4ODAyMDMyNDd9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMTEwNzIxODI2NTUzMzQ0N31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy42NDAxODUzNTIxNTExMDk0LCAxLjI2MjExNTg4ODc1MDEzLCA1LjM5OTAyODA3NDQwMjc0NCwgMC41MDg5NTgwODMwMDY4MDkxXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjozLjg1ODU1OTg0Njg3ODA1MTh9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjozLjYwNzcyMDYxMzQ3OTYxNDN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuODU1MjUyMjY1OTMwMTc2fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjYxOTAzOTI5NzEwMzg4Mn0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuODM5Mzg4MzcwNTEzOTE2fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My4zMzUyODMwNDEwMDAzNjZ9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjU3MTE0MTQ4MTM5OTUzNn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuNDE1NTA0NjkzOTg0OTg1NH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My43MzE2NjQ2NTc1OTI3NzM0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjA2ODAxNTU3NTQwODkzNTV9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuODkxMDY2NTUxMjA4NDk2fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjYwMjI3NTM3MTU1MTUxMzd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzY1MjU3NjU2NTc0MjQ5M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42ODc1MzI2MDM3NDA2OTIxfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjU4Mjg4NzE3MjY5ODk3NDZ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkl0YWx5LE1TTkZITkVIVk1RRllSTk5MS1RLR1ZGR1JRLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NPW04rXSg9TylbTy1dLDE0ODAwMjAsMzYuMzMxMTU3Njg0MzI2MTcsOTk1MDIsXCIxNjgtNDYgOTFTVCBBVkUuLCAyTkQgRkxSXCIsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw4LDgsMVpQOCw4LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi4yOTM1OTIxMDU5MjM4MDksIDEuMzc4MTU4NjU0OTE0MTgzNSwgNS4xMDI1ODk4MDM4Njc2NjA1LCAwLjAzNDkzODUxMjQ1MjkxMjkxXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjoyLjEyODcyODM4OTczOTk5MDJ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoyLjI2Nzk3MjIzMDkxMTI1NX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Mi4zOTg0NDI1MDY3OTAxNjF9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuNTEzMDYyMjM4NjkzMjM3M30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuMzI1NTExNjkzOTU0NDY3OH0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuMTI3MzQwNzkzNjA5NjE5fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi40NzI1OTc4Mzc0NDgxMn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuMTMxMTgxNDc4NTAwMzY2fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjA5MDQyMTQzODIxNzE2M30se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4wMjI5OTE2NTcyNTcwOH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xMTA1MDU5Mzg1Mjk5NjgzfSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ0OTQ0ODU4NTUxMDI1Mzl9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTM3NTYzNTg2MjM1MDQ2NH0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMzYzNTExMjE5NjIwNzA0NjV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTYxOTc3MTEyMjkzMjQzNH1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS45NTMxMjU0OTk0Mzk4NzksIDEuMjUyODYyMDI1NTMwNjUyOCwgNS4xODc2Mzc0NDAxNDk4MDIsIDAuMzExMDM0ODc1MzI2MDg4Nl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NS42NTg1MjgzMjc5NDE4OTQ1fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NS45MTExNTIzNjI4MjM0ODZ9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuOTI0OTIwMDgyMDkyMjg1fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1Ljg0Njk0Mzg1NTI4NTY0NDV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjkyOTQ3MjkyMzI3ODgwOX0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuMTkwMDM3NzI3MzU1OTU3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4yMzYxNzk4Mjg2NDM3OTl9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjE0MTAxOTM0NDMyOTgzNH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4yOTUyMTA4MzgzMTc4NzF9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMjY1ODAxOTA2NTg1NjkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjM3MjI4NTEyNzYzOTc3MDV9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuODI5OTIyNjc2MDg2NDI1OH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMjY5MDkwMDU2NDE5MzcyNn0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42Mjc0NTQzNDA0NTc5MTYzfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjg0NDE4NTcwOTk1MzMwODF9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcblJ3YW5kYSxNUE5TRVBBU0xMRUxGTlNJQVRRR0VMVlJTTEtBR05BU0ssQ0MoQylDYzFjY2MoY2MxKUMoQylDKD1PKU4yQ0NDQzJDKD1PKU9DQ08sMTQ4MDAyMSwzNi4zMzEzNzEzMDczNzMwNSw5OTUwMzcyNDcsXCIxNjgtNDYgOTFTVCBBVkUuLCAyTkQgRkxSXCIsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw5LDksMkJESiw5LDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy44MjA5OTcyMjAyNjU0NDc0LCAxLjM3NzkyMTY3MTY0NDg1MDYsIDUuMjk5ODgyMjI4NDM5Njg2LCAwLjA2MDQwNjQ1NTE5MDY5NjA4XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjozLjc4MjExMDkyOTQ4OTEzNTd9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjozLjU0MjQzMzAyMzQ1Mjc1OX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My43MDA4Njc0MTQ0NzQ0ODczfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjcxNzMwMTYwNzEzMTk1OH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMDI0NDUyMjA5NDcyNjU2fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4wMTM4OTkzMjYzMjQ0NjN9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjk0NTA5NDM0NzAwMDEyMn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuODY2NjIxOTcxMTMwMzcxfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjc0NjE2MjY1Mjk2OTM2MDR9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMzQ1NDc0MDA0NzQ1NDgzNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi42MTk0NDMxNzgxNzY4OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC45OTk0MDUwMjY0MzU4NTJ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDYyNTk3OTM2MzkxODMwNDR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDU0MTM0NjExMDQwMzUzNzc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1NzExMTg3NDIyMjc1NTQzfV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1LjYzMTgwNzk2NTc3MjYwMzUsIDEuODQ5NTQ5Mzc3MDAwMDU5NSwgNS4zOTE3OTMzMTI0NzExMTYsIDAuMTcwNjA3MDc1ODczNDg0NDJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjUuNDU4MDc5ODE0OTEwODg5fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NS41NTQ0MjcxNDY5MTE2MjF9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNzk5OTgzMDI0NTk3MTY4fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjM2NDE0MDAzMzcyMTkyNH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuODY0NDg1NzQwNjYxNjIxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS40NTA5ODA2NjMyOTk1NjA1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS43MDI1NzQ3Mjk5MTk0MzR9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjczMTQ1MzQxODczMTY4OTV9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuNTEyMzQ0MzYwMzUxNTYyNX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS43MjQzOTU3NTE5NTMxMjV9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMzU0NTA2OTY5NDUxOTA0fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjczMDc2NjY1NDAxNDU4NzR9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjMwNTkzNjU3NDkzNTkxM30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMzUxODM0MzcxNjg1OTgxNzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNzU3NTE2OTIwNTY2NTU4OH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuU3dpdHplcmxhbmQsSVJWVkdSWUxJRVZXS0FBR01ETURLVkxGTFdTU0RFSSxDTjFDQ0MoQ0MxKU9jMmNjYyhjYzIpQyhGKShGKUYsMTQ4MDAyOCwzNi4zMzEzNzEzMDczNzMwNSw5OTUwNCw5Mi0xMSAxNzlUSCBQTEFDRSxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDksMTAsMUlBTiwxMCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzEuMTE5MDI1NTg2NTA5NzQ3MSwgMi4zMTYzODk1MTYxNTQ0NDM3LCA1LjQ5Njg4NjYxODIyNzkxOTUsIDAuMjAzNTIwNDA0NzI4OTA1Ml0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MS4xMDU3NjgzMjI5NDQ2NDExfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MS4xMDE5Njk3MTg5MzMxMDU1fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjA4MTg2MDc4MDcxNTk0MjR9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuMDYyOTk3ODE3OTkzMTY0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4wNDY0NDc1MTU0ODc2NzF9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoxLjEyMTcyNDk2MzE4ODE3MTR9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoxLjIxNjY5OTYwMDIxOTcyNjZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoxLjIxNTQ3NzcwNTAwMTgzMX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wNTgxODkzOTIwODk4NDM4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE3NDc5OTU2MTUwMDU0OTN9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDE4MTEyNzc4NjYzNjM1M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41MzQ0NTIzMTkxNDUyMDI2fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI1Njk1MjY0MzM5NDQ3MDJ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTkxMjIwNzMwNTQzMTM2Nn0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4xNTA2MDUzODA1MzUxMjU3M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMy4xMDM4NTgxMDI1ODA1Nzg1LCAyLjAwMzIyMjQyMDQxODUyNDUsIDUuMDg3NjAyODI1OTg5MTYzLCAwLjEzMjc3OTg4NTEyNDkyNzUzXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjozLjA0OTg1MDk0MDcwNDM0NTd9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjoyLjgwNTIxNzc0MjkxOTkyMn0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My4zNDE1MjUzMTYyMzg0MDMzfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjA1NDk4NDMzMTEzMDk4MTR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjI1MDA3NDg2MzQzMzgzOH0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMDQzMjU4NjY2OTkyMTg3NX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMjY1ODUyNDUxMzI0NDYzfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi45NDc1NzI0Njk3MTEzMDM3fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjE5Mjk4OTgyNjIwMjM5MjZ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNzQ2MDA2MDExOTYyODkwNn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42MTc1ODYxMzU4NjQyNTc4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMwMDY2MDg0ODYxNzU1Mzd9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzQ0NDgwMzA1OTEwMTEwNX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMTU1Mzc5NzE2MzA2OTI0ODJ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTUyNzM1ODA1NTExNDc0Nn1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuLCwsLCwsLCwsLCwsLCwsLCwsLCwsYCk7XG50ZXN0RGF0YS5jb2x1bW5zLmFkZChERy5Db2x1bW4uZnJvbUxpc3QoREcuVFlQRS5CWVRFX0FSUkFZLCAnQmluYXJ5SW1hZ2UnLCBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KDExKSkpKTtcbiJdfQ==","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { testData } from './dataframe-utils';\nimport { changeOptionsSaveLayout, filterAsync, loadLayout, selectFilterChangeCurrent, testViewerInternal } from './test-viewer-utils';\nconst STANDART_TIMEOUT = 30000;\nconst BENCHMARK_TIMEOUT = 10800000;\nconst stdLog = console.log.bind(console);\nconst stdInfo = console.info.bind(console);\nconst stdWarn = console.warn.bind(console);\nconst stdError = console.error.bind(console);\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\nconst demoCatName = 'Demo';\nconst detectorsCatName = 'Detectors';\nconst coreCatName = 'Core';\nconst wasRegistered = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report, returnOnFail) {\n this.catchUnhandled = true;\n this.report = false;\n this.returnOnFail = false;\n this.closeAll = true;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n if (returnOnFail !== undefined)\n this.returnOnFail = returnOnFail;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = STANDART_TIMEOUT);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var _b;\n let result = '';\n try {\n if (DG.Test.isInDebug)\n debugger;\n let res = yield test();\n try {\n result = (_b = res === null || res === void 0 ? void 0 : res.toString()) !== null && _b !== void 0 ? _b : '';\n }\n catch (e) {\n result = 'Can\\'t convert test\\'s result to string';\n console.error(`Can\\'t convert test\\'s result to string in the ${this.category}:${this.name} test`);\n }\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport class Category {\n}\nexport class NodeTestExecutionOptions {\n}\nexport class TestExecutionOptions {\n}\nexport function testEvent(event, handler, trigger, ms = 0, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n try {\n handler(args);\n resolve('OK');\n }\n catch (e) {\n reject(e);\n }\n finally {\n sub.unsubscribe();\n clearTimeout(timeout);\n }\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function testEventAsync(event, handler, trigger, ms = 0, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n handler(args).then(() => {\n resolve('OK');\n }).catch((e) => {\n reject(e);\n }).finally(() => {\n sub.unsubscribe();\n clearTimeout(timeout);\n });\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected = true, error) {\n if (error)\n error = `${error}, `;\n else\n error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001, error) {\n if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||\n (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||\n (actual === Number.NaN && expected === Number.NaN) || (isNaN(actual) && isNaN(expected)))\n return;\n const areEqual = Math.abs(actual - expected) < tolerance;\n expect(areEqual, true, `${error !== null && error !== void 0 ? error : ''} (tolerance = ${tolerance}; a = ${actual}, e = ${expected})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectTable(actual, expected, error) {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error !== null && error !== void 0 ? error : ''}, row count`);\n for (const column of expected.columns) {\n const actualColumn = actual.columns.byName(column.name);\n if (actualColumn == null)\n throw new Error(`Column ${column.name} not found`);\n if (actualColumn.type != column.type)\n throw new Error(`Column ${column.name} type expected ${column.type} got ${actualColumn.type}`);\n for (let i = 0; i < expectedRowCount; i++) {\n const value = column.get(i);\n const actualValue = actualColumn.get(i);\n if (column.type == DG.TYPE.FLOAT)\n expectFloat(actualValue, value, 0.0001, error);\n else if (column.type == DG.TYPE.DATE_TIME)\n expect(actualValue.isSame(value), true, error);\n else\n expect(actualValue, value, error);\n }\n }\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests_, options) {\n var _a;\n currentCategory = category;\n tests_();\n if (tests[currentCategory]) {\n tests[currentCategory].clear = (_a = options === null || options === void 0 ? void 0 : options.clear) !== null && _a !== void 0 ? _a : true;\n tests[currentCategory].timeout = options === null || options === void 0 ? void 0 : options.timeout;\n tests[currentCategory].benchmarks = options === null || options === void 0 ? void 0 : options.benchmarks;\n tests[currentCategory].stressTests = options === null || options === void 0 ? void 0 : options.stressTests;\n tests[currentCategory].owner = options === null || options === void 0 ? void 0 : options.owner;\n }\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nfunction addNamespace(s, f) {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\nexport function initAutoTests(package_, module) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n return __awaiter(this, void 0, void 0, function* () {\n const packageId = package_.id;\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (package_.name === 'DevTools' || (!!module && module._package.name === 'DevTools')) {\n for (const f of window.dartTests) {\n const arr = f.name.split(/\\s*\\|\\s*!/g);\n let name = (_a = arr.pop()) !== null && _a !== void 0 ? _a : f.name;\n let cat = arr.length ? coreCatName + ': ' + arr.join(': ') : coreCatName;\n let fullName = name.split(' | ');\n name = fullName[fullName.length - 1];\n fullName.unshift(cat);\n fullName.pop();\n cat = fullName.join(': ');\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(new Test(cat, name, f.test, { isAggregated: false, timeout: (_c = (_b = f.options) === null || _b === void 0 ? void 0 : _b.timeout) !== null && _c !== void 0 ? _c : STANDART_TIMEOUT, skipReason: (_d = f.options) === null || _d === void 0 ? void 0 : _d.skipReason, owner: (_e = f.options) === null || _e === void 0 ? void 0 : _e.owner, benchmark: (_g = (_f = f.options) === null || _f === void 0 ? void 0 : _f.benchmark) !== null && _g !== void 0 ? _g : false }));\n }\n }\n const moduleAutoTests = [];\n const moduleDemo = [];\n const moduleDetectors = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n const reg = new RegExp(/skip:\\s*([^,\\s]+)|wait:\\s*(\\d+)|cat:\\s*([^,\\s]+)|timeout:\\s*(\\d+)/g);\n for (const f of packFunctions) {\n const tests = f.options['test'];\n const demo = f.options['demoPath'];\n if ((tests && Array.isArray(tests) && tests.length)) {\n for (let i = 0; i < tests.length; i++) {\n const res = tests[i].matchAll(reg);\n const map = {};\n Array.from(res).forEach((arr) => {\n if (arr[0].startsWith('skip'))\n map['skip'] = arr[1];\n else if (arr[0].startsWith('wait'))\n map['wait'] = parseInt(arr[2]);\n else if (arr[0].startsWith('cat'))\n map['cat'] = arr[3];\n else if (arr[0].startsWith('timeout'))\n map['timeout'] = parseInt(arr[4]);\n });\n const test = new Test((_h = map.cat) !== null && _h !== void 0 ? _h : autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {\n const res = yield grok.functions.eval(addNamespace(tests[i], f));\n if (map.wait)\n yield delay(map.wait);\n // eslint-disable-next-line no-throw-literal\n if (typeof res === 'boolean' && !res)\n throw `Failed: ${tests[i]}, expected true, got ${res}`;\n }), { skipReason: map.skip, timeout: DG.Test.isInBenchmark ? (_j = map.benchmarkTimeout) !== null && _j !== void 0 ? _j : BENCHMARK_TIMEOUT : (_k = map.timeout) !== null && _k !== void 0 ? _k : STANDART_TIMEOUT });\n if (map.cat) {\n const cat = map.cat;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n // only before/after can be defined in ts files tests under the category\n if (!moduleTests[cat].tests)\n moduleTests[cat].tests = [];\n moduleTests[cat].tests.push(test);\n }\n else\n moduleAutoTests.push(test);\n }\n }\n if (demo) {\n const wait = f.options['demoWait'] ? parseInt(f.options['demoWait']) : undefined;\n const test = new Test(demoCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n yield delay(300);\n grok.shell.clearLastError();\n yield f.apply();\n yield delay(wait ? wait : 2000);\n const unhandled = yield grok.shell.lastError;\n if (unhandled)\n throw new Error(unhandled);\n }), { skipReason: f.options['demoSkip'] });\n moduleDemo.push(test);\n }\n if (f.hasTag('semTypeDetector')) {\n let detectorsTestData = testData;\n if (f.options['testData']) {\n detectorsTestData = yield grok.data.files.openTable(`System:AppData/${package_.nqName}/${f.options['testData']}`);\n }\n const test = new Test(detectorsCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n const arr = [];\n console.log(`System:AppData/${package_.nqName}/${f.options['testData']}`);\n for (const col of detectorsTestData.clone().columns) {\n const res = yield f.apply([col]);\n arr.push(res || col.semType);\n }\n const resArr = arr.filter((i) => i);\n expect(resArr.length, 1);\n if (f.options['testDataColumnName'])\n expect(resArr[0], f.options['testDataColumnName']);\n }), { skipReason: f.options['skipTest'] });\n moduleDetectors.push(test);\n }\n }\n wasRegistered[packageId] = true;\n if (moduleAutoTests.length > 0)\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests, clear: true };\n if (moduleDemo.length > 0)\n moduleTests[demoCatName] = { tests: moduleDemo, clear: true };\n if (moduleDetectors.length > 0)\n moduleTests[detectorsCatName] = { tests: moduleDetectors, clear: false };\n });\n}\nfunction redefineConsole() {\n const logs = [];\n console.log = (...args) => {\n logs.push(...args);\n stdLog(...args);\n };\n console.info = (...args) => {\n logs.push(...args);\n stdInfo(...args);\n };\n console.warn = (...args) => {\n logs.push(...args);\n stdWarn(...args);\n };\n console.error = (...args) => {\n logs.push(...args);\n stdError(...args);\n };\n return logs;\n}\nfunction resetConsole() {\n console.log = stdLog;\n console.info = stdInfo;\n console.warn = stdWarn;\n console.error = stdError;\n}\nexport function runTests(options) {\n var _a, _b;\n var _c;\n return __awaiter(this, void 0, void 0, function* () {\n const package_ = (options === null || options === void 0 ? void 0 : options.nodeOptions) ? options.nodeOptions.package : grok.functions.getCurrentCall().func.package;\n if (!package_)\n throw new Error('Can\\'t run tests outside of the package');\n const match = (_a = package_.packageOwner) === null || _a === void 0 ? void 0 : _a.match(/<([^>]*)>/);\n const packageOwner = match ? match[1] : '';\n if (package_ != undefined)\n yield initAutoTests(package_);\n const results = [];\n console.log(`Running tests...`);\n console.log(options);\n options !== null && options !== void 0 ? options : (options = {});\n (_b = (_c = options).testContext) !== null && _b !== void 0 ? _b : (_c.testContext = new TestContext());\n grok.shell.clearLastError();\n const logs = redefineConsole();\n yield invokeTests(tests, options);\n for (let r of results) {\n r.result = r.result.toString().replace(/\"/g, '\\'');\n if (r.logs != undefined)\n r.logs = r.logs.toString().replace(/\"/g, '\\'');\n }\n return results;\n function invokeCategoryMethod(method, category) {\n return __awaiter(this, void 0, void 0, function* () {\n let invokationResult = undefined;\n try {\n if (method !== undefined) {\n yield timeout(() => __awaiter(this, void 0, void 0, function* () {\n yield method();\n }), 100000, `before ${category}: timeout error`);\n }\n }\n catch (x) {\n invokationResult = yield getResult(x);\n }\n return invokationResult;\n });\n }\n function invokeTestsInCategory(category, options, isTargetCategory) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;\n return __awaiter(this, void 0, void 0, function* () {\n let t = (_a = category.tests) !== null && _a !== void 0 ? _a : [];\n const res = [];\n // let memoryUsageBefore = (window?.performance as any)?.memory?.usedJSHeapSize;\n const widgetsBefore = getWidgetsCountSafe();\n if (category.clear) {\n let skippingTests = isTargetCategory && options.skipToTest != undefined;\n for (let i = 0; i < t.length; i++) {\n if (t[i].options) {\n if (((_b = t[i].options) === null || _b === void 0 ? void 0 : _b.benchmark) === undefined) {\n if (!t[i].options)\n t[i].options = {};\n t[i].options.benchmark = (_c = category.benchmarks) !== null && _c !== void 0 ? _c : false;\n }\n }\n let test = t[i];\n if (options.test)\n if (options.test.toLowerCase() !== test.name.toLowerCase())\n continue;\n if (skippingTests) {\n if ((options === null || options === void 0 ? void 0 : options.skipToTest) != undefined && test.name.toLowerCase().trim() === (options === null || options === void 0 ? void 0 : options.skipToTest.toLowerCase().trim())) {\n // Found the target test, stop skipping after this one\n skippingTests = false;\n }\n else\n continue;\n }\n if (test === null || test === void 0 ? void 0 : test.options) {\n test.options.owner = (_g = (_f = (_e = (_d = t[i].options) === null || _d === void 0 ? void 0 : _d.owner) !== null && _e !== void 0 ? _e : category === null || category === void 0 ? void 0 : category.owner) !== null && _f !== void 0 ? _f : packageOwner) !== null && _g !== void 0 ? _g : '';\n }\n // let isGBEnable = (window as any).gc && test.options?.skipReason == undefined;\n // console.log(`********${isGBEnable}`);\n // if (isGBEnable)\n // await (window as any).gc();\n // memoryUsageBefore = (window?.performance as any)?.memory?.usedJSHeapSize;\n let testRun = yield execTest(test, options === null || options === void 0 ? void 0 : options.test, logs, DG.Test.isInBenchmark ? (_j = (_h = t[i].options) === null || _h === void 0 ? void 0 : _h.benchmarkTimeout) !== null && _j !== void 0 ? _j : BENCHMARK_TIMEOUT : (_l = (_k = t[i].options) === null || _k === void 0 ? void 0 : _k.timeout) !== null && _l !== void 0 ? _l : STANDART_TIMEOUT, package_.name, options.verbose);\n // if (isGBEnable)\n // await (window as any).gc();\n if (testRun) {\n res.push(Object.assign(Object.assign({}, testRun), { widgetsDifference: getWidgetsCountSafe() - widgetsBefore }));\n // Return early if returnOnFail is set and test failed (but ignore failure for the skipToTest test itself)\n if (options.returnOnFail && options.skipToTest !== test.name && !testRun.success && !testRun.skipped)\n return res;\n }\n // res.push({ ...testRun, memoryDelta: (window?.performance as any)?.memory?.usedJSHeapSize - memoryUsageBefore, widgetsDelta: getWidgetsCountSafe() - widgetsBefore });\n if (!options.nodeOptions && ((_m = options.testContext) === null || _m === void 0 ? void 0 : _m.closeAll) !== false) {\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n }\n }\n }\n else {\n let skippingTests = isTargetCategory && options.skipToTest != undefined;\n for (let i = 0; i < t.length; i++) {\n let test = t[i];\n if (options.test)\n if (options.test.toLowerCase() !== test.name.toLowerCase())\n continue;\n if (skippingTests) {\n if ((options === null || options === void 0 ? void 0 : options.skipToTest) != undefined && test.name.toLowerCase().trim() === (options === null || options === void 0 ? void 0 : options.skipToTest.toLowerCase().trim())) {\n // Found the target test, stop skipping after this one\n skippingTests = false;\n }\n continue; // Skip this test (including the target)\n }\n if (test === null || test === void 0 ? void 0 : test.options) {\n test.options.owner = (_r = (_q = (_p = (_o = t[i].options) === null || _o === void 0 ? void 0 : _o.owner) !== null && _p !== void 0 ? _p : category === null || category === void 0 ? void 0 : category.owner) !== null && _q !== void 0 ? _q : packageOwner) !== null && _r !== void 0 ? _r : '';\n }\n // let isGBEnable = (window as any).gc && test.options?.skipReason == undefined;\n // console.log(`********${isGBEnable}`);\n // if (isGBEnable)\n // await (window as any).gc();\n // memoryUsageBefore = (window?.performance as any)?.memory?.usedJSHeapSize;\n let testRun = yield execTest(test, options === null || options === void 0 ? void 0 : options.test, logs, DG.Test.isInBenchmark ? (_t = (_s = t[i].options) === null || _s === void 0 ? void 0 : _s.benchmarkTimeout) !== null && _t !== void 0 ? _t : BENCHMARK_TIMEOUT : (_u = t[i].options) === null || _u === void 0 ? void 0 : _u.timeout, package_.name, options.verbose);\n // if (isGBEnable)\n // await (window as any).gc();\n if (testRun) {\n res.push(Object.assign(Object.assign({}, testRun), { widgetsDifference: getWidgetsCountSafe() - widgetsBefore }));\n // Return early if returnOnFail is set and test failed (but ignore failure for the skipToTest test itself)\n if (options.returnOnFail && options.skipToTest !== test.name && !testRun.success && !testRun.skipped)\n return res;\n }\n // res.push({ ...testRun, memoryDelta: (window?.performance as any)?.memory?.usedJSHeapSize - memoryUsageBefore, widgetsDifference: getWidgetsCountSafe() - widgetsBefore });\n }\n }\n return res;\n });\n }\n function getWidgetsCountSafe() {\n var _a;\n if (typeof process !== 'undefined')\n return 0;\n let length = -1;\n try {\n length = DG.Widget.getAll().length;\n }\n catch (e) {\n console.warn((_a = e.message) !== null && _a !== void 0 ? _a : e);\n }\n return length;\n }\n function invokeTests(categoriesToInvoke, options) {\n var _a, _b, _c, _d, _e, _f;\n return __awaiter(this, void 0, void 0, function* () {\n try {\n let skippingCategories = (options === null || options === void 0 ? void 0 : options.skipToCategory) != undefined;\n let isTargetCategory = false;\n for (const [key, value] of Object.entries(categoriesToInvoke)) {\n if ((_a = options.exclude) === null || _a === void 0 ? void 0 : _a.some((c) => key.startsWith(c)))\n continue;\n if ((options === null || options === void 0 ? void 0 : options.category) != null && !key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase().trim()))\n continue;\n if (skippingCategories) {\n if (isTargetCategory)\n skippingCategories = false;\n else {\n if ((options === null || options === void 0 ? void 0 : options.skipToCategory) != null && key.toLowerCase().trim() === (options === null || options === void 0 ? void 0 : options.skipToCategory.toLowerCase().trim())) {\n isTargetCategory = true;\n }\n else {\n // Haven't found the target category yet, keep skipping\n continue;\n }\n }\n }\n //@ts-ignore\n const skipped = (_b = value.tests) === null || _b === void 0 ? void 0 : _b.every((t) => {\n var _a;\n return ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason)\n || ((options === null || options === void 0 ? void 0 : options.test) != null && options.test.toLowerCase() !== t.name.toLowerCase());\n });\n if (!skipped) {\n //@ts-ignore\n const skippedCount = ((_c = value.tests) !== null && _c !== void 0 ? _c : []).filter((t) => { var _a; return ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || ((options === null || options === void 0 ? void 0 : options.test) != null && options.test.toLowerCase() !== t.name.toLowerCase()); }).length;\n stdLog(`Package testing: Started {{${key}}}${skippedCount > 0 ? ` skipped {{${skippedCount}}}` : ''}`);\n value.beforeStatus = yield invokeCategoryMethod(value.before, key);\n }\n let t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n if (options.stressTest) {\n t = t.filter((e) => { var _a; return (_a = e.options) === null || _a === void 0 ? void 0 : _a.stressTest; });\n t = shuffle(t);\n }\n if (((_f = (_e = options.tags) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0) > 0) {\n t = t.filter((e) => { var _a, _b; return (_b = (_a = e.options) === null || _a === void 0 ? void 0 : _a.tags) === null || _b === void 0 ? void 0 : _b.some(tag => { var _a; return ((_a = options === null || options === void 0 ? void 0 : options.tags) !== null && _a !== void 0 ? _a : []).includes(tag); }); });\n }\n let res;\n if (value.beforeStatus) {\n res = Array.from(t.map((testElem) => {\n return {\n date: new Date().toISOString(),\n category: key,\n name: testElem.name,\n success: false,\n result: 'before() failed',\n ms: 0,\n skipped: false,\n logs: '',\n owner: packageOwner,\n package: package_.name,\n widgetsDifference: 0,\n flaking: DG.Test.isReproducing\n };\n }));\n res.forEach((test) => __awaiter(this, void 0, void 0, function* () { return yield grok.shell.reportTest('package', test); }));\n }\n else\n res = yield invokeTestsInCategory(value, options, skippingCategories);\n const data = res.filter((d) => d.result != 'skipped');\n if (!skipped)\n value.afterStatus = yield invokeCategoryMethod(value.after, key);\n // Clear after category\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n if (value.afterStatus) {\n stdLog(`Package testing: Category after() {{${key}}} failed`);\n stdLog(`Package testing: Result for {{${key}}} after: ${value.afterStatus}`);\n data.push({\n date: new Date().toISOString(),\n category: key,\n name: 'after',\n success: false,\n result: value.afterStatus,\n ms: 0,\n skipped: false,\n logs: '',\n owner: packageOwner,\n package: package_.name,\n widgetsDifference: 0,\n flaking: DG.Test.isReproducing\n });\n }\n if (value.beforeStatus) {\n stdLog(`Package testing: Category before() {{${key}}} failed`);\n stdLog(`Package testing: Result for {{${key}}} before: ${value.beforeStatus}`);\n data.push({\n date: new Date().toISOString(),\n category: key,\n name: 'before',\n success: false,\n result: value.beforeStatus,\n ms: 0,\n skipped: false,\n logs: '',\n owner: packageOwner,\n package: package_.name,\n widgetsDifference: 0,\n flaking: DG.Test.isReproducing\n });\n }\n results.push(...data);\n // If returnOnFail is set and a test failed (other than skipToTest), stop processing more categories\n if (options.returnOnFail && data.some((d) => !d.success && !d.skipped && d.name !== options.skipToTest))\n break;\n }\n }\n finally {\n resetConsole();\n }\n if (options.testContext.catchUnhandled && (!DG.Test.isInBenchmark)) {\n yield delay(1000);\n const error = yield grok.shell.lastError;\n if (error != undefined) {\n const params = {\n logs: '',\n date: new Date().toISOString(),\n category: 'Unhandled exceptions',\n name: 'Exception',\n result: error !== null && error !== void 0 ? error : '',\n success: !error,\n ms: 0,\n skipped: false,\n owner: packageOwner !== null && packageOwner !== void 0 ? packageOwner : '',\n 'package': package_.name,\n widgetsDifference: 0\n };\n stdLog(`Package testing: Unhandled Exception: ${error}`);\n results.push(Object.assign(Object.assign({}, params), { 'flaking': DG.Test.isReproducing && !error }));\n params.package = package_.name;\n yield grok.shell.reportTest('package', params);\n }\n }\n });\n }\n });\n}\nfunction getResult(x) {\n return __awaiter(this, void 0, void 0, function* () {\n return `${x.toString()}\\n${x.stack ? (yield DG.Logger.translateStackTrace(x.stack)) : ''}`;\n });\n}\nfunction execTest(t, predicate, logs, testTimeout, packageName, verbose) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n return __awaiter(this, void 0, void 0, function* () {\n logs.length = 0;\n let r;\n let type = 'package';\n const filter = predicate != undefined && (t.name.toLowerCase() !== predicate.toLowerCase());\n let skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n let skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (DG.Test.isInBenchmark && !((_c = t.options) === null || _c === void 0 ? void 0 : _c.benchmark)) {\n stdLog(`Package testing: Skipped {{${t.category}}} {{${t.name}}} doesnt available in benchmark mode`);\n return undefined;\n }\n if (skip && !DG.Test.isInBenchmark)\n stdLog(`Package testing: Skipped {{${t.category}}} {{${t.name}}}`);\n if (!skip)\n stdLog(`Package testing: Started {{${t.category}}} {{${t.name}}}`);\n const start = Date.now();\n const startDate = new Date(start).toISOString();\n try {\n if (skip)\n r = { name: t.name, owner: (_e = (_d = t.options) === null || _d === void 0 ? void 0 : _d.owner) !== null && _e !== void 0 ? _e : '', category: t.category, logs: '', date: startDate, success: true, result: skipReason, ms: 0, skipped: true, package: packageName !== null && packageName !== void 0 ? packageName : '', flaking: DG.Test.isReproducing };\n else {\n let timeout_ = testTimeout !== null && testTimeout !== void 0 ? testTimeout : STANDART_TIMEOUT;\n if (DG.Test.isProfiling)\n console.profile(`${t.category}: ${t.name}`);\n r = { name: t.name, owner: (_g = (_f = t.options) === null || _f === void 0 ? void 0 : _f.owner) !== null && _g !== void 0 ? _g : '', category: t.category, logs: '', date: startDate, success: true, result: (_h = (yield timeout(t.test, timeout_)).toString()) !== null && _h !== void 0 ? _h : 'OK', ms: 0, skipped: false, package: packageName !== null && packageName !== void 0 ? packageName : '', flaking: DG.Test.isReproducing };\n if (DG.Test.isProfiling) {\n console.profileEnd(`${t.category}: ${t.name}`);\n grok.shell.info(`Profiling of ${t.category}: ${t.name} finished \\n Please ensure that you have opened DevTools (F12) / Performance panel before test starts.`);\n }\n }\n }\n catch (x) {\n stdError(x);\n r = { name: t.name, owner: (_k = (_j = t.options) === null || _j === void 0 ? void 0 : _j.owner) !== null && _k !== void 0 ? _k : '', category: t.category, logs: '', date: startDate, success: false, result: yield getResult(x), ms: 0, skipped: false, package: packageName !== null && packageName !== void 0 ? packageName : '', flaking: false };\n }\n if (((_l = t.options) === null || _l === void 0 ? void 0 : _l.isAggregated) && r.result.constructor === DG.DataFrame) {\n const col = r.result.col('success');\n if (col)\n r.success = col.stats.sum === col.length;\n if (!verbose) {\n const df = r.result;\n df.columns.remove('stack');\n df.rows.removeWhere((r) => r.get('success'));\n r.result = df;\n }\n r.result = r.result.toCsv();\n }\n r.logs = logs.join('\\n');\n r.ms = Date.now() - start;\n if (!skip)\n stdLog(`Package testing: Finished {{${t.category}}} {{${t.name}}} with {{${r.success ? 'success' : 'error'}}} for ${r.ms} ms`);\n if (!r.success) {\n stdLog(`Package testing: Result for {{${t.category}}} {{${t.name}}}: ${r.result}`);\n }\n r.category = t.category;\n r.name = t.name;\n r.owner = (_o = (_m = t.options) === null || _m === void 0 ? void 0 : _m.owner) !== null && _o !== void 0 ? _o : '';\n if (!filter) {\n let params = {\n 'success': r.success, 'result': r.result, 'ms': r.ms, 'date': r.date,\n 'skipped': r.skipped, 'category': t.category, 'name': t.name, 'logs': r.logs, 'owner': r.owner,\n 'flaking': DG.Test.isReproducing && r.success,\n 'package': r.package\n };\n if (r.result.constructor == Object) {\n const res = Object.keys(r.result).reduce((acc, k) => (Object.assign(Object.assign({}, acc), { ['result.' + k]: r.result[k] })), {});\n params = Object.assign(Object.assign({}, params), res);\n }\n if (params.result instanceof DG.DataFrame)\n params.result = JSON.stringify((_p = params.result) === null || _p === void 0 ? void 0 : _p.toJson()) || '';\n yield grok.shell.reportTest(type, params);\n }\n return r;\n });\n}\nexport function shuffle(array) {\n const newArr = array.slice();\n newArr.sort(() => Math.random() - 0.5);\n return newArr;\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500, interval = 50) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const intervalId = setInterval(() => {\n if (checkHandler()) {\n clearInterval(intervalId);\n resolve(null);\n }\n }, interval);\n });\n });\n}\n// Returns test execution result or an error in case of timeout\nexport function timeout(func, testTimeout, timeoutReason = 'EXECUTION TIMEOUT') {\n return __awaiter(this, void 0, void 0, function* () {\n let timeout = null;\n const timeoutPromise = new Promise((_, reject) => {\n timeout = setTimeout(() => {\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(timeoutReason);\n }, testTimeout);\n });\n try {\n return yield Promise.race([func(), timeoutPromise]);\n }\n finally {\n if (timeout)\n clearTimeout(timeout);\n }\n });\n}\nexport function isDialogPresent(dialogTitle) {\n const dialogs = DG.Dialog.getOpenDialogs();\n for (let i = 0; i < dialogs.length; i++) {\n if (dialogs[i].title == dialogTitle)\n return true;\n }\n return false;\n}\n/** Expects an asynchronous {@link action} to throw an exception. Use {@link check} to perform\n * deeper inspection of the exception if necessary.\n * @param {function(): Promise<void>} action\n * @param {function(any): boolean} check\n * @return {Promise<void>}\n */\nexport function expectExceptionAsync(action, check) {\n return __awaiter(this, void 0, void 0, function* () {\n let caught = false;\n let checked = false;\n try {\n yield action();\n }\n catch (e) {\n caught = true;\n checked = !check || check(e);\n }\n finally {\n if (!caught)\n throw new Error('An exception is expected but not thrown');\n if (!checked)\n throw new Error('An expected exception is thrown, but it does not satisfy the condition');\n }\n });\n}\nconst catDF = DG.DataFrame.fromColumns([DG.Column.fromStrings('col', ['val1', 'val2', 'val3'])]);\n/**\n * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a\n * @param {string} v Viewer name\n * @param {_DG.DataFrame} df Dataframe to use. Should have at least 3 rows\n * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not\n * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test\n * @param {boolean} options.arbitraryDfTest If set to false, test on arbitrary dataframe\n * (one categorical column) will not be performed\n * @param {object} options List of options (optional)\n * @return {Promise<void>} The test is considered successful if it completes without errors\n */\nexport function testViewer(v, df, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const packageName = (_a = options === null || options === void 0 ? void 0 : options.packageName) !== null && _a !== void 0 ? _a : '';\n if (options === null || options === void 0 ? void 0 : options.detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n try {\n //1. Open, do nothing and close\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded);\n //in case viewer with async rendering - wait for render to complete\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, undefined, options.awaitViewer);\n //2. Open viewer, run selection, filter, etc. and close\n if (!(options === null || options === void 0 ? void 0 : options.readOnly)) {\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, selectFilterChangeCurrent);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, selectFilterChangeCurrent, options.awaitViewer);\n }\n //2. Open viewer, change options, save layout and close\n let propsAndLayout = null;\n propsAndLayout = yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, changeOptionsSaveLayout);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n propsAndLayout = yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, changeOptionsSaveLayout, options.awaitViewer);\n //3. Load layout\n yield testViewerInternal(tv, v, packageName, grok.events.onViewLayoutApplied, loadLayout, undefined, propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.layout, { savedProps: propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.savedProps });\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewLayoutApplied, loadLayout, options.awaitViewer, propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.layout, { savedProps: propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.savedProps });\n //4. Open viewer on arbitary dataset\n if ((options === null || options === void 0 ? void 0 : options.arbitraryDfTest) !== false) {\n tv.dataFrame = catDF;\n yield delay(50);\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, undefined, options.awaitViewer);\n }\n //5. Call postponed filtering\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, filterAsync);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, filterAsync, options.awaitViewer);\n }\n finally {\n // closeAll() is handling by common test workflow\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBS0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEksTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUM7QUFFbkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUVkLEVBQUUsQ0FBQztBQUVQLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztBQUNyQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQStCLEVBQUUsQ0FBQztBQUNyRCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBS3RCO0FBTEQsV0FBaUIsTUFBTTtJQUNyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZ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QUFFLENBQUM7b0JBQzVHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQzlCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7NEJBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDL0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs0QkFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUM5RCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDOzRCQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2xELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7NEJBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0UsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBQSxHQUFHLENBQUMsR0FBRyxtQ0FBSSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFTLEVBQUU7d0JBQ2hILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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USxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzVHO1lBRUQsNkJBQTZCO1lBQzdCLE1BQU0sa0JBQWtCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckYsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVztnQkFDdEIsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsT0FBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBRTlHO2dCQUFTO1lBQ1IsaURBQWlEO1lBQ2pELHlCQUF5QjtZQUN6Qix5QkFBeUI7U0FDMUI7O0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIF9ncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCB0eXBlICogYXMgX0RHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5kZWNsYXJlIGxldCBncm9rOiB0eXBlb2YgX2dyb2ssIERHOiB0eXBlb2YgX0RHO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0ZXN0RGF0YSB9IGZyb20gJy4vZGF0YWZyYW1lLXV0aWxzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5pbXBvcnQgeyBjaGFuZ2VPcHRpb25zU2F2ZUxheW91dCwgZmlsdGVyQXN5bmMsIGxvYWRMYXlvdXQsIHNlbGVjdEZpbHRlckNoYW5nZUN1cnJlbnQsIHRlc3RWaWV3ZXJJbnRlcm5hbCB9IGZyb20gJy4vdGVzdC12aWV3ZXItdXRpbHMnO1xuXG5jb25zdCBTVEFOREFSVF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBCRU5DSE1BUktfVElNRU9VVCA9IDEwODAwMDAwO1xuXG5jb25zdCBzdGRMb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkSW5mbyA9IGNvbnNvbGUuaW5mby5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkRXJyb3IgPSBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiBDYXRlZ29yeVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3QgZGVtb0NhdE5hbWUgPSAnRGVtbyc7XG5jb25zdCBkZXRlY3RvcnNDYXROYW1lID0gJ0RldGVjdG9ycyc7XG5jb25zdCBjb3JlQ2F0TmFtZSA9ICdDb3JlJztcbmNvbnN0IHdhc1JlZ2lzdGVyZWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5leHBvcnQgbGV0IGN1cnJlbnRDYXRlZ29yeTogc3RyaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIGFzc3VyZSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgYmVuY2htYXJrV2FyblRpbWVvdXQ/OiBudW1iZXI7XG4gIGJlbmNobWFya1RpbWVvdXQ/OiBudW1iZXI7XG4gIHVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIHNraXBSZWFzb24/OiBzdHJpbmc7XG4gIGlzQWdncmVnYXRlZD86IGJvb2xlYW47XG4gIGJlbmNobWFyaz86IGJvb2xlYW47XG4gIHN0cmVzc1Rlc3Q/OiBib29sZWFuO1xuICBvd25lcj86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSZXN1bHQge1xuICBkYXRlOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgcmVzdWx0OiBhbnk7XG4gIG1zOiBudW1iZXI7XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIGxvZ3M6IHN0cmluZztcbiAgb3duZXI6IHN0cmluZztcbiAgcGFja2FnZTogc3RyaW5nO1xuICBmbGFraW5nOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJlc3VsdEV4dGVuZGVkIGV4dGVuZHMgVGVzdFJlc3VsdHtcbiAgd2lkZ2V0c0RpZmZlcmVuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeU9wdGlvbnMge1xuICBjbGVhcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGJlbmNobWFya3M/OiBib29sZWFuO1xuICBzdHJlc3NUZXN0cz86IGJvb2xlYW47XG4gIG93bmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENvbnRleHQge1xuICBzdHJlc3NUZXN0PzogYm9vbGVhbjtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcbiAgcmV0dXJuT25GYWlsID0gZmFsc2U7XG4gIGNsb3NlQWxsID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4sIHJldHVybk9uRmFpbD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gICAgaWYgKHJldHVybk9uRmFpbCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJldHVybk9uRmFpbCA9IHJldHVybk9uRmFpbDtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT47XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgb3B0aW9ucz86IFRlc3RPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGVnb3J5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPz89IFNUQU5EQVJUX1RJTUVPVVQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoREcuVGVzdC5pc0luRGVidWcpXG4gICAgICAgICAgICBkZWJ1Z2dlcjtcblxuICAgICAgICAgIGxldCByZXMgPSBhd2FpdCB0ZXN0KCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlcz8udG9TdHJpbmcoKSA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICdDYW5cXCd0IGNvbnZlcnQgdGVzdFxcJ3MgcmVzdWx0IHRvIHN0cmluZyc7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5cXCd0IGNvbnZlcnQgdGVzdFxcJ3MgcmVzdWx0IHRvIHN0cmluZyBpbiB0aGUgJHt0aGlzLmNhdGVnb3J5fToke3RoaXMubmFtZX0gdGVzdGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3J5IHtcbiAgdGVzdHM/OiBUZXN0W107XG4gIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICBiZWZvcmVTdGF0dXM/OiBzdHJpbmc7XG4gIGFmdGVyU3RhdHVzPzogc3RyaW5nO1xuICBjbGVhcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGJlbmNobWFya3M/OiBib29sZWFuO1xuICBiZW5jaG1hcmtUaW1lb3V0PzogbnVtYmVyO1xuICBzdHJlc3NUZXN0cz86IGJvb2xlYW47XG4gIG93bmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTm9kZVRlc3RFeGVjdXRpb25PcHRpb25zIHtcbiAgcGFja2FnZSE6IF9ERy5QYWNrYWdlO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdEV4ZWN1dGlvbk9wdGlvbnMge1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgdGVzdD86IHN0cmluZztcbiAgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dDtcbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgc3RyZXNzVGVzdD86IGJvb2xlYW47XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgbm9kZU9wdGlvbnM/OiBOb2RlVGVzdEV4ZWN1dGlvbk9wdGlvbnM7XG4gIHNraXBUb0NhdGVnb3J5Pzogc3RyaW5nO1xuICBza2lwVG9UZXN0Pzogc3RyaW5nO1xuICByZXR1cm5PbkZhaWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEV2ZW50PFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gdm9pZCwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDAsIHJlYXNvbjogc3RyaW5nID0gYHRpbWVvdXRgXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJnczogVCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudEFzeW5jPFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gUHJvbWlzZTx2b2lkPiwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDAsIHJlYXNvbjogc3RyaW5nID0gYHRpbWVvdXRgXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJnczogVCkgPT4ge1xuICAgICAgaGFuZGxlcihhcmdzKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkgPSB0cnVlLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXJyb3IpXG4gICAgZXJyb3IgPSBgJHtlcnJvcn0sIGA7XG4gIGVsc2UgZXJyb3IgPSAnJztcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfUV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKChhY3R1YWwgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB8fFxuICAgIChhY3R1YWwgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSB8fFxuICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfTsgYSA9ICR7YWN0dWFsfSwgZSA9ICR7ZXhwZWN0ZWR9KWApO1xuICBpZiAoIWFyZUVxdWFsKVxuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH0gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdFRhYmxlKGFjdHVhbDogX0RHLkRhdGFGcmFtZSwgZXhwZWN0ZWQ6IF9ERy5EYXRhRnJhbWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGV4cGVjdGVkUm93Q291bnQgPSBleHBlY3RlZC5yb3dDb3VudDtcbiAgY29uc3QgYWN0dWFsUm93Q291bnQgPSBhY3R1YWwucm93Q291bnQ7XG4gIGV4cGVjdChhY3R1YWxSb3dDb3VudCwgZXhwZWN0ZWRSb3dDb3VudCwgYCR7ZXJyb3IgPz8gJyd9LCByb3cgY291bnRgKTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBleHBlY3RlZC5jb2x1bW5zKSB7XG4gICAgY29uc3QgYWN0dWFsQ29sdW1uID0gYWN0dWFsLmNvbHVtbnMuYnlOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uLnR5cGUgIT0gY29sdW1uLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSB0eXBlIGV4cGVjdGVkICR7Y29sdW1uLnR5cGV9IGdvdCAke2FjdHVhbENvbHVtbi50eXBlfWApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWRSb3dDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbi5nZXQoaSk7XG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbENvbHVtbi5nZXQoaSk7XG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5GTE9BVClcbiAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIHZhbHVlLCAwLjAwMDEsIGVycm9yKTtcbiAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09IERHLlRZUEUuREFURV9USU1FKVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUuaXNTYW1lKHZhbHVlKSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgZWxzZVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUsIHZhbHVlLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RPYmplY3QoYWN0dWFsOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBleHBlY3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFhY3R1YWwuaGFzT3duUHJvcGVydHkoZXhwZWN0ZWRLZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwcm9wZXJ0eSBcIiR7ZXhwZWN0ZWRLZXl9XCIgbm90IGZvdW5kYCk7XG5cbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlICE9IGV4cGVjdGVkVmFsdWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICgke2V4cGVjdGVkVmFsdWV9KSBmb3Iga2V5ICcke2V4cGVjdGVkS2V5fScsIGdvdCAoJHthY3R1YWxWYWx1ZX0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5KGFjdHVhbDogQXJyYXlMaWtlPGFueT4sIGV4cGVjdGVkOiBBcnJheUxpa2U8YW55Pikge1xuICBjb25zdCBhY3R1YWxMZW5ndGggPSBhY3R1YWwubGVuZ3RoO1xuICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcblxuICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCBsZW5ndGg6IGFjdHVhbCBhcnJheSBsZW5ndGggaXMgJHthY3R1YWxMZW5ndGh9IGAgK1xuICAgICAgYGFuZCBleHBlY3RlZCBhcnJheSBsZW5ndGggaXMgJHtleHBlY3RlZExlbmd0aH1gKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0c186ICgpID0+IHZvaWQsIG9wdGlvbnM/OiBDYXRlZ29yeU9wdGlvbnMpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzXygpO1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSkge1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uY2xlYXIgPSBvcHRpb25zPy5jbGVhciA/PyB0cnVlO1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQ7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZW5jaG1hcmtzID0gb3B0aW9ucz8uYmVuY2htYXJrcztcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnN0cmVzc1Rlc3RzID0gb3B0aW9ucz8uc3RyZXNzVGVzdHM7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5vd25lciA9IG9wdGlvbnM/Lm93bmVyO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5mdW5jdGlvbiBhZGROYW1lc3BhY2Uoczogc3RyaW5nLCBmOiBfREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfOiBfREcuUGFja2FnZSwgbW9kdWxlPzogYW55KSB7XG4gIGNvbnN0IHBhY2thZ2VJZCA9IHBhY2thZ2VfLmlkO1xuICBpZiAod2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVRlc3RzID0gbW9kdWxlID8gbW9kdWxlLnRlc3RzIDogdGVzdHM7XG4gIGlmIChwYWNrYWdlXy5uYW1lID09PSAnRGV2VG9vbHMnIHx8ICghIW1vZHVsZSAmJiBtb2R1bGUuX3BhY2thZ2UubmFtZSA9PT0gJ0RldlRvb2xzJykpIHtcbiAgICBmb3IgKGNvbnN0IGYgb2YgKDxhbnk+d2luZG93KS5kYXJ0VGVzdHMpIHtcbiAgICAgIGNvbnN0IGFyciA9IGYubmFtZS5zcGxpdCgvXFxzKlxcfFxccyohL2cpO1xuICAgICAgbGV0IG5hbWUgPSBhcnIucG9wKCkgPz8gZi5uYW1lO1xuICAgICAgbGV0IGNhdCA9IGFyci5sZW5ndGggPyBjb3JlQ2F0TmFtZSArICc6ICcgKyBhcnIuam9pbignOiAnKSA6IGNvcmVDYXROYW1lO1xuICAgICAgbGV0IGZ1bGxOYW1lOiBzdHJpbmdbXSA9IG5hbWUuc3BsaXQoJyB8ICcpO1xuICAgICAgbmFtZSA9IGZ1bGxOYW1lW2Z1bGxOYW1lLmxlbmd0aCAtIDFdO1xuICAgICAgZnVsbE5hbWUudW5zaGlmdChjYXQpO1xuICAgICAgZnVsbE5hbWUucG9wKCk7XG4gICAgICBjYXQgPSBmdWxsTmFtZS5qb2luKCc6ICcpO1xuICAgICAgaWYgKG1vZHVsZVRlc3RzW2NhdF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgbW9kdWxlVGVzdHNbY2F0XSA9IHsgdGVzdHM6IFtdLCBjbGVhcjogdHJ1ZSB9O1xuICAgICAgbW9kdWxlVGVzdHNbY2F0XS50ZXN0cy5wdXNoKG5ldyBUZXN0KGNhdCwgbmFtZSwgZi50ZXN0LCB7IGlzQWdncmVnYXRlZDogZmFsc2UsIHRpbWVvdXQ6IGYub3B0aW9ucz8udGltZW91dCA/PyBTVEFOREFSVF9USU1FT1VULCBza2lwUmVhc29uOiBmLm9wdGlvbnM/LnNraXBSZWFzb24sIG93bmVyOiBmLm9wdGlvbnM/Lm93bmVyLCBiZW5jaG1hcms6IGYub3B0aW9ucz8uYmVuY2htYXJrID8/IGZhbHNlIH0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbW9kdWxlQXV0b1Rlc3RzID0gW107XG4gIGNvbnN0IG1vZHVsZURlbW8gPSBbXTtcbiAgY29uc3QgbW9kdWxlRGV0ZWN0b3JzID0gW107XG4gIGNvbnN0IHBhY2tGdW5jdGlvbnMgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbHRlcihgcGFja2FnZS5pZCA9IFwiJHtwYWNrYWdlSWR9XCJgKS5saXN0KCk7XG4gIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoL3NraXA6XFxzKihbXixcXHNdKyl8d2FpdDpcXHMqKFxcZCspfGNhdDpcXHMqKFteLFxcc10rKXx0aW1lb3V0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBjb25zdCBkZW1vID0gZi5vcHRpb25zWydkZW1vUGF0aCddO1xuICAgIGlmICgodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgICBjb25zdCBtYXA6IHsgc2tpcD86IHN0cmluZywgd2FpdD86IG51bWJlciwgY2F0Pzogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyLCBiZW5jaG1hcmtUaW1lb3V0PzogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgQXJyYXkuZnJvbShyZXMpLmZvckVhY2goKGFycikgPT4ge1xuICAgICAgICAgIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnc2tpcCcpKSBtYXBbJ3NraXAnXSA9IGFyclsxXTtcbiAgICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnd2FpdCcpKSBtYXBbJ3dhaXQnXSA9IHBhcnNlSW50KGFyclsyXSk7XG4gICAgICAgICAgZWxzZSBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ2NhdCcpKSBtYXBbJ2NhdCddID0gYXJyWzNdO1xuICAgICAgICAgIGVsc2UgaWYgKGFyclswXS5zdGFydHNXaXRoKCd0aW1lb3V0JykpIG1hcFsndGltZW91dCddID0gcGFyc2VJbnQoYXJyWzRdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRlc3QgPSBuZXcgVGVzdChtYXAuY2F0ID8/IGF1dG9UZXN0c0NhdE5hbWUsIHRlc3RzLmxlbmd0aCA9PT0gMSA/IGYubmFtZSA6IGAke2YubmFtZX0gJHtpICsgMX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuZXZhbChhZGROYW1lc3BhY2UodGVzdHNbaV0sIGYpKTtcbiAgICAgICAgICBpZiAobWFwLndhaXQpIGF3YWl0IGRlbGF5KG1hcC53YWl0KTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnYm9vbGVhbicgJiYgIXJlcykgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX0sIGV4cGVjdGVkIHRydWUsIGdvdCAke3Jlc31gO1xuICAgICAgICB9LCB7IHNraXBSZWFzb246IG1hcC5za2lwLCB0aW1lb3V0OiBERy5UZXN0LmlzSW5CZW5jaG1hcmsgPyBtYXAuYmVuY2htYXJrVGltZW91dCA/PyBCRU5DSE1BUktfVElNRU9VVCA6IG1hcC50aW1lb3V0ID8/IFNUQU5EQVJUX1RJTUVPVVQgfSk7XG4gICAgICAgIGlmIChtYXAuY2F0KSB7XG4gICAgICAgICAgY29uc3QgY2F0OiBzdHJpbmcgPSBtYXAuY2F0O1xuICAgICAgICAgIGlmIChtb2R1bGVUZXN0c1tjYXRdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBtb2R1bGVUZXN0c1tjYXRdID0geyB0ZXN0czogW10sIGNsZWFyOiB0cnVlIH07XG5cbiAgICAgICAgICAvLyBvbmx5IGJlZm9yZS9hZnRlciBjYW4gYmUgZGVmaW5lZCBpbiB0cyBmaWxlcyB0ZXN0cyB1bmRlciB0aGUgY2F0ZWdvcnlcbiAgICAgICAgICBpZiAoIW1vZHVsZVRlc3RzW2NhdF0udGVzdHMpXG4gICAgICAgICAgICBtb2R1bGVUZXN0c1tjYXRdLnRlc3RzID0gW107XG4gICAgICAgICAgbW9kdWxlVGVzdHNbY2F0XS50ZXN0cy5wdXNoKHRlc3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBtb2R1bGVBdXRvVGVzdHMucHVzaCh0ZXN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbW8pIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBmLm9wdGlvbnNbJ2RlbW9XYWl0J10gPyBwYXJzZUludChmLm9wdGlvbnNbJ2RlbW9XYWl0J10pIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdGVzdCA9IG5ldyBUZXN0KGRlbW9DYXROYW1lLCBmLmZyaWVuZGx5TmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBkZWxheSgzMDApO1xuICAgICAgICBncm9rLnNoZWxsLmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIGF3YWl0IGYuYXBwbHkoKTtcbiAgICAgICAgYXdhaXQgZGVsYXkod2FpdCA/IHdhaXQgOiAyMDAwKTtcbiAgICAgICAgY29uc3QgdW5oYW5kbGVkID0gYXdhaXQgZ3Jvay5zaGVsbC5sYXN0RXJyb3I7XG4gICAgICAgIGlmICh1bmhhbmRsZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHVuaGFuZGxlZCk7XG4gICAgICB9LCB7IHNraXBSZWFzb246IGYub3B0aW9uc1snZGVtb1NraXAnXSB9KTtcbiAgICAgIG1vZHVsZURlbW8ucHVzaCh0ZXN0KTtcbiAgICB9XG4gICAgaWYgKGYuaGFzVGFnKCdzZW1UeXBlRGV0ZWN0b3InKSkge1xuICAgICAgbGV0IGRldGVjdG9yc1Rlc3REYXRhID0gdGVzdERhdGE7XG4gICAgICBpZiAoZi5vcHRpb25zWyd0ZXN0RGF0YSddKSB7XG4gICAgICAgIGRldGVjdG9yc1Rlc3REYXRhID0gYXdhaXQgZ3Jvay5kYXRhLmZpbGVzLm9wZW5UYWJsZShgU3lzdGVtOkFwcERhdGEvJHtwYWNrYWdlXy5ucU5hbWV9LyR7Zi5vcHRpb25zWyd0ZXN0RGF0YSddfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0ID0gbmV3IFRlc3QoZGV0ZWN0b3JzQ2F0TmFtZSwgZi5mcmllbmRseU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgIGNvbnNvbGUubG9nKGBTeXN0ZW06QXBwRGF0YS8ke3BhY2thZ2VfLm5xTmFtZX0vJHtmLm9wdGlvbnNbJ3Rlc3REYXRhJ119YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZGV0ZWN0b3JzVGVzdERhdGEuY2xvbmUoKS5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZi5hcHBseShbY29sXSk7XG4gICAgICAgICAgYXJyLnB1c2gocmVzIHx8IGNvbC5zZW1UeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNBcnIgPSBhcnIuZmlsdGVyKChpKSA9PiBpKTtcbiAgICAgICAgZXhwZWN0KHJlc0Fyci5sZW5ndGgsIDEpO1xuXG4gICAgICAgIGlmIChmLm9wdGlvbnNbJ3Rlc3REYXRhQ29sdW1uTmFtZSddKVxuICAgICAgICAgIGV4cGVjdChyZXNBcnJbMF0sIGYub3B0aW9uc1sndGVzdERhdGFDb2x1bW5OYW1lJ10pO1xuXG4gICAgICB9LCB7IHNraXBSZWFzb246IGYub3B0aW9uc1snc2tpcFRlc3QnXSB9KTtcbiAgICAgIG1vZHVsZURldGVjdG9ycy5wdXNoKHRlc3QpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAobW9kdWxlQXV0b1Rlc3RzLmxlbmd0aCA+IDApXG4gICAgbW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gPSB7IHRlc3RzOiBtb2R1bGVBdXRvVGVzdHMsIGNsZWFyOiB0cnVlIH07XG4gIGlmIChtb2R1bGVEZW1vLmxlbmd0aCA+IDApXG4gICAgbW9kdWxlVGVzdHNbZGVtb0NhdE5hbWVdID0geyB0ZXN0czogbW9kdWxlRGVtbywgY2xlYXI6IHRydWUgfTtcbiAgaWYgKG1vZHVsZURldGVjdG9ycy5sZW5ndGggPiAwKVxuICAgIG1vZHVsZVRlc3RzW2RldGVjdG9yc0NhdE5hbWVdID0geyB0ZXN0czogbW9kdWxlRGV0ZWN0b3JzLCBjbGVhcjogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gcmVkZWZpbmVDb25zb2xlKCk6IGFueVtdIHtcbiAgY29uc3QgbG9nczogYW55W10gPSBbXTtcbiAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5hcmdzKTtcbiAgICBzdGRMb2coLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZEluZm8oLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUud2FybiA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZFdhcm4oLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5hcmdzKTtcbiAgICBzdGRFcnJvciguLi5hcmdzKTtcbiAgfTtcbiAgcmV0dXJuIGxvZ3M7XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q29uc29sZSgpOiB2b2lkIHtcbiAgY29uc29sZS5sb2cgPSBzdGRMb2c7XG4gIGNvbnNvbGUuaW5mbyA9IHN0ZEluZm87XG4gIGNvbnNvbGUud2FybiA9IHN0ZFdhcm47XG4gIGNvbnNvbGUuZXJyb3IgPSBzdGRFcnJvcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKG9wdGlvbnM/OiBUZXN0RXhlY3V0aW9uT3B0aW9ucykgOiBQcm9taXNlPFRlc3RSZXN1bHRFeHRlbmRlZFtdPntcblxuICBjb25zdCBwYWNrYWdlXzogX0RHLlBhY2thZ2UgPSBvcHRpb25zPy5ub2RlT3B0aW9ucyA/IG9wdGlvbnMubm9kZU9wdGlvbnMucGFja2FnZSA6IGdyb2suZnVuY3Rpb25zLmdldEN1cnJlbnRDYWxsKCkuZnVuYy5wYWNrYWdlO1xuICBpZiAoIXBhY2thZ2VfKVxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBydW4gdGVzdHMgb3V0c2lkZSBvZiB0aGUgcGFja2FnZScpO1xuICBjb25zdCBtYXRjaCA9IHBhY2thZ2VfLnBhY2thZ2VPd25lcj8ubWF0Y2goLzwoW14+XSopPi8pO1xuICBjb25zdCBwYWNrYWdlT3duZXIgPSBtYXRjaCA/IG1hdGNoWzFdIDogJyc7XG4gIGlmIChwYWNrYWdlXyAhPSB1bmRlZmluZWQpXG4gICAgYXdhaXQgaW5pdEF1dG9UZXN0cyhwYWNrYWdlXyk7XG4gIGNvbnN0IHJlc3VsdHM6VGVzdFJlc3VsdEV4dGVuZGVkW10gPSBbXTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHMuLi5gKTtcbiAgY29uc29sZS5sb2cob3B0aW9ucyk7XG4gIG9wdGlvbnMgPz89IHt9O1xuICBvcHRpb25zIS50ZXN0Q29udGV4dCA/Pz0gbmV3IFRlc3RDb250ZXh0KCk7XG4gIGdyb2suc2hlbGwuY2xlYXJMYXN0RXJyb3IoKTtcbiAgY29uc3QgbG9ncyA9IHJlZGVmaW5lQ29uc29sZSgpO1xuXG4gIGF3YWl0IGludm9rZVRlc3RzKHRlc3RzLCBvcHRpb25zKTtcblxuICBmb3IgKGxldCByIG9mIHJlc3VsdHMpIHtcbiAgICByLnJlc3VsdCA9IHIucmVzdWx0LnRvU3RyaW5nKCkucmVwbGFjZSgvXCIvZywgJ1xcJycpO1xuICAgIGlmIChyLmxvZ3MgIT0gdW5kZWZpbmVkKVxuICAgICAgci5sb2dzID0gci5sb2dzIS50b1N0cmluZygpLnJlcGxhY2UoL1wiL2csICdcXCcnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcblxuICBhc3luYyBmdW5jdGlvbiBpbnZva2VDYXRlZ29yeU1ldGhvZChtZXRob2Q6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZCwgY2F0ZWdvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGludm9rYXRpb25SZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChtZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBtZXRob2QoKTtcbiAgICAgICAgfSwgMTAwMDAwLCBgYmVmb3JlICR7Y2F0ZWdvcnl9OiB0aW1lb3V0IGVycm9yYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICBpbnZva2F0aW9uUmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0KHgpO1xuICAgIH1cbiAgICByZXR1cm4gaW52b2thdGlvblJlc3VsdFxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW52b2tlVGVzdHNJbkNhdGVnb3J5KGNhdGVnb3J5OiBDYXRlZ29yeSwgb3B0aW9uczogVGVzdEV4ZWN1dGlvbk9wdGlvbnMsIGlzVGFyZ2V0Q2F0ZWdvcnk6IGJvb2xlYW4pOiBQcm9taXNlPFRlc3RSZXN1bHRFeHRlbmRlZFtdPiB7XG4gICAgbGV0IHQgPSBjYXRlZ29yeS50ZXN0cyA/PyBbXTtcbiAgICBjb25zdCByZXMgOiBUZXN0UmVzdWx0RXh0ZW5kZWRbXSA9IFtdO1xuICAgIC8vIGxldCBtZW1vcnlVc2FnZUJlZm9yZSA9ICh3aW5kb3c/LnBlcmZvcm1hbmNlIGFzIGFueSk/Lm1lbW9yeT8udXNlZEpTSGVhcFNpemU7XG4gICAgY29uc3Qgd2lkZ2V0c0JlZm9yZSA9IGdldFdpZGdldHNDb3VudFNhZmUoKTtcblxuICAgIGlmIChjYXRlZ29yeS5jbGVhcikge1xuICAgICAgICBsZXQgc2tpcHBpbmdUZXN0cyA9IGlzVGFyZ2V0Q2F0ZWdvcnkgJiYgb3B0aW9ucy5za2lwVG9UZXN0ICE9IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGlmICh0W2ldLm9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAodFtpXS5vcHRpb25zPy5iZW5jaG1hcmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKCF0W2ldLm9wdGlvbnMpXG4gICAgICAgICAgICAgIHRbaV0ub3B0aW9ucyA9IHt9XG4gICAgICAgICAgICB0W2ldLm9wdGlvbnMhLmJlbmNobWFyayA9IGNhdGVnb3J5LmJlbmNobWFya3MgPz8gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXN0ID0gdFtpXTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGVzdClcbiAgICAgICAgICBpZiAob3B0aW9ucy50ZXN0LnRvTG93ZXJDYXNlKCkgIT09IHRlc3QubmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChza2lwcGluZ1Rlc3RzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnNraXBUb1Rlc3QgIT0gdW5kZWZpbmVkICYmIHRlc3QubmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gb3B0aW9ucz8uc2tpcFRvVGVzdC50b0xvd2VyQ2FzZSgpLnRyaW0oKSkge1xuICAgICAgICAgICAgLy8gRm91bmQgdGhlIHRhcmdldCB0ZXN0LCBzdG9wIHNraXBwaW5nIGFmdGVyIHRoaXMgb25lXG4gICAgICAgICAgICBza2lwcGluZ1Rlc3RzID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlc3Q/Lm9wdGlvbnMpIHtcbiAgICAgICAgICB0ZXN0Lm9wdGlvbnMub3duZXIgPSB0W2ldLm9wdGlvbnM/Lm93bmVyID8/IGNhdGVnb3J5Py5vd25lciA/PyBwYWNrYWdlT3duZXIgPz8gJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbGV0IGlzR0JFbmFibGUgPSAod2luZG93IGFzIGFueSkuZ2MgJiYgdGVzdC5vcHRpb25zPy5za2lwUmVhc29uID09IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYCoqKioqKioqJHtpc0dCRW5hYmxlfWApO1xuICAgICAgICAvLyBpZiAoaXNHQkVuYWJsZSlcbiAgICAgICAgLy8gICBhd2FpdCAod2luZG93IGFzIGFueSkuZ2MoKTtcbiAgICAgICAgLy8gbWVtb3J5VXNhZ2VCZWZvcmUgPSAod2luZG93Py5wZXJmb3JtYW5jZSBhcyBhbnkpPy5tZW1vcnk/LnVzZWRKU0hlYXBTaXplO1xuICAgICAgICBsZXQgdGVzdFJ1biA9IGF3YWl0IGV4ZWNUZXN0KFxuICAgICAgICAgICAgdGVzdCxcbiAgICAgICAgICAgIG9wdGlvbnM/LnRlc3QsXG4gICAgICAgICAgICBsb2dzLCBERy5UZXN0LmlzSW5CZW5jaG1hcmsgPyB0W2ldLm9wdGlvbnM/LmJlbmNobWFya1RpbWVvdXQgPz8gQkVOQ0hNQVJLX1RJTUVPVVQgOiB0W2ldLm9wdGlvbnM/LnRpbWVvdXQgPz8gU1RBTkRBUlRfVElNRU9VVCxcbiAgICAgICAgICAgIHBhY2thZ2VfLm5hbWUsXG4gICAgICAgICAgICBvcHRpb25zLnZlcmJvc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBpZiAoaXNHQkVuYWJsZSlcbiAgICAgICAgLy8gICBhd2FpdCAod2luZG93IGFzIGFueSkuZ2MoKTtcbiAgICAgICAgaWYgKHRlc3RSdW4pIHtcbiAgICAgICAgICByZXMucHVzaCh7IC4uLnRlc3RSdW4sICB3aWRnZXRzRGlmZmVyZW5jZTogZ2V0V2lkZ2V0c0NvdW50U2FmZSgpIC0gd2lkZ2V0c0JlZm9yZSB9KTtcbiAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgaWYgcmV0dXJuT25GYWlsIGlzIHNldCBhbmQgdGVzdCBmYWlsZWQgKGJ1dCBpZ25vcmUgZmFpbHVyZSBmb3IgdGhlIHNraXBUb1Rlc3QgdGVzdCBpdHNlbGYpXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuT25GYWlsICYmIG9wdGlvbnMuc2tpcFRvVGVzdCAhPT0gdGVzdC5uYW1lICYmICF0ZXN0UnVuLnN1Y2Nlc3MgJiYgIXRlc3RSdW4uc2tpcHBlZClcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzLnB1c2goeyAuLi50ZXN0UnVuLCBtZW1vcnlEZWx0YTogKHdpbmRvdz8ucGVyZm9ybWFuY2UgYXMgYW55KT8ubWVtb3J5Py51c2VkSlNIZWFwU2l6ZSAtIG1lbW9yeVVzYWdlQmVmb3JlLCB3aWRnZXRzRGVsdGE6IGdldFdpZGdldHNDb3VudFNhZmUoKSAtIHdpZGdldHNCZWZvcmUgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLm5vZGVPcHRpb25zICYmIG9wdGlvbnMudGVzdENvbnRleHQ/LmNsb3NlQWxsICE9PSBmYWxzZSkge1xuICAgICAgICAgIGdyb2suc2hlbGwuY2xvc2VBbGwoKTtcbiAgICAgICAgICBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHNraXBwaW5nVGVzdHMgPSBpc1RhcmdldENhdGVnb3J5ICYmIG9wdGlvbnMuc2tpcFRvVGVzdCAhPSB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHRlc3QgPSB0W2ldO1xuICAgICAgICBpZiAob3B0aW9ucy50ZXN0KVxuICAgICAgICAgIGlmIChvcHRpb25zLnRlc3QudG9Mb3dlckNhc2UoKSAhPT0gdGVzdC5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHNraXBwaW5nVGVzdHMpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8uc2tpcFRvVGVzdCAhPSB1bmRlZmluZWQgJiYgdGVzdC5uYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpID09PSBvcHRpb25zPy5za2lwVG9UZXN0LnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAvLyBGb3VuZCB0aGUgdGFyZ2V0IHRlc3QsIHN0b3Agc2tpcHBpbmcgYWZ0ZXIgdGhpcyBvbmVcbiAgICAgICAgICAgIHNraXBwaW5nVGVzdHMgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7ICAvLyBTa2lwIHRoaXMgdGVzdCAoaW5jbHVkaW5nIHRoZSB0YXJnZXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdD8ub3B0aW9ucykge1xuICAgICAgICAgIHRlc3Qub3B0aW9ucy5vd25lciA9IHRbaV0ub3B0aW9ucz8ub3duZXIgPz8gY2F0ZWdvcnk/Lm93bmVyID8/IHBhY2thZ2VPd25lciA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBsZXQgaXNHQkVuYWJsZSA9ICh3aW5kb3cgYXMgYW55KS5nYyAmJiB0ZXN0Lm9wdGlvbnM/LnNraXBSZWFzb24gPT0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgKioqKioqKioke2lzR0JFbmFibGV9YCk7XG4gICAgICAgIC8vIGlmIChpc0dCRW5hYmxlKVxuICAgICAgICAvLyAgIGF3YWl0ICh3aW5kb3cgYXMgYW55KS5nYygpO1xuICAgICAgICAvLyBtZW1vcnlVc2FnZUJlZm9yZSA9ICh3aW5kb3c/LnBlcmZvcm1hbmNlIGFzIGFueSk/Lm1lbW9yeT8udXNlZEpTSGVhcFNpemU7XG4gICAgICAgIGxldCB0ZXN0UnVuID0gYXdhaXQgZXhlY1Rlc3QoXG4gICAgICAgICAgICB0ZXN0LFxuICAgICAgICAgICAgb3B0aW9ucz8udGVzdCxcbiAgICAgICAgICAgIGxvZ3MsXG4gICAgICAgICAgICBERy5UZXN0LmlzSW5CZW5jaG1hcmsgPyB0W2ldLm9wdGlvbnM/LmJlbmNobWFya1RpbWVvdXQgPz8gQkVOQ0hNQVJLX1RJTUVPVVQgOiB0W2ldLm9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICAgICAgICBwYWNrYWdlXy5uYW1lLFxuICAgICAgICAgICAgb3B0aW9ucy52ZXJib3NlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gaWYgKGlzR0JFbmFibGUpXG4gICAgICAgIC8vICAgYXdhaXQgKHdpbmRvdyBhcyBhbnkpLmdjKCk7XG5cbiAgICAgICAgaWYgKHRlc3RSdW4pIHtcbiAgICAgICAgICByZXMucHVzaCh7IC4uLnRlc3RSdW4sIHdpZGdldHNEaWZmZXJlbmNlOiBnZXRXaWRnZXRzQ291bnRTYWZlKCkgLSB3aWRnZXRzQmVmb3JlIH0pO1xuICAgICAgICAgIC8vIFJldHVybiBlYXJseSBpZiByZXR1cm5PbkZhaWwgaXMgc2V0IGFuZCB0ZXN0IGZhaWxlZCAoYnV0IGlnbm9yZSBmYWlsdXJlIGZvciB0aGUgc2tpcFRvVGVzdCB0ZXN0IGl0c2VsZilcbiAgICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkZhaWwgJiYgb3B0aW9ucy5za2lwVG9UZXN0ICE9PSB0ZXN0Lm5hbWUgJiYgIXRlc3RSdW4uc3VjY2VzcyAmJiAhdGVzdFJ1bi5za2lwcGVkKVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICAvLyByZXMucHVzaCh7IC4uLnRlc3RSdW4sIG1lbW9yeURlbHRhOiAod2luZG93Py5wZXJmb3JtYW5jZSBhcyBhbnkpPy5tZW1vcnk/LnVzZWRKU0hlYXBTaXplIC0gbWVtb3J5VXNhZ2VCZWZvcmUsIHdpZGdldHNEaWZmZXJlbmNlOiBnZXRXaWRnZXRzQ291bnRTYWZlKCkgLSB3aWRnZXRzQmVmb3JlIH0pO1xuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRXaWRnZXRzQ291bnRTYWZlKCkge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICByZXR1cm4gMDtcbiAgICBsZXQgbGVuZ3RoID0gLTE7XG4gICAgdHJ5IHtcbiAgICAgIGxlbmd0aCA9IERHLldpZGdldC5nZXRBbGwoKS5sZW5ndGg7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oZS5tZXNzYWdlID8/IGUpO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW52b2tlVGVzdHMoY2F0ZWdvcmllc1RvSW52b2tlOiB7IFtrZXk6IHN0cmluZ106IENhdGVnb3J5IH0sIG9wdGlvbnM6IFRlc3RFeGVjdXRpb25PcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBza2lwcGluZ0NhdGVnb3JpZXMgPSBvcHRpb25zPy5za2lwVG9DYXRlZ29yeSAhPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgaXNUYXJnZXRDYXRlZ29yeSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2F0ZWdvcmllc1RvSW52b2tlKSkge1xuICAgICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUoKGMpID0+IGtleS5zdGFydHNXaXRoKGMpKSlcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IG51bGwgJiYgIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKS50cmltKCkpKVxuICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGlmIChza2lwcGluZ0NhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGFyZ2V0Q2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgICBza2lwcGluZ0NhdGVnb3JpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uc2tpcFRvQ2F0ZWdvcnkgIT0gbnVsbCAmJiBrZXkudG9Mb3dlckNhc2UoKS50cmltKCkgPT09IG9wdGlvbnM/LnNraXBUb0NhdGVnb3J5LnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNUYXJnZXRDYXRlZ29yeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEhhdmVuJ3QgZm91bmQgdGhlIHRhcmdldCBjYXRlZ29yeSB5ZXQsIGtlZXAgc2tpcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdmFsdWUudGVzdHM/LmV2ZXJ5KCh0OiBUZXN0KSA9PiB0Lm9wdGlvbnM/LnNraXBSZWFzb25cbiAgICAgICAgICAgICAgfHwgKG9wdGlvbnM/LnRlc3QgIT0gbnVsbCAmJiBvcHRpb25zLnRlc3QudG9Mb3dlckNhc2UoKSAhPT0gdC5uYW1lLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgIGlmICghc2tpcHBlZCkge1xuICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgY29uc3Qgc2tpcHBlZENvdW50ID0gKHZhbHVlLnRlc3RzID8/IFtdKS5maWx0ZXIoKHQ6IFRlc3QpID0+XG4gICAgICAgICAgICAgICAgdC5vcHRpb25zPy5za2lwUmVhc29uIHx8IChvcHRpb25zPy50ZXN0ICE9IG51bGwgJiYgb3B0aW9ucy50ZXN0LnRvTG93ZXJDYXNlKCkgIT09IHQubmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICAgICAgc3RkTG9nKGBQYWNrYWdlIHRlc3Rpbmc6IFN0YXJ0ZWQge3ske2tleX19fSR7c2tpcHBlZENvdW50ID4gMCA/IGAgc2tpcHBlZCB7eyR7c2tpcHBlZENvdW50fX19YCA6ICcnfWApO1xuICAgICAgICAgICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSBhd2FpdCBpbnZva2VDYXRlZ29yeU1ldGhvZCh2YWx1ZS5iZWZvcmUsIGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5zdHJlc3NUZXN0KSB7XG4gICAgICAgICAgICAgIHQgPSB0LmZpbHRlcigoZSkgPT4gZS5vcHRpb25zPy5zdHJlc3NUZXN0KTtcbiAgICAgICAgICAgICAgdCA9IHNodWZmbGUodCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKChvcHRpb25zLnRhZ3M/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgICAgICAgICAgdCA9IHQuZmlsdGVyKChlKSA9PlxuICAgICAgICAgICAgICAgICAgZS5vcHRpb25zPy50YWdzPy5zb21lKHRhZyA9PiAob3B0aW9ucz8udGFncyA/PyBbXSkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcmVzOiBUZXN0UmVzdWx0RXh0ZW5kZWRbXTtcbiAgICAgICAgICBpZiAodmFsdWUuYmVmb3JlU3RhdHVzKSB7XG4gICAgICAgICAgICAgIHJlcyA9IEFycmF5LmZyb20odC5tYXAoKHRlc3RFbGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRlc3RFbGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiAnYmVmb3JlKCkgZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICBtczogMCxcbiAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2dzOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICBvd25lcjogcGFja2FnZU93bmVyLFxuICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U6IHBhY2thZ2VfLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0c0RpZmZlcmVuY2U6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgZmxha2luZzogREcuVGVzdC5pc1JlcHJvZHVjaW5nXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIHJlcy5mb3JFYWNoKGFzeW5jICh0ZXN0KSA9PiBhd2FpdCBncm9rLnNoZWxsLnJlcG9ydFRlc3QoJ3BhY2thZ2UnLCB0ZXN0KSk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGludm9rZVRlc3RzSW5DYXRlZ29yeSh2YWx1ZSwgb3B0aW9ucywgc2tpcHBpbmdDYXRlZ29yaWVzKTtcbiAgICAgICAgICBjb25zdCBkYXRhOiBUZXN0UmVzdWx0RXh0ZW5kZWRbXSA9IHJlcy5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG5cbiAgICAgICAgICBpZiAoIXNraXBwZWQpXG4gICAgICAgICAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0gYXdhaXQgaW52b2tlQ2F0ZWdvcnlNZXRob2QodmFsdWUuYWZ0ZXIsIGtleSk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhZnRlciBjYXRlZ29yeVxuICAgICAgICAgIC8vIGdyb2suc2hlbGwuY2xvc2VBbGwoKTtcbiAgICAgICAgICAvLyBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICAgICAgaWYgKHZhbHVlLmFmdGVyU3RhdHVzKSB7XG4gICAgICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBDYXRlZ29yeSBhZnRlcigpIHt7JHtrZXl9fX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBSZXN1bHQgZm9yIHt7JHtrZXl9fX0gYWZ0ZXI6ICR7dmFsdWUuYWZ0ZXJTdGF0dXN9YCk7XG4gICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeToga2V5LFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ2FmdGVyJyxcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cyxcbiAgICAgICAgICAgICAgICAgIG1zOiAwLFxuICAgICAgICAgICAgICAgICAgc2tpcHBlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBsb2dzOiAnJyxcbiAgICAgICAgICAgICAgICAgIG93bmVyOiBwYWNrYWdlT3duZXIsXG4gICAgICAgICAgICAgICAgICBwYWNrYWdlOiBwYWNrYWdlXy5uYW1lLFxuICAgICAgICAgICAgICAgICAgd2lkZ2V0c0RpZmZlcmVuY2U6IDAsXG4gICAgICAgICAgICAgICAgICBmbGFraW5nOiBERy5UZXN0LmlzUmVwcm9kdWNpbmdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpIHtcbiAgICAgICAgICAgICAgc3RkTG9nKGBQYWNrYWdlIHRlc3Rpbmc6IENhdGVnb3J5IGJlZm9yZSgpIHt7JHtrZXl9fX0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBSZXN1bHQgZm9yIHt7JHtrZXl9fX0gYmVmb3JlOiAke3ZhbHVlLmJlZm9yZVN0YXR1c31gKTtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBrZXksXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnYmVmb3JlJyxcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsXG4gICAgICAgICAgICAgICAgICBtczogMCxcbiAgICAgICAgICAgICAgICAgIHNraXBwZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgbG9nczogJycsXG4gICAgICAgICAgICAgICAgICBvd25lcjogcGFja2FnZU93bmVyLFxuICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGFja2FnZV8ubmFtZSxcbiAgICAgICAgICAgICAgICAgIHdpZGdldHNEaWZmZXJlbmNlOiAwLFxuICAgICAgICAgICAgICAgICAgZmxha2luZzogREcuVGVzdC5pc1JlcHJvZHVjaW5nXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG5cbiAgICAgICAgICAvLyBJZiByZXR1cm5PbkZhaWwgaXMgc2V0IGFuZCBhIHRlc3QgZmFpbGVkIChvdGhlciB0aGFuIHNraXBUb1Rlc3QpLCBzdG9wIHByb2Nlc3NpbmcgbW9yZSBjYXRlZ29yaWVzXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuT25GYWlsICYmIGRhdGEuc29tZSgoZCkgPT4gIWQuc3VjY2VzcyAmJiAhZC5za2lwcGVkICYmIGQubmFtZSAhPT0gb3B0aW9ucy5za2lwVG9UZXN0KSlcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc2V0Q29uc29sZSgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0Q29udGV4dCEuY2F0Y2hVbmhhbmRsZWQgJiYgKCFERy5UZXN0LmlzSW5CZW5jaG1hcmspKSB7XG4gICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgZ3Jvay5zaGVsbC5sYXN0RXJyb3I7XG4gICAgICBpZiAoZXJyb3IgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAgICAgICAgIGxvZ3M6ICcnLFxuICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiAnVW5oYW5kbGVkIGV4Y2VwdGlvbnMnLFxuICAgICAgICAgICAgICBuYW1lOiAnRXhjZXB0aW9uJyxcbiAgICAgICAgICAgICAgcmVzdWx0OiBlcnJvciA/PyAnJyxcbiAgICAgICAgICAgICAgc3VjY2VzczogIWVycm9yLFxuICAgICAgICAgICAgICBtczogMCxcbiAgICAgICAgICAgICAgc2tpcHBlZDogZmFsc2UsXG4gICAgICAgICAgICAgIG93bmVyOiBwYWNrYWdlT3duZXIgPz8gJycsXG4gICAgICAgICAgICAgICdwYWNrYWdlJzogcGFja2FnZV8ubmFtZSxcbiAgICAgICAgICAgICAgd2lkZ2V0c0RpZmZlcmVuY2U6IDBcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZExvZyhgUGFja2FnZSB0ZXN0aW5nOiBVbmhhbmRsZWQgRXhjZXB0aW9uOiAke2Vycm9yfWApO1xuXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHsuLi5wYXJhbXMsICdmbGFraW5nJzogREcuVGVzdC5pc1JlcHJvZHVjaW5nICYmICFlcnJvcn0pO1xuICAgICAgICAgICg8YW55PnBhcmFtcykucGFja2FnZSA9IHBhY2thZ2VfLm5hbWU7XG4gICAgICAgICAgYXdhaXQgZ3Jvay5zaGVsbC5yZXBvcnRUZXN0KCdwYWNrYWdlJywgcGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzdWx0KHg6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBgJHt4LnRvU3RyaW5nKCl9XFxuJHt4LnN0YWNrID8gKGF3YWl0IERHLkxvZ2dlci50cmFuc2xhdGVTdGFja1RyYWNlKHguc3RhY2spKSA6ICcnfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNUZXN0KHQ6IFRlc3QsIHByZWRpY2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBsb2dzOiBhbnlbXSxcbiAgdGVzdFRpbWVvdXQ/OiBudW1iZXIsIHBhY2thZ2VOYW1lPzogc3RyaW5nLCB2ZXJib3NlPzogYm9vbGVhblxuKTogUHJvbWlzZTxUZXN0UmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gIGxvZ3MubGVuZ3RoID0gMDtcbiAgbGV0IHI6IFRlc3RSZXN1bHQ7XG4gIGxldCB0eXBlOiBzdHJpbmcgPSAncGFja2FnZSc7XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKHQubmFtZS50b0xvd2VyQ2FzZSgpICE9PSBwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSk7XG4gIGxldCBza2lwID0gdC5vcHRpb25zPy5za2lwUmVhc29uIHx8IGZpbHRlcjtcbiAgbGV0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG5cbiAgaWYgKERHLlRlc3QuaXNJbkJlbmNobWFyayAmJiAhdC5vcHRpb25zPy5iZW5jaG1hcmspIHtcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogU2tpcHBlZCB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19IGRvZXNudCBhdmFpbGFibGUgaW4gYmVuY2htYXJrIG1vZGVgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHNraXAgJiYgIURHLlRlc3QuaXNJbkJlbmNobWFyaylcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogU2tpcHBlZCB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19YCk7XG4gIGlmICghc2tpcClcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogU3RhcnRlZCB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19YCk7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc3RhcnQpLnRvSVNPU3RyaW5nKCk7XG4gIHRyeSB7XG4gICAgaWYgKHNraXApXG4gICAgICByID0geyBuYW1lOiB0Lm5hbWUsIG93bmVyOnQub3B0aW9ucz8ub3duZXIgPz8gJycsIGNhdGVnb3J5OiB0LmNhdGVnb3J5LCBsb2dzOiAnJywgZGF0ZTogc3RhcnREYXRlLCBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHNraXBSZWFzb24hLCBtczogMCwgc2tpcHBlZDogdHJ1ZSwgcGFja2FnZTogcGFja2FnZU5hbWUgPz8gJycsIGZsYWtpbmc6IERHLlRlc3QuaXNSZXByb2R1Y2luZ307XG4gICAgZWxzZSB7XG4gICAgICBsZXQgdGltZW91dF8gPSB0ZXN0VGltZW91dCA/PyBTVEFOREFSVF9USU1FT1VUO1xuXG4gICAgICBpZiAoREcuVGVzdC5pc1Byb2ZpbGluZylcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGAke3QuY2F0ZWdvcnl9OiAke3QubmFtZX1gKTtcblxuICAgICAgciA9IHsgbmFtZTogdC5uYW1lLCBvd25lcjp0Lm9wdGlvbnM/Lm93bmVyID8/ICcnLCBjYXRlZ29yeTogdC5jYXRlZ29yeSwgbG9nczogJycsIGRhdGU6IHN0YXJ0RGF0ZSwgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiAoYXdhaXQgdGltZW91dCh0LnRlc3QsIHRpbWVvdXRfKSkudG9TdHJpbmcoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2UgLCBwYWNrYWdlOiBwYWNrYWdlTmFtZSA/PyAnJywgZmxha2luZzogREcuVGVzdC5pc1JlcHJvZHVjaW5nfTtcblxuICAgICAgaWYgKERHLlRlc3QuaXNQcm9maWxpbmcpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGAke3QuY2F0ZWdvcnl9OiAke3QubmFtZX1gKTtcbiAgICAgICAgZ3Jvay5zaGVsbC5pbmZvKGBQcm9maWxpbmcgb2YgJHt0LmNhdGVnb3J5fTogJHt0Lm5hbWV9IGZpbmlzaGVkIFxcbiBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGhhdmUgb3BlbmVkIERldlRvb2xzIChGMTIpIC8gUGVyZm9ybWFuY2UgcGFuZWwgYmVmb3JlIHRlc3Qgc3RhcnRzLmApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgc3RkRXJyb3IoeCk7XG4gICAgciA9IHsgbmFtZTogdC5uYW1lLCBvd25lcjp0Lm9wdGlvbnM/Lm93bmVyID8/ICcnLCBjYXRlZ29yeTogdC5jYXRlZ29yeSwgbG9nczogJycsIGRhdGU6IHN0YXJ0RGF0ZSwgc3VjY2VzczogZmFsc2UsIHJlc3VsdDogYXdhaXQgZ2V0UmVzdWx0KHgpLCBtczogMCwgc2tpcHBlZDogZmFsc2UsIHBhY2thZ2U6IHBhY2thZ2VOYW1lID8/ICcnLCBmbGFraW5nOiBmYWxzZX07XG4gIH1cbiAgaWYgKHQub3B0aW9ucz8uaXNBZ2dyZWdhdGVkICYmIHIucmVzdWx0LmNvbnN0cnVjdG9yID09PSBERy5EYXRhRnJhbWUpIHtcbiAgICBjb25zdCBjb2wgPSByLnJlc3VsdC5jb2woJ3N1Y2Nlc3MnKTtcbiAgICBpZiAoY29sKVxuICAgICAgci5zdWNjZXNzID0gY29sLnN0YXRzLnN1bSA9PT0gY29sLmxlbmd0aDtcbiAgICBpZiAoIXZlcmJvc2UpIHtcbiAgICAgIGNvbnN0IGRmID0gci5yZXN1bHQ7XG4gICAgICBkZi5jb2x1bW5zLnJlbW92ZSgnc3RhY2snKTtcbiAgICAgIGRmLnJvd3MucmVtb3ZlV2hlcmUoKHIpID0+IHIuZ2V0KCdzdWNjZXNzJykpO1xuICAgICAgci5yZXN1bHQgPSBkZjtcbiAgICB9XG4gICAgci5yZXN1bHQgPSByLnJlc3VsdC50b0NzdigpO1xuICB9XG4gIHIubG9ncyA9IGxvZ3Muam9pbignXFxuJyk7XG4gIHIubXMgPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gIGlmICghc2tpcClcbiAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogRmluaXNoZWQge3ske3QuY2F0ZWdvcnl9fX0ge3ske3QubmFtZX19fSB3aXRoIHt7JHtyLnN1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZXJyb3InfX19IGZvciAke3IubXN9IG1zYCk7XG4gIGlmICghci5zdWNjZXNzKSB7XG4gICAgICBzdGRMb2coYFBhY2thZ2UgdGVzdGluZzogUmVzdWx0IGZvciB7eyR7dC5jYXRlZ29yeX19fSB7eyR7dC5uYW1lfX19OiAke3IucmVzdWx0fWApO1xuICB9XG4gIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICByLm5hbWUgPSB0Lm5hbWU7XG4gIHIub3duZXIgPSB0Lm9wdGlvbnM/Lm93bmVyID8/ICcnO1xuICBpZiAoIWZpbHRlcikge1xuICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAnc3VjY2Vzcyc6IHIuc3VjY2VzcywgJ3Jlc3VsdCc6IHIucmVzdWx0LCAnbXMnOiByLm1zLCAnZGF0ZSc6IHIuZGF0ZSxcbiAgICAgICdza2lwcGVkJzogci5za2lwcGVkLCAnY2F0ZWdvcnknOiB0LmNhdGVnb3J5LCAnbmFtZSc6IHQubmFtZSwgJ2xvZ3MnOiByLmxvZ3MsICdvd25lcic6IHIub3duZXIsXG4gICAgICAnZmxha2luZyc6IERHLlRlc3QuaXNSZXByb2R1Y2luZyAmJiByLnN1Y2Nlc3MsXG4gICAgICAncGFja2FnZSc6IHIucGFja2FnZVxuICAgIH07XG4gICAgaWYgKHIucmVzdWx0LmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xuICAgICAgY29uc3QgcmVzID0gT2JqZWN0LmtleXMoci5yZXN1bHQpLnJlZHVjZSgoYWNjLCBrKSA9PiAoeyAuLi5hY2MsIFsncmVzdWx0LicgKyBrXTogci5yZXN1bHRba10gfSksIHt9KTtcbiAgICAgIHBhcmFtcyA9IHsgLi4ucGFyYW1zLCAuLi5yZXMgfTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlc3VsdCBpbnN0YW5jZW9mIERHLkRhdGFGcmFtZSlcbiAgICAgIHBhcmFtcy5yZXN1bHQgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMucmVzdWx0Py50b0pzb24oKSkgfHwgJyc7XG4gICAgYXdhaXQgZ3Jvay5zaGVsbC5yZXBvcnRUZXN0KHR5cGUsIHBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlKGFycmF5OiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgbmV3QXJyID0gYXJyYXkuc2xpY2UoKTtcbiAgbmV3QXJyLnNvcnQoKCkgPT4gTWF0aC5yYW5kb20oKSAtIDAuNSk7XG4gIHJldHVybiBuZXdBcnI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCwgaW50ZXJ2YWw6IG51bWJlciA9IDUwKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsSWQ6IFRpbWVvdXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoY2hlY2tIYW5kbGVyKCkpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICB9LCBpbnRlcnZhbCk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIHRlc3QgZXhlY3V0aW9uIHJlc3VsdCBvciBhbiBlcnJvciBpbiBjYXNlIG9mIHRpbWVvdXRcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lb3V0KGZ1bmM6ICgpID0+IFByb21pc2U8YW55PiwgdGVzdFRpbWVvdXQ6IG51bWJlciwgdGltZW91dFJlYXNvbjogc3RyaW5nID0gJ0VYRUNVVElPTiBUSU1FT1VUJyk6IFByb21pc2U8YW55PiB7XG4gIGxldCB0aW1lb3V0OiBhbnkgPSBudWxsO1xuICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPGFueT4oKF8sIHJlamVjdCkgPT4ge1xuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QodGltZW91dFJlYXNvbik7XG4gICAgfSwgdGVzdFRpbWVvdXQpO1xuICB9KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtmdW5jKCksIHRpbWVvdXRQcm9taXNlXSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRpbWVvdXQpXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpYWxvZ3MgPSBERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGRpYWxvZ3NbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBFeHBlY3RzIGFuIGFzeW5jaHJvbm91cyB7QGxpbmsgYWN0aW9ufSB0byB0aHJvdyBhbiBleGNlcHRpb24uIFVzZSB7QGxpbmsgY2hlY2t9IHRvIHBlcmZvcm1cbiAqIGRlZXBlciBpbnNwZWN0aW9uIG9mIHRoZSBleGNlcHRpb24gaWYgbmVjZXNzYXJ5LlxuICogQHBhcmFtICB7ZnVuY3Rpb24oKTogUHJvbWlzZTx2b2lkPn0gYWN0aW9uXG4gKiBAcGFyYW0gIHtmdW5jdGlvbihhbnkpOiBib29sZWFufSBjaGVja1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGVjdEV4Y2VwdGlvbkFzeW5jKGFjdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgY2hlY2s/OiAoZXhjZXB0aW9uOiBhbnkpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGNhdWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBsZXQgY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IGFjdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY2F1Z2h0ID0gdHJ1ZTtcbiAgICBjaGVja2VkID0gIWNoZWNrIHx8IGNoZWNrKGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICghY2F1Z2h0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQgYnV0IG5vdCB0aHJvd24nKTtcbiAgICBpZiAoIWNoZWNrZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGV4cGVjdGVkIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGJ1dCBpdCBkb2VzIG5vdCBzYXRpc2Z5IHRoZSBjb25kaXRpb24nKTtcbiAgfVxufVxuXG5jb25zdCBjYXRERiA9IERHLkRhdGFGcmFtZS5mcm9tQ29sdW1ucyhbREcuQ29sdW1uLmZyb21TdHJpbmdzKCdjb2wnLCBbJ3ZhbDEnLCAndmFsMicsICd2YWwzJ10pXSk7XG5cbi8qKlxuICogVW5pdmVyc2FsIHRlc3QgZm9yIHZpZXdlcnMuIEl0IHNlYXJjaCB2aWV3ZXJzIGluIERPTSBieSB0YWdzOiBjYW52YXMsIHN2ZywgaW1nLCBpbnB1dCwgaDEsIGFcbiAqIEBwYXJhbSAge3N0cmluZ30gdiBWaWV3ZXIgbmFtZVxuICogQHBhcmFtICB7X0RHLkRhdGFGcmFtZX0gZGYgRGF0YWZyYW1lIHRvIHVzZS4gU2hvdWxkIGhhdmUgYXQgbGVhc3QgMyByb3dzXG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLmRldGVjdFNlbWFudGljVHlwZXMgU3BlY2lmeSB3aGV0aGVyIHRvIGRldGVjdCBzZW1hbnRpYyB0eXBlcyBvciBub3RcbiAqIEBwYXJhbSAge2Jvb2xlYW59IG9wdGlvbnMucmVhZE9ubHkgSWYgc2V0IHRvIHRydWUsIHRoZSBkYXRhZnJhbWUgd2lsbCBub3QgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSB0ZXN0XG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLmFyYml0cmFyeURmVGVzdCBJZiBzZXQgdG8gZmFsc2UsIHRlc3Qgb24gYXJiaXRyYXJ5IGRhdGFmcmFtZVxuICogKG9uZSBjYXRlZ29yaWNhbCBjb2x1bW4pIHdpbGwgbm90IGJlIHBlcmZvcm1lZFxuICogQHBhcmFtICB7b2JqZWN0fSBvcHRpb25zIExpc3Qgb2Ygb3B0aW9ucyAob3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBUaGUgdGVzdCBpcyBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgaWYgaXQgY29tcGxldGVzIHdpdGhvdXQgZXJyb3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IF9ERy5EYXRhRnJhbWUsIG9wdGlvbnM/OiB7XG4gIGRldGVjdFNlbWFudGljVHlwZXM/OiBib29sZWFuLCByZWFkT25seT86IGJvb2xlYW4sIGFyYml0cmFyeURmVGVzdD86IGJvb2xlYW4sXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nLCBhd2FpdFZpZXdlcj86ICh2aWV3ZXI6IF9ERy5WaWV3ZXIpID0+IFByb21pc2U8dm9pZD5cbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBvcHRpb25zPy5wYWNrYWdlTmFtZSA/PyAnJztcbiAgaWYgKG9wdGlvbnM/LmRldGVjdFNlbWFudGljVHlwZXMpXG4gICAgYXdhaXQgZ3Jvay5kYXRhLmRldGVjdFNlbWFudGljVHlwZXMoZGYpO1xuICBjb25zdCB0diA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KGRmKTtcblxuICB0cnkge1xuICAgIC8vMS4gT3BlbiwgZG8gbm90aGluZyBhbmQgY2xvc2VcbiAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkKTtcbiAgICAvL2luIGNhc2Ugdmlld2VyIHdpdGggYXN5bmMgcmVuZGVyaW5nIC0gd2FpdCBmb3IgcmVuZGVyIHRvIGNvbXBsZXRlXG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgdW5kZWZpbmVkLCBvcHRpb25zIS5hd2FpdFZpZXdlcik7XG5cbiAgICAvLzIuIE9wZW4gdmlld2VyLCBydW4gc2VsZWN0aW9uLCBmaWx0ZXIsIGV0Yy4gYW5kIGNsb3NlXG4gICAgaWYgKCFvcHRpb25zPy5yZWFkT25seSkge1xuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgc2VsZWN0RmlsdGVyQ2hhbmdlQ3VycmVudCk7XG4gICAgICBpZiAob3B0aW9ucz8uYXdhaXRWaWV3ZXIpXG4gICAgICAgIGF3YWl0IHRlc3RWaWV3ZXJJbnRlcm5hbCh0diwgdiwgcGFja2FnZU5hbWUsIGdyb2suZXZlbnRzLm9uVmlld2VyQWRkZWQsIHNlbGVjdEZpbHRlckNoYW5nZUN1cnJlbnQsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKTtcbiAgICB9XG5cbiAgICAvLzIuIE9wZW4gdmlld2VyLCBjaGFuZ2Ugb3B0aW9ucywgc2F2ZSBsYXlvdXQgYW5kIGNsb3NlXG4gICAgbGV0IHByb3BzQW5kTGF5b3V0OiB7IGxheW91dDogYW55LCBzYXZlZFByb3BzOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICAgIHByb3BzQW5kTGF5b3V0ID0gYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgY2hhbmdlT3B0aW9uc1NhdmVMYXlvdXQpO1xuICAgIGlmIChvcHRpb25zPy5hd2FpdFZpZXdlcilcbiAgICAgIHByb3BzQW5kTGF5b3V0ID0gYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCxcbiAgICAgICAgY2hhbmdlT3B0aW9uc1NhdmVMYXlvdXQsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKVxuXG4gICAgLy8zLiBMb2FkIGxheW91dFxuICAgIGF3YWl0IHRlc3RWaWV3ZXJJbnRlcm5hbCh0diwgdiwgcGFja2FnZU5hbWUsIGdyb2suZXZlbnRzLm9uVmlld0xheW91dEFwcGxpZWQsIGxvYWRMYXlvdXQsIHVuZGVmaW5lZCwgcHJvcHNBbmRMYXlvdXQ/LmxheW91dCxcbiAgICAgIHsgc2F2ZWRQcm9wczogcHJvcHNBbmRMYXlvdXQ/LnNhdmVkUHJvcHMgfSk7XG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3TGF5b3V0QXBwbGllZCwgbG9hZExheW91dCwgb3B0aW9ucyEuYXdhaXRWaWV3ZXIsXG4gICAgICAgIHByb3BzQW5kTGF5b3V0Py5sYXlvdXQsIHsgc2F2ZWRQcm9wczogcHJvcHNBbmRMYXlvdXQ/LnNhdmVkUHJvcHMgfSk7XG5cbiAgICAvLzQuIE9wZW4gdmlld2VyIG9uIGFyYml0YXJ5IGRhdGFzZXRcbiAgICBpZiAob3B0aW9ucz8uYXJiaXRyYXJ5RGZUZXN0ICE9PSBmYWxzZSkge1xuICAgICAgdHYuZGF0YUZyYW1lID0gY2F0REY7XG4gICAgICBhd2FpdCBkZWxheSg1MCk7XG4gICAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkKTtcbiAgICAgIGlmIChvcHRpb25zPy5hd2FpdFZpZXdlcilcbiAgICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgdW5kZWZpbmVkLCBvcHRpb25zIS5hd2FpdFZpZXdlcik7XG4gICAgfVxuXG4gICAgLy81LiBDYWxsIHBvc3Rwb25lZCBmaWx0ZXJpbmdcbiAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkLCBmaWx0ZXJBc3luYyk7XG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgZmlsdGVyQXN5bmMsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKTtcblxuICB9IGZpbmFsbHkge1xuICAgIC8vIGNsb3NlQWxsKCkgaXMgaGFuZGxpbmcgYnkgY29tbW9uIHRlc3Qgd29ya2Zsb3dcbiAgICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgLy8gREcuQmFsbG9vbi5jbG9zZUFsbCgpO1xuICB9XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {category, test} from '@datagrok-libraries/test/src/test';\n\ncategory('_first', () => {\n /** The first test of the package to evaluate problems with imports. */\n test('_first', async () => { });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types/monomer-library';\n\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from '../constants';\n\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\nexport function removeGapsFromHelm(srcHelm: string): string {\n return srcHelm.replaceAll(helmGapStartRe, '{').replaceAll(helmGapIntRe, '.')\n .replaceAll(helmGapEndRe, '}').replace('{*}', '{}');\n}\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): string[] {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n if (!(s == null || 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 closingIndex = findClosing(monomer, 1, '[', ']');\n const element = monomer.substring(1, closingIndex);\n monomers.push(element);\n const residue = monomer.substring(closingIndex + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const openingIndex = findOpening(monomer, monomer.length - 2, '[', ']');\n const element = monomer.substring(openingIndex + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, openingIndex);\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 return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\n/** Searches monomers of helmString for missed. */\nexport function findMonomers(seqMonomerSymbolList: string[], monomerLib: IMonomerLib): Set<string> {\n return new Set(seqMonomerSymbolList.filter((s) => monomerLib?.getMonomer(null, s)));\n}\n\nfunction findClosing(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i < s.length) {\n if (s[i] === open)\n count++;\n\n if (s[i] === close) {\n if (count === 0)\n return i;\n count--;\n }\n i++;\n }\n return -1;\n}\n\nfunction findOpening(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i >= 0) {\n if (s[i] === close)\n count++;\n\n if (s[i] === open) {\n if (count === 0)\n return i;\n count--;\n }\n i--;\n }\n return -1;\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 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 if (s.endsWith(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 = unescape(tag.replace(new RegExp('\\\\' + c, 'g'), c));\n return {tag: tag, str: s};\n}\n\nfunction unescape(s: string) {\n if (s == null || 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__ = ui;","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nexport class HelmInputBase extends DG.JsInputBase {\n}\nexport const HelmNotSupportedErrorType = 'HelmNotSupportedError';\nexport class HelmNotSupportedError extends Error {\n constructor(message) {\n super(message);\n this.type = HelmNotSupportedErrorType;\n }\n}\nexport async function getHelmHelper() {\n const packageName = 'Helm';\n const funcList = DG.Func.find({ package: packageName, name: `getHelmHelper` });\n if (funcList.length === 0)\n throw new Error(`Package '${packageName}' must be installed for HelmHelper.`);\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\nui.input.helmAsync = async function (name, options) {\n return (await getHelmHelper()).createHelmInput(name, options);\n};\n/** Inputs logic */\nexport function getMonomerHandleArgs(a, name) {\n if (!a)\n throw new Error(`Argument 'a' of type Atom or HelmType is mandatory.`);\n let biotype;\n let elem;\n const aa = a;\n if (aa.T === 'ATOM') {\n // Legacy HelmAtom.biotype() returns the js-draw-lite HelmType union (which\n // still carries the `HELM_NUCLETIDE` typo); cast to the hwe-owned HelmType.\n biotype = aa.biotype();\n elem = aa.elem;\n }\n else {\n biotype = a;\n elem = name;\n }\n return [biotype, elem];\n}\n//# sourceMappingURL=helm-helper.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {delay, testEvent} from '@datagrok-libraries/test/src/test';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {_package} from '../package-test';\n\n\nexport async function initHelmMainPackage(): Promise<void> {\n await getHelmHelper();\n}\n\nexport async function awaitGrid(grid: DG.Grid, timeout: number = 5000): Promise<void> {\n await delay(100);\n await testEvent(grid.onAfterDrawContent, () => {},\n () => { grid.invalidate(); }, timeout);\n}\n\nexport async function readDataframe(tableName: string): Promise<DG.DataFrame> {\n const file = await loadFileAsText(tableName);\n const df = DG.DataFrame.fromCsv(file);\n df.name = tableName.replace('.csv', '');\n return df;\n}\n\nexport async function loadFileAsText(name: string): Promise<string> {\n return await _package.files.readAsText(name);\n}\n","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport { errInfo } from '../utils/err-info';\nexport const DEFAULT_FILES_LIB_PROVIDER_NAME = 'Files';\nexport async function findProviderWithLibraryName(providers, libraryName) {\n for (const provider of providers) {\n const libNames = await provider.listLibraries();\n if (libNames.includes(libraryName) || libNames.includes(`${libraryName}.json`))\n return provider;\n }\n return null;\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 installed for MonomerLibHelper.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\nexport class MonomerSetPlaceholder {\n constructor(monomerLib, symbol, polymerType, monomerType, monomerLinks) {\n this.monomerLib = monomerLib;\n this.symbol = symbol;\n this.polymerType = polymerType;\n this.monomerType = monomerType;\n this.monomerLinks = monomerLinks;\n this.error = null;\n try {\n this.monomers = this.monomerLinks.map((mLink) => {\n const resM = this.monomerLib.getMonomer(this.polymerType, mLink.symbol);\n if (!resM)\n throw new Error('Monomer not found: ');\n if (resM.lib?.source != mLink.source)\n throw new Error(`Monomer '${symbol}' found in different library.`);\n return resM;\n });\n }\n catch (err) {\n const [errMsg, _errStack] = errInfo(err);\n this.error = errMsg;\n this.monomers = [];\n }\n }\n}\nexport class MonomerSet {\n constructor(description, placeholders, source = undefined, error = undefined) {\n this.description = description;\n this.placeholders = placeholders;\n this.source = source;\n this.error = error;\n }\n updateSets(setList, reload = false) {\n if (reload)\n this.placeholders = [];\n for (const _set of setList)\n if (!_set.error)\n this._updateSetInt(_set);\n // TODO: File onChanged\n }\n _updateSetInt(set) {\n for (const setPh of set.placeholders)\n this.placeholders.push(setPh);\n }\n}\n//# sourceMappingURL=monomer-library.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/test/src/test';\n\nimport {parseHelm} from '../utils';\nimport {initHelmMainPackage} from './utils';\n\nimport {_package} from '../package-test';\n\ncategory('Helm', () => {\n //These tests require webservice that is not present on test stand\n // test('helmToFasta', async () => {\n // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');\n // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');\n // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');\n // });\n //\n // test('helmToRNA', async () => {\n // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');\n // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');\n // // eslint-disable-next-line max-len\n // expect(\n // await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA'\n // );\n // });\n //\n // test('helmToPeptide', async () => {\n // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');\n // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');\n // // eslint-disable-next-line max-len\n // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');\n // });\n\n // detectMacromolecule is a function of Bio package\n // test('detectMacromolecule', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n // });\n\n // semType and units tags are detecting by Bio package function detectMacromolecule\n // test('detectHelm', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.meta.units, 'HELM');\n // });\n\n const complexMonomers = [\n // tests parsing of complex monomer in square brackets like [L-hArg(Et,Et)]\n 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n // tests parsing of complex monomer and one as a side chain as well\n 'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',\n // tests parsing of complex monomer and one as a side chain as well\n 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // tests complex monomer as side chain\n 'RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // test complex monomer, side chain and linker\n 'RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0'\n ];\n\n const complexMonomersExpected = [\n ['L-hArg(Et,Et)', 'E', 'F', 'G', 'C', 'E'],\n ['L-hArg(Et,Et)', 'L-hArg(Et,Et)', 'E', 'F', 'G'],\n ['dhp', 'm1A', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['r', 'mo6pur', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['afhna', 'mo6pur', '36SS', 'r', 'T', 'p']\n ];\n\n const complexTestNames = [\n 'complex-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',\n 'complex-side-chain', 'complex+side-chain+linker'\n ];\n\n before(async () => {\n await initHelmMainPackage();\n });\n\n test('parseHelm', async () => {\n const expectedResults = [\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],\n ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],\n ['R', 'U', 'P', 'T', 'A'],\n ['A', '*', 'G', 'C']\n ];\n const helmStrings = [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',\n // eslint-disable-next-line max-len\n 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',\n 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',\n 'PEPTIDE1{A.*.G.C}$$$$V2.0'\n ];\n for (let idx = 0; idx < helmStrings.length; ++idx) {\n const monomerSet = new Set(parseHelm(helmStrings[idx]));\n const monomerArray = Array.from(monomerSet);\n expect(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));\n }\n });\n complexMonomers.forEach((helm, i) => {\n test(complexTestNames[i], async () => {\n const monomersArray = parseHelm(helm);\n monomersArray.sort();\n const expected = complexMonomersExpected[i];\n expected.sort();\n expectArray(monomersArray, expected);\n });\n });\n});\n","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\n// -- Monomer libraries --\nconst LIB_STORAGE_NAME = 'Libraries';\nconst LIB_SETTINGS_KEY = 'Settings';\nconst DUPLICATE_MONOMER_PREFERENCES_KEY = 'DuplicateMonomerPreferences';\n// user settings does not allow more than 5000 characters, but unfortunately we need this, so we will split\n// the string into chunks and store them separately\nconst MAX_USER_SETTINGS_STRING_LENGTH = 4000;\nconst CHUNK_KEY_SUFFIX = 'nextChunk';\nasync function getDuplicatePrefsFull() {\n // the first part of it will always live in DUPLICATE_MONOMER_PREFERENCES_KEY\n let resStr = await grok.userSettings.getValue(LIB_STORAGE_NAME, DUPLICATE_MONOMER_PREFERENCES_KEY, true) ?? '';\n if (!resStr)\n return {};\n // chunk will end with special suffix and just before it will have the number of the next chunk key\n let iter = 1;\n while (resStr.endsWith(CHUNK_KEY_SUFFIX)) {\n const nextChunkKeysCount = iter.toString().length;\n const nextChunkIndex = new Array(nextChunkKeysCount).fill(0)\n .reduce((acc, _, i) => acc + resStr.charAt(resStr.length - nextChunkKeysCount + i - CHUNK_KEY_SUFFIX.length), '');\n const nextChunkKey = `${DUPLICATE_MONOMER_PREFERENCES_KEY}${nextChunkIndex}`;\n const nextChunkStr = (await grok.userSettings.getValue(LIB_STORAGE_NAME, nextChunkKey, true)) ?? '';\n resStr = resStr.slice(0, resStr.length - CHUNK_KEY_SUFFIX.length - nextChunkIndex.length) + nextChunkStr;\n iter++;\n }\n try {\n return JSON.parse(resStr);\n }\n catch (err) {\n console.error(`Failed to parse duplicateMonomerPreferences from user settings: ${err}`);\n return {};\n }\n}\nasync function setDuplicatePrefsFull(value) {\n const valueStr = JSON.stringify(value);\n const chunksCount = Math.ceil(valueStr.length / MAX_USER_SETTINGS_STRING_LENGTH);\n for (let i = 0; i < chunksCount; i++) {\n const key = i === 0 ? DUPLICATE_MONOMER_PREFERENCES_KEY : `${DUPLICATE_MONOMER_PREFERENCES_KEY}${i}`;\n const nextKey = i < chunksCount - 1 ? `${i + 1}` : '';\n const chunkStr = valueStr.slice(i * MAX_USER_SETTINGS_STRING_LENGTH, (i + 1) * MAX_USER_SETTINGS_STRING_LENGTH);\n const chunkStrToStore = nextKey ? chunkStr + nextKey + CHUNK_KEY_SUFFIX : chunkStr;\n await grok.userSettings.add(LIB_STORAGE_NAME, key, chunkStrToStore, true);\n }\n}\nlet userLibSettingsPromise = Promise.resolve();\nexport async function getUserLibSettings() {\n let res;\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n const resStr = await grok.userSettings.getValue(LIB_STORAGE_NAME, LIB_SETTINGS_KEY, true);\n res = resStr ? JSON.parse(resStr) : { exclude: [], explicit: [], duplicateMonomerPreferences: {} };\n const duplicatePrefs = await getDuplicatePrefsFull();\n // Fix empty object returned in case there is no settings stored for user\n res.exclude = res.exclude instanceof Array ? res.exclude : [];\n res.explicit = res.explicit instanceof Array ? res.explicit : [];\n res.duplicateMonomerPreferences = res.duplicateMonomerPreferences instanceof Object ?\n res.duplicateMonomerPreferences : {};\n // migrate from short hand if needed\n for (const polymerType in duplicatePrefs) {\n res.duplicateMonomerPreferences[polymerType] = res.duplicateMonomerPreferences[polymerType] ?? {};\n for (const libraryName in duplicatePrefs[polymerType]) {\n for (const monomerSymbol of duplicatePrefs[polymerType][libraryName])\n res.duplicateMonomerPreferences[polymerType][monomerSymbol] = libraryName;\n }\n }\n // console.debug(`Bio: getUserLibSettings()\\n${JSON.stringify(res, undefined, 2)}`);\n });\n await userLibSettingsPromise;\n return res;\n}\nexport async function setUserLibSettings(value) {\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n value.duplicateMonomerPreferences = value.duplicateMonomerPreferences ?? {};\n // console.debug(`Bio: setUserLibSettings()\\n${JSON.stringify(value, undefined, 2)}`);\n // extract short hand for duplicateMonomerPreferences\n const duplicatePrefsShortHand = {};\n for (const polymerType in value.duplicateMonomerPreferences) {\n duplicatePrefsShortHand[polymerType] = {};\n for (const monomerSymbol in value.duplicateMonomerPreferences[polymerType]) {\n const libraryName = value.duplicateMonomerPreferences[polymerType][monomerSymbol];\n duplicatePrefsShortHand[polymerType][libraryName] = duplicatePrefsShortHand[polymerType][libraryName] ?? [];\n duplicatePrefsShortHand[polymerType][libraryName].push(monomerSymbol);\n }\n }\n await setDuplicatePrefsFull(duplicatePrefsShortHand);\n //await grok.userSettings.add(LIB_STORAGE_NAME, DUPLICATE_MONOMER_PREFERENCES_KEY, JSON.stringify(duplicatePrefsShortHand), true);\n await grok.userSettings.add(LIB_STORAGE_NAME, LIB_SETTINGS_KEY, JSON.stringify(value), true);\n });\n await userLibSettingsPromise;\n}\n//# sourceMappingURL=lib-settings.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, expectObject, test} from '@datagrok-libraries/test/src/test';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings,\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {findMonomers, parseHelm} from '../utils';\nimport {initHelmMainPackage} from './utils';\n\n\n/** Tests with default monomer library */\ncategory('findMonomers', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Tests 'findMonomers' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries for tests\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true);\n });\n\n const tests: { [testName: string]: { test: string, tgt: Set<string> } } = {\n 'withoutMissed': {\n test: 'PEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(),\n },\n 'withMissed':\n {\n test: 'PEPTIDE1{meI.missed2.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(['missed2'])\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(testName, async () => {\n _testFindMonomers(testData.test, testData.tgt);\n });\n }\n\n function _testFindMonomers(testHelmValue: string, tgtMissedSet: Set<string>): void {\n const monomerLib = monomerLibHelper.getMonomerLib();\n const monomerSymbolList: string[] = parseHelm(testHelmValue);\n const resMissedSet: Set<string> = findMonomers(monomerSymbolList, monomerLib);\n expectObject(resMissedSet, tgtMissedSet);\n }\n});\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n /* Requires notation handler */ NOTATION[\"CUSTOM\"] = \"custom\";\n /* Requires notation handler */ NOTATION[\"BILN\"] = \"biln\";\n})(NOTATION || (NOTATION = {}));\nexport var ALPHABET;\n(function (ALPHABET) {\n ALPHABET[\"DNA\"] = \"DNA\";\n ALPHABET[\"RNA\"] = \"RNA\";\n ALPHABET[\"PT\"] = \"PT\";\n /** Unknown */\n ALPHABET[\"UN\"] = \"UN\";\n})(ALPHABET || (ALPHABET = {}));\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"aligned\"] = \"aligned\";\n TAGS[\"alphabet\"] = \"alphabet\";\n TAGS[\"alphabetSize\"] = \".alphabetSize\";\n TAGS[\"alphabetIsMultichar\"] = \".alphabetIsMultichar\";\n TAGS[\"separator\"] = \"separator\";\n TAGS[\"isHelmCompatible\"] = \".isHelmCompatible\";\n TAGS[\"positionNames\"] = \".positionNames\";\n TAGS[\"positionLabels\"] = \".positionLabels\";\n TAGS[\"regions\"] = \".regions\";\n TAGS[\"positionShift\"] = \".positionShift\";\n TAGS[\"selectedPosition\"] = \".selectedPosition\";\n TAGS[\"polymerTypeColumnName\"] = \".polymerTypeColumnName\";\n TAGS[\"annotations\"] = \".annotations\";\n TAGS[\"numberingScheme\"] = \".numberingScheme\";\n TAGS[\"annotationColumnName\"] = \".annotationColumnName\";\n})(TAGS || (TAGS = {}));\nexport { TAGS as BioTags };\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/g;\nexport const helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/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(ALPHABET.PT, Alphabets.fasta.peptide, 0.50),\n new CandidateType(ALPHABET.DNA, Alphabets.fasta.dna, 0.55),\n new CandidateType(ALPHABET.RNA, Alphabets.fasta.rna, 0.55),\n];\n/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\nexport const GapOriginals = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n [NOTATION.BILN]: '',\n};\nexport const MONOMER_MOTIF_SPLITTER = ' , ';\n/** Tag on Monomer columns storing the nqName of a function that returns an IMonomerCanonicalizer.\n * The `.%` prefix ensures this tag is persisted with projects. */\nexport const MONOMER_CANONICALIZER_FUNC_TAG = '.%monomer-canonicalizer-func';\n/** Column temp key for the cached IMonomerCanonicalizer instance */\nexport const MONOMER_CANONICALIZER_TEMP = 'monomer-canonicalizer';\nexport const NOTATION_PROVIDER_CONSTRUCTOR_ROLE = 'notationProviderConstructor';\n//# sourceMappingURL=consts.js.map","import { NOTATION_PROVIDER_CONSTRUCTOR_ROLE } from './consts';\nexport class NotationProviderBase {\n /** Name of the custom notation */\n static get notationName() {\n return 'Custom';\n }\n ;\n /** flag to let bio know if this provider implements method for converting helm to it */\n static get implementsFromHelm() {\n return false;\n }\n ;\n /** Method for converting HELM to this notation */\n static convertFromHelm(helm, options) {\n throw new Error(`Method convertFromHelm not implemented for this notation provider`);\n }\n ;\n static async getProviderConstructors() {\n // this is terrible, I know, but otherwise this gets put in webworkers and fails due to DG resolution)))\n // @ts-ignore\n if (window?.DG) {\n // @ts-ignore\n const constFuncs = window.DG.Func.find({ meta: { role: NOTATION_PROVIDER_CONSTRUCTOR_ROLE } });\n return Promise.all(constFuncs.map((f) => f.apply({})));\n }\n return [];\n }\n}\n/** 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","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","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, polymerType) {\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', // asp, aspartic acid, asp\n 'E': '#E60A0A', // glu, glutamic acid\n 'C': '#E6E600', // cys, cysteine\n 'M': '#E6E600', // met, methionine\n 'K': '#145AFF', // lys, lysine\n 'R': '#145AFF', // arg, arginine\n 'S': '#FA9600', // ser, serine\n 'T': '#FA9600', // thr, threonine\n 'F': '#3232AA', // phe, phenylalanine\n 'Y': '#3232AA', // tyr, tyrosine\n 'N': '#00DCDC', // asn, asparagine\n 'Q': '#00DCDC', // gln, glutamine\n 'G': '#EBEBEB', // gly, glycine\n 'L': '#0F820F', // leu, leucine\n 'V': '#0F820F', // val, valine\n 'I': '#0F820F', // ile, isoleucine\n 'A': '#C8C8C8', // ala, alanine\n 'W': '#B45AB4', // trp, tryptophan\n 'H': '#8282D2', // his, histidine\n 'P': '#DC9682', // pro, proline\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', // Nle - norleucine\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', // orange ?\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","/**\n * @module LRUCache\n */\nconst perf = typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ? process : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort;\n _onabort = [];\n reason;\n aborted = false;\n addEventListener(_, fn) {\n this._onabort.push(fn);\n }\n };\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill();\n }\n signal = new AS();\n abort(reason) {\n if (this.signal.aborted)\n return;\n //@ts-ignore\n this.signal.reason = reason;\n //@ts-ignore\n this.signal.aborted = true;\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason);\n }\n this.signal.onabort?.(reason);\n }\n };\n let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning)\n return;\n printACPolyfillWarning = false;\n emitWarning('AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n constructor(size) {\n super(size);\n this.fill(0);\n }\n}\nclass Stack {\n heap;\n length;\n // private constructor\n static #constructing = false;\n static create(max) {\n const HeapCls = getUintArray(max);\n if (!HeapCls)\n return [];\n Stack.#constructing = true;\n const s = new Stack(max, HeapCls);\n Stack.#constructing = false;\n return s;\n }\n constructor(max, HeapCls) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)');\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max);\n this.length = 0;\n }\n push(n) {\n this.heap[this.length++] = n;\n }\n pop() {\n return this.heap[--this.length];\n }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n #max;\n #maxSize;\n #dispose;\n #disposeAfter;\n #fetchMethod;\n #memoMethod;\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl;\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution;\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas;\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale;\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet;\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL;\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize;\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort;\n // computed properties\n #size;\n #calculatedSize;\n #keyMap;\n #keyList;\n #valList;\n #next;\n #prev;\n #head;\n #tail;\n #free;\n #disposed;\n #sizes;\n #starts;\n #ttls;\n #hasDispose;\n #hasFetchMethod;\n #hasDisposeAfter;\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals(c) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head;\n },\n get tail() {\n return c.#tail;\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n moveToTail: (index) => c.#moveToTail(index),\n indexes: (options) => c.#indexes(options),\n rindexes: (options) => c.#rindexes(options),\n isStale: (index) => c.#isStale(index),\n };\n }\n // Protected read-only members\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max() {\n return this.#max;\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize() {\n return this.#maxSize;\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize() {\n return this.#calculatedSize;\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size() {\n return this.#size;\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod() {\n return this.#fetchMethod;\n }\n get memoMethod() {\n return this.#memoMethod;\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose;\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter;\n }\n constructor(options) {\n const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options;\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer');\n }\n const UintArray = max ? getUintArray(max) : Array;\n if (!UintArray) {\n throw new Error('invalid max value: ' + max);\n }\n this.#max = max;\n this.#maxSize = maxSize;\n this.maxEntrySize = maxEntrySize || this.#maxSize;\n this.sizeCalculation = sizeCalculation;\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function');\n }\n }\n if (memoMethod !== undefined &&\n typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined');\n }\n this.#memoMethod = memoMethod;\n if (fetchMethod !== undefined &&\n typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified');\n }\n this.#fetchMethod = fetchMethod;\n this.#hasFetchMethod = !!fetchMethod;\n this.#keyMap = new Map();\n this.#keyList = new Array(max).fill(undefined);\n this.#valList = new Array(max).fill(undefined);\n this.#next = new UintArray(max);\n this.#prev = new UintArray(max);\n this.#head = 0;\n this.#tail = 0;\n this.#free = Stack.create(max);\n this.#size = 0;\n this.#calculatedSize = 0;\n if (typeof dispose === 'function') {\n this.#dispose = dispose;\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter;\n this.#disposed = [];\n }\n else {\n this.#disposeAfter = undefined;\n this.#disposed = undefined;\n }\n this.#hasDispose = !!this.#dispose;\n this.#hasDisposeAfter = !!this.#disposeAfter;\n this.noDisposeOnSet = !!noDisposeOnSet;\n this.noUpdateTTL = !!noUpdateTTL;\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n this.ignoreFetchAbort = !!ignoreFetchAbort;\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError('maxSize must be a positive integer if specified');\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError('maxEntrySize must be a positive integer if specified');\n }\n this.#initializeSizeTracking();\n }\n this.allowStale = !!allowStale;\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n this.updateAgeOnGet = !!updateAgeOnGet;\n this.updateAgeOnHas = !!updateAgeOnHas;\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1;\n this.ttlAutopurge = !!ttlAutopurge;\n this.ttl = ttl || 0;\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified');\n }\n this.#initializeTTLTracking();\n }\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError('At least one of max, maxSize, or ttl is required');\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED';\n if (shouldWarn(code)) {\n warned.add(code);\n const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.';\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n }\n }\n }\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key) {\n return this.#keyMap.has(key) ? Infinity : 0;\n }\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max);\n const starts = new ZeroArray(this.#max);\n this.#ttls = ttls;\n this.#starts = starts;\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0;\n ttls[index] = ttl;\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index], 'expire');\n }\n }, ttl + 1);\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n };\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0;\n };\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index];\n const start = starts[index];\n /* c8 ignore next */\n if (!ttl || !start)\n return;\n status.ttl = ttl;\n status.start = start;\n status.now = cachedNow || getNow();\n const age = status.now - start;\n status.remainingTTL = ttl - age;\n }\n };\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0;\n const getNow = () => {\n const n = perf.now();\n if (this.ttlResolution > 0) {\n cachedNow = n;\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n return n;\n };\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key);\n if (index === undefined) {\n return 0;\n }\n const ttl = ttls[index];\n const start = starts[index];\n if (!ttl || !start) {\n return Infinity;\n }\n const age = (cachedNow || getNow()) - start;\n return ttl - age;\n };\n this.#isStale = index => {\n const s = starts[index];\n const t = ttls[index];\n return !!t && !!s && (cachedNow || getNow()) - s > t;\n };\n }\n // conditionally set private methods related to TTL\n #updateItemAge = () => { };\n #statusTTL = () => { };\n #setItemTTL = () => { };\n /* c8 ignore stop */\n #isStale = () => false;\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max);\n this.#calculatedSize = 0;\n this.#sizes = sizes;\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index];\n sizes[index] = 0;\n };\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0;\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function');\n }\n size = sizeCalculation(v, k);\n if (!isPosInt(size)) {\n throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n }\n }\n else {\n throw new TypeError('invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.');\n }\n }\n return size;\n };\n this.#addItemSize = (index, size, status) => {\n sizes[index] = size;\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index];\n while (this.#calculatedSize > maxSize) {\n this.#evict(true);\n }\n }\n this.#calculatedSize += sizes[index];\n if (status) {\n status.entrySize = size;\n status.totalCalculatedSize = this.#calculatedSize;\n }\n };\n }\n #removeItemSize = _i => { };\n #addItemSize = (_i, _s, _st) => { };\n #requireSize = (_k, _v, size, sizeCalculation) => {\n if (size || sizeCalculation) {\n throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n }\n return 0;\n };\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#head) {\n break;\n }\n else {\n i = this.#prev[i];\n }\n }\n }\n }\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#tail) {\n break;\n }\n else {\n i = this.#next[i];\n }\n }\n }\n }\n #isValidIndex(index) {\n return (index !== undefined &&\n this.#keyMap.get(this.#keyList[index]) === index);\n }\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries();\n }\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache';\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(fn, getOptions = {}) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n if (fn(value, this.#keyList[i], this)) {\n return this.get(this.#keyList[i], getOptions);\n }\n }\n }\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(fn, thisp = this) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(fn, thisp = this) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false;\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i], 'expire');\n deleted = true;\n }\n }\n return deleted;\n }\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key) {\n const i = this.#keyMap.get(key);\n if (i === undefined)\n return undefined;\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n return undefined;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i];\n const start = this.#starts[i];\n if (ttl && start) {\n const remain = ttl - (perf.now() - start);\n entry.ttl = remain;\n entry.start = Date.now();\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n return entry;\n }\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr = [];\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i];\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined || key === undefined)\n continue;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i];\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - this.#starts[i];\n entry.start = Math.floor(Date.now() - age);\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n arr.unshift([key, entry]);\n }\n return arr;\n }\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr) {\n this.clear();\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start;\n entry.start = perf.now() - age;\n }\n this.set(key, entry.value, entry);\n }\n }\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(k, v, setOptions = {}) {\n if (v === undefined) {\n this.delete(k);\n return this;\n }\n const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss';\n status.maxEntrySizeExceeded = true;\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set');\n return this;\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n if (index === undefined) {\n // addition\n index = (this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size);\n this.#keyList[index] = k;\n this.#valList[index] = v;\n this.#keyMap.set(k, index);\n this.#next[this.#tail] = index;\n this.#prev[index] = this.#tail;\n this.#tail = index;\n this.#size++;\n this.#addItemSize(index, size, status);\n if (status)\n status.set = 'add';\n noUpdateTTL = false;\n }\n else {\n // update\n this.#moveToTail(index);\n const oldVal = this.#valList[index];\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'));\n const { __staleWhileFetching: s } = oldVal;\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set']);\n }\n }\n }\n else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set']);\n }\n }\n this.#removeItemSize(index);\n this.#addItemSize(index, size, status);\n this.#valList[index] = v;\n if (status) {\n status.set = 'replace';\n const oldValue = oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal;\n if (oldValue !== undefined)\n status.oldValue = oldValue;\n }\n }\n else if (status) {\n status.set = 'update';\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking();\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start);\n }\n if (status)\n this.#statusTTL(status, index);\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return this;\n }\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop() {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head];\n this.#evict(true);\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching;\n }\n }\n else if (val !== undefined) {\n return val;\n }\n }\n }\n finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n }\n #evict(free) {\n const head = this.#head;\n const k = this.#keyList[head];\n const v = this.#valList[head];\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict']);\n }\n }\n this.#removeItemSize(head);\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined;\n this.#valList[head] = undefined;\n this.#free.push(head);\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0;\n this.#free.length = 0;\n }\n else {\n this.#head = this.#next[head];\n }\n this.#keyMap.delete(k);\n this.#size--;\n return head;\n }\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k, hasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined) {\n return false;\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index);\n }\n if (status) {\n status.has = 'hit';\n this.#statusTTL(status, index);\n }\n return true;\n }\n else if (status) {\n status.has = 'stale';\n this.#statusTTL(status, index);\n }\n }\n else if (status) {\n status.has = 'miss';\n }\n return false;\n }\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k, peekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions;\n const index = this.#keyMap.get(k);\n if (index === undefined ||\n (!allowStale && this.#isStale(index))) {\n return;\n }\n const v = this.#valList[index];\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n }\n #backgroundFetch(k, index, options, context) {\n const v = index === undefined ? undefined : this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n return v;\n }\n const ac = new AC();\n const { signal } = options;\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n });\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n };\n const cb = (v, updateCache = false) => {\n const { aborted } = ac.signal;\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true;\n options.status.fetchError = ac.signal.reason;\n if (ignoreAbort)\n options.status.fetchAbortIgnored = true;\n }\n else {\n options.status.fetchResolved = true;\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason);\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p;\n if (this.#valList[index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index] = bf.__staleWhileFetching;\n }\n else {\n this.#delete(k, 'fetch');\n }\n }\n else {\n if (options.status)\n options.status.fetchUpdated = true;\n this.set(k, v, fetchOpts.options);\n }\n }\n return v;\n };\n const eb = (er) => {\n if (options.status) {\n options.status.fetchRejected = true;\n options.status.fetchError = er;\n }\n return fetchFail(er);\n };\n const fetchFail = (er) => {\n const { aborted } = ac.signal;\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n const noDelete = allowStale || options.noDeleteOnFetchRejection;\n const bf = p;\n if (this.#valList[index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined;\n if (del) {\n this.#delete(k, 'fetch');\n }\n else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index] = bf.__staleWhileFetching;\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true;\n }\n return bf.__staleWhileFetching;\n }\n else if (bf.__returned === bf) {\n throw er;\n }\n };\n const pcall = (res, rej) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej);\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort) {\n res(undefined);\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true);\n }\n }\n });\n };\n if (options.status)\n options.status.fetchDispatched = true;\n const p = new Promise(pcall).then(cb, eb);\n const bf = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n });\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined });\n index = this.#keyMap.get(k);\n }\n else {\n this.#valList[index] = bf;\n }\n return bf;\n }\n #isBackgroundFetch(p) {\n if (!this.#hasFetchMethod)\n return false;\n const b = p;\n return (!!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC);\n }\n async fetch(k, fetchOptions = {}) {\n const { \n // get options\n allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n // set options\n ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n if (!this.#hasFetchMethod) {\n if (status)\n status.fetch = 'get';\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n });\n }\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n };\n let index = this.#keyMap.get(k);\n if (index === undefined) {\n if (status)\n status.fetch = 'miss';\n const p = this.#backgroundFetch(k, index, options, context);\n return (p.__returned = p);\n }\n else {\n // in cache, maybe already fetching\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined;\n if (status) {\n status.fetch = 'inflight';\n if (stale)\n status.returnedStale = true;\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v);\n }\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index);\n if (!forceRefresh && !isStale) {\n if (status)\n status.fetch = 'hit';\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n if (status)\n this.#statusTTL(status, index);\n return v;\n }\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context);\n const hasStale = p.__staleWhileFetching !== undefined;\n const staleVal = hasStale && allowStale;\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh';\n if (staleVal && isStale)\n status.returnedStale = true;\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n }\n }\n async forceFetch(k, fetchOptions = {}) {\n const v = await this.fetch(k, fetchOptions);\n if (v === undefined)\n throw new Error('fetch() returned undefined');\n return v;\n }\n memo(k, memoOptions = {}) {\n const memoMethod = this.#memoMethod;\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor');\n }\n const { context, forceRefresh, ...options } = memoOptions;\n const v = this.get(k, options);\n if (!forceRefresh && v !== undefined)\n return v;\n const vv = memoMethod(k, v, {\n options,\n context,\n });\n this.set(k, vv, options);\n return vv;\n }\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k, getOptions = {}) {\n const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const value = this.#valList[index];\n const fetching = this.#isBackgroundFetch(value);\n if (status)\n this.#statusTTL(status, index);\n if (this.#isStale(index)) {\n if (status)\n status.get = 'stale';\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire');\n }\n if (status && allowStale)\n status.returnedStale = true;\n return allowStale ? value : undefined;\n }\n else {\n if (status &&\n allowStale &&\n value.__staleWhileFetching !== undefined) {\n status.returnedStale = true;\n }\n return allowStale ? value.__staleWhileFetching : undefined;\n }\n }\n else {\n if (status)\n status.get = 'hit';\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching;\n }\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n return value;\n }\n }\n else if (status) {\n status.get = 'miss';\n }\n }\n #connect(p, n) {\n this.#prev[n] = p;\n this.#next[p] = n;\n }\n #moveToTail(index) {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n this.#connect(this.#prev[index], this.#next[index]);\n }\n this.#connect(this.#tail, index);\n this.#tail = index;\n }\n }\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k) {\n return this.#delete(k, 'delete');\n }\n #delete(k, reason) {\n let deleted = false;\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n deleted = true;\n if (this.#size === 1) {\n this.#clear(reason);\n }\n else {\n this.#removeItemSize(index);\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n this.#keyMap.delete(k);\n this.#keyList[index] = undefined;\n this.#valList[index] = undefined;\n if (index === this.#tail) {\n this.#tail = this.#prev[index];\n }\n else if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n const pi = this.#prev[index];\n this.#next[pi] = this.#next[index];\n const ni = this.#next[index];\n this.#prev[ni] = this.#prev[index];\n }\n this.#size--;\n this.#free.push(index);\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return deleted;\n }\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete');\n }\n #clear(reason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else {\n const k = this.#keyList[index];\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n }\n this.#keyMap.clear();\n this.#valList.fill(undefined);\n this.#keyList.fill(undefined);\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0);\n this.#starts.fill(0);\n }\n if (this.#sizes) {\n this.#sizes.fill(0);\n }\n this.#head = 0;\n this.#tail = 0;\n this.#free.length = 0;\n this.#calculatedSize = 0;\n this.#size = 0;\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n}\n//# sourceMappingURL=index.js.map","import {LRUCache}from'lru-cache';var I=class extends Error{constructor(e,t,n){super(t),this.name=\"HwError\",this.code=e,n!==void 0&&(this.context=Object.freeze({...n})),Object.setPrototypeOf(this,new.target.prototype),typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,new.target);}},N=class extends I{constructor(e,t,n){super(e,t,n?.context),this.name=\"HelmParseError\",n?.span!==void 0&&(this.span={...n.span}),Object.setPrototypeOf(this,new.target.prototype);}},Ye=class extends I{constructor(e,t){let n=Object.freeze([...e]),o=t??Vi(n);super(\"helm-validation-failed\",o),this.name=\"HelmValidationError\",this.diagnostics=n,Object.setPrototypeOf(this,new.target.prototype);}};function Vi(i){if(i.length===0)return \"HELM validation failed\";let t=i[0],n=i.length>1?` (+${i.length-1} more)`:\"\";return `HELM validation failed: ${t.code} \\u2014 ${t.message}${n}`}var j=class extends I{constructor(e,t,n){super(e,t??`HELM operation not supported: ${e}`,n),this.name=\"HelmNotSupportedError\",Object.setPrototypeOf(this,new.target.prototype);}},Qt=class extends I{constructor(e,t){super(\"monomer-not-found\",`Monomer not found in library: ${e}/${t}`,{polymerType:e,symbol:t}),this.name=\"MonomerNotFoundError\",this.polymerType=e,this.symbol=t,Object.setPrototypeOf(this,new.target.prototype);}};var Te=class{constructor(e){if(!Number.isInteger(e.max)||e.max<=0)throw new RangeError(`LruCache: max must be a positive integer (got ${e.max})`);let t=e.onEvict;this._cache=t===void 0?new LRUCache({max:e.max}):new LRUCache({max:e.max,dispose:(n,o,r)=>{t(o,n);}});}get(e){return this._cache.get(e)}set(e,t){this._cache.set(e,t);}has(e){return this._cache.has(e)}delete(e){return this._cache.delete(e)}clear(){this._cache.clear();}get size(){return this._cache.size}keys(){return this._cache.keys()}entries(){return this._cache.entries()}};var Se=class{debug(e,t){}info(e,t){}warn(e,t){}error(e,t){}};function en(i){return i>=65&&i<=90||i>=97&&i<=122}function Xe(i){return i>=48&&i<=57}function Ui(i){return i===32||i===9||i===10||i===13}var tn=class{constructor(e){this.src=e,this.len=e.length,this.pos=0,this.tokens=[];}tokenize(){for(;this.pos<this.len;){let e=this.pos,t=this.src.charCodeAt(this.pos);if(Ui(t))throw new N(\"unexpected-whitespace\",`Unexpected whitespace at offset ${e}`,{span:{start:e,end:e+1}});if(t===91){this.scanBracket(e);continue}if(t===34){this.scanQuote(e);continue}if(en(t)){this.scanIdentifier(e);continue}if(Xe(t)){this.scanNumber(e);continue}let n=zi.get(t);if(n!==void 0){this.pos+=1,this.push(n,this.src.charAt(e),e,this.pos);continue}throw new N(\"unexpected-char\",`Unexpected character ${JSON.stringify(this.src.charAt(e))} at offset ${e}`,{span:{start:e,end:e+1}})}return this.push(\"eof\",\"\",this.len,this.len),{tokens:this.tokens,source:this.src}}scanBracket(e){let t=1,n=false,o=false,r=e+1;for(;r<this.len;){let s=this.src.charCodeAt(r);if(n){if(s===92&&r+1<this.len){r+=2;continue}if(s===34){n=false,r+=1;continue}if(s===10||s===13)throw new N(\"unexpected-newline\",`Newline inside bracket at offset ${r}`,{span:{start:r,end:r+1}});r+=1;continue}if(o){if(s===36&&r+1<this.len){let a=this.src.charCodeAt(r+1);if(a===124){o=false,r+=2;continue}if(a===93){o=false,r+=1;continue}}if(s===10||s===13)throw new N(\"unexpected-newline\",`Newline inside bracket at offset ${r}`,{span:{start:r,end:r+1}});r+=1;continue}if(s===10||s===13)throw new N(\"unexpected-newline\",`Newline inside bracket at offset ${r}`,{span:{start:r,end:r+1}});if(s===34){n=true,r+=1;continue}if(s===124&&r+1<this.len&&this.src.charCodeAt(r+1)===36){o=true,r+=2;continue}if(s===91){t+=1,r+=1;continue}if(s===93){if(t-=1,t===0){let a=r+1,l=this.src.slice(e+1,r);this.pos=a,this.push(\"inline-smiles\",l,e,a);return}r+=1;continue}r+=1;}throw new N(\"unterminated-bracket\",`Unterminated '[' starting at offset ${e}`,{span:{start:e,end:this.len}})}scanQuote(e){let t=[],n=e+1;for(;n<this.len;){let o=this.src.charCodeAt(n);if(o===34){let r=n+1;this.pos=r,this.push(\"quote-string\",t.join(\"\"),e,r);return}if(o===92&&n+1<this.len){let r=this.src.charCodeAt(n+1);r===34?t.push('\"'):r===92?t.push(\"\\\\\"):r===110?t.push(`\n`):r===114?t.push(\"\\r\"):r===116?t.push(\"\t\"):(t.push(\"\\\\\"),t.push(this.src.charAt(n+1))),n+=2;continue}if(o===10||o===13)throw new N(\"unexpected-newline\",`Newline inside quote at offset ${n}`,{span:{start:n,end:n+1}});t.push(this.src.charAt(n)),n+=1;}throw new N(\"unterminated-quote\",`Unterminated '\"' starting at offset ${e}`,{span:{start:e,end:this.len}})}scanIdentifier(e){let t=e+1;for(;t<this.len;){let o=this.src.charCodeAt(t);if(en(o)||Xe(o)||o===95){t+=1;continue}if(o===45&&t+1<this.len&&en(this.src.charCodeAt(t+1))){t+=2;continue}break}let n=this.src.slice(e,t);this.pos=t,this.push(\"identifier\",n,e,t);}scanNumber(e){let t=e+1;for(;t<this.len&&Xe(this.src.charCodeAt(t));)t+=1;if(t+1<this.len&&this.src.charCodeAt(t)===46&&Xe(this.src.charCodeAt(t+1))){for(t+=2;t<this.len&&Xe(this.src.charCodeAt(t));)t+=1;let o=this.src.slice(e,t);this.pos=t,this.push(\"decimal\",o,e,t);return}let n=this.src.slice(e,t);this.pos=t,this.push(\"integer\",n,e,t);}push(e,t,n,o){this.tokens.push({kind:e,value:t,span:{start:n,end:o}});}},zi=new Map([[123,\"lbrace\"],[125,\"rbrace\"],[40,\"lparen\"],[41,\"rparen\"],[93,\"rbracket\"],[124,\"pipe\"],[46,\"dot\"],[44,\"comma\"],[43,\"plus\"],[58,\"colon\"],[45,\"dash\"],[36,\"dollar\"],[62,\"gt\"],[63,\"question\"],[42,\"asterisk\"],[95,\"underscore\"],[39,\"apos\"]]);function qn(i){let e=new tn(i).tokenize();return Ki(e),e}function Ki(i){let e=null;for(let t of i.tokens)if(t.kind===\"apos\")e=e===null?t.span:null;else if(t.kind===\"eof\"&&e!==null)throw new N(\"unterminated-apostrophe\",`Unterminated apostrophe block starting at offset ${e.start}`,{span:{start:e.start,end:i.source.length}})}var Wi={perPolymer:new Map,version:\"\"};function me(){return {atoms:[],bonds:[],chains:[],groups:[],annotations:Wi}}function J(i,e){for(let t of i.atoms)if(t.id===e)return t}function _t(i,e){for(let t of i.bonds)if(t.id===e)return t}function le(i,e){if(e===void 0)return i.bio.positionInChain;let t=0;for(let n=0;n<e.backboneAtoms.length;n++){let o=e.backboneAtoms[n];if(o!==void 0&&(t+=1,o.id===i.id||o.branchAtom!==void 0&&(t+=1,o.branchAtom.id===i.id)))return t}return 0}var b={AA:\"HELM_AA\",SUGAR:\"HELM_SUGAR\",BASE:\"HELM_BASE\",LINKER:\"HELM_LINKER\",CHEM:\"HELM_CHEM\",BLOB:\"HELM_BLOB\",NUCLEOTIDE:\"HELM_NUCLEOTIDE\"},v={PEPTIDE:\"PEPTIDE\",RNA:\"RNA\",CHEM:\"CHEM\",BLOB:\"BLOB\",G:\"G\"},ji={BACKBONE:\"Backbone\",BRANCH:\"Branch\",TERMINAL:\"Terminal\",UNDEFINED:\"Undefined\"};var _e=class{constructor(){this._counter=0;}next(){return this._counter+=1,this._counter}reset(){this._counter=0;}get current(){return this._counter}};function Ee(i){let e=new Map,t=0;for(let n of i.chains)for(let o of n.backboneAtoms)t+=1,e.set(o.id,t),o.branchAtom!==void 0&&(t+=1,e.set(o.branchAtom.id,t));return e}function Ce(i){let e=i.trim();if(/^\\[[a-zA-Z_][a-zA-Z0-9_]*\\]$/.test(e))return false;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n===40||n===91||n===61||n===47||n===92||n===42)return true}return false}function qi(i){let e=new Map,t=/\\[R(\\d{1,2})\\]/g,n;for(;(n=t.exec(i))!==null;){let o=parseInt(n[1],10);o>=1&&o<=10&&!e.has(o)&&e.set(o,n.index);}return e}function Yi(i){let e=new Map,n=/\\s*\\|\\$([^$]*)\\$\\|/.exec(i);if(n===null)return e;let o=n[1].split(\";\"),r=n.index+n[0].indexOf(\"$\")+1,s=0;for(let a of o){let l=/^_R(\\d{1,2})$/.exec(a);if(l!==null){let d=parseInt(l[1],10);d>=1&&d<=10&&!e.has(d)&&e.set(d,r+s);}s+=a.length+1;}return e}function Xi(i){let e=new Map,t=/\\[\\*:(\\d{1,2})\\]/g,n;for(;(n=t.exec(i))!==null;){let o=parseInt(n[1],10);o>=1&&o<=10&&!e.has(o)&&e.set(o,n.index);}return e}function Yn(i){let e=i.trim();if(e.length===0)return {ok:false,reason:\"empty-smiles\"};let t=qi(e);if(t.size>0)return {ok:true,canonicalSmiles:e,info:{rs:t.size,rgroupPositions:t,flavor:\"jsdraw\"}};let n=Yi(e);if(n.size>0)return {ok:true,canonicalSmiles:e,info:{rs:n.size,rgroupPositions:n,flavor:\"chemaxon\"}};let o=Xi(e);return o.size>0?{ok:true,canonicalSmiles:e,info:{rs:o.size,rgroupPositions:o,flavor:\"opensmiles\"}}:{ok:false,reason:\"no-rgroups-found\"}}var Z=class{constructor(){this._listeners=new Set;this._completed=false;}subscribe(e){return this._completed?()=>{}:(this._listeners.add(e),()=>{this._listeners.delete(e);})}next(e){if(!this._completed)for(let t of [...this._listeners])t(e);}complete(){this._completed=true,this._listeners.clear();}get observerCount(){return this._listeners.size}};function B(i){return {line:\"#202020\",text:\"#000000\",background:i}}function Ji(i){return {line:\"#e0e0e0\",text:\"#ffffff\",background:rn(i,.25)}}function Le(i){let e=/^#([0-9a-fA-F]{6})$/.exec(i),t=/^#([0-9a-fA-F]{3})$/.exec(i);if(e!==null){let n=e[1];return [parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]}if(t!==null){let n=t[1];return [parseInt(n[0]+n[0],16),parseInt(n[1]+n[1],16),parseInt(n[2]+n[2],16)]}return null}function nn(i){return i.toString(16).padStart(2,\"0\")}function sn(i,e,t){return `#${nn(i)}${nn(e)}${nn(t)}`}function an(i,e,t){let n=i/255,o=e/255,r=t/255,s=Math.max(n,o,r),a=Math.min(n,o,r),l=(s+a)/2;if(s===a)return [0,0,l];let d=s-a,c=l>.5?d/(2-s-a):d/(s+a),u;return s===n?u=((o-r)/d+(o<r?6:0))*60:s===o?u=((r-n)/d+2)*60:u=((n-o)/d+4)*60,[u,c,l]}function on(i,e,t){let n=t;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?i+(e-i)*6*n:n<1/2?e:n<2/3?i+(e-i)*(2/3-n)*6:i}function Jn(i,e,t){if(e===0){let s=Math.round(t*255);return [s,s,s]}let n=t<.5?t*(1+e):t+e-t*e,o=2*t-n,r=i/360;return [Math.round(on(o,n,r+1/3)*255),Math.round(on(o,n,r)*255),Math.round(on(o,n,r-1/3)*255)]}function xt(i,e=.3,t=.1){let n=Le(i);if(n===null)return i;let[o,r,s]=an(n[0],n[1],n[2]),a=Math.max(0,Math.min(1,r*(1-e))),l=Math.max(0,Math.min(.95,s+t*(1-s))),[d,c,u]=Jn(o,a,l);return sn(d,c,u)}function Xn(i){let e=Le(i);if(e===null)return 0;let t=n=>{let o=n/255;return o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4)};return .2126*t(e[0])+.7152*t(e[1])+.0722*t(e[2])}function Zn(i,e){let t=Xn(i),n=Xn(e),o=Math.max(t,n),r=Math.min(t,n);return (o+.05)/(r+.05)}function Qn(i){let e=Le(i);if(e===null)return {h:0,s:0,l:0};let[t,n,o]=an(e[0],e[1],e[2]);return {h:t,s:n,l:o}}function Zi(i){let e=(i.h%360+360)%360,t=Math.max(0,Math.min(1,i.s)),n=Math.max(0,Math.min(1,i.l)),[o,r,s]=Jn(e,t,n);return sn(o,r,s)}function vt(i){let e=Le(i);if(e===null)return \"#1f2937\";let[t,n,o]=an(e[0],e[1],e[2]);if(o>.85||n<.15&&o>.7)return \"#1f2937\";let r=Math.max(.08,o-.3),s=Math.min(1,n+.1);return Zi({h:t,s,l:r})}function Qi(i){let e=Le(i);return e===null?null:{r:e[0]/255,g:e[1]/255,b:e[2]/255}}function wt(i){let e=Qi(i);if(e===null)return \"#1f2937\";let t=s=>s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),n=.2126*t(e.r)+.7152*t(e.g)+.0722*t(e.b),o=(n+.05)/(0+.05);return (1+.05)/(n+.05)>o?\"#ffffff\":\"#1f2937\"}function rn(i,e){let t=Le(i);if(t===null)return i;let n=1-e,o=Math.max(0,Math.min(255,Math.round(t[0]*n))),r=Math.max(0,Math.min(255,Math.round(t[1]*n))),s=Math.max(0,Math.min(255,Math.round(t[2]*n)));return sn(o,r,s)}var eo={A:B(\"#A0A0FF\"),G:B(\"#FF7070\"),T:B(\"#A0FFA0\"),C:B(\"#FF8C4B\"),U:B(\"#FF8080\")},to={R:B(\"#7a85c1\"),r:B(\"#7a85c1\")},no={P:B(\"#9aa5e1\"),p:B(\"#9aa5e1\")},oo={A:B(\"#C8C8C8\"),R:B(\"#145AFF\"),N:B(\"#00DCDC\"),D:B(\"#E60A0A\"),C:B(\"#E6E600\"),E:B(\"#00DCDC\"),Q:B(\"#E60A0A\"),G:B(\"#EBEBEB\"),H:B(\"#8282D2\"),I:B(\"#0F820F\"),L:B(\"#0F820F\"),K:B(\"#145AFF\"),M:B(\"#E6E600\"),F:B(\"#3232AA\"),P:B(\"#DC9682\"),S:B(\"#FA9600\"),T:B(\"#FA9600\"),W:B(\"#B45AB4\"),Y:B(\"#3232AA\"),V:B(\"#0F820F\")},io={R:B(\"#eeeeee\")},ro={B:B(\"#999999\"),G:B(\"#e2e2e2\")},so={P:B(\"#9aa5e1\")},we={name:\"light\",fallback:{line:\"#202020\",text:\"#000000\",background:\"#eeeeee\"},errorTriple:{line:\"#cc0000\",text:\"#000000\",background:\"#FFFF00\"},palette:{[b.BASE]:eo,[b.SUGAR]:to,[b.LINKER]:no,[b.AA]:oo,[b.CHEM]:io,[b.BLOB]:ro,[b.NUCLEOTIDE]:so}};function ve(i){let e={};for(let[t,n]of Object.entries(i))e[t]=Ji(n.background);return e}var Be={name:\"dark\",fallback:{line:\"#e0e0e0\",text:\"#ffffff\",background:rn(\"#eeeeee\",.5)},errorTriple:{line:\"#ff5050\",text:\"#ffffff\",background:rn(\"#FFFF00\",.4)},palette:{[b.BASE]:ve(eo),[b.SUGAR]:ve(to),[b.LINKER]:ve(no),[b.AA]:ve(oo),[b.CHEM]:ve(io),[b.BLOB]:ve(ro),[b.NUCLEOTIDE]:ve(so)}};function $(i,e,t=we){if(i===null)return {...t.errorTriple};let n=i.meta?.colors;if(n!==void 0){let r=t.name===\"light\"?n.light:t.name===\"dark\"?n.dark:void 0;if(r!==void 0)return {...r,line:vt(r.background)};if(n.default!==void 0)return {...n.default,line:vt(n.default.background)}}let o=i.naturalAnalog;if(o!==void 0&&o!==\"\"){let r=t.palette[e];if(r!==void 0){let s=r[o];if(s!==void 0)return {...s,line:vt(s.background),text:wt(s.background)}}}return {...t.fallback,line:vt(t.fallback.background),text:wt(t.fallback.background)}}function Je(i){for(let e in i)if(Object.prototype.hasOwnProperty.call(i,e)&&e.toLowerCase()===\"capgroupsmiles\"){let t=i[e];if(typeof t==\"string\")return t}}function ao(i){let e=false,t=i.rgroups.map(n=>{let o=Je(n);return o!==void 0&&n.capGroupSMILES!==o?(e=true,{...n,capGroupSMILES:o}):n});return e?{...i,rgroups:t}:i}var er=new Set([\"PEPTIDE\",\"RNA\",\"CHEM\",\"BLOB\"]),tr=new Set([\"Backbone\",\"Branch\",\"Terminal\",\"Undefined\"]),nr=/^R[1-9][0-9]*$/;function kt(i){let e=[];if(!Array.isArray(i))return {ok:false,errors:[{path:\"$\",message:`Expected a JSON array of monomers, got ${F(i)}`}]};for(let t=0;t<i.length;t++)or(i[t],`$.${t}`,e);return e.length>0?{ok:false,errors:e}:{ok:true,data:i}}function or(i,e,t){if(!Qe(i)){t.push({path:e,message:`Expected an object, got ${F(i)}`});return}ln(i,\"symbol\",e,t,{minLength:1}),ln(i,\"molfile\",e,t);let n=i.polymerType;n===void 0?t.push({path:`${e}.polymerType`,message:\"Required property missing\"}):typeof n!=\"string\"?t.push({path:`${e}.polymerType`,message:`Expected string, got ${F(n)}`}):er.has(n)||t.push({path:`${e}.polymerType`,message:`Expected one of PEPTIDE|RNA|CHEM|BLOB, got '${n}'`});let o=i.monomerType;o===void 0?t.push({path:`${e}.monomerType`,message:\"Required property missing\"}):typeof o!=\"string\"?t.push({path:`${e}.monomerType`,message:`Expected string, got ${F(o)}`}):tr.has(o)||t.push({path:`${e}.monomerType`,message:`Expected one of Backbone|Branch|Terminal|Undefined, got '${o}'`});let r=i.rgroups;if(r===void 0)t.push({path:`${e}.rgroups`,message:\"Required property missing\"});else if(!Array.isArray(r))t.push({path:`${e}.rgroups`,message:`Expected array, got ${F(r)}`});else {let s=new Set;for(let a=0;a<r.length;a++)ir(r[a],`${e}.rgroups[${a}]`,t,s);}if(Ze(i,\"name\",e,t),Ze(i,\"smiles\",e,t),Ze(i,\"naturalAnalog\",e,t),Ze(i,\"author\",e,t),\"createDate\"in i&&i.createDate!==void 0&&i.createDate!==null&&typeof i.createDate!=\"string\"&&t.push({path:`${e}.createDate`,message:`Expected string or null, got ${F(i.createDate)}`}),\"id\"in i&&i.id!==void 0){let s=i.id;typeof s==\"string\"||typeof s==\"number\"&&Number.isInteger(s)||t.push({path:`${e}.id`,message:`Expected integer or string, got ${F(s)}`});}if(\"meta\"in i&&i.meta!==void 0){let s=i.meta;Qe(s)?s.colors!==void 0&&rr(s.colors,`${e}.meta.colors`,t):t.push({path:`${e}.meta`,message:`Expected object, got ${F(s)}`});}}function ir(i,e,t,n){if(!Qe(i)){t.push({path:e,message:`Expected an object, got ${F(i)}`});return}let o=i.label;if(o===void 0?t.push({path:`${e}.label`,message:\"Required property missing\"}):typeof o!=\"string\"?t.push({path:`${e}.label`,message:`Expected string, got ${F(o)}`}):nr.test(o)?n.has(o)?t.push({path:`${e}.label`,message:`Duplicate R-group label '${o}'`}):n.add(o):t.push({path:`${e}.label`,message:`Expected pattern /^R[1-9][0-9]*$/, got '${o}'`}),ln(i,\"capGroupName\",e,t),Je(i)===void 0){let r=Object.keys(i).some(s=>s.toLowerCase()===\"capgroupsmiles\");t.push({path:`${e}.capGroupSMILES`,message:r?\"Expected string\":\"Required property missing\"});}Ze(i,\"alternateId\",e,t),\"id\"in i&&i.id!==void 0&&(typeof i.id!=\"number\"||!Number.isInteger(i.id))&&t.push({path:`${e}.id`,message:`Expected integer, got ${F(i.id)}`});}function rr(i,e,t){if(!Qe(i)){t.push({path:e,message:`Expected object, got ${F(i)}`});return}for(let n of [\"default\",\"light\",\"dark\"])i[n]!==void 0&&sr(i[n],`${e}.${n}`,t);}function sr(i,e,t){if(!Qe(i)){t.push({path:e,message:`Expected object, got ${F(i)}`});return}for(let n of [\"line\",\"text\",\"background\"])i[n]===void 0?t.push({path:`${e}.${n}`,message:\"Required property missing\"}):typeof i[n]!=\"string\"&&t.push({path:`${e}.${n}`,message:`Expected string, got ${F(i[n])}`});}function ln(i,e,t,n,o){let r=i[e],s=`${t}.${e}`;if(r===void 0){n.push({path:s,message:\"Required property missing\"});return}if(typeof r!=\"string\"){n.push({path:s,message:`Expected string, got ${F(r)}`});return}o?.minLength!==void 0&&r.length<o.minLength&&n.push({path:s,message:`Expected string of length >= ${o.minLength}, got ${r.length}`});}function Ze(i,e,t,n){let o=i[e];o!==void 0&&typeof o!=\"string\"&&n.push({path:`${t}.${e}`,message:`Expected string, got ${F(o)}`});}function Qe(i){return typeof i==\"object\"&&i!==null&&!Array.isArray(i)}function F(i){return i===null?\"null\":Array.isArray(i)?\"array\":typeof i}var ar=/^R([1-9][0-9]*)$/;function ee(i){switch(i.polymerType){case v.PEPTIDE:return b.AA;case v.CHEM:return b.CHEM;case v.BLOB:return b.BLOB;case v.RNA:{if(i.monomerType===\"Branch\")return b.BASE;if(i.monomerType===\"Backbone\"){let e=i.naturalAnalog;return e===\"P\"||e===\"p\"?b.LINKER:b.SUGAR}return null}default:return null}}function lr(i){let e=new Map;for(let t of i.rgroups){let n=ar.exec(t.label);n!==null&&e.set(parseInt(n[1],10),t);}return Object.assign({},i,{rs:i.rgroups.length,rgroupMap:e})}var dn=class i{constructor(e){this._version=0;this._byPolymerSymbol=new Map;this._byBiotypeSymbol=new Map;this._byNaturalAnalog=new Map;this._resolved=new WeakMap;this._inlineSmilesCounter=0;this.source=e,this.onChanged=new Z;}static empty(e=\"empty\"){return new i(e)}static fromJSON(e,t=\"inline\",n){let o=new i(t);for(let r=0;r<e.length;r++){let s=e[r],a=kt([s]);if(!a.ok){n!==void 0?n.skipped.push({index:r,errors:a.errors}):console.warn(`MonomerLib.fromJSON: skipping invalid entry at index ${r}`,a.errors);continue}o._addNoFire(s);}return o}static fromText(e,t=\"inline\"){let n;try{n=JSON.parse(e);}catch(r){let s=r instanceof Error?r.message:String(r);throw new I(\"invalid-monomer-lib\",`MonomerLib.fromText: JSON.parse failed \\u2014 ${s}`)}let o=kt(n);if(!o.ok)throw new I(\"invalid-monomer-lib\",`MonomerLib.fromText: schema validation failed (${o.errors.length} errors)`,{errors:o.errors});return i.fromJSON(o.data,t)}static async fromUrl(e,t){let n=t??globalThis.fetch;if(n===void 0)throw new I(\"fetch-unavailable\",\"MonomerLib.fromUrl: no fetch implementation available \\u2014 pass `fetchImpl` or run in a fetch-capable environment.\",{url:e});let o=await n(e);if(!o.ok)throw new I(\"monomer-lib-fetch-failed\",`MonomerLib.fromUrl: HTTP ${o.status} fetching ${e}`,{url:e,status:o.status});let r=await o.text();return i.fromText(r,e)}static merge(...e){let t=e.map(o=>o.source).join(\"+\")||\"empty\",n=new i(t);for(let o of e)for(let r of o.getPolymerTypes())for(let s of o.getMonomerSymbolsByType(r)){let a=o.getMonomer(r,s);a!==null&&n._addNoFire(a);}return n}get isEmpty(){for(let e of this._byPolymerSymbol.values())if(e.size>0)return false;return true}get version(){return this._version}getMonomer(e,t){let n=this._byPolymerSymbol.get(e);return n===void 0?null:n.get(t)??null}getMonomerSet(e){let t=this._byBiotypeSymbol.get(e);return t===void 0?new Map:new Map(t)}getMonomerSymbolsByType(e){let t=this._byPolymerSymbol.get(e);return t===void 0?[]:Array.from(t.keys())}getByNaturalAnalog(e,t){let n=this._byNaturalAnalog.get(e);if(n===void 0)return [];let o=n.get(t);return o===void 0?[]:o.slice()}getPolymerTypes(){let e=[];for(let[t,n]of this._byPolymerSymbol.entries())n.size>0&&e.push(t);return e}getColors(e,t){let n=dr(t),o=e===null?b.AA:ee(e)??b.AA;return $(e,o,n)}getResolved(e){return this._resolved.get(e)}addMonomer(e){let t=kt([e]);if(!t.ok)throw new I(\"invalid-monomer\",\"MonomerLib.addMonomer: schema validation failed\",{errors:t.errors});let n=this._addNoFire(e);this._bumpVersion(),this.onChanged.next({type:n?\"update\":\"add\",affectedSymbols:[e.symbol]});}addMonomers(e){let t=[],n=false;for(let o of e)this._addNoFire(o)&&(n=true),t.push(o.symbol);t.length!==0&&(this._bumpVersion(),this.onChanged.next({type:n?\"update\":\"add\",affectedSymbols:t}));}removeMonomer(e,t){let n=this._byPolymerSymbol.get(e);if(n===void 0)return false;let o=n.get(t);if(o===void 0)return false;n.delete(t);let r=ee(o);if(r!==null){let a=this._byBiotypeSymbol.get(r);a!==void 0&&a.delete(t);}let s=o.naturalAnalog;if(s!==void 0&&s!==\"\"){let l=this._byNaturalAnalog.get(e)?.get(s);if(l!==void 0){let d=l.indexOf(o);d>=0&&l.splice(d,1);}}return this._bumpVersion(),this.onChanged.next({type:\"remove\",affectedSymbols:[t]}),true}setMonomerColors(e,t,n){let o=this.getMonomer(e,t);if(o===null)throw new I(\"monomer-not-found\",`MonomerLib.setMonomerColors: ${e}/${t} not found`,{polymerType:e,symbol:t});let r=o.meta??{},s=r.colors??{},a=Object.assign({},r,{colors:Object.assign({},s,n)}),l=Object.assign({},o,{meta:a});this._addNoFire(l),this._bumpVersion(),this.onChanged.next({type:\"update\",affectedSymbols:[t]});}merge(e){for(let t of e.getPolymerTypes())for(let n of e.getMonomerSymbolsByType(t)){let o=e.getMonomer(t,n);o!==null&&this._addNoFire(o);}this._bumpVersion(),this.onChanged.next({type:\"reload\"});}registerInlineSmilesMonomer(e,t,n){let o=Yn(t);if(!o.ok)throw new I(\"inline-smiles-without-r-groups\",`MonomerLib.registerInlineSmilesMonomer: ${o.reason}`,{smiles:t});this._inlineSmilesCounter+=1;let r=`#${this._inlineSmilesCounter}`,s=[],a=Array.from(o.info.rgroupPositions.keys()).sort((c,u)=>c-u);for(let c of a)s.push({label:`R${c}`,capGroupName:\"H\",capGroupSMILES:\"\"});let l=n?.symbolHint!==void 0?{smilesHint:n.symbolHint}:void 0,d={symbol:r,polymerType:e,monomerType:\"Undefined\",molfile:\"\",smiles:o.canonicalSmiles,rgroups:s,...l!==void 0?{meta:l}:{}};return this._addNoFire(d),this._bumpVersion(),this.onChanged.next({type:\"add\",affectedSymbols:[r]}),d}toJSON(){let e=[];for(let t of this._byPolymerSymbol.values())for(let n of t.values())e.push(n);return e}_addNoFire(e){e=ao(e);let t=e.polymerType,n=this._byPolymerSymbol.get(t);n===void 0&&(n=new Map,this._byPolymerSymbol.set(t,n));let o=n.get(e.symbol);if(n.set(e.symbol,e),o!==void 0){let a=ee(o);if(a!==null){let d=this._byBiotypeSymbol.get(a);d!==void 0&&d.delete(o.symbol);}let l=o.naturalAnalog;if(l!==void 0&&l!==\"\"){let d=this._byNaturalAnalog.get(t)?.get(l);if(d!==void 0){let c=d.indexOf(o);c>=0&&d.splice(c,1);}}this._resolved.delete(o);}let r=ee(e);if(r!==null){let a=this._byBiotypeSymbol.get(r);a===void 0&&(a=new Map,this._byBiotypeSymbol.set(r,a)),a.set(e.symbol,e);}let s=e.naturalAnalog;if(s!==void 0&&s!==\"\"){let a=this._byNaturalAnalog.get(t);a===void 0&&(a=new Map,this._byNaturalAnalog.set(t,a));let l=a.get(s);l===void 0&&(l=[],a.set(s,l)),l.push(e);}return this._resolved.set(e,lr(e)),o!==void 0}_bumpVersion(){this._version+=1;}};function dr(i){return i===\"dark\"?Be:we}function xe(i,e,t){return new cn(i,e,t??{}).run()}var cr=new Set([\"?\",\"*\",\"_\",\"X\",\"N\"]),ur=/^R([1-9][0-9]*)$/;function mr(i){return typeof i.registerInlineSmilesMonomer==\"function\"}var cn=class{constructor(e,t,n){this.diagnostics=[];this.oldToNew=new Map;this.placeholderCache=new Map;this.mol=e,this.lib=t,this.options=n;}run(){let e=new Map;for(let a of this.mol.chains)e.set(a.id,a.polymerType);for(let a of this.mol.atoms){let l=e.get(a.bio.chainId)??null,d=this.resolveAtom(a,l);this.oldToNew.set(a.id,d);}for(let a of this.mol.atoms){let l=this.oldToNew.get(a.id);if(l===void 0||a.branchAtom===void 0)continue;let d=this.oldToNew.get(a.branchAtom.id);d!==void 0&&(l.branchAtom=d);}let t=[];for(let a of this.mol.bonds){let l=this.oldToNew.get(a.a1.id),d=this.oldToNew.get(a.a2.id);l===void 0||d===void 0||t.push({...a,a1:l,a2:d});}let n=new Map;for(let a of t)n.set(a.id,a);let o=[];for(let a of this.mol.chains){let l=[];for(let c of a.backboneAtoms){let u=this.oldToNew.get(c.id);u!==void 0&&l.push(u);}let d=[];for(let c of a.bonds){let u=n.get(c.id);u!==void 0&&d.push(u);}o.push({id:a.id,polymerType:a.polymerType,backboneAtoms:l,bonds:d,...a.annotation!==void 0?{annotation:a.annotation}:{},...a.strandType!==void 0?{strandType:a.strandType}:{}});}return {mol:{atoms:this.mol.atoms.map(a=>this.oldToNew.get(a.id)),bonds:t,chains:o,groups:this.mol.groups,annotations:this.mol.annotations},diagnostics:this.diagnostics}}resolveAtom(e,t){let n=null,o=e.biotype;if(t!==null){let r=this.lib.getMonomer(t,e.symbol);if(r!==null)n=this.toResolved(r),o=ee(r)??e.biotype;else if(this.isAmbiguitySymbol(e))n=this.synthesizeAmbiguity(t,e),this.emit(\"info\",\"ambiguous-monomer\",`Ambiguous monomer '${e.symbol}' on chain '${e.bio.chainId}'`,e);else if(Ce(e.symbol))n=this.registerInlineSmilesFallback(t,e);else if(this.options.legacyCaseFallback===true&&t===\"RNA\"){let s=this.findCaseInsensitiveMatch(t,e.symbol);s!==null&&(n=this.toResolved(s),o=ee(s)??e.biotype,this.emit(\"info\",\"case-mismatch\",`Symbol '${e.symbol}' matched library entry '${s.symbol}' only after case fold`,e));}n===null&&(n=this.synthesizeMissing(t,e),this.emit(\"warning\",\"unresolved-monomer\",`Monomer '${e.symbol}' not found in library for ${t}`,e));}return {...e,monomer:n,biotype:o}}toResolved(e){let t=this.lib.getResolved?.(e);if(t!==void 0)return t;let n=new Map;for(let o of e.rgroups){let r=ur.exec(o.label);r!==null&&n.set(parseInt(r[1],10),o);}return Object.assign({},e,{rs:e.rgroups.length,rgroupMap:n})}isAmbiguitySymbol(e){return !!(cr.has(e.symbol)||e.bio.ambiguity!==void 0)}synthesizeAmbiguity(e,t){let n=`ambig:${e}:${t.symbol}`,o=this.placeholderCache.get(n);return o===void 0&&(o={symbol:t.symbol,polymerType:e,monomerType:\"Undefined\",molfile:\"\",rgroups:[{label:\"R1\",capGroupName:\"H\",capGroupSMILES:\"\"},{label:\"R2\",capGroupName:\"H\",capGroupSMILES:\"\"}],meta:{ambiguous:true}},this.placeholderCache.set(n,o)),this.toResolved(o)}synthesizeMissing(e,t){let n=`missing:${e}:${t.symbol}`,o=this.placeholderCache.get(n);return o===void 0&&(o={symbol:t.symbol,polymerType:e,monomerType:\"Undefined\",molfile:\"\",rgroups:[{label:\"R1\",capGroupName:\"H\",capGroupSMILES:\"\"},{label:\"R2\",capGroupName:\"H\",capGroupSMILES:\"\"}],meta:{missing:true}},this.placeholderCache.set(n,o)),this.toResolved(o)}registerInlineSmilesFallback(e,t){if(mr(this.lib))try{let n=this.lib.registerInlineSmilesMonomer(e,t.symbol);return this.toResolved(n)}catch{this.emit(\"warning\",\"inline-smiles-without-r-groups\",`Inline SMILES '${pr(t.symbol,40)}' has no detectable R-groups`,t);}else this.emit(\"warning\",\"inline-smiles-without-r-groups\",\"Inline SMILES seen but lib has no registerInlineSmilesMonomer\",t);return this.synthesizeMissing(e,t)}findCaseInsensitiveMatch(e,t){let n=t.toLowerCase();for(let o of this.lib.getMonomerSymbolsByType(e))if(o.toLowerCase()===n&&o!==t){let r=this.lib.getMonomer(e,o);if(r!==null)return r}return null}emit(e,t,n,o){let r={chainId:o.bio.chainId,atomId:o.id,symbol:o.symbol};this.diagnostics.push({severity:e,code:t,message:n,context:r});}};function pr(i,e){return i.length<=e?i:i.slice(0,e-1)+\"\\u2026\"}function et(i,e,t){let n=t?.mode??\"lenient\",o;try{o=qn(i);}catch(r){if(r instanceof N){if(n===\"strict\")throw r;let s={severity:\"error\",code:r.code,message:r.message,...r.span!==void 0?{span:{start:r.span.start,end:r.span.end}}:{}};return {mol:me(),diagnostics:[s]}}throw r}return co(o,e,t)}function co(i,e,t){let o=new mn(i,e,t?.mode??\"lenient\").parseDocument();if(e===null||t?.resolveMonomers===false)return o;let r=xe(o.mol,e,{mode:t?.mode??\"lenient\",...t?.legacyCaseFallback===true?{legacyCaseFallback:true}:{}});return {mol:r.mol,diagnostics:[...o.diagnostics,...r.diagnostics]}}var un=class{constructor(e){this.tokens=e.tokens,this.len=e.tokens.length,this.eof=e.tokens[e.tokens.length-1],this.idx=0;}peek(e=0){let t=this.idx+e;return t>=this.len?this.eof:this.tokens[t]}advance(){let e=this.idx<this.len?this.tokens[this.idx]:this.eof;return e.kind!==\"eof\"&&(this.idx+=1),e}optional(e){let t=this.idx<this.len?this.tokens[this.idx]:this.eof;return t.kind===e?(t.kind!==\"eof\"&&(this.idx+=1),t):null}at(e){return (this.idx<this.len?this.tokens[this.idx]:this.eof).kind===e}at2(e,t){let o=(this.idx<this.len?this.tokens[this.idx]:this.eof).kind;return o===e||o===t}at3(e,t,n){let r=(this.idx<this.len?this.tokens[this.idx]:this.eof).kind;return r===e||r===t||r===n}currentSpan(){return (this.idx<this.len?this.tokens[this.idx]:this.eof).span}position(){return this.idx}setPosition(e){this.idx=e;}isAtEnd(){return (this.idx<this.len?this.tokens[this.idx]:this.eof).kind===\"eof\"}},hr=/^(PEPTIDE|RNA|DNA|CHEM|BLOB|G)([0-9]+)$/;function lo(i){let e=hr.exec(i);if(e===null)return null;let t=e[1],n=parseInt(e[2],10);switch(t){case \"PEPTIDE\":return {rawTypeName:\"PEPTIDE\",polymerType:v.PEPTIDE,number:n,isDnaShim:false,isGroup:false};case \"RNA\":return {rawTypeName:\"RNA\",polymerType:v.RNA,number:n,isDnaShim:false,isGroup:false};case \"DNA\":return {rawTypeName:\"DNA\",polymerType:v.RNA,number:n,isDnaShim:true,isGroup:false};case \"CHEM\":return {rawTypeName:\"CHEM\",polymerType:v.CHEM,number:n,isDnaShim:false,isGroup:false};case \"BLOB\":return {rawTypeName:\"BLOB\",polymerType:v.BLOB,number:n,isDnaShim:false,isGroup:false};case \"G\":return {rawTypeName:\"G\",polymerType:v.PEPTIDE,number:n,isDnaShim:false,isGroup:true};default:return null}}var mn=class{constructor(e,t,n){this.diagnostics=[];this.chains=[];this.chainById=new Map;this.pendingBonds=[];this.groups=[];this.atomIds=new _e;this.bondIds=new _e;this.cursor=new un(e),this.source=e.source,this.lib=t,this.mode=n,this.annotations={perPolymer:new Map,version:\"\"};}parseDocument(){if(this.cursor.isAtEnd())return this.emit(\"warning\",\"empty-helm\",\"Empty HELM string\"),{mol:me(),diagnostics:this.diagnostics};if(this.parseSimplePolymers(),this.expectDollarSeparator(1),this.parseConnections(),this.expectDollarSeparator(2),this.parseGroupsSection(),this.expectDollarSeparator(3),this.parseAnnotationsSection(),this.cursor.at(\"dollar\")&&(this.cursor.advance(),this.parseVersionTrailer()),!this.cursor.isAtEnd())for(this.emit(\"warning\",\"extra-section-separator\",\"Unexpected trailing tokens after HELM document\",this.cursor.currentSpan());!this.cursor.isAtEnd();)this.cursor.advance();return {mol:this.finalize(),diagnostics:this.diagnostics}}expectDollarSeparator(e){if(this.cursor.at(\"dollar\")){this.cursor.advance();return}this.emit(\"error\",\"missing-section-separator\",`Expected '$' separator before section ${e+1}`,this.cursor.currentSpan());}parseSimplePolymers(){if(!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()))for(this.parsePolymer();this.cursor.at(\"pipe\");){if(this.cursor.advance(),this.cursor.at(\"dollar\")||this.cursor.isAtEnd()){this.emit(\"warning\",\"empty-polymer-body\",\"Empty polymer after '|'\",this.cursor.currentSpan());return}this.parsePolymer();}}parsePolymer(){let e=this.cursor.currentSpan(),t=this.cursor.optional(\"identifier\");if(t===null){this.emit(\"error\",\"unexpected-token\",`Expected polymer id, got '${this.cursor.peek().value}'`,this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let n=lo(t.value);if(n===null){this.emit(\"error\",\"unknown-polymer-type\",`Unknown polymer type '${t.value}'`,t.span),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.chainById.has(t.value)&&this.emit(\"warning\",\"duplicate-polymer-id\",`Duplicate polymer id '${t.value}'`,t.span),this.cursor.optional(\"lbrace\")===null){this.emit(\"error\",\"unexpected-token\",`Expected '{' after polymer id '${t.value}'`,this.cursor.currentSpan());return}let o={id:t.value,polymerType:n.polymerType,rawTypeName:n.rawTypeName,rawNumber:n.number,backboneAtoms:[],allAtoms:[],bonds:[],span:{start:e.start,end:e.end}};if(this.chains.push(o),this.chainById.set(o.id,o),this.cursor.at(\"rbrace\"))this.emit(\"warning\",\"empty-polymer-body\",`Empty body for polymer '${o.id}'`,this.cursor.currentSpan());else if(n.isGroup)this.parseGroupBody(o);else switch(n.polymerType){case v.PEPTIDE:this.parsePeptideBody(o);break;case v.RNA:this.parseRnaBody(o,n.isDnaShim),n.isDnaShim&&this.emit(\"info\",\"dna-emitted-as-rna\",`DNA polymer '${o.id}' will be emitted as RNA on canonicalize`,t.span);break;case v.CHEM:this.parseChemBody(o);break;case v.BLOB:this.parseBlobBody(o);break;}if(this.cursor.optional(\"rbrace\")===null){this.emit(\"error\",\"unterminated-brace\",`Expected '}' to close polymer '${o.id}'`,this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let r=this.cursor.optional(\"quote-string\");r!==null&&(o.annotation=r.value);}parsePeptideBody(e){for(this.parsePeptideItem(e);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rbrace\")||this.cursor.at(\"gt\")));)this.parsePeptideItem(e);if(this.cursor.at(\"gt\")){let t=this.cursor.currentSpan();this.cursor.advance(),this.emit(\"warning\",\"peptide-cyclic-without-closure\",`Peptide '${e.id}' marked cyclic with '>' \\u2014 no explicit closure connection emitted`,t);}}parsePeptideItem(e){if(this.cursor.at(\"lparen\"))this.parsePeptideAlternation(e);else {let t=this.parsePeptideAtom(e);this.maybeRepeatBracket(e,[t]);}this.maybeAttachAnnotation(e);}parsePeptideAtom(e){let t=this.consumeMonomerSymbol(false),{symbol:n,annotation:o,ambiguity:r,ambiguityKind:s,isInlineSmiles:a,rawPayload:l,inlineSource:d,span:c}=t,u=this.makeAtom(e,b.AA,n);o!==void 0&&(u.tag=o),r!==void 0&&(u.bio.ambiguity=r),s!==void 0&&(u.bio.ambiguityKind=s),d!==void 0&&(u.inlineSource=d),a&&this.registerInlineSmiles(l,c,v.PEPTIDE),this.addToChain(e,u,true);let m=e.backboneAtoms[e.backboneAtoms.length-2];return m!==void 0&&this.addBond(e,m,u,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),u}parsePeptideAlternation(e){let t=this.cursor.currentSpan();if(this.cursor.advance(),this.peptideContentIsSubsequence()){let d=e.backboneAtoms.length;for(this.parsePeptideItem(e);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rparen\")||this.cursor.isAtEnd()));)this.parsePeptideItem(e);this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' to close repeat sub-sequence\",this.cursor.currentSpan());let c=e.backboneAtoms.slice(d);this.maybeRepeatBracket(e,c),this.maybeAttachAnnotation(e);return}let n=[],o=null;for(;!this.cursor.at(\"rparen\")&&!this.cursor.isAtEnd();){let d=this.parseAlternationCandidate(v.PEPTIDE);if(n.push(d),this.cursor.at(\"comma\"))o===\"and\"&&this.emit(\"warning\",\"mixed-separator-in-alternation\",\"Mixed ',' and '+' separators in alternation\",this.cursor.currentSpan()),o=\"or\",this.cursor.advance();else if(this.cursor.at(\"plus\"))o===\"or\"&&this.emit(\"warning\",\"mixed-separator-in-alternation\",\"Mixed ',' and '+' separators in alternation\",this.cursor.currentSpan()),o=\"and\",this.cursor.advance();else break}this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' to close alternation\",this.cursor.currentSpan());let r=o===\"and\"?\"+\":\",\",s=`(${n.map(d=>d.symbol+(d.ratio!==void 0?`:${String(d.ratio)}`:\"\")).join(r)})`,a=this.makeAtom(e,b.AA,\"?\");a.bio.ambiguity=s,a.bio.ambiguityKind=o===\"and\"?\"and\":\"or\",this.addToChain(e,a,true);let l=e.backboneAtoms[e.backboneAtoms.length-2];if(l!==void 0&&this.addBond(e,l,a,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),o===\"and\")for(let d of n)typeof d.ratio==\"number\"&&d.ratio<0&&this.emit(\"error\",\"ratio-and-negative\",`Negative ratio ${d.ratio} in AND mixture`,t);this.maybeRepeatBracket(e,[a]),this.maybeAttachAnnotation(e);}peptideContentIsSubsequence(){let e=1,t=0;for(;;){let n=this.cursor.peek(t);if(n.kind===\"eof\")return false;if(n.kind===\"lparen\"){e+=1,t+=1;continue}if(n.kind===\"rparen\"){if(e-=1,e===0)return true;t+=1;continue}if(e===1){if(n.kind===\"dot\")return true;if(n.kind===\"comma\"||n.kind===\"plus\"||n.kind===\"colon\")return false}if(t+=1,t>1024)return false}}parseAlternationCandidate(e){let{symbol:t,isInlineSmiles:n,rawPayload:o,span:r}=this.consumeMonomerSymbol(true);n&&this.registerInlineSmiles(o,r,e);let s;if(this.cursor.optional(\"colon\")!==null){let a=this.cursor.peek();a.kind===\"integer\"||a.kind===\"decimal\"?(this.cursor.advance(),s=parseFloat(a.value)):a.kind===\"question\"?(this.cursor.advance(),s=\"?\"):this.emit(\"error\",\"unexpected-token\",\"Expected ratio after ':' in alternation\",a.span);}return s===void 0?{symbol:t}:{symbol:t,ratio:s}}parseRnaBody(e,t){for(this.parseRnaItem(e,t);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rbrace\")||this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseRnaItem(e,t);}parseRnaItem(e,t){if(this.cursor.at(\"lparen\")){this.parseRnaAlternation(e,t);return}if(this.cursor.at(\"asterisk\")){this.cursor.currentSpan();this.cursor.advance();let d=this.makeAtom(e,b.NUCLEOTIDE,\"*\");this.addToChain(e,d,true);let c=e.backboneAtoms[e.backboneAtoms.length-2];c!==void 0&&this.addBond(e,c,d,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),this.maybeRepeatBracket(e,[d]),this.maybeAttachAnnotation(e);return}let n=this.parseRnaSugar(e,t);this.maybeAttachAnnotation(e);let o;this.cursor.at(\"lparen\")&&(this.cursor.advance(),this.cursor.at(\"rparen\")||(o=this.parseRnaBaseSymbol(e),this.maybeAttachAnnotationTo(o)),this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' after RNA base\",this.cursor.currentSpan()),o!==void 0&&(this.addBond(e,n,o,\"branch\",{kind:\"numeric\",r:3},{kind:\"numeric\",r:1}),n.branchAtom=o));let r;this.canStartRnaLinker()&&(r=this.parseRnaLinker(e),this.maybeAttachAnnotationTo(r)),r!==void 0&&this.addBond(e,n,r,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1});let s=e.backboneAtoms.indexOf(n);if(s>0){let l=e.backboneAtoms[s-1];this.addBond(e,l,n,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1});}let a=[n];o!==void 0&&a.push(o),r!==void 0&&a.push(r),this.maybeRepeatBracket(e,a);}canStartRnaLinker(){let e=this.cursor.peek().kind;return e===\"identifier\"||e===\"inline-smiles\"||e===\"asterisk\"}parseRnaSugar(e,t){let{symbol:n,isInlineSmiles:o,rawPayload:r,inlineSource:s,span:a}=this.consumeMonomerSymbol(false),l=this.makeAtom(e,b.SUGAR,n);return s!==void 0&&(l.inlineSource=s),o&&this.registerInlineSmiles(r,a,v.RNA),this.addToChain(e,l,true),l}parseRnaBaseSymbol(e){let{symbol:t,isInlineSmiles:n,rawPayload:o,inlineSource:r,span:s}=this.consumeMonomerSymbol(false),a=this.makeAtom(e,b.BASE,t);return r!==void 0&&(a.inlineSource=r),n&&this.registerInlineSmiles(o,s,v.RNA),this.addToChain(e,a,false),a}parseRnaLinker(e){if(this.cursor.at(\"asterisk\")){this.cursor.currentSpan();this.cursor.advance();let d=this.makeAtom(e,b.LINKER,\"*\");return this.addToChain(e,d,true),d}let{symbol:t,isInlineSmiles:n,rawPayload:o,inlineSource:r,span:s}=this.consumeMonomerSymbol(false),a=this.makeAtom(e,b.LINKER,t);return r!==void 0&&(a.inlineSource=r),n&&this.registerInlineSmiles(o,s,v.RNA),this.addToChain(e,a,true),a}parseRnaAlternation(e,t){let n=e.backboneAtoms.length;if(this.cursor.advance(),this.looksLikeFlatAlternation()){let r=[],s=null;for(;!this.cursor.at(\"rparen\")&&!this.cursor.isAtEnd();)if(r.push(this.parseAlternationCandidate(v.RNA)),this.cursor.at(\"comma\"))s=\"or\",this.cursor.advance();else if(this.cursor.at(\"plus\"))s=\"and\",this.cursor.advance();else break;this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' in RNA alternation\",this.cursor.currentSpan());let a=s===\"and\"?\"+\":\",\",l=`(${r.map(u=>u.symbol+(u.ratio!==void 0?`:${String(u.ratio)}`:\"\")).join(a)})`,d=this.makeAtom(e,b.BASE,\"?\");d.bio.ambiguity=l,d.bio.ambiguityKind=s===\"and\"?\"and\":\"or\",this.addToChain(e,d,true);let c=e.backboneAtoms[e.backboneAtoms.length-2];c!==void 0&&this.addBond(e,c,d,\"backbone\",{kind:\"numeric\",r:2},{kind:\"numeric\",r:1}),this.maybeRepeatBracket(e,[d]),this.maybeAttachAnnotation(e);return}for(this.parseRnaItem(e,t);this.cursor.at(\"dot\")&&(this.cursor.advance(),!(this.cursor.at(\"rparen\")||this.cursor.isAtEnd()));)this.parseRnaItem(e,t);this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' in RNA repeat\",this.cursor.currentSpan());let o=e.backboneAtoms.slice(n);this.maybeRepeatBracket(e,o),this.maybeAttachAnnotation(e);}looksLikeFlatAlternation(){let e=1,t=0,n=false;for(;;){let o=this.cursor.peek(t);if(o.kind===\"eof\")return n;if(o.kind===\"rparen\"){if(e-=1,e===0)return n}else {if(o.kind===\"lparen\")return false;if(o.kind===\"dot\")return false;e===1&&(o.kind===\"comma\"||o.kind===\"plus\")&&(n=true);}if(t+=1,t>256)return n}}parseChemBody(e){let t;if(this.cursor.at(\"asterisk\"))this.cursor.advance(),t=this.makeAtom(e,b.CHEM,\"*\"),this.addToChain(e,t,true);else {let{symbol:n,isInlineSmiles:o,rawPayload:r,inlineSource:s,span:a}=this.consumeMonomerSymbol(false);t=this.makeAtom(e,b.CHEM,n),s!==void 0&&(t.inlineSource=s),o&&this.registerInlineSmiles(r,a,v.CHEM),this.addToChain(e,t,true);}this.maybeAttachAnnotation(e),this.cursor.at(\"apos\")&&this.maybeRepeatBracket(e,[t]),this.cursor.at(\"rbrace\")||(this.emit(\"error\",\"chem-multiple-monomers\",`CHEM polymer '${e.id}' must contain exactly one monomer`,this.cursor.currentSpan()),this.skipUntil([\"rbrace\",\"eof\"]));}parseBlobBody(e){let t,n,o=false,r=\"\",s,a=this.cursor.currentSpan();if(this.cursor.at(\"inline-smiles\")){let d=this.cursor.advance();o=Ce(d.value),r=d.value,t=d.value,n=d.value,s=d.value,a=d.span;}else if(this.cursor.at(\"identifier\")){let d=this.cursor.advance();t=d.value,n=d.value,a=d.span;}else this.emit(\"error\",\"unknown-blobtype\",\"Expected BLOB identifier\",this.cursor.currentSpan()),t=\"?\",n=\"?\";let l=this.makeAtom(e,b.BLOB,t);l.bio.blobtype=n,s!==void 0&&(l.inlineSource=s),o&&this.registerInlineSmiles(r,a,v.BLOB),this.addToChain(e,l,true),this.maybeAttachAnnotation(e);}parseGroupBody(e){let t=0;for(;;){let n=this.cursor.peek();if(n.kind===\"eof\"||t===0&&n.kind===\"rbrace\")break;n.kind===\"lbrace\"&&(t+=1),n.kind===\"rbrace\"&&(t-=1),this.cursor.advance();}}parseConnections(){if(!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()))for(this.parseConnection();this.cursor.at(\"pipe\")&&(this.cursor.advance(),!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseConnection();}parseConnection(){let e=this.cursor.currentSpan(),t=this.cursor.optional(\"identifier\");if(t===null){this.emit(\"error\",\"unexpected-token\",\"Expected chain id in connection\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.cursor.optional(\"comma\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ',' in connection\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let n=this.cursor.optional(\"identifier\");if(n===null){this.emit(\"error\",\"unexpected-token\",\"Expected second chain id in connection\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.cursor.optional(\"comma\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ',' before connection position\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let o=this.parsePosition();if(this.cursor.optional(\"colon\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ':' between position and R-group\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let r=this.parseRGroupSpec();if(this.cursor.optional(\"dash\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected '-' between connection endpoints\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let s=this.parsePosition();if(this.cursor.optional(\"colon\")===null){this.emit(\"error\",\"unexpected-token\",\"Expected ':' before second R-group\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let a=this.parseRGroupSpec(),l=this.cursor.optional(\"quote-string\"),d=r.kind===\"pair\"&&a.kind===\"pair\"?\"hbond\":\"cross-polymer\",c={chain1:t.value,pos1:o,r1:r,chain2:n.value,pos2:s,r2:a,kind:d,span:{start:e.start,end:l?.span.end??this.cursor.peek().span.start},...l!==null?{tag:l.value}:{}};this.pendingBonds.push(c);}parsePosition(){let e=this.cursor.peek();return e.kind===\"integer\"?(this.cursor.advance(),{kind:\"index\",value:parseInt(e.value,10)}):e.kind===\"question\"?(this.cursor.advance(),{kind:\"any\"}):e.kind===\"identifier\"?(this.cursor.advance(),this.emit(\"info\",\"symbol-position-reference\",`Connection position uses monomer symbol '${e.value}' as chain-level ambiguity`,e.span),{kind:\"symbol\",value:e.value}):(this.emit(\"error\",\"invalid-position\",`Expected position (integer, '?', or symbol), got '${e.value}'`,e.span),{kind:\"any\"})}parseRGroupSpec(){let e=this.cursor.peek();if(e.kind===\"question\")return this.cursor.advance(),{kind:\"unspecified\"};if(e.kind===\"asterisk\")return this.cursor.advance(),{kind:\"wildcard\"};if(e.kind===\"identifier\"){if(this.cursor.advance(),e.value===\"pair\")return {kind:\"pair\"};let t=/^R([1-9][0-9]*)$/.exec(e.value);return t===null?(this.emit(\"error\",\"invalid-rgroup\",`Expected R-group label, got '${e.value}'`,e.span),{kind:\"unspecified\"}):{kind:\"numeric\",r:parseInt(t[1],10)}}return this.emit(\"error\",\"invalid-rgroup\",`Expected R-group label, got '${e.value}'`,e.span),{kind:\"unspecified\"}}parseGroupsSection(){if(!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()))for(this.parseGroupOrBondRatio();this.cursor.at(\"pipe\")&&(this.cursor.advance(),!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseGroupOrBondRatio();}parseGroupOrBondRatio(){let e=this.cursor.optional(\"identifier\");if(e===null){this.emit(\"error\",\"unexpected-token\",\"Expected group or bond-ratio identifier\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}this.cursor.at(\"lparen\")?this.parseGroupAfterId(e):this.cursor.at(\"plus\")?this.parseBondRatioAfterId(e):(this.emit(\"warning\",\"unexpected-token\",`Expected '(' or '+' after id '${e.value}' in section 3`,this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]));}parseGroupAfterId(e){let t=lo(e.value);(t===null||!t.isGroup)&&this.emit(\"error\",\"unknown-group-reference\",`Group id must be 'G<n>', got '${e.value}'`,e.span),this.cursor.advance();let n=[],o=\"or\",r=null;for(;!this.cursor.at(\"rparen\")&&!this.cursor.isAtEnd();){let s=this.parseGroupMember();if(s!==null&&n.push(s),this.cursor.at(\"comma\"))r===null&&(r=\"or\",o=\"or\"),this.cursor.advance();else if(this.cursor.at(\"plus\"))r===null&&(r=\"and\",o=\"and\"),this.cursor.advance();else break}this.cursor.optional(\"rparen\")===null&&this.emit(\"error\",\"unterminated-paren\",\"Expected ')' to close group\",this.cursor.currentSpan()),this.groups.push({id:e.value,kind:o,members:n});}parseGroupMember(){let e=this.cursor.optional(\"identifier\");if(e===null)return this.emit(\"error\",\"unexpected-token\",\"Expected group member id\",this.cursor.currentSpan()),null;let t;return this.cursor.optional(\"colon\")!==null&&(t=this.parseRatio()),t===void 0?{target:e.value}:{target:e.value,ratio:t}}parseRatio(){let e=this.cursor.peek();if(e.kind===\"integer\"||e.kind===\"decimal\"){this.cursor.advance();let t=parseFloat(e.value);if(this.cursor.at(\"dash\")){this.cursor.peek();if(this.cursor.peek(1).kind===\"integer\"){this.cursor.advance();let o=this.cursor.advance();this.emit(\"info\",\"ratio-range\",`Ratio range ${e.value}-${o.value}; using lower bound`,{start:e.span.start,end:o.span.end});}}return t}return e.kind===\"question\"?(this.cursor.advance(),\"?\"):(this.emit(\"error\",\"unexpected-token\",`Expected ratio after ':', got '${e.value}'`,e.span),0)}parseBondRatioAfterId(e){this.cursor.advance();let t=this.cursor.optional(\"identifier\");if(t===null){this.emit(\"error\",\"unexpected-token\",\"Expected second chain id in bond-ratio\",this.cursor.currentSpan());return}let n;if(this.cursor.optional(\"colon\")!==null){let r=this.parseRatio();typeof r==\"number\"&&(n=r);}let o=this.pendingBonds.find(r=>r.chain1===e.value&&r.chain2===t.value||r.chain1===t.value&&r.chain2===e.value);if(o===void 0){this.emit(\"warning\",\"bond-ratio-no-matching-bond\",`Bond-ratio for ${e.value}+${t.value} has no matching cross-polymer bond`,e.span);return}n!==void 0&&(o.ratio={numerator:n});}parseAnnotationsSection(){if(this.cursor.at(\"dollar\")||this.cursor.isAtEnd())return;this.cursor.position();if(this.cursor.at(\"lbrace\")){this.parseAnnotation20(),this.cursor.at(\"pipe\")&&(this.emit(\"info\",\"annotation-mixed-versions\",\"Mixed HELM 2.0 JSON and HELM 1.0 pipe annotations\",this.cursor.currentSpan()),this.cursor.advance(),this.parseAnnotation10Entries());return}this.parseAnnotation10Entries();}parseAnnotation20(){let e=this.cursor.currentSpan(),t=0,n=e.end;for(;!this.cursor.isAtEnd();){let s=this.cursor.peek();if(s.kind===\"lbrace\")t+=1;else if(s.kind===\"rbrace\"&&(t-=1,t===0)){n=s.span.end,this.cursor.advance();break}this.cursor.advance();}let o=this.source.slice(e.start,n),r=null;try{r=JSON.parse(o);}catch{this.emit(\"warning\",\"annotation-malformed-json\",\"Annotation block is not valid JSON\",{start:e.start,end:n}),this.annotations={perPolymer:this.annotations.perPolymer,version:this.annotations.version,raw:o};return}if(r!==null&&typeof r==\"object\"&&!Array.isArray(r)){let s=new Map(this.annotations.perPolymer);for(let[a,l]of Object.entries(r))l!==null&&typeof l==\"object\"&&!Array.isArray(l)?(s.set(a,{...l}),this.chainById.has(a)||this.emit(\"warning\",\"annotation-unknown-polymer\",`Annotation references unknown polymer '${a}'`,e)):s.set(a,{value:l});this.annotations={perPolymer:s,version:this.annotations.version};}else this.emit(\"warning\",\"annotation-malformed-json\",\"Annotation block parsed but is not an object\",{start:e.start,end:n}),this.annotations={perPolymer:this.annotations.perPolymer,version:this.annotations.version,raw:o};}parseAnnotation10Entries(){for(this.parseAnnotation10One();this.cursor.at(\"pipe\")&&(this.cursor.advance(),!(this.cursor.at(\"dollar\")||this.cursor.isAtEnd()));)this.parseAnnotation10One();}parseAnnotation10One(){let e=this.cursor.optional(\"identifier\");if(e===null){this.emit(\"warning\",\"annotation-malformed-json\",\"Expected polymer-id in HELM 1.0 annotation\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}if(this.cursor.optional(\"lbrace\")===null){this.emit(\"warning\",\"annotation-malformed-json\",\"Expected '{' after polymer-id\",this.cursor.currentSpan()),this.skipUntil([\"pipe\",\"dollar\",\"eof\"]);return}let t=[];for(;!this.cursor.at(\"rbrace\")&&!this.cursor.isAtEnd();)t.push(this.cursor.advance().value);if(this.cursor.optional(\"rbrace\")===null){this.emit(\"error\",\"unterminated-brace\",\"Expected '}' to close annotation\",this.cursor.currentSpan());return}let n=t.join(\"\").trim(),o=new Map(this.annotations.perPolymer),r=o.get(e.value)??{};n===\"ss\"||n===\"as\"?o.set(e.value,{...r,strandtype:n}):o.set(e.value,{...r,[n]:true}),this.chainById.has(e.value)||this.emit(\"warning\",\"annotation-unknown-polymer\",`Annotation references unknown polymer '${e.value}'`,e.span),this.annotations={perPolymer:o,version:this.annotations.version};}parseVersionTrailer(){let e=this.cursor.optional(\"identifier\");if(e===null){this.annotations={...this.annotations,version:\"\"};return}let t=e.value;if(this.cursor.at(\"dot\")&&this.cursor.peek(1).kind===\"integer\"){this.cursor.advance();let n=this.cursor.advance();t=`${e.value}.${n.value}`;}this.annotations={...this.annotations,version:t};}skipUntil(e){for(;!this.cursor.isAtEnd();){if(e.includes(this.cursor.peek().kind))return;this.cursor.advance();}}consumeMonomerSymbol(e){let t=this.cursor.peek();if(t.kind===\"inline-smiles\"){this.cursor.advance();let n=Ce(t.value);return {symbol:t.value,isInlineSmiles:n,rawPayload:t.value,inlineSource:t.value,span:t.span}}if(t.kind===\"identifier\"){this.cursor.advance();let n=t.value,o=t.span;for(;this.cursor.peek().kind===\"dash\"&&this.cursor.peek(1).kind===\"integer\"&&(this.cursor.peek(2).kind===\"identifier\"||this.cursor.peek(2).kind===\"dash\");){this.cursor.advance();let s=this.cursor.advance();if(n=`${n}-${s.value}`,o=s.span,this.cursor.peek().kind===\"identifier\"){let a=this.cursor.advance();n=`${n}${a.value}`,o=a.span;}}return {symbol:n,isInlineSmiles:false,rawPayload:n,span:{start:t.span.start,end:o.end}}}if(t.kind===\"asterisk\"||t.kind===\"underscore\"||t.kind===\"question\")return this.cursor.advance(),{symbol:t.value,isInlineSmiles:false,rawPayload:t.value,span:t.span};if(t.kind===\"integer\"&&this.cursor.peek(1).kind===\"identifier\"){let n=this.cursor.advance(),o=this.cursor.advance(),r=`${n.value}${o.value}`;return {symbol:r,isInlineSmiles:false,rawPayload:r,span:{start:n.span.start,end:o.span.end}}}return this.emit(\"error\",\"unexpected-token\",`Expected monomer symbol, got '${t.value}'`,t.span),{symbol:\"?\",isInlineSmiles:false,rawPayload:\"\",span:t.span}}maybeRepeatBracket(e,t){if(!this.cursor.at(\"apos\"))return;let n=this.cursor.currentSpan();this.cursor.advance();let o=this.cursor.optional(\"integer\");if(o===null){this.emit(\"error\",\"unexpected-token\",\"Expected integer in repeat bracket\",this.cursor.currentSpan()),this.cursor.optional(\"apos\");return}let r=parseInt(o.value,10),s=r;if(this.cursor.at(\"dash\")){this.cursor.advance();let a=this.cursor.optional(\"integer\");a===null?this.emit(\"error\",\"unexpected-token\",\"Expected integer after '-' in repeat bracket\",this.cursor.currentSpan()):s=parseInt(a.value,10);}if(this.cursor.optional(\"apos\")===null&&this.emit(\"error\",\"unterminated-apostrophe\",\"Expected closing apostrophe\",this.cursor.currentSpan()),t.length===0){this.emit(\"warning\",\"repeat-on-empty-bracket\",\"Repeat bracket applied to empty content\",n);return}if(s<r){this.emit(\"warning\",\"repeat-range-inverted\",`Repeat range ${r}-${s} has max < min; swapping`,n);let a=r;r=s,s=a;}if(r===0&&s===0){this.emit(\"warning\",\"repeat-zero-count\",\"Repeat bracket with zero count\",n);return}s>1e4&&this.emit(\"warning\",\"bracket-repeat-too-large\",`Repeat range upper bound ${s} > 10000`,n),e.polymerType===v.CHEM&&this.emit(\"error\",\"repeat-on-non-iterable-polymer\",`Repeat bracket not allowed on CHEM polymer '${e.id}'`,n),this.groups.push({id:`${e.id}/bracket@${t[0]?.id??0}`,kind:\"bracket\",members:t.map(a=>({target:String(a.id)})),repeat:{min:r,max:s}});}maybeAttachAnnotation(e){let t=e.backboneAtoms[e.backboneAtoms.length-1];t!==void 0&&this.maybeAttachAnnotationTo(t);}maybeAttachAnnotationTo(e){if(e===void 0)return;let t=this.cursor.optional(\"quote-string\");t!==null&&(e.tag=t.value);}registerInlineSmiles(e,t,n){if(Ce(e)){if(this.lib===null){this.emit(\"info\",\"inline-smiles-no-lib\",\"Inline SMILES seen but no monomer library available for registration\",t);return}try{this.lib.addMonomer;let o=this.lib.registerInlineSmilesMonomer;typeof o==\"function\"&&o.call(this.lib,n,e);}catch(o){let r=o instanceof Error?o.message:String(o);this.emit(\"warning\",\"inline-smiles-without-r-groups\",`Inline SMILES registration failed: ${r}`,t);}}}makeAtom(e,t,n){return {id:this.atomIds.next(),p:{x:0,y:0},biotype:t,symbol:n,monomer:null,bio:{chainId:e.id,positionInChain:0,continuousId:0},hidden:false,selected:false,highlighted:false}}addToChain(e,t,n){e.allAtoms.push(t),n&&(e.backboneAtoms.push(t),t.bio.positionInChain=e.backboneAtoms.length);}addBond(e,t,n,o,r,s){let a=this.bondIds.next();e.bonds.push({id:a,a1:t,a2:n,kind:o,r1:r,r2:s});}finalize(){let e=[];for(let a of this.pendingBonds){let l=this.chainById.get(a.chain1),d=this.chainById.get(a.chain2);if(l===void 0){this.emit(\"error\",\"unknown-chain-reference\",`Connection references unknown chain '${a.chain1}'`,a.span);continue}if(d===void 0){this.emit(\"error\",\"unknown-chain-reference\",`Connection references unknown chain '${a.chain2}'`,a.span);continue}let c=this.resolveAtomByPosition(l,a.pos1,a.span),u=this.resolveAtomByPosition(d,a.pos2,a.span);if(c===null||u===null)continue;a.r1.kind===\"pair\"&&c.branchAtom!==void 0&&(c=c.branchAtom),a.r2.kind===\"pair\"&&u.branchAtom!==void 0&&(u=u.branchAtom);let p={id:this.bondIds.next(),a1:c,a2:u,kind:a.kind,r1:a.r1,r2:a.r2,...a.tag!==void 0?{tag:a.tag}:{},...a.ratio!==void 0?{ratio:a.ratio}:{}};e.push(p);}let t=[],n=[],o=[];for(let a of this.chains){for(let u of a.allAtoms)t.push(u);for(let u of a.bonds)n.push(u);let l=this.annotations.perPolymer.get(a.id),d=l===void 0?void 0:l.strandtype,c=d===\"ss\"||d===\"as\"?d:void 0;o.push({id:a.id,polymerType:a.polymerType,backboneAtoms:a.backboneAtoms,bonds:a.bonds,...a.annotation!==void 0?{annotation:a.annotation}:{},...c!==void 0?{strandType:c}:{}});}for(let a of e)n.push(a);let r=0;for(let a of this.chains)for(let l of a.backboneAtoms)r+=1,l.bio.continuousId=r,l.branchAtom!==void 0&&(r+=1,l.branchAtom.bio.continuousId=r);let s=[];for(let a of this.groups)s.push({id:a.id,kind:a.kind,members:a.members,...a.repeat!==void 0?{repeat:a.repeat}:{}});return {atoms:t,bonds:n,chains:o,groups:s,annotations:this.annotations}}sourceOrderAtoms(e){let t=[];for(let n of e.backboneAtoms)t.push(n),n.branchAtom!==void 0&&t.push(n.branchAtom);return t}resolveAtomByPosition(e,t,n){if(t.kind===\"any\")return e.backboneAtoms[0]??null;if(t.kind===\"symbol\"){let s=e.backboneAtoms.find(a=>a.symbol===t.value);if(s===void 0){let a=e.allAtoms.find(l=>l.symbol===t.value);return a===void 0?(this.emit(\"warning\",\"position-out-of-range\",`Chain '${e.id}' has no monomer with symbol '${t.value}'`,n),e.backboneAtoms[0]??null):a}return s}let o=this.sourceOrderAtoms(e),r=t.value;return r<1||r>o.length?(this.emit(\"error\",\"position-out-of-range\",`Position ${r} out of range for chain '${e.id}' (length ${o.length})`,n),e.backboneAtoms[0]??null):o[r-1]}emit(e,t,n,o){let r={severity:e,code:t,message:n,...o!==void 0?{span:{start:o.start,end:o.end}}:{}};if(this.diagnostics.push(r),this.mode===\"strict\"&&e===\"error\")throw new N(t,n,{...o!==void 0?{span:{start:o.start,end:o.end}}:{}})}};function uo(i,e,t){for(let n of t){if(n.kind!==\"backbone\"||n.r1.kind!==\"numeric\"||n.r2.kind!==\"numeric\")continue;let o=n.a1.id===i.id&&n.a2.id===e.id&&n.r1.r===2&&n.r2.r===1,r=n.a1.id===e.id&&n.a2.id===i.id&&n.r1.r===2&&n.r2.r===1;if(o||r)return true}return false}function fr(i){let e=false;for(let c of i.chains){for(let u=0;u<c.backboneAtoms.length-1;u++){let m=c.backboneAtoms[u],p=c.backboneAtoms[u+1];if(!uo(m,p,i.bonds)){e=true;break}}if(e)break}if(!e)return i;let t=new Set(i.chains.map(c=>c.id)),n=c=>{let u=1;for(;t.has(`${c}${u}`);)u+=1;let m=`${c}${u}`;return t.add(m),m},o=[];for(let c of i.chains){let u=[[]],m=u[0];for(let p=0;p<c.backboneAtoms.length;p++){let h=c.backboneAtoms[p];if(m.push(h),p<c.backboneAtoms.length-1){let f=c.backboneAtoms[p+1];uo(h,f,i.bonds)||(m=[],u.push(m));}}for(let p=0;p<u.length;p++){let f={id:p===0?c.id:n(c.polymerType),polymerType:c.polymerType,atoms:u[p]};p===0&&c.annotation!==void 0&&(f.annotation=c.annotation),o.push(f);}}let r=new Map;for(let c of o)for(let u=0;u<c.atoms.length;u++){let m=c.atoms[u];r.set(m.id,{chainId:c.id,pos:u+1}),m.branchAtom!==void 0&&r.set(m.branchAtom.id,{chainId:c.id,pos:u+1});}let s=new Map;for(let c of i.atoms){let u=r.get(c.id);if(u===void 0){s.set(c.id,c);continue}if(c.bio.chainId===u.chainId&&c.bio.positionInChain===u.pos){s.set(c.id,c);continue}s.set(c.id,{...c,bio:{...c.bio,chainId:u.chainId,positionInChain:u.pos}});}for(let c of i.atoms){if(c.branchAtom===void 0)continue;let u=s.get(c.id),m=s.get(c.branchAtom.id);u===void 0||m===void 0||(u.branchAtom=m);}let a=i.bonds.map(c=>{let u=s.get(c.a1.id)??c.a1,m=s.get(c.a2.id)??c.a2;return u===c.a1&&m===c.a2?c:{...c,a1:u,a2:m}}),l=o.map(c=>{let u=c.atoms.map(f=>s.get(f.id)??f),m=new Set;for(let f of c.atoms)m.add(f.id),f.branchAtom!==void 0&&m.add(f.branchAtom.id);let p=[];for(let f of a)m.has(f.a1.id)&&m.has(f.a2.id)&&p.push(f);return {id:c.id,polymerType:c.polymerType,backboneAtoms:u,bonds:p,...c.annotation!==void 0?{annotation:c.annotation}:{}}});return {atoms:i.atoms.map(c=>s.get(c.id)??c),bonds:a,chains:l,groups:i.groups,annotations:i.annotations}}function Re(i,e){let t=fr(i);return new pn(t,e??{}).emit()}var pn=class{constructor(e,t){this.mol=e,this.options=t;}emit(){let t=this.orderedChains().map(a=>this.emitPolymer(a)).join(\"|\"),n=this.emitConnections(),o=this.emitGroupsAndBondRatios(),r=this.emitAnnotations(),s=this.versionTrailer();return `${t}$${n}$${o}$${r}${s}`}orderedChains(){if(this.options.canonicalize!==true)return this.mol.chains;let e=this.mol.chains.slice();return e.sort((t,n)=>t.polymerType!==n.polymerType?t.polymerType<n.polymerType?-1:1:t.id<n.id?-1:t.id>n.id?1:0),e}emitPolymer(e){let t=this.emitChainBody(e),n=e.annotation!==void 0?`\"${te(e.annotation)}\"`:\"\";return `${e.id}{${t}}${n}`}emitChainBody(e){switch(e.polymerType){case \"PEPTIDE\":return this.emitPeptideBody(e);case \"RNA\":return this.emitRnaBody(e);case \"CHEM\":return this.emitChemBody(e);case \"BLOB\":return this.emitBlobBody(e);default:return \"\"}}emitPeptideBody(e){let t=this.bracketsForChain(e.id),n=[],o=0,r=0,s=null;for(;o<e.backboneAtoms.length;){let a=e.backboneAtoms[o],l=t.find(c=>c.startAtomId===a.id);l!==void 0&&s===null&&(n.push(\"(\"),s=l,r+=1),n.push(this.emitMonomerToken(a));let d=a.tag!==void 0?`\"${te(a.tag)}\"`:\"\";n.push(d),s!==null&&s.endAtomId===a.id&&(n.push(`)${mo(s.min,s.max)}`),s=null,r-=1),o+=1,o<e.backboneAtoms.length&&n.push(\".\");}return n.join(\"\")}emitRnaBody(e){let t=this.bracketsForChain(e.id),n=[],o=0,r=true,s=null,a=d=>{s!==null&&s.endAtomId===d&&(n.push(`)${mo(s.min,s.max)}`),s=null);},l=d=>{let c=t.find(u=>u.startAtomId===d);c!==void 0&&s===null&&(n.push(\"(\"),s=c);};for(;o<e.backboneAtoms.length;){let d=e.backboneAtoms[o];if(r||n.push(\".\"),r=false,d.biotype===b.NUCLEOTIDE){l(d.id),n.push(this.emitMonomerToken(d)),d.tag!==void 0&&n.push(`\"${te(d.tag)}\"`),a(d.id),o+=1;continue}if(d.biotype===b.SUGAR){l(d.id),n.push(this.emitMonomerToken(d)),d.tag!==void 0&&n.push(`\"${te(d.tag)}\"`),d.branchAtom!==void 0&&(n.push(\"(\"),n.push(this.emitMonomerToken(d.branchAtom)),d.branchAtom.tag!==void 0&&n.push(`\"${te(d.branchAtom.tag)}\"`),n.push(\")\"));let c=e.backboneAtoms[o+1];c!==void 0&&c.biotype===b.LINKER?(n.push(this.emitMonomerToken(c)),c.tag!==void 0&&n.push(`\"${te(c.tag)}\"`),a(c.id),o+=2):(a(d.id),o+=1);continue}l(d.id),n.push(this.emitMonomerToken(d)),d.tag!==void 0&&n.push(`\"${te(d.tag)}\"`),a(d.id),o+=1;}return n.join(\"\")}emitChemBody(e){let t=e.backboneAtoms[0];if(t===void 0)return \"\";let n=t.tag!==void 0?`\"${te(t.tag)}\"`:\"\";return `${this.emitMonomerToken(t)}${n}`}emitBlobBody(e){let t=e.backboneAtoms[0];if(t===void 0)return \"\";let n=t.tag!==void 0?`\"${te(t.tag)}\"`:\"\";return `${this.emitMonomerToken(t)}${n}`}emitMonomerToken(e){let t;return e.inlineSource!==void 0?t=`[${e.inlineSource}]`:e.bio.ambiguity!==void 0&&(e.symbol===\"?\"||e.bio.ambiguity.startsWith(\"(\"))?t=e.bio.ambiguity:t=e.symbol,this.options.includeHighlights===true&&e.selected?`<span style='background:#bbf;'>${t}</span>`:t}emitConnections(){let e=[];for(let t of this.crossPolymerBonds())e.push(this.emitConnection(t));return e.join(\"|\")}*crossPolymerBonds(){let e=new Map;for(let t of this.mol.chains){let n=new Map;for(let o=0;o<t.backboneAtoms.length;o++)n.set(t.backboneAtoms[o].id,o);e.set(t.id,n);}for(let t of this.mol.bonds){if(t.kind===\"backbone\"){if(t.a1.bio.chainId===t.a2.bio.chainId){let n=e.get(t.a1.bio.chainId);if(n!==void 0){let o=n.get(t.a1.id),r=n.get(t.a2.id);if(o!==void 0&&r!==void 0&&Math.abs(o-r)===1)continue}}yield t;continue}if(t.kind===\"branch\"){if(t.a1.branchAtom!==void 0&&t.a1.branchAtom.id===t.a2.id||t.a2.branchAtom!==void 0&&t.a2.branchAtom.id===t.a1.id)continue;yield t;continue}yield t;}}emitConnection(e){let t=po(e.r1,e.kind),n=po(e.r2,e.kind),o=e.tag!==void 0?`\"${te(e.tag)}\"`:\"\",r=String(this.connectionPosition(e.a1)),s=String(this.connectionPosition(e.a2));return `${e.a1.bio.chainId},${e.a2.bio.chainId},${r}:${t}-${s}:${n}${o}`}connectionPosition(e){return le(e,this.mol.chains.find(t=>t.id===e.bio.chainId))}emitGroupsAndBondRatios(){let e=[];for(let t of this.mol.groups)t.kind!==\"bracket\"&&e.push(this.emitGroup(t));for(let t of this.mol.bonds){if(t.kind!==\"cross-polymer\"||t.ratio===void 0)continue;let n=t.ratio.denominator!==void 0?`${t.ratio.numerator}/${t.ratio.denominator}`:`${t.ratio.numerator}`;e.push(`${t.a1.bio.chainId}+${t.a2.bio.chainId}:${n}`);}return e.join(\"|\")}emitGroup(e){let t=e.kind===\"and\"?\"+\":\",\",n=e.members.map(o=>br(o)).join(t);return `${e.id}(${n})`}emitAnnotations(){let e=this.mol.annotations.perPolymer;if(e.size===0)return \"\";let t={};for(let[n,o]of e)t[n]=o;return JSON.stringify(t)}versionTrailer(){let e=this.options.version??\"V2.0\";if(e===\"none\")return \"\";if(e===\"preserve\"){let t=this.mol.annotations.version;return t===\"\"?\"\":`$${t}`}return `$${e}`}bracketsForChain(e){let t=[],n=new Map;for(let o of this.mol.atoms)n.set(o.id,o.bio.chainId);for(let o of this.mol.groups){if(o.kind!==\"bracket\")continue;let r=[];for(let l of o.members){let d=parseInt(l.target,10);Number.isFinite(d)&&r.push(d);}if(r.length===0)continue;let s=new Set;for(let l of r){let d=n.get(l);d!==void 0&&s.add(d);}if(!s.has(e)||s.size>1)continue;let a=o.repeat??{min:1,max:1};t.push({members:r,min:a.min,max:a.max,set:new Set(r),startAtomId:r[0],endAtomId:r[r.length-1]});}return t}};function te(i){let e=\"\";for(let t=0;t<i.length;t++){let n=i.charCodeAt(t);if(n===34){e+='\\\\\"';continue}if(n===92){e+=\"\\\\\\\\\";continue}if(n===10){e+=\"\\\\n\";continue}if(n===13){e+=\"\\\\r\";continue}if(n===9){e+=\"\\\\t\";continue}e+=i.charAt(t);}return e}function mo(i,e){return i===e?`'${i}'`:`'${i}-${e}'`}function po(i,e){switch(i.kind){case \"numeric\":return `R${i.r}`;case \"unspecified\":return \"?\";case \"wildcard\":return \"*\";case \"pair\":return \"pair\";case \"positional\":return `${i.position}:R${i.r}`;default:return \"?\"}}function br(i){return i.ratio===void 0?i.target:`${i.target}:${i.ratio}`}function fn(i){return new hn(i).run()}var hn=class{constructor(e){this.chainIdMap=new Map;this.mol=e;}run(){let e=this.mol.chains.slice().sort((m,p)=>m.polymerType!==p.polymerType?m.polymerType<p.polymerType?-1:1:fo(m.id,p.id)),t={},n=[];for(let m of e){let p=yr(m.polymerType);t[p]=(t[p]??0)+1;let h=`${p}${t[p]}`;this.chainIdMap.set(m.id,h),n.push(m);}let o=new Map;for(let m of this.mol.atoms){let p=this.chainIdMap.get(m.bio.chainId)??m.bio.chainId;o.set(m.id,{...m,bio:{...m.bio,chainId:p}});}for(let m of this.mol.atoms){if(m.branchAtom===void 0)continue;let p=o.get(m.id),h=o.get(m.branchAtom.id);p!==void 0&&h!==void 0&&(p.branchAtom=h);}let r=this.mol.bonds.map(m=>({...m,a1:o.get(m.a1.id)??m.a1,a2:o.get(m.a2.id)??m.a2})),s=new Map;for(let m of r)s.set(m.id,m);let a=n.map(m=>{let p=this.chainIdMap.get(m.id)??m.id,h=[];for(let y of m.backboneAtoms){let w=o.get(y.id);w!==void 0&&h.push(w);}let f=[];for(let y of m.bonds){let w=s.get(y.id);w!==void 0&&f.push(w);}return {id:p,polymerType:m.polymerType,backboneAtoms:h,bonds:f,...m.annotation!==void 0&&m.annotation.length>0?{annotation:m.annotation}:{}}}),l=new Map;for(let m of a)l.set(m.id,m);r.sort((m,p)=>{let h=ho(m.kind),f=ho(p.kind);if(h&&!f)return 1;if(!h&&f)return -1;if(!h&&!f)return m.id-p.id;let y=m.a1.bio.chainId,w=p.a1.bio.chainId;if(y!==w)return y<w?-1:1;let _=m.a2.bio.chainId,M=p.a2.bio.chainId;if(_!==M)return _<M?-1:1;let k=le(m.a1,l.get(m.a1.bio.chainId)),x=le(p.a1,l.get(p.a1.bio.chainId));if(k!==x)return k-x;let T=le(m.a2,l.get(m.a2.bio.chainId)),E=le(p.a2,l.get(p.a2.bio.chainId));return T-E});let d=this.renumberGroups(this.mol.groups),c=this.rekeyAnnotations(this.mol.annotations);return {atoms:this.mol.atoms.map(m=>o.get(m.id)),bonds:r,chains:a,groups:d,annotations:c}}renumberGroups(e){let t=[],n=[];for(let r of e)r.kind===\"bracket\"?t.push(this.rekeyBracket(r)):n.push(r);n.sort((r,s)=>fo(r.id,s.id));let o={G:0};return n.map(r=>{o.G+=1;let s=`G${o.G}`;return {...r,id:s,members:r.members.map(a=>this.rekeyMember(a))}}).concat(t)}rekeyBracket(e){return e}rekeyMember(e){let t=this.chainIdMap.get(e.target);return t===void 0?e:e.ratio===void 0?{target:t}:{target:t,ratio:e.ratio}}rekeyAnnotations(e){let t=new Map;for(let[n,o]of e.perPolymer){let r=this.chainIdMap.get(n)??n;Object.keys(o).length!==0&&t.set(r,o);}return {perPolymer:t,version:e.version}}};function yr(i){switch(i){case \"PEPTIDE\":return \"PEPTIDE\";case \"RNA\":return \"RNA\";case \"CHEM\":return \"CHEM\";case \"BLOB\":return \"BLOB\";default:return \"BLOB\"}}function ho(i){return i===\"cross-polymer\"||i===\"hbond\"}function fo(i,e){let t=/^([A-Z]+)([0-9]+)$/.exec(i),n=/^([A-Z]+)([0-9]+)$/.exec(e);return t===null||n===null?i<e?-1:i>e?1:0:t[1]!==n[1]?t[1]<n[1]?-1:1:parseInt(t[2],10)-parseInt(n[2],10)}function bo(i){let e=Ee(i),t=new Map;for(let a of i.atoms){let l=e.get(a.id);if(l===void 0||l===a.bio.continuousId){t.set(a.id,a);continue}t.set(a.id,{...a,bio:{...a.bio,continuousId:l}});}for(let a of i.atoms){if(a.branchAtom===void 0)continue;let l=t.get(a.id),d=t.get(a.branchAtom.id);l===void 0||d===void 0||(l.branchAtom=d);}let n=i.bonds.map(a=>{let l=t.get(a.a1.id),d=t.get(a.a2.id);return l===void 0||d===void 0||l===a.a1&&d===a.a2?a:{...a,a1:l,a2:d}}),o=new Map;for(let a of n)o.set(a.id,a);let r=i.chains.map(a=>{let l=[];for(let c of a.backboneAtoms){let u=t.get(c.id);l.push(u??c);}let d=[];for(let c of a.bonds){let u=o.get(c.id);d.push(u??c);}return {id:a.id,polymerType:a.polymerType,backboneAtoms:l,bonds:d,...a.annotation!==void 0?{annotation:a.annotation}:{}}});return {atoms:i.atoms.map(a=>t.get(a.id)??a),bonds:n,chains:r,groups:i.groups,annotations:i.annotations}}function bn(i,e){let n=et(i,e??null,{mode:\"lenient\",resolveMonomers:false}),o=gr(n.mol),r=bo(o.mol),s=new Map;for(let d of r.atoms)s.set(d.id,d.bio.continuousId);let a=new Map;for(let[d,c]of o.survivorByOldContinuousId){let u=s.get(c);u!==void 0&&a.set(d,u);}let l=Re(r,{version:\"V2.0\"});return {srcHelm:i,resHelm:l,monomerMap:a}}function gr(i){let e=new Map;for(let u of i.atoms)e.set(u.bio.continuousId,u.id);let t=new Set;for(let u of i.atoms)u.symbol===\"*\"&&t.add(u.id);if(t.size===0)return {mol:i,survivorByOldContinuousId:e};let n=new Map;for(let u of i.atoms)n.set(u.id,[]);for(let u of i.bonds)n.get(u.a1.id)?.push(u),n.get(u.a2.id)?.push(u);for(let u of t){let m=n.get(u)??[];if(m.some(f=>f.kind===\"cross-polymer\"||f.kind===\"hbond\"))throw new j(\"gap-at-complex-junction\",`Gap atom ${u} participates in a cross-polymer/hbond bond`,{atomId:u});let h=m.filter(f=>f.kind===\"backbone\");if(h.length>2)throw new j(\"gap-at-complex-junction\",`Gap atom ${u} has ${h.length} backbone bonds (max 2 allowed)`,{atomId:u,bondCount:h.length})}let o=i.atoms.filter(u=>!t.has(u.id)),r=[],s=[];for(let u of i.chains){let m=u.backboneAtoms.filter(f=>!t.has(f.id)),p=(()=>{let f=0;for(let y of i.bonds)y.id>f&&(f=y.id);return f+1})(),h=[];for(let f of u.bonds)t.has(f.a1.id)||t.has(f.a2.id)||h.push(f);for(let f=0;f<u.backboneAtoms.length;f++){let y=u.backboneAtoms[f];if(!t.has(y.id))continue;let w=_r(u.backboneAtoms,f,t),_=vr(u.backboneAtoms,f,t);if(w===null||_===null)continue;let M={id:p++,a1:w,a2:_,kind:\"backbone\",r1:{kind:\"numeric\",r:2},r2:{kind:\"numeric\",r:1}};h.find(x=>x.a1.id===w.id&&x.a2.id===_.id)===void 0&&h.push(M);}for(let f of h)s.push(f);r.push({id:u.id,polymerType:u.polymerType,backboneAtoms:m,bonds:h,...u.annotation!==void 0?{annotation:u.annotation}:{}});}for(let u of i.bonds)u.kind!==\"cross-polymer\"&&u.kind!==\"hbond\"||t.has(u.a1.id)||t.has(u.a2.id)||s.push(u);let a=new Map;for(let u of r){let m=0;for(let p of u.backboneAtoms)m+=1,a.set(p.id,{...p,bio:{...p.bio,positionInChain:m}});}for(let u of o)a.has(u.id)||a.set(u.id,u);let l=r.map(u=>{let m=u.backboneAtoms.map(h=>a.get(h.id)),p=u.bonds.map(h=>({...h,a1:a.get(h.a1.id),a2:a.get(h.a2.id)}));return {id:u.id,polymerType:u.polymerType,backboneAtoms:m,bonds:p,...u.annotation!==void 0?{annotation:u.annotation}:{}}}),d=s.map(u=>({...u,a1:a.get(u.a1.id),a2:a.get(u.a2.id)}));return {mol:{atoms:o.map(u=>a.get(u.id)),bonds:d,chains:l,groups:i.groups,annotations:i.annotations},survivorByOldContinuousId:e}}function _r(i,e,t){for(let n=e-1;n>=0;n--){let o=i[n];if(o!==void 0&&!t.has(o.id))return o}return null}function vr(i,e,t){for(let n=e+1;n<i.length;n++){let o=i[n];if(o!==void 0&&!t.has(o.id))return o}return null}function yn(i,e,t){let n=t?.mode??\"lenient\",o=[];for(let s of wr)o.push(...s(i,e));let r=n===\"pedantic\"?o.map(s=>s.severity===\"warning\"?{...s,severity:\"error\"}:s):o;if(n===\"strict\"||n===\"pedantic\"){let s=r.filter(a=>a.severity===\"error\");if(s.length>0)throw new Ye(s)}return r}var wr=[xr,kr,Ar,Mr,Tr,Er,Cr,Lr];function xr(i,e){let t=[],n=new Set(i.chains.map(s=>s.id));for(let s of i.bonds)s.kind!==\"cross-polymer\"&&s.kind!==\"hbond\"||(n.has(s.a1.bio.chainId)||t.push({severity:\"error\",code:\"unknown-chain-reference\",message:`Connection references unknown chain '${s.a1.bio.chainId}'`,context:{chainId:s.a1.bio.chainId,bondId:s.id}}),n.has(s.a2.bio.chainId)||t.push({severity:\"error\",code:\"unknown-chain-reference\",message:`Connection references unknown chain '${s.a2.bio.chainId}'`,context:{chainId:s.a2.bio.chainId,bondId:s.id}}));for(let s of i.chains)for(let a of i.bonds){if(a.kind!==\"cross-polymer\"&&a.kind!==\"hbond\")continue;let l=0;for(let d of s.backboneAtoms)l+=d.branchAtom!==void 0?2:1;for(let d of [a.a1,a.a2]){if(d.bio.chainId!==s.id)continue;let c=le(d,s);(c<1||c>l)&&t.push({severity:\"error\",code:\"position-out-of-range\",message:`Position ${c} out of range for chain '${s.id}' (length ${l})`,context:{chainId:s.id,atomId:d.id,found:c}});}}let o=new Set;for(let s of i.groups)s.kind!==\"bracket\"&&o.add(s.id);for(let s of i.groups)if(s.kind!==\"bracket\")for(let a of s.members)n.has(a.target)||o.has(a.target)||t.push({severity:\"error\",code:\"unknown-group-reference\",message:`Group '${s.id}' references unknown id '${a.target}'`,context:{found:a.target}});let r=new Map;for(let s of i.groups){if(s.kind===\"bracket\")continue;let a=[];for(let l of s.members)o.has(l.target)&&a.push(l.target);r.set(s.id,a);}for(let s of r.keys()){let a=new Set,l=[s];for(;l.length>0;){let d=l.pop();if(a.has(d))continue;a.add(d);let c=r.get(d)??[];for(let u of c)u===s?t.push({severity:\"error\",code:\"group-cycle\",message:`Group cycle detected involving '${s}'`,context:{found:s}}):a.has(u)||l.push(u);}}return t}function kr(i,e){let t=[];if(e===null)return t;let n=new Map;for(let o of i.chains)n.set(o.id,o.polymerType);for(let o of i.atoms){let r=n.get(o.bio.chainId);if(r===void 0)continue;let s=o.monomer,a=s?.meta;if(s===null||a?.missing===true){t.push({severity:\"warning\",code:\"unresolved-monomer\",message:`Monomer '${o.symbol}' not found in library for ${r}`,context:{chainId:o.bio.chainId,atomId:o.id,found:o.symbol}});continue}a?.ambiguous!==true&&s.smiles!==void 0&&s.smiles.length>0&&(s.rgroups.length===0?t.push({severity:\"warning\",code:\"inline-smiles-without-r-groups\",message:`Inline-SMILES monomer '${s.symbol}' has no R-groups`,context:{atomId:o.id,found:s.symbol}}):s.rgroups.length>4&&t.push({severity:\"warning\",code:\"inline-smiles-too-many-rs\",message:`Inline-SMILES monomer '${s.symbol}' has ${s.rgroups.length} R-groups (max 4 expected)`,context:{atomId:o.id,found:s.rgroups.length}}));}for(let o of i.atoms){let r=n.get(o.bio.chainId);if(!(r===void 0||e.getMonomer(r,o.symbol)!==null)){for(let a of e.getMonomerSymbolsByType(r))if(a!==o.symbol&&a.toLowerCase()===o.symbol.toLowerCase()){t.push({severity:\"info\",code:\"case-mismatch\",message:`Symbol '${o.symbol}' differs from library entry '${a}' only in case`,context:{atomId:o.id,found:o.symbol,expected:a}});break}}}return t}function Ar(i,e){let t=[],n=new Map;for(let o of i.bonds)for(let[r,s]of [[o.a1,o.r1],[o.a2,o.r2]]){if(s.kind!==\"numeric\")continue;let a=n.get(r.id)??new Set;a.has(s.r)&&t.push({severity:\"error\",code:\"rgroup-already-bonded\",message:`R-group R${s.r} on atom ${r.id} already bonded`,context:{atomId:r.id,bondId:o.id,found:s.r}}),a.add(s.r),n.set(r.id,a);}for(let o of i.bonds){for(let[r,s]of [[o.a1,o.r1],[o.a2,o.r2]]){if(s.kind!==\"numeric\"||r.monomer===null)continue;let a=r.monomer.rs;(s.r<1||s.r>a)&&t.push({severity:\"error\",code:\"rgroup-not-on-monomer\",message:`R-group R${s.r} not defined on monomer '${r.symbol}' (rs=${a})`,context:{atomId:r.id,bondId:o.id,found:s.r,expected:`R1..R${a}`}});}o.kind===\"backbone\"&&o.r1.kind===\"numeric\"&&o.r2.kind===\"numeric\"&&(o.r1.r===2&&o.r2.r===1||t.push({severity:\"warning\",code:\"backbone-rgroup-misaligned\",message:`Backbone bond uses R${o.r1.r}->R${o.r2.r} (expected R2->R1)`,context:{bondId:o.id,found:`R${o.r1.r}->R${o.r2.r}`}})),o.kind===\"branch\"&&o.r1.kind===\"numeric\"&&o.r1.r!==3&&t.push({severity:\"warning\",code:\"branch-rgroup-misaligned\",message:`Branch bond uses R${o.r1.r} (expected R3 on parent)`,context:{bondId:o.id,found:`R${o.r1.r}`}});}for(let o of i.atoms){if(o.monomer===null)continue;let s=n.get(o.id)?.size??0;if(o.monomer.rs>s){let a=o.monomer.rs-s;a>0&&o.monomer.rs>0&&t.push({severity:\"info\",code:\"unmatched-r-group\",message:`Monomer '${o.symbol}' on atom ${o.id} has ${a} unused R-group(s); default cap applied`,context:{atomId:o.id,found:a}});}}return t}function Mr(i,e){let t=[];for(let n of i.chains){if(n.polymerType===\"CHEM\"&&n.backboneAtoms.length>1&&t.push({severity:\"error\",code:\"chem-multiple-monomers\",message:`CHEM polymer '${n.id}' has ${n.backboneAtoms.length} monomers (expected 1)`,context:{chainId:n.id,found:n.backboneAtoms.length}}),n.polymerType===\"BLOB\")for(let o of n.backboneAtoms)o.bio.blobtype===void 0&&o.symbol!==\"Bead\"&&o.symbol!==\"Group\"&&t.push({severity:\"error\",code:\"blob-non-blob-symbol\",message:`BLOB '${n.id}' contains non-blob symbol '${o.symbol}'`,context:{chainId:n.id,atomId:o.id,found:o.symbol}});if(n.polymerType===\"RNA\"){let o=false;for(let r=0;r<n.backboneAtoms.length;r++){let s=n.backboneAtoms[r];s.biotype===b.BASE&&!o&&t.push({severity:\"error\",code:\"rna-bare-base\",message:`Bare base '${s.symbol}' without parent sugar in '${n.id}'`,context:{chainId:n.id,atomId:s.id}}),s.biotype===b.LINKER&&(n.backboneAtoms.slice(0,r).some(l=>l.biotype===b.SUGAR)||t.push({severity:\"warning\",code:\"rna-bare-linker\",message:`Bare linker '${s.symbol}' before any sugar in '${n.id}'`,context:{chainId:n.id,atomId:s.id}})),o=s.biotype===b.SUGAR||s.biotype===b.LINKER;}}}return t}function Tr(i,e){let t=[],n=new Map;for(let r of i.chains)n.set(r.id,r.polymerType);let o=new Map;for(let r of i.bonds){if(r.kind!==\"hbond\")continue;o.set(r.a1.id,(o.get(r.a1.id)??0)+1),o.set(r.a2.id,(o.get(r.a2.id)??0)+1);let s=n.get(r.a1.bio.chainId),a=n.get(r.a2.bio.chainId);(s!==\"RNA\"||a!==\"RNA\")&&t.push({severity:\"error\",code:\"pair-non-rna\",message:`Hydrogen-bond connects non-RNA chains (${s}/${a})`,context:{bondId:r.id}}),(r.a1.biotype!==b.BASE||r.a2.biotype!==b.BASE)&&t.push({severity:\"warning\",code:\"pair-position-not-base\",message:\"Hydrogen-bond endpoints are not both bases\",context:{bondId:r.id,found:`${r.a1.biotype}/${r.a2.biotype}`}}),Sr(r.a1.symbol,r.a2.symbol)||t.push({severity:\"warning\",code:\"pair-non-canonical\",message:`Non-canonical pair ${r.a1.symbol}-${r.a2.symbol}`,context:{bondId:r.id,found:`${r.a1.symbol}-${r.a2.symbol}`}});}for(let[r,s]of o)s>1&&t.push({severity:\"warning\",code:\"pair-already-paired\",message:`Base atom ${r} participates in ${s} pair bonds`,context:{atomId:r,found:s}});return t}function Sr(i,e){let t=i.toUpperCase(),n=e.toUpperCase();return new Set([\"A:T\",\"T:A\",\"A:U\",\"U:A\",\"G:C\",\"C:G\"]).has(`${t}:${n}`)}function Er(i,e){let t=[];for(let n of i.atoms){let o=n.bio.ambiguity;if(o!==void 0){if(n.bio.ambiguityKind===\"and\"){let r=yo(o,\"+\");for(let s of r)s.ratio!==void 0&&s.ratio<0&&t.push({severity:\"error\",code:\"ratio-and-negative\",message:`AND ratio for '${s.symbol}' is negative (${s.ratio})`,context:{atomId:n.id,found:s.ratio}});}else if(n.bio.ambiguityKind===\"or\"){let r=yo(o,\",\"),s=0,a=false;for(let l of r)typeof l.ratio==\"number\"&&(s+=l.ratio,a=true);a&&Math.abs(s-1)>.001&&Math.abs(s-100)>.5&&t.push({severity:\"info\",code:\"ratio-doesnt-sum-to-1\",message:`OR ratios sum to ${s} (expected 1.0 or 100)`,context:{atomId:n.id,found:s}});}}}return t}function yo(i,e){let t=i.trim();t.startsWith(\"(\")&&t.endsWith(\")\")&&(t=t.slice(1,-1));let n=t.split(e),o=[];for(let r of n){let s=r.trim();if(s.length===0)continue;let a=s.indexOf(\":\");if(a<0){o.push({symbol:s});continue}let l=s.slice(0,a),d=s.slice(a+1),c=parseFloat(d);Number.isFinite(c)?o.push({symbol:l,ratio:c}):o.push({symbol:l});}return o}function Cr(i,e){let t=[],n=new Set(i.chains.map(o=>o.id));for(let o of i.annotations.perPolymer.keys())n.has(o)||t.push({severity:\"warning\",code:\"annotation-unknown-polymer\",message:`Annotation references unknown polymer '${o}'`,context:{found:o}});return t}function Lr(i,e){let t=[];for(let o of i.chains)o.backboneAtoms.length>1e4&&t.push({severity:\"info\",code:\"polymer-too-long\",message:`Polymer '${o.id}' has ${o.backboneAtoms.length} atoms (> 10000); renderer may switch to rows layout`,context:{chainId:o.id,found:o.backboneAtoms.length}});let n=0;for(let o of i.bonds)(o.kind===\"cross-polymer\"||o.kind===\"hbond\")&&(n+=1);n>1e3&&t.push({severity:\"info\",code:\"connection-count-high\",message:`${n} cross-polymer/hbond connections (> 1000); rendering may be slow`,context:{found:n}});for(let o of i.groups)o.kind===\"bracket\"&&o.repeat!==void 0&&o.repeat.max>1e4&&t.push({severity:\"warning\",code:\"bracket-repeat-too-large\",message:`Bracket repeat upper bound ${o.repeat.max} > 10000`,context:{found:o.repeat.max}});return t}function go(i){let e=[],t=new Map;for(let n of i.chains)for(let o of n.backboneAtoms)t.set(o.id,n.id);for(let n of i.chains)for(let o of n.backboneAtoms)o.branchAtom!==void 0&&t.set(o.branchAtom.id,n.id);for(let n of i.chains){let o=Br(n.polymerType),r=n.backboneAtoms,s=[],a=[],l=[];for(let c of n.bonds)c.kind===\"backbone\"&&l.push(c);if(o===\"RNA\")for(let c of r){if(c.biotype!==b.SUGAR){s.push(null),a.push(null);continue}let u=null,m=null;for(let p of n.bonds){if(p.kind!==\"branch\")continue;let h=p.a1.id===c.id?p.a2:p.a2.id===c.id?p.a1:null;if(h!==null&&h.biotype===b.BASE){u=h,m=p;break}}s.push(u),a.push(m);}else for(let c=0;c<r.length;c++)s.push(null),a.push(null);let d=Rr(i,n.id,r,t);e.push({id:n.id,polymerType:o,backbone:r,bases:s,backboneBonds:l,baseBonds:a,isCyclic:d,...n.strandType!==void 0?{strandType:n.strandType}:{}});}return e}function Br(i){switch(i){case v.PEPTIDE:return \"PEPTIDE\";case v.RNA:return \"RNA\";case v.CHEM:return \"CHEM\";case v.BLOB:return \"BLOB\";default:return \"BLOB\"}}function Rr(i,e,t,n){if(t.length<2)return false;let o=t[0],r=t[t.length-1];for(let s of i.bonds){if(s.kind===\"backbone\"||s.kind===\"branch\")continue;let a=n.get(s.a1.id),l=n.get(s.a2.id);if(a!==e||l!==e||!(s.a1.id===r.id&&s.a2.id===o.id||s.a2.id===r.id&&s.a1.id===o.id))continue;let c=s.a1.id===o.id?s.r1:s.r2,u=s.a1.id===r.id?s.r1:s.r2,m=c.kind===\"numeric\"&&c.r===1,p=u.kind===\"numeric\"&&u.r===2;if(m&&p)return true}return false}var gn=44.800000000000004,_o=1.5*28,At=1.5*28/gn,_n=1.5*28/gn,vn=1.5*28/gn;function ke(i,e){let t=e?.bondLength??28,n=e?.origin??{x:0,y:0},o=1.6*t,r=new Map;for(let s=0;s<i.backbone.length;s++){let a=i.backbone[s];r.set(a.id,{x:n.x+s*o,y:n.y});}return r}var Ir=Math.PI/180;function Mt(i,e){let t=i.backbone.length;if(t<=2){let d={};return e?.bondLength!==void 0&&(d.bondLength=e.bondLength),e?.origin!==void 0&&(d.origin=e.origin),ke(i,d)}let n=e?.bondLength??28,o=e?.origin??{x:0,y:0},r=e?.startDegrees??-90,a=1.6*n/(2*Math.sin(Math.PI/t)),l=new Map;for(let d=0;d<t;d++){let c=i.backbone[d],m=(r+d*360/t)*Ir;l.set(c.id,{x:o.x+a*Math.cos(m),y:o.y+a*Math.sin(m)});}return l}var Pr=10,Hr=1.5/1.6;function vo(i,e){let t=e?.bondLength??28,n=e?.origin??{x:0,y:0},o=Math.max(1,e?.perRow??Pr),r=e?.rowSpacing??Hr,s=1.6*t,a=r*s,l=new Map;for(let d=0;d<i.backbone.length;d++){let c=i.backbone[d],u=Math.floor(d/o),m=d%o,p=u%2===0?n.x+m*s:n.x+(o-1-m)*s,h=n.y+u*a;l.set(c.id,{x:p,y:h});}return l}function wo(i,e){let t=new Map;for(let r=0;r<i.backbone.length;r++)t.set(i.backbone[r].id,r);let n=i.backbone.length-1,o=[];for(let r of e.bonds){if(r.kind===\"backbone\"||r.kind===\"branch\")continue;let s=t.get(r.a1.id),a=t.get(r.a2.id);if(s===void 0||a===void 0)continue;let l=Math.min(s,a),d=Math.max(s,a);d-l<2||l===0&&d===n||o.push({lo:l,hi:d});}return o}function xo(i,e){return e===null?false:wo(i,e).length>0}function wn(i,e,t){if(e===null)return ke(i,t);let n=t?.bondLength??28,o=t?.origin??{x:0,y:0},r=1.6*n,s=wo(i,e);if(s.length===0)return ke(i,t);let a=s[0].lo,l=s[0].hi;for(let L of s)L.lo<a&&(a=L.lo),L.hi>l&&(l=L.hi);let d=i.backbone.slice(a,l+1),c=d.length,u=r/(2*Math.sin(Math.PI/c)),m={id:i.id,polymerType:i.polymerType,backbone:d,bases:new Array(c).fill(null),baseBonds:new Array(c).fill(null)},p=a,h={x:o.x+p*r+u,y:o.y},f=Mt(m,{bondLength:n,origin:h,startDegrees:180}),y=new Map;for(let L=0;L<a;L++){let z=i.backbone[L];y.set(z.id,{x:o.x+L*r,y:o.y});}for(let[L,z]of f)y.set(L,z);let w=d[c-1],_=f.get(w.id)??h,M=_.x-h.x,k=_.y-h.y,x=Math.hypot(M,k);x<1e-6&&(M=0,k=1,x=1);let T=M/x,E=k/x,C={x:_.x+T*r,y:_.y+E*r},P=Math.sign(_.x-h.x);if(P===0&&c>=2){let L=f.get(d[c-2].id);L!==void 0&&(P=Math.sign(_.x-L.x));}P===0&&(P=1);for(let L=l+1;L<i.backbone.length;L++){let z=i.backbone[L],ae=L-(l+1);y.set(z.id,ae===0?C:{x:C.x+P*r*ae,y:C.y});}return y}function Ao(i){let e=new Map,t=new Map;for(let n=0;n<i.backbone.length;n++){e.set(i.backbone[n].id,n);let o=i.bases[n];o!=null&&t.set(o.id,n);}return {sugarToIdx:e,baseToIdx:t}}function ko(i,e,t){let n=e.get(i);if(n!==void 0)return n;let o=t.get(i);return o!==void 0?o:null}function Mo(i,e,t){let n=i.kind===\"hbond\",o=i.kind===\"cross-polymer\"&&typeof i.r1==\"object\"&&i.r1!==null&&i.r1.kind===\"pair\"&&typeof i.r2==\"object\"&&i.r2!==null&&i.r2.kind===\"pair\";if(!n&&!o)return null;let r=ko(i.a1.id,e,t),s=ko(i.a2.id,e,t);return r===null||s===null||r===s?null:{lo:Math.min(r,s),hi:Math.max(r,s)}}function To(i,e){if(i.polymerType!==\"RNA\"||i.backbone.length===0)return false;let{sugarToIdx:t,baseToIdx:n}=Ao(i);for(let o of e.bonds)if(Mo(o,t,n)!==null)return true;return false}function $r(i,e){let t=i.backbone.length,n=new Int32Array(t).fill(-1);if(t===0)return n;let{sugarToIdx:o,baseToIdx:r}=Ao(i),s=[];for(let l of e.bonds){let d=Mo(l,o,r);d!==null&&s.push([d.lo,d.hi]);}s.sort((l,d)=>l[0]-d[0]||d[1]-l[1]);let a=[];for(let l of s){let[d,c]=l,u=false;for(let[m,p]of a){let h=c<m||d>p,f=d>m&&c<p||d<m&&c>p;if(!h&&!f){u=true;break}}u||n[d]!==-1||n[c]!==-1||(n[d]=c,n[c]=d,a.push(l));}return n}function Dr(i){return e(0,i.length-1,null);function e(t,n,o){let r=[],s=-1,a=t;for(;a<=n;){let l=i[a];if(l>a&&l<=n){s!==-1&&(r.push({kind:\"unpaired\",from:s,to:a-1}),s=-1);let d=1;for(;a+2*d<l-2*d&&i[a+2*d]===l-2*d&&i[a+2*d-1]===-1&&i[l-2*d+1]===-1;)d+=1;let c=a+2*(d-1),u=l-2*(d-1),m=[c,u],p=e(c+1,u-1,m);r.push({kind:\"stem\",fromIdx:a,toIdx:l,numPairs:d,child:p}),a=l+1;}else s===-1&&(s=a),a+=1;}return s!==-1&&r.push({kind:\"unpaired\",from:s,to:n}),{kind:\"loop\",nodes:r,closingPair:o}}}function Tt(i){let e=Math.hypot(i.x,i.y);return e===0?{x:1,y:0}:{x:i.x/e,y:i.y/e}}function Or(i){return {x:-i.y,y:i.x}}function xn(i,e,t){return {x:i.x+e*Math.cos(t),y:i.y+e*Math.sin(t)}}function Nr(i,e,t,n){let o=t+n+1;if(o<=0)return Math.max(i/2+1,e);let r=n+1,s=o*e,a=Math.max(s/(2*Math.PI),i/2+1);for(let l=0;l<64;l++){let d=i/(2*a),u=2*Math.asin(Math.min(.9999,Math.max(-0.9999,d))),m=(2*Math.PI-r*u)*a-s,p=d,h=Math.sqrt(Math.max(1e-12,1-p*p)),y=2*(-i/(2*a*a)/h),w=2*Math.PI-r*u-r*a*y;if(!Number.isFinite(w)||Math.abs(w)<1e-12)break;let _=m/w,M=a-_;if(!Number.isFinite(M)||M<i/2+.001){a=i/2+.001;break}if(a=M,Math.abs(_)<1e-9)break}return Math.max(a,i/2+.001)}function St(i,e,t,n,o){let r=o.chain.bases[i];r!=null&&o.out.set(r.id,{x:e.x+n*t.x,y:e.y+n*t.y});}function So(i,e,t){let{chain:n,step:o,rail:r,baseInwardHang:s,out:a}=t,l=2*i.numPairs-1,d={x:e.normal.x,y:e.normal.y},c={x:-e.normal.x,y:-e.normal.y};for(let m=0;m<l;m++){let p=n.backbone[i.fromIdx+m],h=n.backbone[i.toIdx-m],f=m*o,y={x:e.origin.x+f*e.tangent.x,y:e.origin.y+f*e.tangent.y},w={x:e.origin.x+f*e.tangent.x+r*e.normal.x,y:e.origin.y+f*e.tangent.y+r*e.normal.y};a.set(p.id,y),a.set(h.id,w),St(i.fromIdx+m,y,d,s,t),St(i.toIdx-m,w,c,s,t);}let u=(l-1)*o;return {origin:{x:e.origin.x+u*e.tangent.x,y:e.origin.y+u*e.tangent.y},tangent:e.tangent,normal:e.normal}}function Eo(i,e,t,n){if(i.closingPair===null)return;let{step:o,rail:r,out:s}=t,a=0,l=0;for(let T of i.nodes)T.kind===\"unpaired\"?a+=T.to-T.from+1:l+=1;let d=Nr(r,o,a,l),c=s.get(t.chain.backbone[i.closingPair[0]].id),u=s.get(t.chain.backbone[i.closingPair[1]].id),m={x:(c.x+u.x)/2,y:(c.y+u.y)/2},p=Math.sqrt(Math.max(0,d*d-r/2*(r/2))),h={x:m.x+p*e.tangent.x,y:m.y+p*e.tangent.y},f=Math.atan2(c.y-h.y,c.x-h.x),w=Math.atan2(u.y-h.y,u.x-h.x)-f;for(;w>Math.PI;)w-=2*Math.PI;for(;w<=-Math.PI;)w+=2*Math.PI;let _=w>0?-1:1,M=2*Math.asin(Math.min(.9999,Math.max(-0.9999,r/(2*d)))),k=o/d,x=f;for(let T of i.nodes)if(T.kind===\"unpaired\")for(let E=T.from;E<=T.to;E++){x=x+_*k;let C=xn(h,d,x);s.set(t.chain.backbone[E].id,C);let P=Tt({x:C.x-h.x,y:C.y-h.y});St(E,C,P,t.step,t);}else {x=x+_*k;let E=xn(h,d,x);x=x+_*M;let C=xn(h,d,x);s.set(t.chain.backbone[T.fromIdx].id,E),s.set(t.chain.backbone[T.toIdx].id,C);let P=Tt({x:(E.x+C.x)/2-h.x,y:(E.y+C.y)/2-h.y}),L=Tt({x:C.x-E.x,y:C.y-E.y}),ae=So(T,{origin:E,tangent:P,normal:L},t);Eo(T.child,ae,t);}}function Fr(i,e,t){let{step:n,rail:o,out:r}=t,s={x:e.origin.x,y:e.origin.y},a={x:e.tangent.x,y:e.tangent.y},l={x:-e.normal.x,y:-e.normal.y};for(let d of i.nodes)if(d.kind===\"unpaired\")for(let c=d.from;c<=d.to;c++){let u={x:s.x,y:s.y};r.set(t.chain.backbone[c].id,u),St(c,u,{x:e.normal.x,y:e.normal.y},t.step,t),s={x:s.x+n*a.x,y:s.y+n*a.y};}else {let c={origin:{x:s.x,y:s.y},tangent:l,normal:a},u=So(d,c,t);Eo(d.child,u,t),s={x:s.x+(o+n)*a.x,y:s.y+(o+n)*a.y};}}function Co(i,e,t){let n=t?.bondLength??28,o=1.6*n,r=o/2,a=_o*(n/28)+2*r,l=t?.origin??{x:0,y:0},d=Tt(t?.rootDirection??{x:1,y:0}),c=Or(d),u=new Map;if(i.backbone.length===0)return u;let m=$r(i,e),p=Dr(m);Fr(p,{origin:l,tangent:d,normal:c},{chain:i,step:o,rail:a,baseInwardHang:r,out:u});for(let y of i.backbone)u.has(y.id)||u.set(y.id,{x:l.x,y:l.y});return u}function Lo(i,e,t){if(i.polymerType!==\"RNA\")return e;let n=t?.bondLength??28,o=1.6*n;for(let r=0;r<i.backbone.length;r++){let s=i.bases[r];if(s==null||e.has(s.id))continue;let a=i.backbone[r],l=e.get(a.id);if(l===void 0)continue;let d=Gr(i,r,e);e.set(s.id,{x:l.x+o*d.x,y:l.y+o*d.y});}return e}function Gr(i,e,t){let n=i.backbone[e],o=t.get(n.id);if(o===void 0)return {x:0,y:1};let r=e>0?i.backbone[e-1]:void 0,s=e<i.backbone.length-1?i.backbone[e+1]:void 0,a=r!==void 0?t.get(r.id):void 0,l=s!==void 0?t.get(s.id):void 0,d=0,c=0;if(a!==void 0&&l!==void 0){let u=l.x-a.x,m=l.y-a.y,p=Math.hypot(u,m);if(p===0)return {x:0,y:1};let h={x:m/p,y:-u/p},f={x:-m/p,y:u/p},y=h.y>=f.y?h:f;d=y.x,c=y.y;}else if(l!==void 0){let u=l.x-o.x,m=l.y-o.y,p=Math.hypot(u,m);if(p===0)return {x:0,y:1};let h={x:m/p,y:-u/p},f={x:-m/p,y:u/p},y=h.y>=f.y?h:f;d=y.x,c=y.y;}else if(a!==void 0){let u=o.x-a.x,m=o.y-a.y,p=Math.hypot(u,m);if(p===0)return {x:0,y:1};let h={x:m/p,y:-u/p},f={x:-m/p,y:u/p},y=h.y>=f.y?h:f;d=y.x,c=y.y;}else return {x:0,y:1};return {x:d,y:c}}function Io(i,e,t,n){let o=n?.bondLength??28,r=1.6*o,s=new Map,a=new Map;for(let h of i){let f=new Set;for(let y of h.backbone)f.add(y.id);for(let y of h.bases)y!==null&&f.add(y.id);a.set(h.id,{chain:h,atomIds:f});for(let y of f)s.set(y,h);}let l=new Set;if(i.length>0){let h=i.find(f=>f.strandType===\"ss\");l.add((h??i[0]).id);}let d=new Map;for(let h of i)d.set(h.id,h.id);let c=h=>{let f=h;for(;d.get(f)!==f;)f=d.get(f);let y=h;for(;d.get(y)!==f;){let w=d.get(y);d.set(y,f),y=w;}return f},u=(h,f)=>{d.set(c(h),c(f));},m=h=>{let f=c(h),y=new Set;for(let[w,_]of a)if(c(w)===f)for(let M of _.atomIds)y.add(M);return y},p=h=>{let f=c(h),y=0;for(let w of d.keys())c(w)===f&&(y+=1);return y};for(let h of t.bonds){if(h.kind===\"backbone\"||h.kind===\"branch\")continue;let f=s.get(h.a1.id),y=s.get(h.a2.id);if(f===void 0||y===void 0||f.id===y.id)continue;h.kind===\"hbond\"&&(f.strandType===\"as\"&&y.strandType===\"ss\"?l.add(y.id):y.strandType===\"as\"&&f.strandType===\"ss\"?l.add(f.id):f.strandType===\"as\"&&!l.has(y.id)?l.add(y.id):y.strandType===\"as\"&&!l.has(f.id)&&l.add(f.id));let w=y,_=h.a1,M=h.a2;if(l.has(y.id)&&!l.has(f.id))w=f,_=h.a2,M=h.a1;else if(!l.has(f.id)&&!l.has(y.id)){if(l.size>0){let T=new Set;for(let L of l){let z=a.get(L);if(z!==void 0)for(let ae of z.atomIds)T.add(ae);}let E=Ho(T,e),C=a.get(f.id),P=Po(C.atomIds,e);if(E!==null&&P!==null){let L=E+r*At-P;L>0&&tt(C.atomIds,e,0,L);}}l.add(f.id),w=y,_=h.a1,M=h.a2;}else if(l.has(f.id)&&l.has(y.id)){if(c(f.id)===c(y.id)||h.kind!==\"cross-polymer\")continue;let T=m(f.id),E=m(y.id),C=T.size<=E.size,P=C?T:E,L=C?E:T,z=e.get((C?h.a1:h.a2).id),ae=e.get((C?h.a2:h.a1).id);z!==void 0&&ae!==void 0&&Ro(P,z,L,ae,r,e),u(f.id,y.id);continue}let k=e.get(_.id),x=e.get(M.id);if(!(k===void 0||x===void 0)){if(h.kind===\"hbond\"){let T=a.get(w.id);Vr(T.atomIds,e),Ur(T.atomIds,e);let E=e.get(M.id),C=k.x-E.x,P=k.y+r*_n-E.y;P=Bo(P,T,l,a,e,r*_n),tt(T.atomIds,e,C,P);}else if(w.isCyclic&&w.backbone.length>=3){let T=a.get(w.id),E=w.id===f.id?y:f,C=a.get(E.id);Kr(T.atomIds,x,C.atomIds,k,r,e);}else {let T=a.get(w.id),E=k.x-x.x,C=k.y+r*vn-x.y;C=Bo(C,T,l,a,e,r*vn);let P=Math.abs(x.y+C-k.y),L=s.get(_.id),z=L!==void 0&&p(L.id)>1;h.kind===\"cross-polymer\"&&z&&P>2*r?Ro(T.atomIds,x,m(L.id),k,r,e):tt(T.atomIds,e,E,C);}l.add(w.id),u(f.id,y.id);}}return l}function Bo(i,e,t,n,o,r){let s=Po(e.atomIds,o);if(s===null)return i;let a=null;for(let c of t){let u=n.get(c);if(u===void 0)continue;let m=Ho(u.atomIds,o);m!==null&&(a===null||m>a)&&(a=m);}if(a===null)return i;let l=s+i,d=a+r;return l<d?d-s:i}function Po(i,e){let t=null;for(let n of i){let o=e.get(n);o!==void 0&&(t===null||o.y<t)&&(t=o.y);}return t}function Ho(i,e){let t=null;for(let n of i){let o=e.get(n);o!==void 0&&(t===null||o.y>t)&&(t=o.y);}return t}function tt(i,e,t,n){for(let o of i){let r=e.get(o);r!==void 0&&e.set(o,{x:r.x+t,y:r.y+n});}}function Vr(i,e){let t=0,n=0;for(let r of i){let s=e.get(r);s!==void 0&&(t+=s.x,n+=1);}if(n===0)return;let o=t/n;for(let r of i){let s=e.get(r);s!==void 0&&e.set(r,{x:2*o-s.x,y:s.y});}}function Ur(i,e){let t=0,n=0;for(let r of i){let s=e.get(r);s!==void 0&&(t+=s.y,n+=1);}if(n===0)return;let o=t/n;for(let r of i){let s=e.get(r);s!==void 0&&e.set(r,{x:s.x,y:2*o-s.y});}}function kn(i,e){let t=0,n=0,o=0;for(let r of i){let s=e.get(r);s!==void 0&&(t+=s.x,n+=s.y,o+=1);}return o===0?{x:0,y:0}:{x:t/o,y:n/o}}function Ro(i,e,t,n,o,r){let s=kn(t,r),a=n.x-s.x,l=n.y-s.y,d=Math.hypot(a,l);d<1e-6&&(a=0,l=1,d=1);let c=a/d,u=l/d,m=n.x+c*o,p=n.y+u*o;tt(i,r,m-e.x,p-e.y);}function zr(i,e,t,n){let o=Math.cos(n),r=Math.sin(n);for(let s of i){let a=e.get(s);if(a===void 0)continue;let l=a.x-t.x,d=a.y-t.y;e.set(s,{x:t.x+l*o-d*r,y:t.y+l*r+d*o});}}function Kr(i,e,t,n,o,r){let s=kn(t,r),a=n.x-s.x,l=n.y-s.y,d=Math.hypot(a,l);d<1e-6&&(a=1,l=0,d=1);let c=a/d,u=l/d,m=kn(i,r),p=Math.hypot(e.x-m.x,e.y-m.y),h=Math.atan2(e.y-m.y,e.x-m.x),f=Math.atan2(-u,-c);zr(i,r,m,f-h);let y=n.x+c*(o+p),w=n.y+u*(o+p);tt(i,r,y-m.x,w-m.y);}function $o(i,e,t,n){let o=n?.bondLength??28,r=n?.gap??At,s=1.6*o,a=r*s,l=0,d=false;for(let u of i)if(t.has(u.id)){for(let m of u.backbone){let p=e.get(m.id);p!==void 0&&(d?p.y>l&&(l=p.y):(l=p.y,d=true));}for(let m of u.bases){if(m===null)continue;let p=e.get(m.id);p!==void 0&&p.y>l&&(l=p.y);}}d||(l=0);let c=l+a;for(let u of i){if(t.has(u.id))continue;let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY;for(let f of u.backbone){let y=e.get(f.id);y!==void 0&&(y.y<m&&(m=y.y),y.y>p&&(p=y.y));}for(let f of u.bases){if(f===null)continue;let y=e.get(f.id);y!==void 0&&(y.y<m&&(m=y.y),y.y>p&&(p=y.y));}if(m===Number.POSITIVE_INFINITY){t.add(u.id);continue}let h=c-m;for(let f of u.backbone){let y=e.get(f.id);y!==void 0&&e.set(f.id,{x:y.x,y:y.y+h});}for(let f of u.bases){if(f===null)continue;let y=e.get(f.id);y!==void 0&&e.set(f.id,{x:y.x,y:y.y+h});}c=p+h+a,t.add(u.id);}}var Wr=20,jr=40,qr=250,Yr=4;function Xr(i,e){let t=1,n=qr;for(;e>n;)t*=2,n*=Yr;return i*t}function ne(i,e){let t=e?.bondLength??28,n=e?.perRow,o=e?.rowsThreshold,r=e?.circleThreshold??20,s=go(i),a=new Map;for(let d of s){let c=Jr(d,i,t,n,o,r);for(let[u,m]of c)a.set(u,m);d.polymerType===\"RNA\"&&Lo(d,a,{bondLength:t});}let l=Io(s,a,i,{bondLength:t});$o(s,a,l,{bondLength:t});for(let d of i.atoms)a.has(d.id)||a.set(d.id,{x:0,y:0});return Zr(i,a)}function Jr(i,e,t,n,o,r){let s=i.backbone.length;if(s===0)return new Map;let a=i.polymerType===\"RNA\",d=n??Xr(a?jr:Wr,s),c=o??d;if(i.polymerType===\"RNA\"&&To(i,e))return Co(i,e,{bondLength:t});if(i.isCyclic&&s<=r)return Mt(i,{bondLength:t});if(!i.isCyclic&&xo(i,e))return wn(i,e,{bondLength:t});if(s>c){let u=a?2:void 0;return vo(i,u!==void 0?{bondLength:t,perRow:d,rowSpacing:u}:{bondLength:t,perRow:d})}return i.isCyclic?ke(i,{bondLength:t}):wn(i,e,{bondLength:t})}function Zr(i,e){let t=new Map,n=[];for(let s of i.atoms){let a=e.get(s.id)??s.p,l={...s,p:{x:a.x,y:a.y}};t.set(s.id,l),n.push(l);}for(let s=0;s<n.length;s++){let a=i.atoms[s];if(a.branchAtom!==void 0){let l=t.get(a.branchAtom.id);l!==void 0&&(n[s]={...n[s],branchAtom:l}),t.set(n[s].id,n[s]);}}let o=[];for(let s of i.bonds){let a=t.get(s.a1.id),l=t.get(s.a2.id);a===void 0||l===void 0||o.push({...s,a1:a,a2:l});}let r=[];for(let s of i.chains){let a=s.backboneAtoms.map(d=>t.get(d.id)??d),l=s.bonds.map(d=>{let c=t.get(d.a1.id)??d.a1,u=t.get(d.a2.id)??d.a2;return {...d,a1:c,a2:u}});r.push({id:s.id,polymerType:s.polymerType,backboneAtoms:a,bonds:l,...s.annotation!==void 0?{annotation:s.annotation}:{},...s.strandType!==void 0?{strandType:s.strandType}:{}});}return {atoms:n,bonds:o,chains:r,groups:i.groups,annotations:i.annotations}}function Et(i,e){let t=Math.min(i.x,e.x),n=Math.min(i.y,e.y),o=Math.max(i.x+i.width,e.x+e.width),r=Math.max(i.y+i.height,e.y+e.height);return {x:t,y:n,width:o-t,height:r-n}}function A(i){if(Number.isInteger(i))return i===0?\"0\":i.toString();if(!Number.isFinite(i)||Object.is(i,-0))return \"0\";let e=Math.round(i*1e3)/1e3;return e===0?\"0\":e.toString()}function An(i){if(i.length===0)return \"\";let e=i[0],t=`M ${A(e.x)} ${A(e.y)}`;for(let n=1;n<i.length;n++){let o=i[n];t+=` L ${A(o.x)} ${A(o.y)}`;}return t+=` L ${A(e.x)} ${A(e.y)} Z`,t}function Do(i,e,t,n){let o=[],r=360/e;for(let s=0;s<e;s++){let a=(n+s*r)*Math.PI/180;o.push({x:i.x+t*Math.cos(a),y:i.y+t*Math.sin(a)});}return o}function Oo(i,e,t=-30){return An(Do(i,6,e,t))}function No(i,e){let t=[{x:i.x,y:i.y-e},{x:i.x+e,y:i.y},{x:i.x,y:i.y+e},{x:i.x-e,y:i.y}];return An(t)}function Fo(i,e,t=-90){return An(Do(i,5,e,t))}function Mn(i,e,t,n){let o=Math.abs(e)/2,r=Math.abs(t)/2,s=Math.max(0,Math.min(n,o,r)),a=i.x-o,l=i.y-r,d=a+o*2,c=l+r*2,u=`M ${A(a+s)} ${A(l)}`;return u+=` L ${A(d-s)} ${A(l)}`,u+=` A ${A(s)} ${A(s)} 0 0 1 ${A(d)} ${A(l+s)}`,u+=` L ${A(d)} ${A(c-s)}`,u+=` A ${A(s)} ${A(s)} 0 0 1 ${A(d-s)} ${A(c)}`,u+=` L ${A(a+s)} ${A(c)}`,u+=` A ${A(s)} ${A(s)} 0 0 1 ${A(a)} ${A(c-s)}`,u+=` L ${A(a)} ${A(l+s)}`,u+=` A ${A(s)} ${A(s)} 0 0 1 ${A(a+s)} ${A(l)}`,u+=\" Z\",u}function Tn(i,e,t){let n=Math.abs(e),o=Math.abs(t);return `M ${A(i.x-n)} ${A(i.y)} A ${A(n)} ${A(o)} 0 1 0 ${A(i.x+n)} ${A(i.y)} A ${A(n)} ${A(o)} 0 1 0 ${A(i.x-n)} ${A(i.y)} Z`}function Go(i,e,t,n){return Mn(i,e,t,n)}function Vo(i,e){return Tn(i,e,e)}function Uo(i,e){return `M ${A(i.x)} ${A(i.y)} L ${A(e.x)} ${A(e.y)}`}function zo(i,e,t=6){let n=e.x-i.x,o=e.y-i.y,r=Math.sqrt(n*n+o*o);if(r===0)return `M ${A(i.x)} ${A(i.y)} L ${A(i.x)} ${A(i.y)}`;let s=n/r,a=o/r,l=-a,d=s,c=(i.x+e.x)/2,u=(i.y+e.y)/2,m=t/2,p=Math.min(t*.6,r*.25),h=c-s*p,f=u-a*p,y=c+s*p,w=u+a*p;return `M ${A(h-l*m)} ${A(f-d*m)} L ${A(h+l*m)} ${A(f+d*m)} M ${A(y-l*m)} ${A(w-d*m)} L ${A(y+l*m)} ${A(w+d*m)}`}function Sn(i,e,t,n){switch(i){case \"hexagon\":{let o=t*Math.sqrt(3)/2,r=t;return {x:e.x-o,y:e.y-r,width:o*2,height:r*2}}case \"diamond\":return {x:e.x-t,y:e.y-t,width:t*2,height:t*2};case \"pentagon\":{let o=Math.cos(18*Math.PI/180)*t,r=-t,s=Math.sin(54*Math.PI/180)*t;return {x:e.x-o,y:e.y+r,width:o*2,height:s-r}}case \"rounded-rect\":case \"blob\":{let o=n??t,r=Math.abs(t)/2,s=Math.abs(o)/2;return {x:e.x-r,y:e.y-s,width:r*2,height:s*2}}case \"ellipse\":{let o=Math.abs(t),r=Math.abs(n??t);return {x:e.x-o,y:e.y-r,width:o*2,height:r*2}}case \"circle\":{let o=Math.abs(t);return {x:e.x-o,y:e.y-o,width:o*2,height:o*2}}}}var Ct=14,Ko='\"Helvetica Neue\", Helvetica, Arial, sans-serif';function Wo(i){return {aa:{size:i*.72,strokeWidth:5},sugar:{size:i*1.39,strokeWidth:5,cornerRadius:i*.3},base:{size:i*.88,strokeWidth:5},linker:{size:i*.63,strokeWidth:5},chem:{size:i*1.49,strokeWidth:5,cornerRadius:i*.5},blob:{size:i*1.64,strokeWidth:5,cornerRadius:i*.8},nucleotide:{size:i*.98,strokeWidth:5}}}var H={name:\"light\",background:\"#ffffff\",defaultStroke:\"#202020\",defaultFill:\"#ffffff\",selectionColor:\"#FFC107\",highlightColor:\"#A4E2DC\",errorColor:\"#cc0000\",fontSize:Ct,fontFamily:Ko,bondLength:28,textColor:\"#000000\",idColor:\"#00aa00\",annotationColor:\"#FFA500\",tagDotColor:\"#dd2222\",hbondColor:\"#888888\",nonCanonicalHbondColor:\"#cc8800\",crossPolymerBondColor:\"#1f5fcd\",colorTheme:we,palette:{softenCanvas:false},shapes:Wo(Ct)},En={name:\"dark\",background:\"#1a1d23\",defaultStroke:\"#e0e0e0\",defaultFill:\"#2b2f37\",selectionColor:\"#FFD54F\",highlightColor:\"#7DD8CC\",errorColor:\"#ff5050\",fontSize:Ct,fontFamily:Ko,bondLength:28,textColor:\"#ffffff\",idColor:\"#33ff33\",annotationColor:\"#FFB84D\",tagDotColor:\"#ff6464\",hbondColor:\"#aaaaaa\",nonCanonicalHbondColor:\"#ffaa44\",crossPolymerBondColor:\"#6699ff\",colorTheme:Be,palette:{softenCanvas:false},shapes:Wo(Ct)};function Qr(i,e){let t=e.shapes===void 0?i.shapes:{...i.shapes,...e.shapes};return {...i,...e,shapes:t}}function nt(i,e){switch(e){case b.AA:return i.shapes.aa;case b.SUGAR:return i.shapes.sugar;case b.BASE:return i.shapes.base;case b.LINKER:return i.shapes.linker;case b.CHEM:return i.shapes.chem;case b.BLOB:return i.shapes.blob;case b.NUCLEOTIDE:return i.shapes.nucleotide}}var jo=\"*\";function Lt(i){switch(i){case b.AA:return \"hexagon\";case b.SUGAR:return \"rounded-rect\";case b.BASE:return \"diamond\";case b.LINKER:return \"circle\";case b.CHEM:return \"rounded-rect\";case b.BLOB:return \"blob\";case b.NUCLEOTIDE:return \"pentagon\"}}function Ie(i,e,t=0){let n=nt(e,i.biotype);if(i.symbol===jo)return Vo(i.p,n.size+t);switch(Lt(i.biotype)){case \"hexagon\":{let r=t===0?0:t/Math.cos(Math.PI/6);return Oo(i.p,n.size+r)}case \"diamond\":{let r=t===0?0:t/Math.cos(Math.PI/4);return No(i.p,n.size+r)}case \"pentagon\":{let r=t===0?0:t/Math.cos(Math.PI/5);return Fo(i.p,n.size+r)}case \"rounded-rect\":return Mn(i.p,n.size+2*t,n.size+2*t,(n.cornerRadius??0)+t);case \"blob\":return Go(i.p,n.size+2*t,n.size+2*t,(n.cornerRadius??0)+t);case \"circle\":return Tn(i.p,n.size+t,n.size+t)}}function pe(i,e){let t=nt(e,i.biotype),n=i.symbol===jo?\"circle\":Lt(i.biotype),o;switch(n){case \"hexagon\":case \"diamond\":case \"pentagon\":case \"circle\":o=Sn(n,i.p,t.size);break;case \"rounded-rect\":case \"blob\":o=Sn(n,i.p,t.size,t.size);break}let r=t.strokeWidth/2;return {x:o.x-r,y:o.y-r,width:o.width+2*r,height:o.height+2*r}}function qo(i,e){return nt(e,i.biotype).size}function he(i,e){return nt(e,i.biotype)}var es=/[&\"'<>]/,ts=/[&<>]/;function ns(i){return es.test(i)?i.replace(/&/g,\"&amp;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&apos;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"):i}function de(i){return ts.test(i)?i.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"):i}function Ae(i){if(Number.isInteger(i))return i===0?\"0\":i.toString();if(!Number.isFinite(i)||Object.is(i,-0))return \"0\";let e=Math.round(i*1e3)/1e3;return e===0?\"0\":e.toString()}function R(i,e,t){let n=`<${i}`;if(e!==void 0)for(let o in e){let r=e[o];if(!(r===void 0||r===false)){if(r===true){n+=` ${o}`;continue}typeof r==\"number\"?n+=` ${o}=\"${Ae(r)}\"`:n+=` ${o}=\"${ns(r)}\"`;}}return t===void 0?`${n}/>`:typeof t==\"string\"?`${n}>${t}</${i}>`:`${n}>${t.join(\"\")}</${i}>`}var os=\"http://www.w3.org/2000/svg\",Cn=.525,Ln=.8,Bn=1.125,is=\".hw-atom{transition:stroke-width 120ms,filter 120ms;}.hw-atom:focus{outline:none;}.hw-atom__shape{shape-rendering:geometricPrecision;}.hw-bond__stroke{stroke-linecap:round;}\",rs=[[\"A\",\"T\"],[\"A\",\"U\"],[\"G\",\"C\"]];function Rt(i,e={}){let t=e.theme??H,n=e.width??400,o=e.height??100,r=e.padding??16,s=e.backColor??t.background,a=e.showIds??false,l=e.showAnnotations??true,d=e.fontSize??t.fontSize,c=e.selectedAtomIds??new Set,u=e.highlightedAtomIds??new Set;e.documentImpl??(typeof globalThis<\"u\"&&typeof globalThis.document<\"u\"?globalThis.document:void 0);let p=e.fixedModelBbox??Rn(i,t),h=ss(p,n,o,r,e.maxScale??1),f=h.x-p.x*h.scale,y=h.y-p.y*h.scale,w=In(i,t,u),_=Pn(i,t,c),M=as(i,t),k=ps(i,t,d,a,e.bondLength??t.bondLength),x=l?bs(i,t,d):\"\",T=`translate(${Ae(f)} ${Ae(y)}) scale(${Ae(h.scale)})`,E=R(\"g\",{class:\"hw-content\",transform:T},[M,k,x,w,_].join(\"\")),C=R(\"defs\",void 0,`<style>${is}</style>`),P=R(\"rect\",{class:\"hw-bg\",x:0,y:0,width:n,height:o,fill:s});return {svg:R(\"svg\",{xmlns:os,viewBox:`0 0 ${Ae(n)} ${Ae(o)}`,width:n,height:o,\"data-hw-theme\":t.name},[C,P,E].join(\"\")),bbox:{x:p.x,y:p.y,width:p.width,height:p.height},drawBox:{x:h.x,y:h.y,width:h.width,height:h.height,scale:h.scale}}}function Rn(i,e=H){if(i.atoms.length===0)return {x:0,y:0,width:0,height:0};let t=pe(i.atoms[0],e);for(let n=1;n<i.atoms.length;n++)t=Et(t,pe(i.atoms[n],e));return t}function ss(i,e,t,n,o=1){let r=Math.max(0,e-2*n),s=Math.max(0,t-2*n),a=1;if(i.width>0||i.height>0){let c=i.width>0?r/i.width:Number.POSITIVE_INFINITY,u=i.height>0?s/i.height:Number.POSITIVE_INFINITY;a=Math.min(c,u,o),(!Number.isFinite(a)||a<=0)&&(a=1);}let l=i.width*a,d=i.height*a;return {x:(e-l)/2,y:(t-d)/2,width:l,height:d,scale:a}}var Bt=3;function In(i,e,t){if(t.size===0)return R(\"g\",{class:\"hw-layer hw-highlights\"},\"\");let n=[];for(let o of i.atoms){if(!t.has(o.id))continue;let s=(he(o,e).strokeWidth+Bt)/2,a=Ie(o,e,s);n.push(R(\"path\",{d:a,class:\"hw-highlight\",fill:\"none\",stroke:e.highlightColor,\"stroke-width\":Bt,\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\",\"data-symbol\":o.symbol,\"data-ring-atom-id\":o.id,\"data-testid\":`highlight-ring-${o.id}`}));}return R(\"g\",{class:\"hw-layer hw-highlights\"},n.join(\"\"))}function Pn(i,e,t){if(t.size===0)return R(\"g\",{class:\"hw-layer hw-selections\"},\"\");let n=[];for(let o of i.atoms){if(!t.has(o.id))continue;let s=(he(o,e).strokeWidth+Bt)/2,a=Ie(o,e,s);n.push(R(\"path\",{d:a,class:\"hw-selection\",fill:\"none\",stroke:e.selectionColor,\"stroke-width\":Bt,\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\",\"data-symbol\":o.symbol,\"data-ring-atom-id\":o.id,\"data-testid\":`selection-ring-${o.id}`}));}return R(\"g\",{class:\"hw-layer hw-selections\"},n.join(\"\"))}function as(i,e){let t=[];for(let n of i.bonds)t.push(ls(n,e));return R(\"g\",{class:\"hw-layer hw-bonds\"},t.join(\"\"))}function ls(i,e){let t=i.a1.p,n=i.a2.p,o=ds(i,e),r=cs(i),s=us(),l={d:Uo(t,n),class:\"hw-bond__stroke\",fill:\"none\",stroke:o,\"stroke-width\":s};r!==void 0&&(l[\"stroke-dasharray\"]=r);let d=[R(\"path\",l)];return i.kind===\"hbond\"&&d.push(R(\"path\",{d:zo(t,n,e.fontSize*.6),class:\"hw-bond__hash\",fill:\"none\",stroke:o,\"stroke-width\":s})),R(\"g\",{class:`hw-bond hw-bond--${i.kind}`,\"data-bond-id\":i.id,\"data-kind\":i.kind,\"data-testid\":`canvas-bond-${i.id}`},d.join(\"\"))}function ds(i,e){switch(i.kind){case \"backbone\":case \"branch\":return e.defaultStroke;case \"cross-polymer\":return e.crossPolymerBondColor;case \"hbond\":return ms(i)?e.hbondColor:e.nonCanonicalHbondColor;case \"group\":return e.defaultStroke}}function cs(i){if(i.kind===\"hbond\")return \"4 3\"}function us(i){return Bn}function ms(i){if(i.a1.biotype!==b.BASE||i.a2.biotype!==b.BASE)return false;let e=Yo(i.a1),t=Yo(i.a2);for(let[n,o]of rs)if(e===n&&t===o||e===o&&t===n)return true;return false}function Yo(i){let e=i.monomer?.naturalAnalog,t=e!==void 0&&e!==\"\"?e:i.symbol;return t.length===0?\"\":t.charAt(0).toUpperCase()}function ps(i,e,t,n,o=e.bondLength){let r=[];for(let s of i.atoms)s.hidden||r.push(hs(s,e,t,n,o));return R(\"g\",{class:\"hw-layer hw-atoms\"},r.join(\"\"))}function hs(i,e,t,n,o=e.bondLength){let r=he(i,e),s=Ie(i,e),a=$(i.monomer,i.biotype,e.colorTheme),l=a.background,d=a.text,c=i.symbol===\"*\"?\"3 3\":void 0,u={d:s,class:\"hw-atom__shape\",fill:l,stroke:l,\"stroke-width\":r.strokeWidth,\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\"};c!==void 0&&(u[\"stroke-dasharray\"]=c);let m=[R(\"path\",u)],p=i.monomer?.symbol??i.symbol;if(p!==\"\"){let f=p.length<=1?1:Math.min(1,2/p.length),y=t*f;m.push(R(\"text\",{class:\"hw-atom__label\",x:i.p.x,y:i.p.y+y*.35,\"text-anchor\":\"middle\",\"font-size\":y,\"font-family\":e.fontFamily,fill:d},de(p)));}if(i.bio.ambiguity!==void 0&&i.bio.ambiguity!==\"\"&&m.push(R(\"text\",{class:\"hw-atom__ambiguity\",x:i.p.x,y:i.p.y+r.size+t*.7,\"text-anchor\":\"middle\",\"font-size\":t*.7,\"font-family\":e.fontFamily,fill:d},de(i.bio.ambiguity))),n){let f=o*Cn;m.push(R(\"text\",{class:\"hw-atom__id\",x:i.p.x-f,y:i.p.y-f,\"font-size\":t*Ln,\"font-family\":e.fontFamily,fill:e.idColor},de(String(i.bio.continuousId))));}i.tag!==void 0&&i.tag!==\"\"&&m.push(R(\"circle\",{class:\"hw-atom__tag-dot\",cx:i.p.x+r.size*.7,cy:i.p.y-r.size*.7,r:Math.max(2,t*.18),fill:e.tagDotColor}));let h=fs(i);return R(\"g\",{class:\"hw-atom\",\"data-atom-id\":i.id,\"data-symbol\":i.symbol,\"data-chain-id\":i.bio.chainId,\"data-biotype\":i.biotype,\"data-testid\":`canvas-atom-${i.id}`,tabindex:0,role:\"button\",\"aria-label\":h},m.join(\"\"))}function fs(i){let e=i.symbol===\"\"?\"?\":i.symbol,t=i.bio.chainId===\"\"?\"unknown chain\":i.bio.chainId,n=i.bio.positionInChain;return `${e} at position ${n} of ${t}`}function bs(i,e,t){let n=[];for(let o of i.bonds){if(o.ratio===void 0)continue;let r=(o.a1.p.x+o.a2.p.x)/2,s=(o.a1.p.y+o.a2.p.y)/2,a=o.ratio.denominator!==void 0?`${o.ratio.numerator}/${o.ratio.denominator}`:`${o.ratio.numerator}`;n.push(R(\"text\",{class:\"hw-annotation hw-annotation--bond-ratio\",x:r,y:s-t*.4,\"text-anchor\":\"middle\",\"font-size\":t*.7,\"font-family\":e.fontFamily,fill:e.annotationColor},de(a)));}for(let o of i.atoms){let r=o.bio.annotation;if(r===void 0||r===\"\")continue;let s=he(o,e);n.push(R(\"text\",{class:\"hw-annotation hw-annotation--atom\",x:o.p.x+s.size+2,y:o.p.y-s.size,\"font-size\":t*.7,\"font-family\":e.fontFamily,fill:e.annotationColor},de(r)));}for(let o of i.chains){if(o.annotation===void 0||o.annotation===\"\")continue;let r=o.backboneAtoms[0];r!==void 0&&n.push(R(\"text\",{class:\"hw-annotation hw-annotation--chain\",x:r.p.x,y:r.p.y-e.fontSize*1.4,\"font-size\":t*.8,\"font-family\":e.fontFamily,fill:e.annotationColor},de(o.annotation)));}for(let o of i.chains){if(o.polymerType!==\"RNA\")continue;let r=o.backboneAtoms;if(r.length<2)continue;let s=r[0],a=r[r.length-1],l=r.length>=2?r[1]:null,d=r.length>=2?r[r.length-2]:null,c=e.fontSize*1.4,u=Xo(s.p,l?.p??null,c),m=Xo(a.p,d?.p??null,c),p=o.strandType!==void 0?`5'${o.strandType}`:\"5'\",h=o.strandType!==void 0?`3'${o.strandType}`:\"3'\";n.push(R(\"text\",{class:\"hw-annotation hw-annotation--prime hw-annotation--prime-5\",\"data-testid\":`prime-5-${o.id}`,x:u.x,y:u.y,\"text-anchor\":\"middle\",\"dominant-baseline\":\"central\",\"font-size\":t*.85,\"font-family\":e.fontFamily,\"font-weight\":\"bold\",fill:e.annotationColor},de(p))),n.push(R(\"text\",{class:\"hw-annotation hw-annotation--prime hw-annotation--prime-3\",\"data-testid\":`prime-3-${o.id}`,x:m.x,y:m.y,\"text-anchor\":\"middle\",\"dominant-baseline\":\"central\",\"font-size\":t*.85,\"font-family\":e.fontFamily,\"font-weight\":\"bold\",fill:e.annotationColor},de(h)));}return R(\"g\",{class:\"hw-layer hw-annotations\"},n.join(\"\"))}function Xo(i,e,t){if(e===null)return {x:i.x-t,y:i.y};let n=i.x-e.x,o=i.y-e.y,r=Math.hypot(n,o);return r===0?{x:i.x-t,y:i.y}:{x:i.x+t*(n/r),y:i.y+t*(o/r)}}function It(i,e,t,n={}){let o=n.theme??H,r=n.padding??16,s=gs(e,o),a=_s(s,t.width,t.height,r,n.maxScale??1),l=t.x+a.x,d=t.y+a.y;return i.save(),i.beginPath(),i.rect(t.x,t.y,t.width,t.height),i.clip(),n.backColor!==void 0&&(i.fillStyle=n.backColor,i.fillRect(t.x,t.y,t.width,t.height)),i.translate(l,d),i.scale(a.scale,a.scale),i.translate(-s.x,-s.y),vs(i,e,o),xs(i,e,o,n.fontSize??o.fontSize,n.showIds??false,n.bondLength??o.bondLength),n.showAnnotations!==false&&ws(i,e,o,n.fontSize??o.fontSize),i.restore(),{bbox:{x:s.x,y:s.y,width:s.width,height:s.height},drawBox:{x:l,y:d,width:a.width,height:a.height}}}async function ei(i,e={}){let t=ys();if(t===null&&e.canvas===void 0)throw new Error(\"renderToPng: OffscreenCanvas is not available in this environment\");let n=e.theme??H,o=e.width??400,r=e.height??100,s=e.pixelRatio??1,a=e.canvas??new t(Math.max(1,Math.round(o*s)),Math.max(1,Math.round(r*s))),l=a.getContext(\"2d\");if(l===null)throw new Error(\"renderToPng: failed to acquire 2D context\");l.save(),l.scale(s,s),It(l,i,{x:0,y:0,width:o,height:r},{...e,backColor:e.backColor??n.background}),l.restore();let d=a;if(typeof d.convertToBlob!=\"function\")throw new Error(\"renderToPng: canvas.convertToBlob is not available\");let u=await(await d.convertToBlob({type:\"image/png\"})).arrayBuffer();return new Uint8Array(u)}function ys(){let i=globalThis;return typeof i.OffscreenCanvas==\"function\"?i.OffscreenCanvas:null}function gs(i,e){if(i.atoms.length===0)return {x:0,y:0,width:0,height:0};let t=pe(i.atoms[0],e);for(let n=1;n<i.atoms.length;n++)t=Et(t,pe(i.atoms[n],e));return t}function _s(i,e,t,n,o=1){let r=Math.max(0,e-2*n),s=Math.max(0,t-2*n),a=1;if(i.width>0||i.height>0){let c=i.width>0?r/i.width:Number.POSITIVE_INFINITY,u=i.height>0?s/i.height:Number.POSITIVE_INFINITY;a=Math.min(c,u,o),(!Number.isFinite(a)||a<=0)&&(a=1);}let l=i.width*a,d=i.height*a;return {x:(e-l)/2,y:(t-d)/2,width:l,height:d,scale:a}}function vs(i,e,t){for(let n of e.bonds)i.save(),i.strokeStyle=As(n,t),i.lineWidth=Ms(),n.kind===\"hbond\"?i.setLineDash([4,3]):i.setLineDash([]),i.beginPath(),i.moveTo(n.a1.p.x,n.a1.p.y),i.lineTo(n.a2.p.x,n.a2.p.y),i.stroke(),i.restore();}function ws(i,e,t,n){i.save(),i.fillStyle=t.annotationColor,i.font=`${n*.7}px ${t.fontFamily}`,i.textAlign=\"left\",i.textBaseline=\"alphabetic\";for(let r of e.atoms){let s=r.bio.annotation;if(s===void 0||s===\"\")continue;let a=he(r,t);i.fillText(s,r.p.x+a.size+2,r.p.y-a.size);}i.font=`${n*.8}px ${t.fontFamily}`;for(let r of e.chains){if(r.annotation===void 0||r.annotation===\"\")continue;let s=r.backboneAtoms[0];s!==void 0&&i.fillText(r.annotation,s.p.x,s.p.y-t.fontSize*1.4);}i.font=`bold ${n*.85}px ${t.fontFamily}`,i.textAlign=\"center\",i.textBaseline=\"middle\";let o=t.fontSize*1.4;for(let r of e.chains){if(r.polymerType!==\"RNA\")continue;let s=r.backboneAtoms;if(s.length<2)continue;let a=s[0],l=s[s.length-1],d=s.length>=2?s[1]:null,c=s.length>=2?s[s.length-2]:null,u=Jo(a.p,d?.p??null,o),m=Jo(l.p,c?.p??null,o),p=r.strandType!==void 0?`5'${r.strandType}`:\"5'\",h=r.strandType!==void 0?`3'${r.strandType}`:\"3'\";i.fillText(p,u.x,u.y),i.fillText(h,m.x,m.y);}i.restore();}function Jo(i,e,t){if(e===null)return {x:i.x-t,y:i.y};let n=i.x-e.x,o=i.y-e.y,r=Math.hypot(n,o);return r===0?{x:i.x-t,y:i.y}:{x:i.x+t*(n/r),y:i.y+t*(o/r)}}function xs(i,e,t,n,o=false,r=t.bondLength){for(let s of e.atoms){if(s.hidden)continue;let a=he(s,t),l=$(s.monomer,s.biotype,t.colorTheme);i.save(),i.fillStyle=l.background,i.strokeStyle=l.background,i.lineWidth=a.strokeWidth,i.lineJoin=\"round\",i.lineCap=\"round\",s.symbol===\"*\"?i.setLineDash([3,3]):i.setLineDash([]),ks(i,s,a.size,a.cornerRadius??0),i.fill(),i.stroke(),i.restore();let d=s.monomer?.symbol??s.symbol;if(d!==\"\"){let c=d.length<=1?1:Math.min(1,2/d.length),u=n*c;i.save(),i.fillStyle=l.text,i.font=`${u}px ${t.fontFamily}`,i.textAlign=\"center\",i.textBaseline=\"middle\",i.fillText(d,s.p.x,s.p.y),i.restore();}if(o){let c=r*Cn;i.save(),i.fillStyle=t.idColor,i.font=`${n*Ln}px ${t.fontFamily}`,i.textAlign=\"right\",i.textBaseline=\"bottom\",i.fillText(String(s.bio.continuousId),s.p.x-c,s.p.y-c),i.restore();}}}function ks(i,e,t,n){let o=e.p,r=e.symbol===\"*\"?\"circle\":Lt(e.biotype);switch(i.beginPath(),r){case \"hexagon\":Zo(i,o,6,t,-30);break;case \"diamond\":i.moveTo(o.x,o.y-t),i.lineTo(o.x+t,o.y),i.lineTo(o.x,o.y+t),i.lineTo(o.x-t,o.y),i.closePath();break;case \"pentagon\":Zo(i,o,5,t,-90);break;case \"rounded-rect\":case \"blob\":{let s=t/2,a=Math.max(0,Math.min(n,s)),l=o.x-s,d=o.y-s,c=s*2,u=s*2;i.moveTo(l+a,d),i.lineTo(l+c-a,d),i.quadraticCurveTo(l+c,d,l+c,d+a),i.lineTo(l+c,d+u-a),i.quadraticCurveTo(l+c,d+u,l+c-a,d+u),i.lineTo(l+a,d+u),i.quadraticCurveTo(l,d+u,l,d+u-a),i.lineTo(l,d+a),i.quadraticCurveTo(l,d,l+a,d),i.closePath();break}case \"circle\":i.ellipse(o.x,o.y,t,t,0,0,Math.PI*2);break}}function Zo(i,e,t,n,o){let r=360/t;for(let s=0;s<t;s++){let a=(o+s*r)*Math.PI/180,l=e.x+n*Math.cos(a),d=e.y+n*Math.sin(a);s===0?i.moveTo(l,d):i.lineTo(l,d);}i.closePath();}function As(i,e){switch(i.kind){case \"backbone\":case \"branch\":return e.defaultStroke;case \"cross-polymer\":return e.crossPolymerBondColor;case \"hbond\":return Ss(i)?e.hbondColor:e.nonCanonicalHbondColor;case \"group\":return e.defaultStroke}}function Ms(i){return Bn}var Ts=[[\"A\",\"T\"],[\"A\",\"U\"],[\"G\",\"C\"]];function Ss(i){if(i.a1.biotype!==b.BASE||i.a2.biotype!==b.BASE)return false;let e=Qo(i.a1),t=Qo(i.a2);for(let[n,o]of Ts)if(e===n&&t===o||e===o&&t===n)return true;return false}function Qo(i){let e=i.monomer?.naturalAnalog,t=e!==void 0&&e!==\"\"?e:i.symbol;return t.length===0?\"\":t.charAt(0).toUpperCase()}function fe(i){let e=new Map,t=new Map;for(let o of i.bonds){let r=o.a1.id,s=o.a2.id,a=t.get(r);a===void 0&&(a=[],t.set(r,a)),a.push(o);let l=t.get(s);l===void 0&&(l=[],t.set(s,l)),l.push(o);}for(let o of i.atoms)ti(e,o,t.get(o.id)??[]);for(let o of i.groups){if(o.kind!==\"bracket\")continue;let r=o.repeat?.min??1;if(r===1)continue;let s=new Set(o.members.map(l=>l.target)),a=new Map;for(let l of i.atoms){if(!s.has(l.bio.chainId))continue;let d=new Map;ti(d,l,t.get(l.id)??[]);for(let[c,u]of d)a.set(c,(a.get(c)??0)+u*(r-1));}for(let[l,d]of a)e.set(l,(e.get(l)??0)+d);}for(let[o,r]of [...e])r===0&&e.delete(o);let n=Ls(e);return {elements:e,mw:n}}var Es={H:1.008,C:12.011,N:14.007,O:15.999,F:18.998,Na:22.99,Mg:24.305,P:30.974,S:32.06,Cl:35.45,K:39.098,Ca:40.078,Br:79.904,I:126.904,Fe:55.845,Zn:65.38,Cu:63.546},Cs={C:4,N:3,O:2,S:2,P:3,F:1,Cl:1,Br:1,I:1,H:1};function Ls(i){let e=0;for(let[t,n]of i){let o=Es[t];o!==void 0&&(e+=o*n);}return Math.round(e*1e3)/1e3}function ti(i,e,t){if(e.monomer===null)return;let n=Rs(e.monomer);for(let[o,r]of n.elements)i.set(o,(i.get(o)??0)+r);for(let o of t){if(o.kind===\"hbond\"||o.kind===\"group\")continue;let r=o.a1.id===e.id?o.r1:o.r2,s=Bs(e.monomer,r);if(s===void 0)continue;let a=oi(s);for(let[l,d]of a)i.set(l,(i.get(l)??0)-d);}}function Bs(i,e){if(e.kind!==\"numeric\"&&e.kind!==\"positional\")return;let t=(e.kind===\"numeric\",e.r);for(let n of i.rgroups){let o=/^R([1-9][0-9]*)$/.exec(n.label);if(o!==null&&parseInt(o[1],10)===t)return n.capGroupName}}function oi(i){let e=new Map;switch(i){case \"H\":e.set(\"H\",1);break;case \"OH\":e.set(\"H\",1),e.set(\"O\",1);break;}return e}var ni=new WeakMap;function Rs(i){let e=ni.get(i);if(e!==void 0)return e;let t=Is(i);return ni.set(i,t),t}function Is(i){let e=new Map;if(i.molfile===void 0||i.molfile===\"\")return {elements:e};let t=Ps(i.molfile);if(t===null)return {elements:e};let{atoms:n,bondOrders:o}=t;for(let r=0;r<n.length;r++){let s=n[r];if(s===\"R\"||s===\"R#\"||s===\"*\")continue;e.set(s,(e.get(s)??0)+1);let a=Cs[s];if(a===void 0)continue;let l=o[r]??0,d=a-l;d>0&&e.set(\"H\",(e.get(\"H\")??0)+d);}for(let r of i.rgroups){let s=r.capGroupName;if(s===void 0)continue;let a=oi(s);for(let[l,d]of a)e.set(l,(e.get(l)??0)+d);}return {elements:e}}function Ps(i){let e=i.split(/\\r\\n|\\n|\\r/);if(e.length<5)return null;let t=e[3];if(t===void 0||t.length<6)return null;let n=parseInt(t.slice(0,3),10),o=parseInt(t.slice(3,6),10);if(!Number.isFinite(n)||!Number.isFinite(o)||e.length<4+n+o)return null;let r=[];for(let a=0;a<n;a++){let l=e[4+a];if(l===void 0)return null;let d=l.slice(31,34).trim();r.push(d);}let s=new Array(n).fill(0);for(let a=0;a<o;a++){let l=e[4+n+a];if(l===void 0)return null;let d=parseInt(l.slice(0,3),10),c=parseInt(l.slice(3,6),10),u=parseInt(l.slice(6,9),10);if(!Number.isFinite(d)||!Number.isFinite(c)||!Number.isFinite(u))continue;let m=u===4?1:u;d>=1&&d<=n&&(s[d-1]=(s[d-1]??0)+m),c>=1&&c<=n&&(s[c-1]=(s[c-1]??0)+m);}return {atoms:r,bondOrders:s}}function Pe(i){return fe(i).mw}var Hn={W:5.5,Y:1.49,C:.0625},Hs={AA:13.65,AC:10.67,AG:12.79,AU:12.14,CA:10.67,CC:7.52,CG:9.39,CU:8.37,GA:12.79,GC:9.39,GG:11.77,GU:10.21,UA:12.14,UC:8.37,UG:10.21,UU:8.99},ii={A:15.4,C:7.4,G:11.7,U:10,T:8.8};function He(i){let e=0;for(let t of i.chains)t.polymerType===\"PEPTIDE\"?e+=$s(t.backboneAtoms):t.polymerType===\"RNA\"&&(e+=Ds(t.backboneAtoms));return Math.round(e*1e4)/1e4}function $s(i){let e=0,t=0,n=0;for(let o of i){let r=ri(o);r===\"W\"?e++:r===\"Y\"?t++:r===\"C\"&&n++;}return Hn.W*e+Hn.Y*t+Hn.C*n}function Ds(i){let e=[];for(let o of i)if(o.branchAtom!==void 0&&o.branchAtom.biotype===b.BASE){let r=ri(o.branchAtom);r===\"T\"&&(r=\"U\"),r!==\"\"&&e.push(r);}if(e.length===0)return 0;if(e.length===1){let o=e[0];return ii[o]??0}let t=0;for(let o=0;o<e.length-1;o++){let r=e[o],s=e[o+1],a=Hs[r+s];a!==void 0&&(t+=a);}let n=0;for(let o=1;o<e.length-1;o++){let r=e[o];n+=ii[r]??0;}return 2*t-n}function ri(i){let e=i.monomer;return e!==null&&e.naturalAnalog!==void 0&&e.naturalAnalog!==\"\"?e.naturalAnalog.charAt(0).toUpperCase():i.symbol===\"\"?\"\":i.symbol.charAt(0).toUpperCase()}function Pt(i){let e=[];e.push(\"HWE pseudo-molfile\"),e.push(\" HWE 2D\"),e.push(\"\");let t=i.atoms.length,n=i.bonds.length;e.push(Os(t,n));for(let r of i.atoms)e.push(Ns(r));let o=new Map;for(let r=0;r<i.atoms.length;r++)o.set(i.atoms[r].id,r+1);for(let r of i.bonds){let s=o.get(r.a1.id),a=o.get(r.a2.id);s===void 0||a===void 0||e.push(Fs(s,a));}return e.push(\"M END\"),e.join(`\n`)+`\n`}function Os(i,e){return $e(i)+$e(e)+\" 0 0 0 0 0 0 0 0999 V2000\"}function Ns(i){let e=Gs(i);return $n(i.p.x)+$n(i.p.y)+$n(0)+\" \"+Vs(e,3)+\" 0 0 0 0 0 0 0 0 0 0 0 0\"}function Fs(i,e){return $e(i)+$e(e)+$e(1)+$e(0)}function Gs(i){let e=i.monomer;return e!==null&&e.symbol!==\"\"?e.symbol:i.symbol!==\"\"?i.symbol:e!==null&&e.naturalAnalog!==void 0&&e.naturalAnalog!==\"\"?e.naturalAnalog:\"X\"}function $e(i){let e=String(i);return e.length>=3?e:\" \".repeat(3-e.length)+e}function Vs(i,e){return i.length>=e?i:i+\" \".repeat(e-i.length)}function $n(i){let e=i.toFixed(4);return e.length>=10?e.slice(0,10):\" \".repeat(10-e.length)+e}var Us=new Map;function zs(i){return `${i.mode}|${i.resolveMonomers?1:0}|${i.helm}`}function Ks(i){let e=i.chains.map(o=>`${o.id}:${o.polymerType}:${o.backboneAtoms.length}`).join(\",\"),t=i.atoms.map(o=>`${o.id}@${o.symbol}@${o.bio.chainId}`).join(\";\"),n=i.bonds.map(o=>`${o.id}:${o.a1.id}-${o.a2.id}:${o.kind}`).join(\";\");return `${e}#${t}#${n}`}var Ws=256,Dn=class{constructor(e){this._destroyed=false;this._parseHits=0;this._parseMisses=0;this._layoutHits=0;this._layoutMisses=0;this._renderHits=0;this._renderMisses=0;if(e.monomerLib===void 0||e.monomerLib===null)throw new TypeError(\"HelmService: options.monomerLib is required\");this.monomerLib=e.monomerLib,this.theme=e.theme??H,this.logger=e.logger??new Se,this.options=Object.freeze({...e});let t=e.cacheSize??Ws;this._parseCache=new Te({max:t}),this._layoutCache=new Te({max:t}),this._renderCache=new Te({max:t}),this._libUnsub=this.monomerLib.onChanged.subscribe(()=>{this.clearCaches();});}parse(e,t){this._ensureLive(),e=this._normalizeHelm(e);let n=t?.mode??\"lenient\",o=t?.resolveMonomers!==false,r=zs({mode:n,resolveMonomers:o,helm:e}),s=this._parseCache.get(r);if(s!==void 0)return this._parseHits+=1,s;this._parseMisses+=1;let a={mode:n,resolveMonomers:o},l=et(e,this.monomerLib,a),d={mol:l.mol,diagnostics:Object.freeze([...l.diagnostics])};return this._parseCache.set(r,d),d}serialize(e,t){this._ensureLive();let n={...t?.canonicalize!==void 0?{canonicalize:t.canonicalize}:{},...t?.includeHighlights!==void 0?{includeHighlights:t.includeHighlights}:{},...t?.version!==void 0?{version:t.version}:{}};return Re(e,n)}validate(e,t){this._ensureLive(),e=this._normalizeHelm(e);let{mol:n,diagnostics:o}=this.parse(e,{mode:\"lenient\"}),r=t?.mode!==void 0?{mode:t.mode}:{},s=yn(n,this.monomerLib,r);return [...o,...s]}canonicalize(e){this._ensureLive(),e=this._normalizeHelm(e);let{mol:t}=this.parse(e,{mode:\"lenient\"}),n=fn(t);return Re(n,{canonicalize:true,version:\"V2.0\"})}removeGaps(e){return this._ensureLive(),bn(this._normalizeHelm(e),this.monomerLib)}renderToSvg(e,t){this._ensureLive(),e=this._normalizeHelm(e);let n=this._resolveRenderOptions(t),o=this._renderKey(e,n),r=this._renderCache.get(o);if(r!==void 0)return this._renderHits+=1,r;this._renderMisses+=1;let{mol:s}=this.parse(e,{mode:\"lenient\"}),a=this._layout(s,n.bondLength),{svg:l}=Rt(a,n);return this._renderCache.set(o,l),l}renderMol(e,t){this._ensureLive();let n=this._resolveRenderOptions(t),{svg:o}=Rt(e,n);return o}renderMolResult(e,t){this._ensureLive();let n=this._resolveRenderOptions(t);return Rt(e,n)}async renderToPng(e,t){if(this._ensureLive(),e=this._normalizeHelm(e),typeof globalThis.OffscreenCanvas!=\"function\")throw new j(\"png-rendering-requires-browser\",\"HelmService.renderToPng requires OffscreenCanvas (browser-only).\");let n=this._resolveRenderOptions(t),{mol:o}=this.parse(e,{mode:\"lenient\"}),r=this._layout(o,n.bondLength);return ei(r,n)}renderToCanvas(e,t,n,o){this._ensureLive(),t=this._normalizeHelm(t);let r=this._resolveRenderOptions(o),{mol:s}=this.parse(t,{mode:\"lenient\"}),a=this._layout(s,r.bondLength),{bbox:l,drawBox:d}=It(e,a,n,r);return {mol:a,bbox:l,drawBox:d}}renderMolToCanvas(e,t,n,o){this._ensureLive();let r=this._resolveRenderOptions(o),{bbox:s,drawBox:a}=It(e,t,n,r);return {mol:t,bbox:s,drawBox:a}}*renderMany(e,t){for(let n of e??[]){let o=this.renderToSvg(n.helm,t);yield {id:n.id,svg:o};}}getFormula(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return fe(t)}getMolWeight(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return Pe(t)}getExtinctionCoefficient(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return He(t)}getMolfile(e){this._ensureLive();let{mol:t}=this.parse(this._normalizeHelm(e),{mode:\"lenient\"});return Pt(t)}hasAtomicMolfileProvider(){return typeof this.options.atomicMolfileProvider==\"function\"}async getAtomicMolfile(e){this._ensureLive(),e=this._normalizeHelm(e);let t=this.options.atomicMolfileProvider;if(typeof t!=\"function\")throw new j(\"atomic-molfile-not-configured\",\"Set HelmServiceOptions.atomicMolfileProvider to enable atomic-level expansion.\");return await t(e,this.monomerLib)}hasExtraPanes(){let e=this.options.extraPanes;return e!==void 0&&e.size>0}getExtraPanes(){return this.options.extraPanes??Us}invalidate(e){if(e===void 0){this.clearCaches();return}for(let t of [this._parseCache,this._layoutCache,this._renderCache]){let n=[];for(let o of t.keys())e(o)&&n.push(o);for(let o of n)t.delete(o);}}clearCaches(){this._parseCache.clear(),this._layoutCache.clear(),this._renderCache.clear(),this._parseHits=0,this._parseMisses=0,this._layoutHits=0,this._layoutMisses=0,this._renderHits=0,this._renderMisses=0;}destroy(){this._destroyed||(this._destroyed=true,this._libUnsub(),this.clearCaches());}_ensureLive(){if(this._destroyed)throw new j(\"service-destroyed\",\"HelmService instance has been destroyed.\")}_normalizeHelm(e){return e==null?\"\":typeof e==\"string\"?e:String(e)}_resolveRenderOptions(e){let t={},n=e?.theme??this.theme;return t.theme=n,e?.width!==void 0&&(t.width=e.width),e?.height!==void 0&&(t.height=e.height),e?.backColor!==void 0&&(t.backColor=e.backColor),e?.padding!==void 0&&(t.padding=e.padding),e?.showIds!==void 0&&(t.showIds=e.showIds),e?.showAnnotations!==void 0&&(t.showAnnotations=e.showAnnotations),e?.bondLength!==void 0&&(t.bondLength=e.bondLength),e?.fontSize!==void 0&&(t.fontSize=e.fontSize),e?.maxScale!==void 0&&(t.maxScale=e.maxScale),e?.showRGroupLabels!==void 0&&(t.showRGroupLabels=e.showRGroupLabels),e?.selectedAtomIds!==void 0&&(t.selectedAtomIds=e.selectedAtomIds),e?.highlightedAtomIds!==void 0&&(t.highlightedAtomIds=e.highlightedAtomIds),e?.fixedModelBbox!==void 0&&(t.fixedModelBbox=e.fixedModelBbox),t}_renderKey(e,t){let o=(t.theme??this.theme).name,r=this._libCacheTag(),s=t.width??0,a=t.height??0,l=t.padding??-1,d=t.bondLength??-1,c=t.backColor??\"\",u=t.showIds===true?1:0,m=t.showAnnotations===false?0:1,p=t.maxScale??1;return `${r}|${o}|${s}x${a}|p${l}|b${d}|bg${c}|i${u}a${m}|s${p}|${e}`}_layout(e,t){let n=Ks(e),o=`${this._libCacheTag()}|${t??\"d\"}|${n}`,r=this._layoutCache.get(o);if(r!==void 0)return this._layoutHits+=1,r;this._layoutMisses+=1;let s=t!==void 0?ne(e,{bondLength:t}):ne(e);return this._layoutCache.set(o,s),s}get stats(){return {parseHits:this._parseHits,parseMisses:this._parseMisses,layoutHits:this._layoutHits,layoutMisses:this._layoutMisses,renderHits:this._renderHits,renderMisses:this._renderMisses}}_libCacheTag(){let e=this.monomerLib,t=typeof e.version==\"number\"?e.version:0;return `${this.monomerLib.source}@${t}`}};var Q=class{constructor(e,t){this.atoms=e,this.bonds=t,this.isEmpty=e.size===0&&t.size===0,Object.freeze(this);}},si=new Q(new Set,new Set),G={empty(){return si},fromAtoms(i){return new Q(new Set(i),new Set)},fromBonds(i){return new Q(new Set,new Set(i))},fromAtomsAndBonds(i,e){return new Q(new Set(i),new Set(e))},union(...i){if(i.length===0)return si;let e=new Set,t=new Set;for(let n of i){for(let o of n.atoms)e.add(o);for(let o of n.bonds)t.add(o);}return new Q(e,t)},difference(i,e){let t=new Set,n=new Set;for(let o of i.atoms)e.atoms.has(o)||t.add(o);for(let o of i.bonds)e.bonds.has(o)||n.add(o);return new Q(t,n)},intersect(i,e){let t=new Set,n=new Set;for(let o of i.atoms)e.atoms.has(o)&&t.add(o);for(let o of i.bonds)e.bonds.has(o)&&n.add(o);return new Q(t,n)},toggle(i,e){if(e.kind===\"atom\"){let n=new Set(i.atoms);return n.has(e.id)?n.delete(e.id):n.add(e.id),new Q(n,new Set(i.bonds))}let t=new Set(i.bonds);return t.has(e.id)?t.delete(e.id):t.add(e.id),new Q(new Set(i.atoms),t)},hasAtom(i,e){return i.atoms.has(e)},hasBond(i,e){return i.bonds.has(e)},equals(i,e){if(i===e)return true;if(i.atoms.size!==e.atoms.size||i.bonds.size!==e.bonds.size)return false;for(let t of i.atoms)if(!e.atoms.has(t))return false;for(let t of i.bonds)if(!e.bonds.has(t))return false;return true}};function be(i){let e=i.monomer;return e===null?0:e.rgroups.length}function ai(i,e){let t=new Set;for(let r of e)r.a1.id===i.id&&r.r1.kind===\"numeric\"&&t.add(r.r1.r),r.a2.id===i.id&&r.r2.kind===\"numeric\"&&t.add(r.r2.r);let n=[],o=Array.from(t).sort((r,s)=>r-s);for(let r of o)n.push(r);return n}function W(i,e){let t=be(i);if(t===0)return [];let n=new Set(ai(i,e)),o=[];for(let r=1;r<=t;r++)n.has(r)||o.push(r);return o}function js(i,e){return W(i,e).length>0}function Ht(i,e){let t=[];for(let n of e)if(n.a1.id===i.id){let o=n.r1.kind===\"numeric\"?n.r1.r:0;t.push({bond:n,side:\"r1\",rNumber:o});}else if(n.a2.id===i.id){let o=n.r2.kind===\"numeric\"?n.r2.r:0;t.push({bond:n,side:\"r2\",rNumber:o});}return t}function qs(i){switch(i){case b.AA:return v.PEPTIDE;case b.SUGAR:case b.BASE:case b.LINKER:case b.NUCLEOTIDE:return v.RNA;case b.CHEM:return v.CHEM;case b.BLOB:return v.BLOB}}function Ys(i){switch(i){case v.PEPTIDE:return \"PEPTIDE\";case v.RNA:return \"RNA\";case v.CHEM:return \"CHEM\";case v.BLOB:return \"BLOB\";case v.G:return \"G\"}}function Xs(i){let e=0;for(let t of i.atoms)t.id>e&&(e=t.id);for(let t of i.bonds)t.id>e&&(e=t.id);return e}function $t(i,e){return i.kind!==e.kind?false:i.kind===\"numeric\"&&e.kind===\"numeric\"?i.r===e.r:i.kind===\"positional\"&&e.kind===\"positional\"?i.position===e.position&&i.r===e.r:true}var O=class{constructor(e){this._atoms=new Map;this._atomOrder=[];this._bonds=new Map;this._bondOrder=[];this._chains=new Map;this._chainOrder=[];this._addedAtoms=new Set;this._removedAtoms=new Set;this._modifiedAtoms=new Set;this._addedBonds=new Set;this._removedBonds=new Set;this._modifiedBonds=new Set;this._topologyDirty=false;this._idgen=new _e;let t=Xs(e);for(let n=0;n<t;n++)this._idgen.next();for(let n of e.chains)this._chains.set(n.id,{id:n.id,polymerType:n.polymerType,backboneAtomIds:n.backboneAtoms.map(o=>o.id),bondIds:n.bonds.map(o=>o.id),annotation:n.annotation}),this._chainOrder.push(n.id);for(let n of e.atoms)this._atoms.set(n.id,{id:n.id,p:{x:n.p.x,y:n.p.y},biotype:n.biotype,symbol:n.symbol,monomer:n.monomer,bio:{...n.bio},hidden:n.hidden,selected:n.selected,highlighted:n.highlighted,tag:n.tag,branchAtomId:n.branchAtom?.id,inlineSource:n.inlineSource}),this._atomOrder.push(n.id);for(let n of e.bonds)this._bonds.set(n.id,{id:n.id,a1Id:n.a1.id,a2Id:n.a2.id,kind:n.kind,r1:n.r1,r2:n.r2,ratio:n.ratio,tag:n.tag}),this._bondOrder.push(n.id);this._groups=[...e.groups],this._annotations=e.annotations;}addAtom(e){let t=this._idgen.next(),n=qs(e.biotype),o=e.chainId??this._pickChainId(n),r=this._chains.get(o);r===void 0&&(r={id:o,polymerType:n,backboneAtomIds:[],bondIds:[],annotation:void 0},this._chains.set(o,r),this._chainOrder.push(o));let s=e.positionInChain??r.backboneAtomIds.length+1,a={id:t,p:{x:e.p.x,y:e.p.y},biotype:e.biotype,symbol:e.symbol,monomer:null,bio:{chainId:o,positionInChain:s,continuousId:0},hidden:false,selected:false,highlighted:false,tag:void 0,branchAtomId:void 0,inlineSource:void 0};this._atoms.set(t,a),this._atomOrder.push(t);let l=Math.max(0,Math.min(s-1,r.backboneAtomIds.length));return r.backboneAtomIds.splice(l,0,t),this._addedAtoms.add(t),this._topologyDirty=true,t}removeAtom(e){let t=this._atoms.get(e);if(t===void 0)return;let n=[];for(let s of this._bonds.values())(s.a1Id===e||s.a2Id===e)&&n.push(s.id);for(let s of n)this._removeBondInternal(s);for(let s of this._atoms.values())s.branchAtomId===e&&(s.branchAtomId=void 0);let o=this._chains.get(t.bio.chainId);if(o!==void 0){let s=o.backboneAtomIds.indexOf(e);s>=0&&o.backboneAtomIds.splice(s,1);}this._atoms.delete(e);let r=this._atomOrder.indexOf(e);r>=0&&this._atomOrder.splice(r,1),this._addedAtoms.has(e)?this._addedAtoms.delete(e):this._removedAtoms.add(e),this._modifiedAtoms.delete(e),this._topologyDirty=true;}updateAtom(e,t){let n=this._atoms.get(e);n!==void 0&&(t.p!==void 0&&(n.p={x:t.p.x,y:t.p.y}),t.symbol!==void 0&&(n.symbol=t.symbol),t.selected!==void 0&&(n.selected=t.selected),t.highlighted!==void 0&&(n.highlighted=t.highlighted),\"tag\"in t&&(n.tag=t.tag),t.hidden!==void 0&&(n.hidden=t.hidden),this._addedAtoms.has(e)||this._modifiedAtoms.add(e));}addBond(e){if(!this._atoms.has(e.a1))throw new Error(`Transaction.addBond: atom ${e.a1} does not exist`);if(!this._atoms.has(e.a2))throw new Error(`Transaction.addBond: atom ${e.a2} does not exist`);for(let r of this._bonds.values()){let s=r.a1Id===e.a1&&r.a2Id===e.a2&&$t(r.r1,e.r1)&&$t(r.r2,e.r2),a=r.a1Id===e.a2&&r.a2Id===e.a1&&$t(r.r1,e.r2)&&$t(r.r2,e.r1);if(s||a)throw new Error(`Transaction.addBond: duplicate bond ${e.a1}:${li(e.r1)}-${e.a2}:${li(e.r2)}`)}let t=this._idgen.next();this._bonds.set(t,{id:t,a1Id:e.a1,a2Id:e.a2,kind:e.kind,r1:e.r1,r2:e.r2,ratio:void 0,tag:void 0}),this._bondOrder.push(t);let n=this._atoms.get(e.a1),o=this._atoms.get(e.a2);if(n!==void 0&&o!==void 0&&n.bio.chainId===o.bio.chainId){let r=this._chains.get(n.bio.chainId);r!==void 0&&r.bondIds.push(t);}return this._addedBonds.add(t),this._topologyDirty=true,t}removeBond(e){this._bonds.has(e)&&(this._removeBondInternal(e),this._topologyDirty=true);}updateBond(e,t){let n=this._bonds.get(e);n!==void 0&&(\"tag\"in t&&(n.tag=t.tag),\"ratio\"in t&&(n.ratio=t.ratio),this._addedBonds.has(e)||this._modifiedBonds.add(e));}commit(){let e=new Map;for(let l of this._atomOrder){let d=this._atoms.get(l);if(d===void 0)continue;let c={id:d.id,p:{x:d.p.x,y:d.p.y},biotype:d.biotype,symbol:d.symbol,monomer:d.monomer,bio:{...d.bio},hidden:d.hidden,selected:d.selected,highlighted:d.highlighted,...d.tag!==void 0?{tag:d.tag}:{},...d.inlineSource!==void 0?{inlineSource:d.inlineSource}:{}};e.set(l,c);}for(let l of this._atomOrder){let d=this._atoms.get(l);if(d===void 0||d.branchAtomId===void 0)continue;let c=e.get(l),u=e.get(d.branchAtomId);c===void 0||u===void 0||(c.branchAtom=u);}let t=new Map;for(let l of this._bondOrder){let d=this._bonds.get(l);if(d===void 0)continue;let c=e.get(d.a1Id),u=e.get(d.a2Id);if(c===void 0||u===void 0)continue;let m={id:d.id,a1:c,a2:u,kind:d.kind,r1:d.r1,r2:d.r2,...d.ratio!==void 0?{ratio:{...d.ratio}}:{},...d.tag!==void 0?{tag:d.tag}:{}};t.set(l,m);}let n=[];for(let l of this._chainOrder){let d=this._chains.get(l);if(d===void 0||d.backboneAtomIds.length===0&&d.bondIds.length===0)continue;let c=[];for(let m of d.backboneAtomIds){let p=e.get(m);p!==void 0&&c.push(p);}let u=[];for(let m of d.bondIds){let p=t.get(m);p!==void 0&&u.push(p);}n.push({id:d.id,polymerType:d.polymerType,backboneAtoms:c,bonds:u,...d.annotation!==void 0?{annotation:d.annotation}:{}});}let o=this._atomOrder.map(l=>e.get(l)).filter(l=>l!==void 0),r=this._bondOrder.map(l=>t.get(l)).filter(l=>l!==void 0),s={atoms:o,bonds:r,chains:n,groups:[...this._groups],annotations:this._annotations};this._topologyDirty&&(s=Js(s));let a=Object.freeze({addedAtomIds:new Set(this._addedAtoms),removedAtomIds:new Set(this._removedAtoms),addedBondIds:new Set(this._addedBonds),removedBondIds:new Set(this._removedBonds),modifiedAtomIds:new Set(this._modifiedAtoms),modifiedBondIds:new Set(this._modifiedBonds)});return this._addedAtoms.clear(),this._removedAtoms.clear(),this._modifiedAtoms.clear(),this._addedBonds.clear(),this._removedBonds.clear(),this._modifiedBonds.clear(),this._topologyDirty=false,{mol:s,changes:a}}_removeBondInternal(e){if(this._bonds.get(e)===void 0)return;this._bonds.delete(e);let n=this._bondOrder.indexOf(e);n>=0&&this._bondOrder.splice(n,1);for(let o of this._chains.values()){let r=o.bondIds.indexOf(e);r>=0&&o.bondIds.splice(r,1);}this._addedBonds.has(e)?this._addedBonds.delete(e):this._removedBonds.add(e),this._modifiedBonds.delete(e);}_pickChainId(e){let t=Ys(e),n=1;for(;this._chains.has(`${t}${n}`);)n+=1;return `${t}${n}`}};function li(i){switch(i.kind){case \"numeric\":return `R${i.r}`;case \"unspecified\":return \"?\";case \"wildcard\":return \"*\";case \"pair\":return \"pair\";case \"positional\":return `${i.position}pos:R${i.r}`}}function Js(i){let e=Ee(i),t=new Map;for(let a of i.atoms){let l=e.get(a.id);if(l===void 0||l===a.bio.continuousId){t.set(a.id,a);continue}t.set(a.id,{...a,bio:{...a.bio,continuousId:l}});}for(let a of i.atoms){if(a.branchAtom===void 0)continue;let l=t.get(a.id),d=t.get(a.branchAtom.id);l===void 0||d===void 0||(l.branchAtom=d);}let n=i.bonds.map(a=>{let l=t.get(a.a1.id),d=t.get(a.a2.id);return l===void 0||d===void 0||l===a.a1&&d===a.a2?a:{...a,a1:l,a2:d}}),o=new Map;for(let a of n)o.set(a.id,a);let r=i.chains.map(a=>{let l=[];for(let c of a.backboneAtoms)l.push(t.get(c.id)??c);let d=[];for(let c of a.bonds)d.push(o.get(c.id)??c);return {id:a.id,polymerType:a.polymerType,backboneAtoms:l,bonds:d,...a.annotation!==void 0?{annotation:a.annotation}:{}}});return {atoms:i.atoms.map(a=>t.get(a.id)??a),bonds:n,chains:r,groups:i.groups,annotations:i.annotations}}var q=class{constructor(e,t,n){this.atoms=[];this.bonds=[];this.bondHitWidth=n?.bondHitWidth??4,this.rebuild(e,t);}rebuild(e,t){let n=[];for(let r of e.atoms)r.hidden||n.push({atom:r,bbox:pe(r,t),hitRadius:qo(r,t)});let o=[];for(let r of e.bonds)o.push({bond:r,a:r.a1.p,b:r.a2.p});this.atoms=n,this.bonds=o;}test(e){let t=null,n=null;for(let r of this.atoms){if(!Dt(e,r.bbox))continue;let s=e.x-r.atom.p.x,a=e.y-r.atom.p.y,l=Math.sqrt(s*s+a*a);l>r.hitRadius||(t===null||l<t.d?(n=t,t={entry:r,d:l}):(n===null||l<n.d)&&(n={entry:r,d:l}));}if(t!==null)return {atom:t.entry.atom};let o=null;for(let r of this.bonds){let s=Zs(e,r.a,r.b);s>this.bondHitWidth||(o===null||s<o.d)&&(o={entry:r,d:s});}return o!==null?{bond:o.entry.bond}:null}testRect(e){let t=[];for(let o of this.atoms)Dt(o.atom.p,e)&&t.push(o.atom);let n=[];for(let o of this.bonds)Dt(o.a,e)&&Dt(o.b,e)&&n.push(o.bond);return {atoms:t,bonds:n}}atomCount(){return this.atoms.length}bondCount(){return this.bonds.length}};function Dt(i,e){return i.x>=e.x&&i.x<=e.x+e.width&&i.y>=e.y&&i.y<=e.y+e.height}function Zs(i,e,t){let n=t.x-e.x,o=t.y-e.y,r=n*n+o*o;if(r===0){let u=i.x-e.x,m=i.y-e.y;return Math.sqrt(u*u+m*m)}let s=((i.x-e.x)*n+(i.y-e.y)*o)/r;s<0?s=0:s>1&&(s=1);let a=e.x+s*n,l=e.y+s*o,d=i.x-a,c=i.y-l;return Math.sqrt(d*d+c*c)}var De=class{constructor(){this._handlers=new Map;}on(e,t){let n=this._handlers.get(e);n===void 0&&(n=new Set,this._handlers.set(e,n));let o=t;return n.add(o),()=>{let r=this._handlers.get(e);r!==void 0&&r.delete(o);}}off(e,t){let n=this._handlers.get(e);n!==void 0&&n.delete(t);}fire(e,t){let n=this._handlers.get(e);if(n===void 0||n.size===0)return;let o=[...n];for(let r of o)r(t);}clear(){this._handlers.clear();}observerCount(e){if(e===void 0){let t=0;for(let n of this._handlers.values())t+=n.size;return t}return this._handlers.get(e)?.size??0}};var Oe=class{constructor(e){this._entries=[];this._idx=-1;let t=e?.maxEntries??100;if(t<=0)throw new RangeError(\"HistoryStack: maxEntries must be > 0\");this._max=t;}push(e){for(this._idx<this._entries.length-1&&(this._entries=this._entries.slice(0,this._idx+1)),this._entries.push(e),this._idx=this._entries.length-1;this._entries.length>this._max;)this._entries.shift(),this._idx-=1;}canUndo(){return this._idx>0}canRedo(){return this._idx>=0&&this._idx<this._entries.length-1}undo(){return this.canUndo()?(this._idx-=1,this._entries[this._idx]??null):null}redo(){return this.canRedo()?(this._idx+=1,this._entries[this._idx]??null):null}clear(){this._entries=[],this._idx=-1;}get size(){return this._entries.length}current(){return this._idx<0?null:this._entries[this._idx]??null}};function di(i,e={}){let t=e.theme??H,n=e.selectedAtomIds??new Set,o=e.highlightedAtomIds??new Set;return {highlightLayer:In(i,t,o),selectionLayer:Pn(i,t,n)}}function S(i){let e=i.ownerDocument;if(e!=null)return e;let t=globalThis;if(t.document!==void 0)return t.document;throw new Error(\"EditorView: no Document available (host.ownerDocument is null).\")}function g(i,e,t,n){let o=i.createElement(e);if(t!==void 0)for(let r of Object.keys(t)){let s=t[r];s===false||s===void 0||o.setAttribute(r,s===true?\"\":String(s));}if(n!==void 0)for(let r of n)typeof r==\"string\"?o.appendChild(i.createTextNode(r)):o.appendChild(r);return o}function ci(i){let e=S(i);if(e.querySelector(\"style[data-hw-editor-view-styles]\")!==null)return;let n=e.createElement(\"style\");n.setAttribute(\"data-hw-editor-view-styles\",\"\"),n.textContent=\".hw-editor-view{position:relative;display:block;overflow:hidden;outline:none;}.hw-editor-view svg{display:block;user-select:none;}.hw-editor-view.hw-view-only{cursor:default;}\";let o=e.head??e.documentElement;o!==null&&o.appendChild(n);}function ui(i,e){let t=S(i),n=i.querySelector(\".hw-editor-view\");if(n===null)throw new Error(\"EditorView.replaceSvg: missing .hw-editor-view wrapper.\");let o=t.createElement(\"div\");o.innerHTML=e;let r=o.querySelector(\"svg\");if(r===null)throw new Error(\"EditorView.replaceSvg: rendered output contained no <svg>.\");for(;n.firstChild!==null;)n.removeChild(n.firstChild);return n.appendChild(r),r}function ye(i,e,t=220,n=140){if(i==null||e===\"\")return null;try{let o=i.get_mol(e);if(o===null)return null;let r=o.get_svg(t,n);return o.delete(),r}catch{return null}}function oe(i,e,t){let n=\"data-testid\";for(let r=0;r<i.body.children.length;r++){let s=i.body.children[r];if(s!==void 0&&s.getAttribute(n)===e)return s}let o=g(i,\"div\",{class:t,[n]:e});return o.style.display=\"none\",i.body.appendChild(o),o}function Me(i,e,t){for(;e.firstChild!==null;)e.removeChild(e.firstChild);if(e.appendChild(g(i,\"div\",{class:\"hw-tooltip__symbol\"},[t.symbol])),t.name!==void 0&&t.name!==\"\"&&t.name!==t.symbol&&e.appendChild(g(i,\"div\",{class:\"hw-tooltip__name\"},[t.name])),t.rdkitSvg!==void 0&&t.rdkitSvg!==null&&t.rdkitSvg!==\"\"){let n={class:\"hw-tooltip__rdkit\"};t.rdkitTestid!==void 0&&(n[\"data-testid\"]=t.rdkitTestid);let o=g(i,\"div\",n);o.innerHTML=t.rdkitSvg,e.appendChild(o);}t.hint!==void 0&&t.hint!==\"\"&&e.appendChild(g(i,\"div\",{class:\"hw-tooltip__hint\"},[t.hint]));}function mi(i,e,t){for(;e.firstChild!==null;)e.removeChild(e.firstChild);e.appendChild(g(i,\"div\",{class:\"hw-tooltip__symbol\"},[t.title]));let n=g(i,\"div\",{class:\"hw-tooltip__triplet\"});for(let o of t.parts){let r=g(i,\"div\",{class:\"hw-tooltip__triplet-part\"});if(r.appendChild(g(i,\"div\",{class:\"hw-tooltip__triplet-role\"},[`${o.role}: ${o.symbol}`])),o.name!==void 0&&o.name!==\"\"&&o.name!==o.symbol&&r.appendChild(g(i,\"div\",{class:\"hw-tooltip__name\"},[o.name])),o.rdkitSvg!==void 0&&o.rdkitSvg!==null&&o.rdkitSvg!==\"\"){let s={class:\"hw-tooltip__rdkit\"};t.rdkitTestid!==void 0&&(s[\"data-testid\"]=t.rdkitTestid);let a=g(i,\"div\",s);a.innerHTML=o.rdkitSvg,r.appendChild(a);}n.appendChild(r);}e.appendChild(n),t.hint!==void 0&&t.hint!==\"\"&&e.appendChild(g(i,\"div\",{class:\"hw-tooltip__hint\"},[t.hint]));}function Y(i,e,t){let n=i.style;n.display=\"block\",n.left=`${e+12}px`,n.top=`${t+12}px`;}function V(i){i!==null&&(i.style.display=\"none\");}function Ot(i){let e=i.body;if(e==null)return;let t=\"data-testid\";for(let n=0;n<e.children.length;n++){let o=e.children[n];if(o===void 0)continue;let r=o.getAttribute===void 0?null:o.getAttribute(t);r!=null&&r.endsWith(\"-tooltip\")&&V(o);}}var Ft=class Ft{constructor(e,t,n){this._baseTransform=\"\";this._viewport={scale:1,offset:{x:0,y:0}};this._pinnedBbox=null;this._tooltip=null;this._bondTooltip=null;this._rdkitSvgCache=new Map;this._unsubs=[];this._destroyed=false;this.host=e,this._editor=t,this._doc=n?.documentImpl??S(e),this._width=n?.width??400,this._height=n?.height??200,ci(e);let o=this._doc.createElement(\"div\");o.setAttribute(\"class\",\"hw-editor-view\"),e.appendChild(o),this._tooltip=oe(this._doc,\"atom-tooltip\",\"hw-atom-tooltip\"),this._bondTooltip=oe(this._doc,\"bond-tooltip\",\"hw-bond-tooltip\"),this._svgRoot=this._renderFresh(),this._unsubs.push(t.on(\"mol:changed\",r=>{this._hideTooltip(),this._hideBondTooltip(),(r.reason===\"setHelm\"||r.reason===\"cleanLayout\"||r.reason===\"initial\")&&(this._pinnedBbox=null),this._renderFresh();})),this._unsubs.push(t.on(\"selection:change\",r=>{this._refreshOverlays(r);})),this._unsubs.push(t.on(\"highlight:change\",r=>{this._refreshOverlays(r);})),this._unsubs.push(t.on(\"theme:change\",()=>{this._renderFresh();})),this._unsubs.push(t.on(\"view:resize\",r=>{this._applyResize(r.width,r.height);})),this._unsubs.push(t.on(\"view:viewport-change\",r=>{this._viewport=r.viewport,this._applyViewport(r.viewport);})),this._unsubs.push(t.on(\"view:fit-to-content\",()=>{this._pinnedBbox=null,this._renderFresh();})),this._unsubs.push(t.on(\"monomer:hover\",r=>{this._showTooltip(r.atom,r.clientX,r.clientY);})),this._unsubs.push(t.on(\"monomer:hover-end\",()=>{this._hideTooltip();})),this._unsubs.push(t.on(\"bond:hover\",r=>{this._showBondTooltip(r.bond,r.clientX,r.clientY);})),this._unsubs.push(t.on(\"bond:hover-end\",()=>{this._hideBondTooltip();})),this._unsubs.push(t.on(\"bond:preview\",r=>{this._paintBondPreview(r.start.p,r.cursor,r.candidate!==null);})),this._unsubs.push(t.on(\"bond:preview-end\",()=>{this._clearBondPreview();})),this._unsubs.push(t.on(\"bond:cancel\",()=>{this._clearBondPreview();})),this._unsubs.push(t.on(\"selection:rectangle-start\",r=>{this._paintSelectionRect(r.origin,r.origin);})),this._unsubs.push(t.on(\"selection:rectangle-update\",r=>{this._paintSelectionRectFromRect(r.rect);})),this._unsubs.push(t.on(\"selection:rectangle-end\",()=>{this._clearSelectionRect();}));}get svgRoot(){return this._svgRoot}get width(){return this._width}get height(){return this._height}resize(e,t){this._destroyed||(this._width=e,this._height=t,this._renderFresh());}redraw(){this._destroyed||this._renderFresh();}destroy(){if(this._destroyed)return;this._destroyed=true;for(let t of this._unsubs)t();this._unsubs.length=0;let e=this.host.querySelector(\".hw-editor-view\");e!==null&&e.parentNode!==null&&e.parentNode.removeChild(e),V(this._tooltip),V(this._bondTooltip),this._tooltip=null,this._bondTooltip=null;}_renderFresh(){let e=this._editor.getService(),t=this._currentTheme(),n=this._editor.getMol();this._pinnedBbox===null&&(this._pinnedBbox=Rn(n,t));let o=e.renderMol(n,{width:this._width,height:this._height,theme:t,fixedModelBbox:this._pinnedBbox});this._svgRoot=ui(this.host,o);let r=this._svgRoot.querySelector(\".hw-content\");return this._baseTransform=r!==null?r.getAttribute(\"transform\")??\"\":\"\",this._svgRoot.setAttribute(\"data-testid\",\"editor-svg\"),this._applyOverlaysToCurrent(),(this._viewport.scale!==1||this._viewport.offset.x!==0||this._viewport.offset.y!==0)&&this._applyViewport(this._viewport),this._svgRoot}_refreshOverlays(e){this._applyOverlaysToCurrent();}_applyOverlaysToCurrent(){let e=this._editor.getMol(),t=this._editor.getSelection(),n=di(e,{theme:this._currentTheme(),selectedAtomIds:t.atoms,highlightedAtomIds:this._editorHighlights()});this._spliceLayer(\"hw-highlights\",n.highlightLayer),this._spliceLayer(\"hw-selections\",n.selectionLayer);}_spliceLayer(e,t){let n=this._svgRoot.querySelector(`.${e}`);if(n===null||n.parentNode===null)return;let o=this._doc.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");o.innerHTML=t;let r=o.querySelector(`.${e}`);r!==null&&n.parentNode.replaceChild(r,n);}_editorHighlights(){let e=this._editor;return typeof e._currentHighlights==\"function\"?e._currentHighlights():new Set}_currentTheme(){let e=this._editor;return typeof e._currentTheme==\"function\"?e._currentTheme():this._editor.getService().theme}_applyResize(e,t){this._width=e,this._height=t,this._pinnedBbox=null,this._renderFresh();}_applyViewport(e){let n=this._svgRoot.querySelector(\".hw-content\");if(n===null)return;let o=`translate(${e.offset.x} ${e.offset.y}) scale(${e.scale})`,r=this._baseTransform===\"\"?o:`${o} ${this._baseTransform}`;n.setAttribute(\"transform\",r);}_showTooltip(e,t,n){let o=this._tooltip;if(o===null)return;let r=e.symbol===\"\"?\"?\":e.symbol,s=e.monomer?.name??\"\",a=e.bio.positionInChain,l=e.bio.chainId===\"\"?\"?\":e.bio.chainId,d=s!==\"\"&&s!==r?`${s} @ ${l}:${a}`:`${r} @ ${l}:${a}`,c=this._renderRdkitTooltipSvg(e);Me(this._doc,o,{symbol:r,name:d,rdkitSvg:c,rdkitTestid:\"atom-tooltip-rdkit-svg\"});let u=s!==\"\"&&s!==r?`${r} \\u2014 ${s} @ ${l}:${a}`:`${r} @ ${l}:${a}`,m=this._doc.createElement(\"div\");m.setAttribute(\"class\",\"hw-atom-tooltip__text\"),m.style.display=\"none\",m.appendChild(this._doc.createTextNode(u)),o.appendChild(m),Y(o,t,n);}_renderRdkitTooltipSvg(e){let n=this._editor.getService().options.rdkitModule;if(n==null)return null;let o=e.monomer;if(o===null)return null;let r=o.smiles;if(r===void 0||r===\"\")return null;let s=`${o.polymerType}:${o.symbol}`;if(this._rdkitSvgCache.has(s))return this._rdkitSvgCache.get(s)??null;let a=ye(n,r,220,140);if(this._rdkitSvgCache.size>=Ft._RDKIT_CACHE_LIMIT){let l=this._rdkitSvgCache.keys().next().value;l!==void 0&&this._rdkitSvgCache.delete(l);}return this._rdkitSvgCache.set(s,a),a}_hideTooltip(){V(this._tooltip);}_showBondTooltip(e,t,n){let o=this._bondTooltip;if(o===null)return;let r=pi(e.r1),s=pi(e.r2),a=`${e.a1.symbol}@${e.a1.bio.chainId}:${e.a1.bio.positionInChain}`,l=`${e.a2.symbol}@${e.a2.bio.chainId}:${e.a2.bio.positionInChain}`;Me(this._doc,o,{symbol:`${r}-${s} (${e.kind})`,name:`${a} \\u2194 ${l}`}),Y(o,t,n);}_hideBondTooltip(){V(this._bondTooltip);}_paintBondPreview(e,t,n){let o=\"http://www.w3.org/2000/svg\",r=this._svgRoot.querySelector(\".hw-content\");if(r===null)return;let s=r.querySelector(\".hw-bond-preview\");s===null&&(s=this._doc.createElementNS(o,\"line\"),s.setAttribute(\"class\",\"hw-bond-preview\"),s.setAttribute(\"data-testid\",\"bond-preview\"),s.setAttribute(\"stroke-dasharray\",\"6 4\"),s.setAttribute(\"stroke-width\",\"2\"),s.setAttribute(\"fill\",\"none\"),s.setAttribute(\"pointer-events\",\"none\"),r.appendChild(s)),s.setAttribute(\"x1\",String(e.x)),s.setAttribute(\"y1\",String(e.y)),s.setAttribute(\"x2\",String(t.x)),s.setAttribute(\"y2\",String(t.y)),s.setAttribute(\"stroke\",n?\"#1f5fcd\":\"#999999\");}_clearBondPreview(){let e=this._svgRoot.querySelector(\".hw-bond-preview\");e!==null&&e.parentNode!==null&&e.parentNode.removeChild(e);}_paintSelectionRect(e,t){let n=Math.min(e.x,t.x),o=Math.min(e.y,t.y),r=Math.abs(e.x-t.x),s=Math.abs(e.y-t.y);this._paintSelectionRectAt(n,o,r,s);}_paintSelectionRectFromRect(e){this._paintSelectionRectAt(e.x,e.y,e.width,e.height);}_paintSelectionRectAt(e,t,n,o){let r=\"http://www.w3.org/2000/svg\",s=this._svgRoot.querySelector(\".hw-content\");if(s===null)return;let a=s.querySelector(\".hw-selection-rect\");a===null&&(a=this._doc.createElementNS(r,\"rect\"),a.setAttribute(\"class\",\"hw-selection-rect\"),a.setAttribute(\"data-testid\",\"selection-rect\"),a.setAttribute(\"fill\",\"rgba(31, 95, 205, 0.08)\"),a.setAttribute(\"stroke\",\"#1f5fcd\"),a.setAttribute(\"stroke-width\",\"1\"),a.setAttribute(\"stroke-dasharray\",\"4 3\"),a.setAttribute(\"pointer-events\",\"none\"),s.appendChild(a)),a.setAttribute(\"x\",String(e)),a.setAttribute(\"y\",String(t)),a.setAttribute(\"width\",String(n)),a.setAttribute(\"height\",String(o));}_clearSelectionRect(){let e=this._svgRoot.querySelector(\".hw-selection-rect\");e!==null&&e.parentNode!==null&&e.parentNode.removeChild(e);}};Ft._RDKIT_CACHE_LIMIT=256;var Nt=Ft;function pi(i){switch(i.kind){case \"numeric\":return `R${i.r}`;case \"unspecified\":return \"?\";case \"wildcard\":return \"*\";case \"pair\":return \"pair\";case \"positional\":return `${i.position}pos:R${i.r}`}}var ie=class ie{constructor(e,t){this._onClose=null;this._primaryAction=null;this._host=e,this._doc=t.documentImpl??S(e);let n=this._doc,o={class:\"hw-modal-backdrop\",role:\"presentation\"};t.testId!==void 0&&(o[\"data-testid\"]=`dialog-${t.testId}`);let r=g(n,\"div\",o),s={class:\"hw-modal\",role:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":t.title};t.testId!==void 0&&(s[\"data-testid\"]=`dialog-${t.testId}-frame`);let a=g(n,\"div\",s),l=g(n,\"div\",{class:\"hw-modal__header\"},[t.title]),d=g(n,\"div\",{class:\"hw-modal__body\"});a.appendChild(l),a.appendChild(d),r.appendChild(a);let c=u=>{u.stopPropagation();};for(let u of [\"mousedown\",\"mousemove\",\"mouseup\",\"mouseover\",\"mouseenter\",\"mouseleave\",\"wheel\",\"contextmenu\",\"dblclick\",\"keydown\",\"keyup\",\"keypress\"])r.addEventListener(u,c);a.addEventListener(\"keydown\",u=>{let m=u;if(m.key!==\"Enter\"||m.target?.tagName===\"TEXTAREA\")return;let p=this._primaryAction;p!==null&&(m.preventDefault?.(),m.stopImmediatePropagation?.(),p());}),r.addEventListener(\"click\",u=>{if(u.target===r){this.close();return}u.stopPropagation();}),this.root=r,this.body=d;}static anyOpen(){return ie._openStack.length>0}static closeTopmost(){let e=ie._openStack[ie._openStack.length-1];return e===void 0?false:(e.close(),true)}open(e){this._onClose=e??null,this.root.parentNode===null&&this._host.appendChild(this.root),ie._openStack.includes(this)||ie._openStack.push(this),Ot(this._doc);}close(){let e=ie._openStack.indexOf(this);e>=0&&ie._openStack.splice(e,1),this.root.parentNode!==null&&this.root.parentNode.removeChild(this.root);let t=this._onClose;this._onClose=null,t!==null&&t();}setPrimaryAction(e){this._primaryAction=e;}get isOpen(){return this.root.parentNode!==null}};ie._openStack=[];var X=ie;function Ne(i,e,t,n){let o=`hw-input-${Math.random().toString(36).slice(2,9)}`,r=g(i,\"label\",{for:o,class:\"hw-modal__label\"},[e]),s=i.createElement(\"input\");return s.setAttribute(\"id\",o),s.setAttribute(\"type\",\"text\"),s.setAttribute(\"class\",\"hw-modal__input\"),n!==void 0&&s.setAttribute(\"data-testid\",n),s.value=t,{row:g(i,\"div\",{class:\"hw-modal__row\"},[r,s]),input:s}}function Fe(i,e,t,n,o){let r=`hw-sel-${Math.random().toString(36).slice(2,9)}`,s=g(i,\"label\",{for:r,class:\"hw-modal__label\"},[e]),a=i.createElement(\"select\");a.setAttribute(\"id\",r),a.setAttribute(\"class\",\"hw-modal__select\"),o!==void 0&&a.setAttribute(\"data-testid\",o);for(let d of t){let c=i.createElement(\"option\");c.setAttribute(\"value\",d.value),d.value===n&&c.setAttribute(\"selected\",\"\"),c.appendChild(i.createTextNode(d.label)),a.appendChild(c);}return {row:g(i,\"div\",{class:\"hw-modal__row\"},[s,a]),select:a}}function Ge(i,e){let t=i.createElement(\"button\");t.setAttribute(\"class\",\"hw-modal__ok\"),t.setAttribute(\"type\",\"button\"),e!==void 0&&t.setAttribute(\"data-testid\",`${e}-ok`),t.appendChild(i.createTextNode(\"OK\"));let n=i.createElement(\"button\");return n.setAttribute(\"class\",\"hw-modal__cancel\"),n.setAttribute(\"type\",\"button\"),e!==void 0&&n.setAttribute(\"data-testid\",`${e}-cancel`),n.appendChild(i.createTextNode(\"Cancel\")),{row:g(i,\"div\",{class:\"hw-modal__actions\"},[t,n]),ok:t,cancel:n}}var Ve=class{constructor(e,t){this._modal=null;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"ChooseRDialog: editor has no host element.\");this._doc=t?.documentImpl??S(n);}open(e,t,n){this.close();let o=this._editor._getHost();if(o===null)return Promise.resolve(null);let r=new X(o,{documentImpl:this._doc,title:\"Choose R-Groups\",testId:\"choose-r\"});this._modal=r;let s=fi(e,n?.freeR1,n?.currentR1,this._editor),a=fi(t,n?.freeR2,n?.currentR2,this._editor),l=g(this._doc,\"div\",{class:\"hw-modal__info\"},[`${e.symbol} (${e.bio.chainId})`]),d=n?.currentR1!==void 0?String(n.currentR1):s[0]?.value??\"1\",c=n?.currentR2!==void 0?String(n.currentR2):a[0]?.value??\"1\",u=Fe(this._doc,\"R-group on side A\",s,d,\"choose-r-r1\"),m=g(this._doc,\"div\",{class:\"hw-modal__info\"},[`${t.symbol} (${t.bio.chainId})`]),p=Fe(this._doc,\"R-group on side B\",a,c,\"choose-r-r2\"),h=Ge(this._doc,\"choose-r\"),f=[];return s.length===0&&f.push(g(this._doc,\"div\",{class:\"hw-modal__info hw-modal__note-fully-booked\"},[`All R-groups on ${e.symbol} are in use.`])),a.length===0&&f.push(g(this._doc,\"div\",{class:\"hw-modal__info hw-modal__note-fully-booked\"},[`All R-groups on ${t.symbol} are in use.`])),new Promise(y=>{let w=false,_=x=>{w||(w=true,y(x));},M=x=>{_(x),this.close();},k=()=>M({r1:hi(u.select),r2:hi(p.select)});h.ok.addEventListener(\"click\",k),h.cancel.addEventListener(\"click\",()=>M(null)),r.setPrimaryAction(k),r.body.appendChild(l),r.body.appendChild(u.row),r.body.appendChild(m),r.body.appendChild(p.row);for(let x of f)r.body.appendChild(x);r.body.appendChild(h.row),r.open(()=>_(null));})}get isOpen(){return this._modal!==null&&this._modal.isOpen}close(){this._modal!==null&&(this._modal.close(),this._modal=null);}};function hi(i){let e=i.value;if(typeof e==\"string\"&&e.length>0){let o=Number(e);if(Number.isFinite(o)&&o>=1)return o}let t=i.querySelectorAll(\"option\");for(let o of Array.from(t))if(o.getAttribute(\"selected\")!==null){let r=o.getAttribute(\"value\")??\"\",s=Number(r);if(Number.isFinite(s)&&s>=1)return s}let n=t[0];if(n!==void 0){let o=n.getAttribute(\"value\")??\"\",r=Number(o);if(Number.isFinite(r)&&r>=1)return r}return 1}function fi(i,e,t,n){let o=i.monomer?.rgroups;if(o===void 0||o.length===0)return [{value:\"1\",label:\"R1\"},{value:\"2\",label:\"R2\"},{value:\"3\",label:\"R3\"}];let r;if(e!==void 0)r=new Set(e);else if(r=new Set(W(i,n.getMol().bonds)),r.size===0)for(let l=1;l<=o.length;l++)r.add(l);t!==void 0&&t>=1&&t<=o.length&&r.add(t);let s=[],a=Array.from(r).sort((l,d)=>l-d);for(let l of a){let d=o[l-1];if(d===void 0)continue;let c=d.capGroupName!==void 0&&d.capGroupName!==\"\"?` (${d.capGroupName})`:\"\";s.push({value:String(l),label:`${d.label}${c}`});}return s}var bi=\"next-add-cursor\",ot=28,Gt=ot*2;function yi(i){let e=\"data-testid\";for(let n=0;n<i.body.children.length;n++){let o=i.body.children[n];if(o!==void 0&&o.getAttribute(e)===bi)return o}let t=i.createElement(\"div\");return t.className=\"hw-next-add-cursor\",t.setAttribute(e,bi),t.style.display=\"none\",i.body.appendChild(t),t}function gi(i,e,t,n,o,r,s){let l=Ie({p:{x:0,y:0},biotype:t,symbol:e},o),c=$(n,t,o.colorTheme).background,u=wt(c),m=e.length,p=m<=1?1:Math.min(1,2/m),h=o.fontSize*p,f=`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${-ot} ${-ot} ${Gt} ${Gt}\" width=\"${Gt}\" height=\"${Gt}\" class=\"hw-next-add-cursor__svg\" aria-hidden=\"true\"><path d=\"${l}\" fill=\"${c}\" stroke=\"${c}\" stroke-width=\"5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/><text x=\"0\" y=\"0\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"Helvetica Neue, Helvetica, Arial, sans-serif\" font-size=\"${h}\" fill=\"${u}\">${Qs(e)}</text></svg>`;i.innerHTML=f;let y=i.style;y.left=`${r-ot}px`,y.top=`${s-ot}px`,y.display=\"block\";}function it(i){i!==null&&(i.style.display=\"none\");}function Qs(i){let e=\"\";for(let t=0;t<i.length;t++){let n=i.charAt(t);n===\"<\"?e+=\"&lt;\":n===\">\"?e+=\"&gt;\":n===\"&\"?e+=\"&amp;\":e+=n;}return e}var Vt=class{constructor(e,t,n){this._hoverAtom=null;this._hoverBond=null;this._dragOrigin=null;this._bondStart=null;this._bondDragMoved=false;this._rectDragHappened=false;this._chooseRDialog=null;this._panStart=null;this._atomDragState=null;this._panMoved=false;this._atomDragMoved=false;this._nextAddCursorEl=null;this._destroyed=false;this._unsubs=[];this._host=e,this._editor=t,this._enableContextMenu=n?.enableContextMenu??true,this._tester=new q(t.getMol(),t._currentTheme()),this._unsubs.push(t.on(\"mol:changed\",()=>{this._tester=new q(this._editor.getMol(),this._editor._currentTheme()),this._hoverAtom=null,this._hoverBond=null;})),this._unsubs.push(t.on(\"option:change\",o=>{(o.key===\"mode\"||o.key===\"nextAdd\")&&it(this._nextAddCursorEl);})),this._onMove=o=>this._handleMove(o),this._onClick=o=>this._handleClick(o),this._onDblClick=o=>this._handleDblClick(o),this._onContextMenu=o=>this._handleContextMenu(o),this._onMouseDown=o=>this._handleMouseDown(o),this._onMouseUp=o=>this._handleMouseUp(o),this._onMouseLeave=o=>this._handleMouseLeave(o),this._onWheel=o=>this._handleWheel(o),e.addEventListener(\"mousemove\",this._onMove),e.addEventListener(\"click\",this._onClick),e.addEventListener(\"dblclick\",this._onDblClick),e.addEventListener(\"contextmenu\",this._onContextMenu),e.addEventListener(\"mousedown\",this._onMouseDown),e.addEventListener(\"mouseup\",this._onMouseUp),e.addEventListener(\"mouseleave\",this._onMouseLeave),e.addEventListener(\"wheel\",this._onWheel,{passive:false});}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this._host.removeEventListener(\"mousemove\",this._onMove),this._host.removeEventListener(\"click\",this._onClick),this._host.removeEventListener(\"dblclick\",this._onDblClick),this._host.removeEventListener(\"contextmenu\",this._onContextMenu),this._host.removeEventListener(\"mousedown\",this._onMouseDown),this._host.removeEventListener(\"mouseup\",this._onMouseUp),this._host.removeEventListener(\"mouseleave\",this._onMouseLeave),this._host.removeEventListener(\"wheel\",this._onWheel),this._chooseRDialog!==null&&(this._chooseRDialog.close(),this._chooseRDialog=null),it(this._nextAddCursorEl),this._nextAddCursorEl=null;}}_handleMove(e){if(this._panStart!==null){let s=this._toViewBox({clientX:e.clientX,clientY:e.clientY}),a=s.x-this._panStart.origin.x,l=s.y-this._panStart.origin.y;this._editor.panTo({x:this._panStart.initialOffset.x+a,y:this._panStart.initialOffset.y+l}),this._panMoved=true;return}if(this._atomDragState!==null){let s=this._toModel(e),a=s.x-this._atomDragState.pointerDownModel.x,l=s.y-this._atomDragState.pointerDownModel.y,d=[];for(let c of this._atomDragState.atomIds){let u=this._atomDragState.initialPositions.get(c);u!==void 0&&d.push({atomId:c,p:{x:u.x+a,y:u.y+l}});}this._editor.moveAtoms(d),this._atomDragMoved=true;return}let t=this._toModel(e),n=this._tester.test(t),o=n?.atom??null,r=n?.bond??null;if(this._bondStart!==null){this._bondDragMoved=true;let s=o!==null&&o.id!==this._bondStart.id?o:null;this._editor.fire(\"bond:preview\",{start:this._bondStart,cursor:t,candidate:s,kind:this._editor.getMode()===\"hbond\"?\"hbond\":\"backbone\"});}if(this._hoverAtom!==null&&(o===null||o.id!==this._hoverAtom.id)&&(this._editor.fire(\"monomer:hover-end\",{atom:this._hoverAtom}),this._hoverAtom=null),o!==null&&(this._hoverAtom===null||this._hoverAtom.id!==o.id)&&(this._hoverAtom=o,this._editor.fire(\"monomer:hover\",{atom:o,clientX:e.clientX,clientY:e.clientY,modelX:t.x,modelY:t.y})),this._hoverBond!==null&&(r===null||r.id!==this._hoverBond.id)&&(this._editor.fire(\"bond:hover-end\",{bond:this._hoverBond}),this._hoverBond=null),r!==null&&(this._hoverBond===null||this._hoverBond.id!==r.id)&&(this._hoverBond=r,this._editor.fire(\"bond:hover\",{bond:r,clientX:e.clientX,clientY:e.clientY})),this._dragOrigin!==null){let s=ki(this._dragOrigin,t);this._editor.fire(\"selection:rectangle-update\",{rect:s});}this._updateNextAddCursor(e);}_handleClick(e){if(this._bondDragMoved){this._bondDragMoved=false;return}if(this._rectDragHappened){this._rectDragHappened=false;return}if(this._panMoved){this._panMoved=false;return}if(this._atomDragMoved){this._atomDragMoved=false;return}let t=this._toModel(e),n=this._tester.test(t),o=xi(e),r=this._editor.getMode();if(r===\"eraser\"){if(n?.atom!==void 0){this._editor.removeAtom(n.atom);return}if(n?.bond!==void 0){this._editor.removeBond(n.bond);return}return}if(n?.atom!==void 0){if(r===\"select\"&&!o.ctrl&&!o.shift&&!o.meta){let s=this._editor.getNextAddSymbol();if(s!==null){if(n.atom.biotype===s.biotype){this._editor.replaceMonomer(n.atom,s.symbol);return}this._editor.fire(\"editor:status\",{message:`Cannot replace: ${n.atom.biotype} is incompatible with ${s.biotype}`,severity:\"warn\",durationMs:3e3});return}}this._editor.fire(\"monomer:click\",{atom:n.atom,modifiers:o,clientX:e.clientX,clientY:e.clientY});return}if(n?.bond!==void 0){this._editor.fire(\"bond:click\",{bond:n.bond,modifiers:o});return}if(this._addsEnabled()){let s=this._editor.getNextAddSymbol();if(s!==null){this._editor.addAtom(t,s.biotype,s.symbol);return}}!o.shift&&!o.ctrl&&!o.meta&&this._editor.clearSelection();}_handleDblClick(e){let t=this._toModel(e),n=this._tester.test(t),o=xi(e);if(n?.atom!==void 0){this._editor.fire(\"monomer:dblclick\",{atom:n.atom,modifiers:o});return}n===null&&this._editor.fitToContent();}_handleContextMenu(e){this._enableContextMenu||e.preventDefault();let t=this._toModel(e),n=this._tester.test(t),r=()=>{e.preventDefault();};n?.atom!==void 0?this._editor.fire(\"monomer:contextmenu\",{atom:n.atom,clientX:e.clientX,clientY:e.clientY,preventDefault:r}):n?.bond!==void 0&&this._editor.fire(\"bond:contextmenu\",{bond:n.bond,clientX:e.clientX,clientY:e.clientY,preventDefault:r});}_handleMouseDown(e){if(e.button!==0)return;let t=this._toModel(e),n=this._tester.test(t),o=this._editor.getMode(),r=e.ctrlKey===true||e.metaKey===true,s=e.shiftKey===true;if(n?.atom!==void 0){if(o===\"move\"||o===\"select\"&&r){let a=this._editor.getSelection(),d=a.atoms.has(n.atom.id)?Array.from(a.atoms):[n.atom.id],c=this._editor.getMol(),u=new Map;for(let m of d){let p=c.atoms.find(h=>h.id===m);p!==void 0&&u.set(m,{x:p.p.x,y:p.p.y});}this._atomDragState={atomIds:d,pointerDownModel:{x:t.x,y:t.y},initialPositions:u},this._atomDragMoved=false;return}this._bondStart=n.atom,this._bondDragMoved=false;return}if(n===null){if(o===\"move\"||o===\"select\"&&!s){let a=this._editor.getViewport();this._panStart={origin:this._toViewBox({clientX:e.clientX,clientY:e.clientY}),initialOffset:{x:a.offset.x,y:a.offset.y}},this._panMoved=false;return}o===\"select\"&&s&&(this._dragOrigin=t,this._editor.fire(\"selection:rectangle-start\",{origin:t}));}}_handleMouseUp(e){if(this._panStart!==null){this._panStart=null;return}if(this._atomDragState!==null){this._atomDragState=null;return}if(this._bondStart!==null){let a=this._bondStart,l=this._bondDragMoved;this._bondStart=null;let d=this._toModel(e),u=this._tester.test(d)?.atom;if(l&&u!==void 0&&u.id!==a.id){if(this._editor.fire(\"bond:preview-end\",{start:a}),this._editor.getMode()===\"hbond\"){try{this._editor.addHydrogenBond(a,u);}catch{this._editor.fire(\"bond:cancel\",{start:a});}return}let m=a.bio.chainId===u.bio.chainId&&wi(a,u,this._editor.getMol())?\"backbone\":\"cross-polymer\",p=_i(a,u,this._editor.getMol().bonds,m);if(p.mode===\"fail\"){this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"editor:status\",{message:p.reason,severity:\"error\",durationMs:3e3});return}if(p.mode===\"auto\"){try{this._editor.addBond(a,u,p.r1,p.r2,p.kind);}catch{this._editor.fire(\"bond:cancel\",{start:a});}return}this._openChooseR(a,u,m,p.freeR1,p.freeR2);return}if(l){let m=this._addsEnabled()?this._editor.getNextAddSymbol():null;if(m!==null){let p;try{p=this._editor.addAtom(d,m.biotype,m.symbol);}catch{this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"bond:preview-end\",{start:a});return}let h=this._editor.getMol().atoms.find(M=>M.id===a.id);if(h===void 0){this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"bond:preview-end\",{start:a});return}let f=h.bio.chainId===p.bio.chainId&&wi(h,p,this._editor.getMol())?\"backbone\":\"cross-polymer\",y=W(h,this._editor.getMol().bonds),w=W(p,this._editor.getMol().bonds);if(y.includes(2)&&w.includes(1)){try{this._editor.addBond(h,p,2,1,f);}catch{this._editor.fire(\"bond:cancel\",{start:a});}this._editor.fire(\"bond:preview-end\",{start:a});return}let _=_i(h,p,this._editor.getMol().bonds,f);if(_.mode===\"fail\"){this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"editor:status\",{message:_.reason,severity:\"error\",durationMs:3e3}),this._editor.fire(\"bond:preview-end\",{start:a});return}if(_.mode===\"auto\"){try{this._editor.addBond(h,p,_.r1,_.r2,_.kind);}catch{this._editor.fire(\"bond:cancel\",{start:a});}this._editor.fire(\"bond:preview-end\",{start:a});return}this._editor.fire(\"bond:preview-end\",{start:a}),this._openChooseR(h,p,f,_.freeR1,_.freeR2);return}this._editor.fire(\"bond:cancel\",{start:a}),this._editor.fire(\"bond:preview-end\",{start:a});return}return}if(this._dragOrigin===null)return;let t=this._toModel(e),n=ki(this._dragOrigin,t);this._dragOrigin=null;let o=this._tester.testRect(n),r=G.fromAtomsAndBonds(o.atoms.map(a=>a.id),o.bonds.map(a=>a.id)),s=G.union(this._editor.getSelection(),r);this._editor.setSelection(s),this._editor.fire(\"selection:rectangle-end\",{rect:n,selection:s}),this._rectDragHappened=true,s.atoms.size>0&&this._editor.getMode()===\"select\"&&this._editor.setMode(\"move\");}_handleMouseLeave(e){this._hoverAtom!==null&&(this._editor.fire(\"monomer:hover-end\",{atom:this._hoverAtom}),this._hoverAtom=null),this._hoverBond!==null&&(this._editor.fire(\"bond:hover-end\",{bond:this._hoverBond}),this._hoverBond=null),this._bondStart!==null&&(this._editor.fire(\"bond:cancel\",{start:this._bondStart}),this._editor.fire(\"bond:preview-end\",{start:this._bondStart}),this._bondStart=null,this._bondDragMoved=false),this._dragOrigin=null,this._panStart=null,this._atomDragState=null,this._panMoved=false,this._atomDragMoved=false,it(this._nextAddCursorEl);}_openChooseR(e,t,n,o,r){this._chooseRDialog===null&&(this._chooseRDialog=new Ve(this._editor)),this._chooseRDialog.open(e,t,{freeR1:o,freeR2:r}).then(a=>{if(!this._destroyed){if(a===null){this._editor.fire(\"bond:cancel\",{start:e});return}try{this._editor.addBond(e,t,a.r1,a.r2,n);}catch{this._editor.fire(\"bond:cancel\",{start:e});}}});}_updateNextAddCursor(e){let t=this._editor.getNextAddSymbol(),n=this._editor.getMode(),o=this._hoverAtom!==null,r=this._bondStart!==null||this._dragOrigin!==null||this._panStart!==null||this._atomDragState!==null;if(!(n===\"select\"&&t!==null&&!o&&!r)){this._nextAddCursorEl!==null&&it(this._nextAddCursorEl);return}let a=this._host.ownerDocument;if(a===null)return;this._nextAddCursorEl===null&&(this._nextAddCursorEl=yi(a));let l=this._editor.getService().monomerLib,d=null;for(let c of l.getPolymerTypes()){let u=l.getMonomer(c,t.symbol);if(u!==null){d=u;break}}gi(this._nextAddCursorEl,t.symbol,t.biotype,d,this._editor._currentTheme(),e.clientX,e.clientY);}_addsEnabled(){return this._editor.getMode()===\"select\"}_handleWheel(e){let t=e.ctrlKey===true||e.metaKey===true;if(e.preventDefault(),t){this._wheelPan(e);return}let n=e.deltaY<0?1.1:1/1.1,o=this._toViewBox({clientX:e.clientX,clientY:e.clientY}),r=this._editor.getViewport(),s=r.scale===0?o:{x:(o.x-r.offset.x)/r.scale,y:(o.y-r.offset.y)/r.scale};this._editor.zoom(n,s);}_wheelPan(e){let t=e.deltaX??0,n=e.deltaY??0;if(t===0&&n===0)return;let o=this._toViewBox({clientX:e.clientX,clientY:e.clientY}),r=this._toViewBox({clientX:e.clientX+t,clientY:e.clientY+n}),s=r.x-o.x,a=r.y-o.y,l=this._editor.getViewport();this._editor.panTo({x:l.offset.x-s,y:l.offset.y-a});}_toModel(e){let t=this._host.querySelector(\"svg\"),n=t!==null?t.querySelector(\".hw-content\"):null;if(t!==null&&n!==null){let r=vi(n,e.clientX,e.clientY);if(r!==null)return r;let s=this._host.getBoundingClientRect(),a=e.clientX-s.left,l=e.clientY-s.top,d=ta(n.getAttribute(\"transform\")??\"\");return d!==null?{x:(a-d.tx)/(d.scale===0?1:d.scale),y:(l-d.ty)/(d.scale===0?1:d.scale)}:{x:a,y:l}}let o=this._host.getBoundingClientRect();return {x:e.clientX-o.left,y:e.clientY-o.top}}_toViewBox(e){let t=this._host.querySelector(\"svg\");if(t!==null){let o=vi(t,e.clientX,e.clientY);if(o!==null)return o;let r=this._host.getBoundingClientRect(),s=e.clientX-r.left,a=e.clientY-r.top,l=ea(t.getAttribute(\"viewBox\"));return l!==null&&r.width>0&&r.height>0?{x:s*(l.w/r.width),y:a*(l.h/r.height)}:{x:s,y:a}}let n=this._host.getBoundingClientRect();return {x:e.clientX-n.left,y:e.clientY-n.top}}};function _i(i,e,t,n){let o=be(i),r=be(e);if(o===0||r===0)return {mode:\"auto\",r1:2,r2:1,kind:n};let s=W(i,t),a=W(e,t);if(s.length===0)return {mode:\"fail\",reason:`${i.symbol} has no free R-groups (max ${o}).`};if(a.length===0)return {mode:\"fail\",reason:`${e.symbol} has no free R-groups (max ${r}).`};if(s.includes(2)&&a.includes(1)&&(s.length===1||a.length===1))return {mode:\"auto\",r1:2,r2:1,kind:n};if(s.length===1&&a.length===1){let l=s[0],d=a[0];return {mode:\"auto\",r1:l,r2:d,kind:n}}return {mode:\"choose\",freeR1:s,freeR2:a}}function vi(i,e,t){let n=i;if(typeof n.getScreenCTM!=\"function\")return null;let o=n.getScreenCTM();if(o===null)return null;let r=null;try{let l=o;typeof l.inverse==\"function\"&&(r=l.inverse());}catch{return null}if(r===null)return null;let s=n.ownerSVGElement;if(s!=null&&typeof s.createSVGPoint==\"function\"){let l=s.createSVGPoint();l.x=e,l.y=t;let d=l.matrixTransform(r);return {x:d.x,y:d.y}}let a=r;return {x:a.a*e+a.c*t+a.e,y:a.b*e+a.d*t+a.f}}function ea(i){if(i===null||i===\"\")return null;let e=i.split(/[,\\s]+/).map(o=>Number(o)).filter(o=>Number.isFinite(o));if(e.length<4)return null;let t=e[2],n=e[3];return t<=0||n<=0?null:{w:t,h:n}}function ta(i){if(i===\"\")return null;let e=0,t=0,n=1,o=/(translate|scale)\\(([^)]+)\\)/g,r,s=false;for(;(r=o.exec(i))!==null;){s=true;let a=r[1],l=(r[2]??\"\").split(/[,\\s]+/).map(d=>Number(d)).filter(d=>Number.isFinite(d));if(a===\"translate\"){let d=l[0]??0,c=l[1]??0;e=e+n*d,t=t+n*c;}else if(a===\"scale\"){let d=l[0]??1;n=n*d;}}return s?{tx:e,ty:t,scale:n}:null}function wi(i,e,t){if(i.bio.chainId!==e.bio.chainId)return false;let n=t.chains.find(s=>s.id===i.bio.chainId);if(n===void 0)return false;let o=-1,r=-1;for(let s=0;s<n.backboneAtoms.length;s++){let a=n.backboneAtoms[s];a.id===i.id&&(o=s),a.id===e.id&&(r=s);}return o<0||r<0?false:Math.abs(o-r)===1}function xi(i){return {shift:i.shiftKey===true,alt:i.altKey===true,ctrl:i.ctrlKey===true,meta:i.metaKey===true}}function ki(i,e){let t=Math.min(i.x,e.x),n=Math.min(i.y,e.y);return {x:t,y:n,width:Math.abs(i.x-e.x),height:Math.abs(i.y-e.y)}}var Ut=class{constructor(e,t,n){this._destroyed=false;this._host=e,this._editor=t,this._enabled=n?.enableKeyboard!==false,this._enabled&&e.getAttribute(\"tabindex\")===null&&e.setAttribute(\"tabindex\",\"0\"),this._onKey=o=>this._handleKey(o),e.addEventListener(\"keydown\",this._onKey);}destroy(){this._destroyed||(this._destroyed=true,this._host.removeEventListener(\"keydown\",this._onKey));}_handleKey(e){if(!this._enabled)return;let t=this._classify(e),n=na(e);if(t===null){this._editor.fire(\"key:unhandled\",{key:e.key,modifiers:n,preventDefault:()=>e.preventDefault()});return}let o=false,r=()=>{o=true,e.preventDefault();};this._editor.fire(\"key:command\",{command:t,preventDefault:r}),!o&&(e.preventDefault(),t!==\"clearSelection\"&&(e.stopPropagation(),e.stopImmediatePropagation?.()),this._execute(t));}_classify(e){let t=e.key,n=e.ctrlKey||e.metaKey;return t===\"Delete\"||t===\"Backspace\"?\"delete\":n&&(t===\"z\"||t===\"Z\")&&!e.shiftKey?\"undo\":n&&((t===\"z\"||t===\"Z\")&&e.shiftKey||t===\"y\"||t===\"Y\")?\"redo\":n&&(t===\"a\"||t===\"A\")?\"selectAll\":n&&(t===\"c\"||t===\"C\")?\"copy\":n&&(t===\"v\"||t===\"V\")?\"paste\":n&&(t===\"x\"||t===\"X\")?\"cut\":t===\"Escape\"?\"clearSelection\":t===\"+\"||t===\"=\"?\"zoomIn\":t===\"-\"||t===\"_\"?\"zoomOut\":t===\"0\"?\"fitToContent\":t===\"ArrowUp\"?\"nudgeUp\":t===\"ArrowDown\"?\"nudgeDown\":t===\"ArrowLeft\"?\"nudgeLeft\":t===\"ArrowRight\"?\"nudgeRight\":null}_execute(e){switch(e){case \"delete\":this._editor.deleteSelection();return;case \"undo\":this._editor.undo();return;case \"redo\":this._editor.redo();return;case \"selectAll\":this._editor.selectAll();return;case \"clearSelection\":this._editor.clearSelection();return;case \"zoomIn\":this._editor.zoom(1.1);return;case \"zoomOut\":this._editor.zoom(1/1.1);return;case \"fitToContent\":this._editor.fitToContent();return;case \"nudgeUp\":this._editor.nudgeSelection(0,-5);return;case \"nudgeDown\":this._editor.nudgeSelection(0,5);return;case \"nudgeLeft\":this._editor.nudgeSelection(-5,0);return;case \"nudgeRight\":this._editor.nudgeSelection(5,0);return;case \"copy\":{let t=this._editor.getHelm();this._editor.fire(\"clipboard:copy\",{format:\"helm\",payload:t});return}case \"cut\":{let t=this._editor.getHelm();this._editor.fire(\"clipboard:copy\",{format:\"helm\",payload:t}),this._editor.deleteSelection();return}case \"paste\":this._editor.fire(\"clipboard:paste\",{format:\"helm\"});return;default:return}}};function na(i){return {shift:i.shiftKey===true,alt:i.altKey===true,ctrl:i.ctrlKey===true,meta:i.metaKey===true}}var oa=\"application/x-hwe-monomer\",zt=class{constructor(e,t){this._currentPaletteSymbol=null;this._currentPaletteBiotype=null;this._destroyed=false;this._unsubs=[];this._host=e,this._editor=t,this._tester=new q(t.getMol(),t._currentTheme()),this._unsubs.push(t.on(\"mol:changed\",()=>{this._tester=new q(this._editor.getMol(),this._editor._currentTheme());})),this._onDragOver=n=>this._handleDragOver(n),this._onDrop=n=>this._handleDrop(n),this._onDragStart=n=>this._handleDragStart(n),this._onDragEnd=n=>this._handleDragEnd(n),this._onDragEnter=n=>this._handleDragEnter(n),this._onDragLeave=n=>this._handleDragLeave(n),e.addEventListener(\"dragover\",this._onDragOver),e.addEventListener(\"drop\",this._onDrop),e.addEventListener(\"dragstart\",this._onDragStart),e.addEventListener(\"dragend\",this._onDragEnd),e.addEventListener(\"dragenter\",this._onDragEnter),e.addEventListener(\"dragleave\",this._onDragLeave);}startPaletteDrag(e,t){this._currentPaletteSymbol=e,this._currentPaletteBiotype=t,this._editor.fire(\"dnd:start\",{source:\"palette\",symbol:e});}cancelPaletteDrag(){this._currentPaletteSymbol!==null&&(this._currentPaletteSymbol=null,this._currentPaletteBiotype=null,this._editor.fire(\"dnd:cancel\",{source:\"palette\"}));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this._host.removeEventListener(\"dragover\",this._onDragOver),this._host.removeEventListener(\"drop\",this._onDrop),this._host.removeEventListener(\"dragstart\",this._onDragStart),this._host.removeEventListener(\"dragend\",this._onDragEnd),this._host.removeEventListener(\"dragenter\",this._onDragEnter),this._host.removeEventListener(\"dragleave\",this._onDragLeave);}}_activePaletteSymbol(e){if(this._currentPaletteSymbol!==null&&this._currentPaletteBiotype!==null)return {symbol:this._currentPaletteSymbol,biotype:this._currentPaletteBiotype};let t=e.dataTransfer;if(t==null)return null;try{let n=typeof t.getData==\"function\"?t.getData(oa):\"\";if(n===\"\")return null;let o=JSON.parse(n);return typeof o.symbol!=\"string\"||typeof o.biotype!=\"string\"?null:{symbol:o.symbol,biotype:o.biotype}}catch{return null}}_handleDragEnter(e){if(this._activePaletteSymbol(e)!==null&&(e.preventDefault(),e.dataTransfer!==null&&e.dataTransfer!==void 0))try{e.dataTransfer.dropEffect=\"copy\";}catch{}}_handleDragLeave(e){}_handleDragOver(e){if(this._activePaletteSymbol(e)===null)return;if(e.preventDefault(),e.dataTransfer!==null&&e.dataTransfer!==void 0)try{e.dataTransfer.dropEffect=\"copy\";}catch{}let n=this._toModel(e),o=this._tester.test(n),r=o?.atom!==void 0?o.atom:o?.bond!==void 0?o.bond:void 0,s={clientX:e.clientX,clientY:e.clientY};r!==void 0&&(s.target=r),this._editor.fire(\"dnd:over\",s);}_handleDrop(e){let t=this._activePaletteSymbol(e);if(t===null)return;e.preventDefault();let{symbol:n,biotype:o}=t,r=this._toModel(e),s=this._tester.test(r),a=s?.atom!==void 0?s.atom:s?.bond!==void 0?s.bond:void 0,l={symbol:n,biotype:o,clientX:e.clientX,clientY:e.clientY};a!==void 0&&(l.target=a),this._editor.fire(\"dnd:drop\",l),s?.atom!==void 0?this._editor.replaceMonomer(s.atom,n):this._editor.addAtom(r,o,n),this._currentPaletteSymbol=null,this._currentPaletteBiotype=null;}_handleDragStart(e){this._editor.fire(\"dnd:start\",{source:\"canvas\"});}_handleDragEnd(e){this._currentPaletteSymbol!==null&&(this._currentPaletteSymbol=null,this._currentPaletteBiotype=null,this._editor.fire(\"dnd:cancel\",{source:\"palette\"}));}_toModel(e){let t=this._host.querySelector(\"svg\"),n=t!==null?t.querySelector(\".hw-content\"):null;if(t!==null&&n!==null){let r=ia(n,e.clientX,e.clientY);if(r!==null)return r;let s=this._host.getBoundingClientRect(),a=e.clientX-s.left,l=e.clientY-s.top,d=ra(n.getAttribute(\"transform\")??\"\");return d!==null?{x:(a-d.tx)/(d.scale===0?1:d.scale),y:(l-d.ty)/(d.scale===0?1:d.scale)}:{x:a,y:l}}let o=this._host.getBoundingClientRect();return {x:e.clientX-o.left,y:e.clientY-o.top}}};function ia(i,e,t){let n=i;if(typeof n.getScreenCTM!=\"function\")return null;let o=n.getScreenCTM();if(o===null)return null;let r=null;try{let l=o;typeof l.inverse==\"function\"&&(r=l.inverse());}catch{return null}if(r===null)return null;let s=n.ownerSVGElement;if(s!=null&&typeof s.createSVGPoint==\"function\"){let l=s.createSVGPoint();l.x=e,l.y=t;let d=l.matrixTransform(r);return {x:d.x,y:d.y}}let a=r;return {x:a.a*e+a.c*t+a.e,y:a.b*e+a.d*t+a.f}}function ra(i){if(i===\"\")return null;let e=0,t=0,n=1,o=/(translate|scale)\\(([^)]+)\\)/g,r,s=false;for(;(r=o.exec(i))!==null;){s=true;let a=r[1],l=(r[2]??\"\").split(/[,\\s]+/).map(d=>Number(d)).filter(d=>Number.isFinite(d));if(a===\"translate\"){let d=l[0]??0,c=l[1]??0;e=e+n*d,t=t+n*c;}else if(a===\"scale\"){let d=l[0]??1;n=n*d;}}return s?{tx:e,ty:t,scale:n}:null}var Ue=class{constructor(e,t){this._modal=null;this._atom=null;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"AtomPropsDialog: editor has no host element.\");this._doc=t?.documentImpl??S(n);}get isOpen(){return this._modal!==null&&this._modal.isOpen}open(e){this.close(),this._atom=e;let t=this._editor._getHost();if(t===null)return;let n=new X(t,{documentImpl:this._doc,title:\"Monomer Properties\",testId:\"atom-props\"});this._modal=n;let o=g(this._doc,\"div\",{class:\"hw-modal__info\"},[`Position ${e.bio.continuousId} in ${e.bio.chainId}`]),r=Ne(this._doc,\"Symbol\",e.symbol,\"atom-props-symbol\"),s=Ne(this._doc,\"Annotation\",e.bio.annotation??\"\",\"atom-props-annotation\"),a=Ge(this._doc,\"atom-props\"),l=()=>this._commit(r.input.value,s.input.value);a.ok.addEventListener(\"click\",l),a.cancel.addEventListener(\"click\",()=>this.close()),n.setPrimaryAction(l),n.body.appendChild(o),n.body.appendChild(r.row),n.body.appendChild(s.row),n.body.appendChild(a.row),n.open();}close(){this._modal!==null&&(this._modal.close(),this._modal=null),this._atom=null;}_commit(e,t){let n=this._atom;if(n===null){this.close();return}let o=e.trim(),r=(n.bio.annotation??\"\")!==t;if(o.length>0&&o!==n.symbol&&this._editor.replaceMonomer(n,o),r){let a=new O(this._editor.getMol()),l={};l.tag=t===\"\"?void 0:t,a.updateAtom(n.id,l);let{mol:d}=a.commit();this._editor.setMol(d);let c=d.atoms.find(u=>u.id===n.id);if(c!==void 0){let u={atom:c};n.bio.annotation!==void 0&&(u.oldAnnotation=n.bio.annotation),t!==\"\"&&(u.newAnnotation=t),this._editor.fire(\"monomer:annotate\",u);}}this.close();}};var ze=class{constructor(e,t){this._modal=null;this._bond=null;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"BondPropsDialog: editor has no host element.\");this._doc=t?.documentImpl??S(n);}get isOpen(){return this._modal!==null&&this._modal.isOpen}open(e){this.close(),this._bond=e;let t=this._editor._getHost();if(t===null)return;let n=new X(t,{documentImpl:this._doc,title:\"Bond Properties\",testId:\"bond-props\"});this._modal=n;let o=g(this._doc,\"div\",{class:\"hw-modal__info\"},[`Kind: ${e.kind}`]),r=this._buildAtomsPreviewRow(e),s=e.r1.kind===\"numeric\",a=e.r2.kind===\"numeric\",l=s&&a,c=this._editor.getMol().bonds,u=l?Ai(e.r1,e.a1,c):[],m=l?Ai(e.r2,e.a2,c):[],p=null,h=null;if(l){let w=String(e.r1.r),_=String(e.r2.r);p=Fe(this._doc,`R-group on ${e.a1.symbol} (${e.a1.bio.chainId}:${e.a1.bio.positionInChain})`,u,w,\"bond-props-r1\"),h=Fe(this._doc,`R-group on ${e.a2.symbol} (${e.a2.bio.chainId}:${e.a2.bio.positionInChain})`,m,_,\"bond-props-r2\");}let f=Ge(this._doc,\"bond-props\"),y=()=>{let w=p!==null?Number(Mi(p.select,e.r1.r)):null,_=h!==null?Number(Mi(h.select,e.r2.r)):null;this._commit(w,_);};f.ok.addEventListener(\"click\",y),f.cancel.addEventListener(\"click\",()=>this.close()),n.setPrimaryAction(y),n.body.appendChild(o),r!==null&&n.body.appendChild(r),p!==null&&n.body.appendChild(p.row),h!==null&&n.body.appendChild(h.row),n.body.appendChild(f.row),n.open();}_buildAtomsPreviewRow(e){let t=this._rdkit(),n=this._buildAtomCell(e.a1,t,\"bond-props-atom-a1\"),o=this._buildAtomCell(e.a2,t,\"bond-props-atom-a2\"),r=g(this._doc,\"div\",{class:\"hw-bond-props__bond-arrow\"},[\"\\u2194\"]);return g(this._doc,\"div\",{class:\"hw-bond-props__atoms\",\"data-testid\":\"bond-props-atoms\"},[n,r,o])}_buildAtomCell(e,t,n){let o=e.monomer?.name??e.symbol,r=e.symbol===o?e.symbol:`${e.symbol} \\u2014 ${o}`,s=g(this._doc,\"div\",{class:\"hw-bond-props__atom-label\"},[r]),a={class:\"hw-bond-props__atom-rdkit\",\"data-testid\":`${n}-rdkit`},l=g(this._doc,\"div\",a),d=e.monomer?.smiles;if(t!==null&&d!==void 0&&d!==\"\"){let c=ye(t,d,220,140);c!==null&&c!==\"\"&&(l.innerHTML=c);}return g(this._doc,\"div\",{class:\"hw-bond-props__atom\",\"data-testid\":n},[s,l])}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}close(){this._modal!==null&&(this._modal.close(),this._modal=null),this._bond=null;}_commit(e,t){let n=this._bond;if(n===null){this.close();return}let o=n.r1.kind===\"numeric\"?n.r1.r:null,r=n.r2.kind===\"numeric\"?n.r2.r:null;if(!(e!==null&&t!==null&&(e!==o||t!==r))){this.close();return}if(e!==null&&t!==null){let a=n.kind,l=n.a1,d=n.a2;this._editor.removeBond(n);try{this._editor.addBond(l,d,e,t,a);}catch(c){if(o!==null&&r!==null)try{this._editor.addBond(l,d,o,r,n.kind);}catch{}}}this.close();}};function Ai(i,e,t){let n=e.monomer?.rgroups;if(n===void 0||n.length===0)return [{value:\"1\",label:\"R1\"},{value:\"2\",label:\"R2\"},{value:\"3\",label:\"R3\"}];let o=new Set(W(e,t));o.add(i.r);let r=Array.from(o).sort((a,l)=>a-l),s=[];for(let a of r){let l=n[a-1];if(l===void 0)continue;let d=l.capGroupName!==void 0&&l.capGroupName!==\"\"?` (${l.capGroupName})`:\"\";s.push({value:String(a),label:`${l.label}${d}`});}return s}function Mi(i,e){let t=i.value;if(typeof t==\"string\"&&t.length>0){let o=Number(t);if(Number.isFinite(o)&&o>=1)return o}let n=i.querySelectorAll(\"option\");for(let o of Array.from(n))if(o.getAttribute(\"selected\")!==null){let r=o.getAttribute(\"value\")??\"\",s=Number(r);if(Number.isFinite(s)&&s>=1)return s}return e}var Ke=class{constructor(e,t){this._modal=null;this._result=null;this._findInput=null;this._replaceInput=null;this._matches=[];this._cursor=-1;this._editor=e;let n=e._getHost();if(n===null)throw new Error(\"FindReplaceDialog: editor has no host element.\");this._doc=t?.documentImpl??S(n);}get isOpen(){return this._modal!==null&&this._modal.isOpen}open(){this.close();let e=this._editor._getHost();if(e===null)return;let t=new X(e,{documentImpl:this._doc,title:\"Find / Replace\",testId:\"find-replace\"});this._modal=t;let n=Ne(this._doc,\"Find\",\"\",\"find-replace-find\"),o=Ne(this._doc,\"Replace with\",\"\",\"find-replace-replace\");this._findInput=n.input,this._replaceInput=o.input;let r=this._doc.createElement(\"button\");r.setAttribute(\"class\",\"hw-modal__find-next\"),r.setAttribute(\"type\",\"button\"),r.setAttribute(\"data-testid\",\"find-replace-next\"),r.appendChild(this._doc.createTextNode(\"Find Next\")),r.addEventListener(\"click\",()=>this._findNext());let s=this._doc.createElement(\"button\");s.setAttribute(\"class\",\"hw-modal__replace\"),s.setAttribute(\"type\",\"button\"),s.setAttribute(\"data-testid\",\"find-replace-replace-one\"),s.appendChild(this._doc.createTextNode(\"Replace\")),s.addEventListener(\"click\",()=>this._replaceOne());let a=this._doc.createElement(\"button\");a.setAttribute(\"class\",\"hw-modal__replace-all\"),a.setAttribute(\"type\",\"button\"),a.setAttribute(\"data-testid\",\"find-replace-replace-all\"),a.appendChild(this._doc.createTextNode(\"Replace All\")),a.addEventListener(\"click\",()=>this._replaceAll());let l=this._doc.createElement(\"button\");l.setAttribute(\"class\",\"hw-modal__cancel\"),l.setAttribute(\"type\",\"button\"),l.setAttribute(\"data-testid\",\"find-replace-close\"),l.appendChild(this._doc.createTextNode(\"Close\")),l.addEventListener(\"click\",()=>this.close());let d=g(this._doc,\"div\",{class:\"hw-modal__actions\"},[r,s,a,l]),c=g(this._doc,\"div\",{class:\"hw-modal__result\",\"data-testid\":\"find-replace-result\"},[\"0 matches\"]);this._result=c,t.setPrimaryAction(()=>this._findNext()),t.body.appendChild(n.row),t.body.appendChild(o.row),t.body.appendChild(d),t.body.appendChild(c),t.open();}close(){this._modal!==null&&(this._modal.close(),this._modal=null),this._result=null,this._findInput=null,this._replaceInput=null,this._matches=[],this._cursor=-1;}_findNext(){let e=this._findInput?.value.trim()??\"\";if(e===\"\"){this._setResultText(\"Enter a symbol to find\");return}let t=this._editor.findMonomers(e);if(this._matches=t.map(o=>o.id),this._matches.length===0){this._cursor=-1,this._editor.setHighlights([]),this._setResultText(\"No matches\");return}this._cursor=(this._cursor+1)%this._matches.length;let n=this._matches[this._cursor];n!==void 0&&this._editor.setHighlights([n]),this._setResultText(`${this._cursor+1} / ${this._matches.length} matches`);}_replaceOne(){let e=this._findInput?.value.trim()??\"\",t=this._replaceInput?.value.trim()??\"\";if(e===\"\"||t===\"\"){this._setResultText(\"Both Find and Replace fields are required\");return}if(this._matches.length===0||this._cursor<0){this._findNext();return}let n=this._matches[this._cursor];if(n===void 0)return;let o=this._editor.getMol().atoms.find(r=>r.id===n);if(o!==void 0)if(this._editor.replaceMonomer(o,t),this._matches.splice(this._cursor,1),this._matches.length===0)this._cursor=-1,this._editor.setHighlights([]),this._setResultText(\"Replaced; no further matches\");else {this._cursor=this._cursor%this._matches.length;let r=this._matches[this._cursor];r!==void 0&&this._editor.setHighlights([r]),this._setResultText(`${this._matches.length} matches remaining`);}}_replaceAll(){let e=this._findInput?.value.trim()??\"\",t=this._replaceInput?.value.trim()??\"\";if(e===\"\"||t===\"\"){this._setResultText(\"Both Find and Replace fields are required\");return}let n=this._editor.replaceMonomers(e,t);this._matches=[],this._cursor=-1,this._editor.setHighlights([]),this._setResultText(`${n} replacement${n===1?\"\":\"s\"} made`);}_setResultText(e){if(this._result!==null){for(;this._result.firstChild!==null;)this._result.removeChild(this._result.firstChild);this._result.appendChild(this._doc.createTextNode(e));}}};var ge=Object.freeze(new Set),sa=.2,aa=8,rt=class{constructor(e,t){this._events=new De;this._destroyed=false;this._view=null;this._pointer=null;this._keyboard=null;this._dnd=null;this._atomDialog=null;this._bondDialog=null;this._findReplaceDialog=null;this._viewBootstrapped=false;this._mode=\"select\";this._nextAdd=null;this._lastAction=null;this._lastTripletSugarPos=null;if(t.service===void 0||t.service===null)throw new TypeError(\"HelmEditor: options.service is required\");this._host=e,this._service=t.service,this._options=Object.freeze({...t}),this._mol=me(),this._selection=G.empty(),this._highlights=ge,this._theme=t.service.theme??H,this._viewport={scale:1,offset:{x:0,y:0}},this._viewOnly=t.viewOnly??false,this._history=new Oe({maxEntries:100}),this._history.push({mol:this._mol,label:\"initial\"}),this._libUnsub=this._service.monomerLib.onChanged.subscribe(n=>{let o=this._service.monomerLib,r=typeof o.version==\"number\"?o.version:0,s=n.type===\"reload\"?\"replace\":\"update\";this._events.fire(\"monomer-lib:change\",{source:this._service.monomerLib.source,version:r,reason:s});}),t.initialHelm!==void 0&&this.setHelm(t.initialHelm),this._bootstrapWaveB();}_bootstrapWaveB(){if(this._viewBootstrapped||this._host===null)return;let e=this._resolveDocument(this._host);if(e===null)return;this._viewBootstrapped=true;let t={documentImpl:e};this._options.width!==void 0&&(t.width=this._options.width),this._options.height!==void 0&&(t.height=this._options.height),this._view=new Nt(this._host,this,t),this._viewOnly!==true&&(this._pointer=new Vt(this._host,this,{enableContextMenu:this._options.enableContextMenu??true})),this._options.enableKeyboard!==false&&(this._keyboard=new Ut(this._host,this,{enableKeyboard:true})),this._options.enableDragDrop!==false&&(this._dnd=new zt(this._host,this)),this._events.on(\"monomer:hover\",n=>{this.setHighlights([n.atom.id]);}),this._events.on(\"monomer:hover-end\",()=>{this.clearHighlights();}),this._events.on(\"monomer:click\",n=>{let o=n.modifiers;if(o.ctrl===true||o.meta===true){this.setSelection(G.toggle(this._selection,{kind:\"atom\",id:n.atom.id}));return}if(o.shift===true){this.setSelection(G.union(this._selection,G.fromAtoms([n.atom.id])));return}this.setSelection(G.fromAtoms([n.atom.id]));});}_resolveDocument(e){let t=e.ownerDocument;if(t!=null)return t;let n=globalThis;return n.document!==void 0?n.document:null}destroy(){this._destroyed||(this._destroyed=true,this._atomDialog!==null&&(this._atomDialog.close(),this._atomDialog=null),this._bondDialog!==null&&(this._bondDialog.close(),this._bondDialog=null),this._findReplaceDialog!==null&&(this._findReplaceDialog.close(),this._findReplaceDialog=null),this._dnd!==null&&(this._dnd.destroy(),this._dnd=null),this._keyboard!==null&&(this._keyboard.destroy(),this._keyboard=null),this._pointer!==null&&(this._pointer.destroy(),this._pointer=null),this._view!==null&&(this._view.destroy(),this._view=null),this._libUnsub(),this._events.clear(),this._history.clear());}resize(e,t){this._ensureLive(),this._view!==null&&this._view.resize(e,t),this._events.fire(\"view:resize\",{width:e,height:t});}redraw(){if(this._ensureLive(),this._view!==null){this._view.redraw();return}this._events.fire(\"render:skip\",{reason:\"no-view-mounted\"});}setHelm(e,t){this._ensureLive();let n=t?.canonicalize??this._options.canonicalize??false,o=this._service.parse(e,{mode:\"lenient\"}),r=o.diagnostics;r.filter(d=>d.severity===\"error\").length>0&&this._events.fire(\"helm:parse-error\",{helm:e,diagnostics:r});for(let d of r)d.severity===\"error\"?this._events.fire(\"validation:error\",{diagnostic:d}):d.severity===\"warning\"&&this._events.fire(\"validation:warning\",{diagnostic:d});let a=o.mol;if(n){let d=this._service.canonicalize(e);a=this._service.parse(d,{mode:\"lenient\"}).mol;}let l=ne(a,this._options.bondLength!==void 0?{bondLength:this._options.bondLength}:void 0);return this._replaceMol(l,\"setHelm\",\"api\"),{mol:l,diagnostics:r}}getHelm(e){this._ensureLive();let t={};return e?.canonicalize!==void 0&&(t.canonicalize=e.canonicalize),e?.includeHighlights!==void 0&&(t.includeHighlights=e.includeHighlights),this._service.serialize(this._mol,t)}setMol(e){this._ensureLive(),this._replaceMol(e,\"setMol\",\"api\");}getMol(){return this._mol}getService(){return this._service}getSelection(){return this._selection}setSelection(e){if(this._ensureLive(),G.equals(this._selection,e))return;let t=G.difference(e,this._selection),n=G.difference(this._selection,e);this._selection=e,this._events.fire(\"selection:change\",{selection:e,addedAtomIds:t.atoms,removedAtomIds:n.atoms,addedBondIds:t.bonds,removedBondIds:n.bonds});}selectAll(){this._ensureLive();let e=this._mol.atoms.map(n=>n.id),t=this._mol.bonds.map(n=>n.id);this.setSelection(G.fromAtomsAndBonds(e,t));}clearSelection(){this._ensureLive(),!this._selection.isEmpty&&this.setSelection(G.empty());}setHighlights(e){this._ensureLive();let t=new Set(e);this._highlights=t,this._events.fire(\"highlight:change\",{atomIds:t,bondIds:ge});}clearHighlights(){this._ensureLive(),this._highlights.size!==0&&(this._highlights=ge,this._events.fire(\"highlight:change\",{atomIds:ge,bondIds:ge}));}addAtom(e,t,n){this._ensureLive();let o=new O(this._mol),r=o.addAtom({p:e,biotype:t,symbol:n}),{mol:s}=o.commit(),a=xe(s,this._service.monomerLib,{mode:\"lenient\"}).mol;this._replaceMol(a,`addAtom:${n}`,\"api\");let l=J(a,r);if(l===void 0)throw new Error(\"HelmEditor.addAtom: lost atom after commit\");return this._events.fire(\"monomer:add\",{atom:l,source:\"api\"}),l}removeAtom(e){this._ensureLive();let t=typeof e==\"number\"?e:e.id,n=J(this._mol,t);if(n===void 0)return;let o=new O(this._mol);o.removeAtom(t);let{mol:r}=o.commit();this._replaceMol(r,`removeAtom:${n.symbol}`,\"api\"),this._events.fire(\"monomer:remove\",{atom:n,source:\"api\"});}addBond(e,t,n,o,r){this._ensureLive();let s,a;try{this._validateAddBondConstraints(e,t,n,o);let d=r??\"backbone\",c=this._maybeMergeForLinearExtend(e,t,n,o,d);if(c!==null)({id:s,mol:a}=c);else {let u=new O(this._mol);s=u.addBond({a1:e.id,a2:t.id,kind:r??\"backbone\",r1:{kind:\"numeric\",r:n},r2:{kind:\"numeric\",r:o}}),{mol:a}=u.commit();}}catch(d){let c=d instanceof I?d.message:this._friendlyBondError(d instanceof Error?d.message:String(d),e,t,n,o);throw this._events.fire(\"editor:status\",{message:`Could not add bond: ${c}`,severity:\"error\",durationMs:3e3}),d}this._replaceMol(a,\"addBond\",\"api\");let l=_t(a,s);if(l===void 0)throw new Error(\"HelmEditor.addBond: lost bond after commit\");return this._events.fire(\"bond:add\",{bond:l,source:\"api\"}),l}_maybeMergeForLinearExtend(e,t,n,o,r){if(e.bio.chainId===t.bio.chainId||r!==\"backbone\"&&r!==\"cross-polymer\")return null;let s=this._mol.chains.find(l=>l.id===e.bio.chainId),a=this._mol.chains.find(l=>l.id===t.bio.chainId);if(s===void 0||a===void 0||s.polymerType!==a.polymerType)return null;if(n===2&&o===1){let l=s.backboneAtoms[s.backboneAtoms.length-1],d=a.backboneAtoms[0];if(l!==void 0&&d!==void 0&&l.id===e.id&&d.id===t.id)return this._mergeChains(s,a,r)}if(n===1&&o===2){let l=s.backboneAtoms[0],d=a.backboneAtoms[a.backboneAtoms.length-1];if(l!==void 0&&d!==void 0&&l.id===e.id&&d.id===t.id)return this._mergeChains(a,s,r)}return null}_mergeChains(e,t,n){let o=e.backboneAtoms.length,r=new Set;for(let _ of t.backboneAtoms)r.add(_.id),_.branchAtom!==void 0&&r.add(_.branchAtom.id);let s=new Map,a=o;for(let _ of t.backboneAtoms){a+=1;let M={..._,bio:{..._.bio,chainId:e.id,positionInChain:a}};if(s.set(_.id,M),_.branchAtom!==void 0){let k=_.branchAtom,x={...k,bio:{...k.bio,chainId:e.id,positionInChain:a}};s.set(k.id,x);}}for(let _ of t.backboneAtoms){let M=s.get(_.id);if(M===void 0||_.branchAtom===void 0)continue;let k=s.get(_.branchAtom.id);k!==void 0&&(M.branchAtom=k);}for(let _ of this._mol.atoms)s.has(_.id)||s.set(_.id,_);let l=0;for(let _ of this._mol.atoms)_.id>l&&(l=_.id);for(let _ of this._mol.bonds)_.id>l&&(l=_.id);let d=l+1,c=s.get(e.backboneAtoms[e.backboneAtoms.length-1].id),u=s.get(t.backboneAtoms[0].id),m={id:d,a1:c,a2:u,kind:\"backbone\",r1:{kind:\"numeric\",r:2},r2:{kind:\"numeric\",r:1}},p=[];for(let _ of this._mol.bonds){let M=s.get(_.a1.id)??_.a1,k=s.get(_.a2.id)??_.a2;M===_.a1&&k===_.a2?p.push(_):p.push({..._,a1:M,a2:k});}p.push(m);let h=[],f=[...e.backboneAtoms];for(let _ of t.backboneAtoms)f.push(s.get(_.id));for(let _ of this._mol.chains)if(_.id!==t.id)if(_.id===e.id){let M=_.bonds.map(k=>{let x=s.get(k.a1.id)??k.a1,T=s.get(k.a2.id)??k.a2;return x===k.a1&&T===k.a2?k:{...k,a1:x,a2:T}});for(let k of t.bonds){let x=s.get(k.a1.id)??k.a1,T=s.get(k.a2.id)??k.a2;M.push(x===k.a1&&T===k.a2?k:{...k,a1:x,a2:T});}M.push(m),h.push({id:_.id,polymerType:_.polymerType,backboneAtoms:f,bonds:M,..._.annotation!==void 0?{annotation:_.annotation}:{}});}else {let M=_.backboneAtoms.map(x=>s.get(x.id)??x),k=_.bonds.map(x=>{let T=s.get(x.a1.id)??x.a1,E=s.get(x.a2.id)??x.a2;return T===x.a1&&E===x.a2?x:{...x,a1:T,a2:E}});h.push({id:_.id,polymerType:_.polymerType,backboneAtoms:M,bonds:k,..._.annotation!==void 0?{annotation:_.annotation}:{}});}let w={atoms:this._mol.atoms.map(_=>s.get(_.id)??_),bonds:p,chains:h,groups:this._mol.groups,annotations:this._mol.annotations};return w=this._refreshContinuousIdsLocal(w),{id:d,mol:w}}_refreshContinuousIdsLocal(e){let t=Ee(e),n=new Map;for(let l of e.atoms){let d=t.get(l.id);if(d===void 0||d===l.bio.continuousId){n.set(l.id,l);continue}n.set(l.id,{...l,bio:{...l.bio,continuousId:d}});}for(let l of e.atoms){if(l.branchAtom===void 0)continue;let d=n.get(l.id),c=n.get(l.branchAtom.id);d===void 0||c===void 0||(d.branchAtom=c);}let o=e.bonds.map(l=>{let d=n.get(l.a1.id)??l.a1,c=n.get(l.a2.id)??l.a2;return d===l.a1&&c===l.a2?l:{...l,a1:d,a2:c}}),r=new Map;for(let l of o)r.set(l.id,l);let s=e.chains.map(l=>{let d=l.backboneAtoms.map(u=>n.get(u.id)??u),c=l.bonds.map(u=>r.get(u.id)??u);return {id:l.id,polymerType:l.polymerType,backboneAtoms:d,bonds:c,...l.annotation!==void 0?{annotation:l.annotation}:{}}});return {atoms:e.atoms.map(l=>n.get(l.id)??l),bonds:o,chains:s,groups:e.groups,annotations:e.annotations}}_friendlyBondError(e,t,n,o,r){return e.includes(\"duplicate bond\")?`bond ${t.symbol}:R${o} \\u2194 ${n.symbol}:R${r} already exists`:e.includes(\"does not exist\")?\"one of the endpoint atoms is missing\":e}_validateAddBondConstraints(e,t,n,o){let r=this._mol.bonds,s=be(e);if(s>0&&(n<1||n>s))throw new I(\"rgroup-not-on-monomer\",`R-group R${n} is not defined on monomer '${e.symbol}' (has R1..R${s})`,{atomId:e.id,requested:n,total:s});let a=be(t);if(a>0&&(o<1||o>a))throw new I(\"rgroup-not-on-monomer\",`R-group R${o} is not defined on monomer '${t.symbol}' (has R1..R${a})`,{atomId:t.id,requested:o,total:a});if(s>0){let l=Ht(e,r).find(d=>d.rNumber===n);if(l!==void 0){let d=l.side===\"r1\"?l.bond.a2:l.bond.a1;throw new I(\"rgroup-already-bonded\",`R-group R${n} on '${e.symbol}' is already bonded to '${d.symbol}' (${d.bio.chainId}:${d.bio.positionInChain})`,{atomId:e.id,requested:n,conflictingBondId:l.bond.id})}}if(a>0){let l=Ht(t,r).find(d=>d.rNumber===o);if(l!==void 0){let d=l.side===\"r1\"?l.bond.a2:l.bond.a1;throw new I(\"rgroup-already-bonded\",`R-group R${o} on '${t.symbol}' is already bonded to '${d.symbol}' (${d.bio.chainId}:${d.bio.positionInChain})`,{atomId:t.id,requested:o,conflictingBondId:l.bond.id})}}for(let l of r){if(l.r1.kind!==\"numeric\"||l.r2.kind!==\"numeric\")continue;let d=l.a1.id===e.id&&l.a2.id===t.id&&l.r1.r===n&&l.r2.r===o,c=l.a1.id===t.id&&l.a2.id===e.id&&l.r1.r===o&&l.r2.r===n;if(d||c)throw new I(\"duplicate-bond\",`bond ${e.symbol}:R${n} \\u2194 ${t.symbol}:R${o} already exists`,{atomId:e.id,bondId:l.id})}}_freeRgroupsOn(e){return W(e,this._mol.bonds)}addHydrogenBond(e,t){this._ensureLive();let n=new O(this._mol),o={kind:\"pair\"},r=n.addBond({a1:e.id,a2:t.id,kind:\"hbond\",r1:o,r2:o}),{mol:s}=n.commit();this._replaceMol(s,\"addHydrogenBond\",\"api\");let a=_t(s,r);if(a===void 0)throw new Error(\"HelmEditor.addHydrogenBond: lost bond after commit\");return this._events.fire(\"bond:add\",{bond:a,source:\"api\"}),a}removeBond(e){this._ensureLive();let t=typeof e==\"number\"?e:e.id,n=_t(this._mol,t);if(n===void 0)return;let o=new O(this._mol);o.removeBond(t);let{mol:r}=o.commit();this._replaceMol(r,\"removeBond\",\"api\"),this._events.fire(\"bond:remove\",{bond:n,source:\"api\"});}replaceMonomer(e,t){this._ensureLive();let n=J(this._mol,e.id);if(n===void 0)return;let o=n.symbol;if(o===t)return;let r=new O(this._mol);r.updateAtom(e.id,{symbol:t});let{mol:s}=r.commit(),a=xe(s,this._service.monomerLib,{mode:\"lenient\"}).mol;this._replaceMol(a,`replaceMonomer:${o}->${t}`,\"api\");let l=J(a,e.id);l!==void 0&&this._events.fire(\"monomer:replace\",{atom:l,oldSymbol:o,newSymbol:t});}hitTest(e,t){this._ensureLive();let o=new q(this._mol,this._theme).test({x:e,y:t});return o===null?null:o.atom!==void 0?{atom:o.atom}:o.bond!==void 0?{bond:o.bond}:null}moveAtom(e,t){this._ensureLive();let n=J(this._mol,e);if(n===void 0||n.p.x===t.x&&n.p.y===t.y)return;let o=new O(this._mol);o.updateAtom(e,{p:{x:t.x,y:t.y}});let{mol:r}=o.commit();this._replaceMol(r,\"moveAtom\",\"user\");}moveAtoms(e){if(this._ensureLive(),e.length===0)return;let t=new O(this._mol),n=0;for(let r of e){let s=J(this._mol,r.atomId);s!==void 0&&(s.p.x===r.p.x&&s.p.y===r.p.y||(t.updateAtom(r.atomId,{p:{x:r.p.x,y:r.p.y}}),n+=1));}if(n===0)return;let{mol:o}=t.commit();this._replaceMol(o,\"moveAtom\",\"user\");}cleanLayout(e){this._ensureLive(),this._resetLastAction();let t=ne(this._mol,this._options.bondLength!==void 0?{bondLength:this._options.bondLength}:void 0);this._mol=t,this._history.push({mol:t,label:\"cleanLayout\"}),this._events.fire(\"layout:change\",{mol:t,strategy:\"auto\"}),this._events.fire(\"mol:changed\",{mol:t,changedAtomIds:new Set(t.atoms.map(n=>n.id)),changedBondIds:ge,reason:\"cleanLayout\"});}canUndo(){return this._history.canUndo()}canRedo(){return this._history.canRedo()}undo(){this._ensureLive();let e=this._history.undo();e!==null&&this._restoreFromHistory(e.mol,\"undo\");}redo(){this._ensureLive();let e=this._history.redo();e!==null&&this._restoreFromHistory(e.mol,\"redo\");}on(e,t){return this._events.on(e,t)}off(e,t){this._events.off(e,t);}fire(e,t){this._events.fire(e,t);}zoom(e,t){if(this._ensureLive(),!Number.isFinite(e)||e<=0)return;let n=this._viewport.scale,o=Math.min(aa,Math.max(sa,n*e));if(o===n)return;let r={...this._viewport.offset},s=r;t!==void 0&&(s={x:r.x+(n-o)*t.x,y:r.y+(n-o)*t.y});let a={scale:o,offset:s};this._viewport=a;let l=t??{x:0,y:0};this._events.fire(\"view:zoom\",{scale:o,center:l,previousScale:n}),this._events.fire(\"view:viewport-change\",{viewport:a});}panTo(e){this._ensureLive();let t={...this._viewport.offset},n={scale:this._viewport.scale,offset:{...e}};this._viewport=n,this._events.fire(\"view:pan\",{offset:n.offset,previousOffset:t}),this._events.fire(\"view:viewport-change\",{viewport:n});}getViewport(){return {scale:this._viewport.scale,offset:{...this._viewport.offset}}}fitToContent(e){this._ensureLive();let t=0,n=0,o=0,r=0,s=false;for(let u of this._mol.atoms){if(!s){t=o=u.p.x,n=r=u.p.y,s=true;continue}u.p.x<t&&(t=u.p.x),u.p.x>o&&(o=u.p.x),u.p.y<n&&(n=u.p.y),u.p.y>r&&(r=u.p.y);}let a=s?{x:t,y:n,width:o-t,height:r-n}:{x:0,y:0,width:0,height:0},l={...this._viewport.offset},d=this._viewport.scale,c={scale:1,offset:{x:0,y:0}};this._viewport=c,d!==1&&this._events.fire(\"view:zoom\",{scale:1,center:{x:0,y:0},previousScale:d}),(l.x!==0||l.y!==0)&&this._events.fire(\"view:pan\",{offset:c.offset,previousOffset:l}),this._events.fire(\"view:viewport-change\",{viewport:c}),this._events.fire(\"view:fit-to-content\",{bbox:a});}setViewOnly(e){this._ensureLive();let t=this._viewOnly;t!==e&&(this._viewOnly=e,this._events.fire(\"option:change\",{key:\"viewOnly\",oldValue:t,newValue:e}));}setTheme(e){this._ensureLive();let t=this._theme;t!==e&&(this._theme=e,this._events.fire(\"theme:change\",{theme:e,previousTheme:t}));}toSvg(e){this._ensureLive();let t=this.getHelm(),n={};return e?.width!==void 0&&(n.width=e.width),e?.height!==void 0&&(n.height=e.height),this._service.renderToSvg(t,n)}async toPng(e){this._ensureLive();let t=this.getHelm(),n={};return e?.width!==void 0&&(n.width=e.width),e?.height!==void 0&&(n.height=e.height),this._service.renderToPng(t,n)}_getHost(){return this._host}_observerCount(){return this._events.observerCount()}_currentHighlights(){return this._highlights}_currentTheme(){return this._theme}_getView(){return this._view}_getViewport(){return this._viewport}openAtomProps(e){this._ensureLive(),this._host!==null&&(this._atomDialog===null&&(this._atomDialog=new Ue(this)),this._atomDialog.open(e));}openBondProps(e){this._ensureLive(),this._host!==null&&(this._bondDialog===null&&(this._bondDialog=new ze(this)),this._bondDialog.open(e));}openFindReplace(){this._ensureLive(),this._host!==null&&(this._findReplaceDialog===null&&(this._findReplaceDialog=new Ke(this)),this._findReplaceDialog.open());}getMode(){return this._mode}setMode(e){this._ensureLive();let t=this._mode;t!==e&&(this._mode=e,this._events.fire(\"option:change\",{key:\"mode\",oldValue:t,newValue:e}));}getNextAddSymbol(){return this._nextAdd}setNextAddSymbol(e,t){this._ensureLive();let n=this._nextAdd;if(e===null)this._nextAdd=null;else {if(t===void 0)return;this._nextAdd={symbol:e,biotype:t};}this._events.fire(\"option:change\",{key:\"nextAdd\",oldValue:n,newValue:this._nextAdd});}startPaletteDrag(e,t){if(this._ensureLive(),this._dnd===null){this._events.fire(\"dnd:start\",{source:\"palette\",symbol:e});return}this._dnd.startPaletteDrag(e,t);}findMonomers(e){this._ensureLive();let t=[];for(let n of this._mol.atoms)n.symbol===e&&t.push(n);return t}replaceMonomers(e,t){this._ensureLive();let n,o;if(typeof e==\"string\"){let d=e,c=t;if(n=this.findMonomers(d),n.length===0)return 0;if(d===c)return n.length;o=`${d}->${c}`;}else {let d=t,c=new Set,u=[];for(let m of e){if(c.has(m.id))continue;c.add(m.id);let p=J(this._mol,m.id);p!==void 0&&p.symbol!==d&&u.push(p);}if(u.length===0)return 0;n=u,o=`atoms[${u.length}]->${d}`;}let r=t,s=new O(this._mol);for(let d of n)s.updateAtom(d.id,{symbol:r});let{mol:a}=s.commit(),l=xe(a,this._service.monomerLib,{mode:\"lenient\"}).mol;return this._replaceMol(l,`replaceMonomers:${o}`,\"api\"),n.length}nudgeSelection(e,t){this._ensureLive();let n=this._selection;if(n.atoms.size===0)return;let o=new O(this._mol);for(let s of n.atoms){let a=J(this._mol,s);a!==void 0&&o.updateAtom(s,{p:{x:a.p.x+e,y:a.p.y+t}});}let{mol:r}=o.commit();this._replaceMol(r,\"nudge\",\"user\");}deleteSelection(){this._ensureLive();let e=this._selection;if(e.atoms.size===0&&e.bonds.size===0)return;let t=new O(this._mol);for(let o of e.atoms)t.removeAtom(o);for(let o of e.bonds)t.removeBond(o);let{mol:n}=t.commit();this._selection=G.empty(),this._replaceMol(n,\"delete-selection\",\"user\"),this._events.fire(\"selection:change\",{selection:this._selection,addedAtomIds:ge,removedAtomIds:e.atoms,addedBondIds:ge,removedBondIds:e.bonds});}appendRnaTriplet(e,t,n){this._ensureLive();let o=We(e,t,n),r=this.getHelm(),s=da(r,o);this.setHelm(s);}placeRnaTriplet(e,t,n){this._ensureLive();let o=1.6*(this._options.bondLength??28),r,s=this._mol.atoms;if(this._lastAction===\"add-triplet\"&&this._lastTripletSugarPos!==null)r={x:this._lastTripletSugarPos.x+o*2,y:this._lastTripletSugarPos.y};else if(s.length===0)r={x:0,y:0};else {let M=s[0].p.x,k=s[0].p.y;for(let x of s)x.p.x<M&&(M=x.p.x),x.p.y>k&&(k=x.p.y);r={x:M,y:k+o};}let a={x:r.x+o,y:r.y},l={x:r.x,y:r.y+o},d=new Set;for(let M of this._mol.chains)d.add(M.id);let c=1;for(;d.has(`RNA${c}`);)c+=1;let u=`RNA${c}`,m=new O(this._mol),p=m.addAtom({p:r,biotype:b.SUGAR,symbol:e,chainId:u,positionInChain:1}),h=m.addAtom({p:a,biotype:b.LINKER,symbol:n,chainId:u,positionInChain:2}),f=m.addAtom({p:l,biotype:b.BASE,symbol:t,chainId:u,positionInChain:0});m.addBond({a1:p,a2:f,kind:\"branch\",r1:{kind:\"numeric\",r:3},r2:{kind:\"numeric\",r:1}}),m.addBond({a1:p,a2:h,kind:\"backbone\",r1:{kind:\"numeric\",r:2},r2:{kind:\"numeric\",r:1}});let{mol:y}=m.commit(),w=this._postProcessTripletMol(y,p,f,u),_=xe(w,this._service.monomerLib,{mode:\"lenient\"}).mol;this._replaceMol(_,\"placeRnaTriplet\",\"user\"),this._lastAction=\"add-triplet\",this._lastTripletSugarPos=r;}_postProcessTripletMol(e,t,n,o){let r=new Map,s=J(e,n),a=J(e,t);if(s===void 0||a===void 0)return e;let l={...a,branchAtom:s};r.set(t,l);let d=e.bonds.map(h=>{let f=r.get(h.a1.id)??h.a1,y=r.get(h.a2.id)??h.a2;return f===h.a1&&y===h.a2?h:{...h,a1:f,a2:y}}),c=new Map;for(let h of d)c.set(h.id,h);let u=e.chains.map(h=>{let f=[];for(let w of h.backboneAtoms)h.id===o&&w.id===n||f.push(r.get(w.id)??w);let y=h.bonds.map(w=>c.get(w.id)??w);return {id:h.id,polymerType:h.polymerType,backboneAtoms:f,bonds:y,...h.annotation!==void 0?{annotation:h.annotation}:{}}}),p={atoms:e.atoms.map(h=>r.get(h.id)??h),bonds:d,chains:u,groups:e.groups,annotations:e.annotations};return p=this._refreshContinuousIdsLocal(p),p}_resetLastAction(){this._lastAction=\"other\",this._lastTripletSugarPos=null;}_ensureLive(){if(this._destroyed)throw new Error(\"HelmEditor: this instance has been destroyed.\")}_replaceMol(e,t,n){let o=this._service.serialize(this._mol),r=this._service.serialize(e);this._mol=e,this._history.push({mol:e,label:t}),this._resetLastAction(),this._events.fire(\"mol:changed\",{mol:e,changedAtomIds:new Set(e.atoms.map(s=>s.id)),changedBondIds:new Set(e.bonds.map(s=>s.id)),reason:t}),o!==r&&this._events.fire(\"helm:changed\",{helm:r,mol:e,source:n});}_restoreFromHistory(e,t){let n=this._service.serialize(this._mol),o=this._service.serialize(e);this._mol=e,this._resetLastAction(),this._events.fire(\"mol:changed\",{mol:e,changedAtomIds:new Set(e.atoms.map(r=>r.id)),changedBondIds:new Set(e.bonds.map(r=>r.id)),reason:t}),n!==o&&this._events.fire(\"helm:changed\",{helm:o,mol:e,source:t});}};function On(i){return i.startsWith(\"[\")&&i.endsWith(\"]\")||i.length===1&&/^[A-Za-z]$/.test(i)?i:`[${i}]`}function We(i,e,t){return `${On(i)}(${On(e)})${On(t)}`}function da(i,e){if(i===\"\")return `RNA1{${e}}$$$$V2.0`;let t=/(^|\\|)(RNA\\d+)\\{([^}]*)\\}/g,n=null,o;for(;(o=t.exec(i))!==null;)n={name:o[2],body:o[3],matchText:o[0]};if(n!==null){let h=n.body===\"\"?\"\":\".\",f=`${n.matchText.startsWith(\"|\")?\"|\":\"\"}${n.name}{${n.body}${h}${e}}`,y=i.lastIndexOf(n.matchText);return i.slice(0,y)+f+i.slice(y+n.matchText.length)}let r=new Set,s=/RNA(\\d+)\\{/g,a;for(;(a=s.exec(i))!==null;)r.add(Number(a[1]));let l=1;for(;r.has(l);)l+=1;let d=`RNA${l}{${e}}`,c=i.indexOf(\"$\");if(c<0)return `${i}|${d}$$$$V2.0`;let u=i.slice(0,c),m=i.slice(c);return `${u}${u===\"\"?\"\":\"|\"}${d}${m}`}var ca=5,ua=3,ma=14,pa=11,ha=9,fa=8,ba=48,ya=96;function ga(i){return i<=ua?ma:i<=6?pa:i<=9?ha:fa}function Ti(i,e){let t=$(e.monomer,e.biotype,e.theme.colorTheme),n=xt(t.background),o=t.text,r=Zn(o,n)<ca,s=e.monomer.symbol,a=ga(s.length),d=s.length>=10?\"line-height:1.1;letter-spacing:-0.02em;\":\"\",c=`font-size:${a}px;${d}white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:${ya-16}px;display:inline-block;`,u=g(i,\"span\",{class:\"hw-palette__star\"},[e.favorite?\"\\u2605\":\"\\u2606\"]),m=g(i,\"span\",{class:\"hw-palette__label\",style:c},[s]),p=[\"hw-palette__tile\"];e.primed&&p.push(\"hw-palette__tile--primed\"),e.favorite&&p.push(\"hw-palette__tile--favorite\"),r&&p.push(\"hw-palette__tile--low-contrast\");let h=e.monomer.name!==void 0?`${s} \\u2014 ${e.monomer.name}`:s,f=`background:${n};color:${o};width:100%;min-width:${ba}px;padding:4px 6px;height:40px;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;`;return {root:g(i,\"div\",{class:p.join(\" \"),draggable:\"true\",role:\"button\",\"aria-pressed\":e.primed?\"true\":\"false\",\"aria-label\":h,\"data-symbol\":s,\"data-biotype\":e.biotype,\"data-bg\":n,\"data-raw-bg\":t.background,\"data-testid\":`palette-tile-${s}`,title:h,style:f},[u,m]),star:u}}function Si(i,e){let t=e.showStar!==false,n=g(i,\"span\",{class:\"hw-triplet-chip__star\"},[e.favorite?\"\\u2605\":\"\\u2606\"]),o=g(i,\"span\",{class:\"hw-triplet-chip__label\"},[e.label]),r=[\"hw-triplet-chip\"];e.favorite&&r.push(\"hw-triplet-chip--favorite\");let s=t?[n,o]:[o];return {root:g(i,\"div\",{class:r.join(\" \"),role:\"button\",tabindex:\"0\",\"aria-label\":e.title,\"data-sugar\":e.sugar,\"data-base\":e.base,\"data-linker\":e.linker,\"data-triplet\":e.label,\"data-testid\":`palette-triplet-${e.label}`,title:e.title,style:`background:${e.background};color:${e.textColor};`},s),star:n}}var ce=\"http://www.w3.org/2000/svg\",Ei={sugar:b.SUGAR,base:b.BASE,linker:b.LINKER},_a={sugar:[\"r\",\"R\"],base:[\"A\"],linker:[\"p\",\"P\"]},va=200,wa=180,st={x:70,y:60},Nn={x:140,y:60},Fn={x:70,y:130},je=18,Ci=18,at=22,Wt=class Wt{constructor(e,t,n){this.onValueSet=new Z;this.onPickModeChange=new Z;this._slots=new Map;this._favStar=null;this._pickMode=null;this._destroyed=false;this._builderRdkitCache=new Map;this._editor=t,this._doc=n?.documentImpl??S(e),this._hooks=n?.paletteHooks??null,this._favHooks=n?.favoriteHooks??null,this.element=g(this._doc,\"div\",{class:\"hw-rna-builder\",\"data-testid\":\"rna-builder\"});let o=g(this._doc,\"div\",{class:\"hw-rna-builder__header\"});if(o.appendChild(g(this._doc,\"div\",{class:\"hw-rna-builder__title\"},[\"RNA builder\"])),this._favHooks!==null){let l=g(this._doc,\"span\",{class:\"hw-rna-builder__fav hw-rna-builder__fav--disabled\",role:\"button\",tabindex:\"0\",\"data-testid\":\"rna-builder-fav-star\",title:\"Favorite this triplet\",\"aria-pressed\":\"false\",\"aria-disabled\":\"true\"},[\"\\u2606\"]),d=c=>{c.stopPropagation();let u=this.getSelection();u.preview===\"\"||this._favHooks===null||this._favHooks.toggleFavoriteTriplet(u.sugar,u.base,u.linker);};l.addEventListener(\"click\",d),l.addEventListener(\"keydown\",c=>{let u=c;(u.key===\"Enter\"||u.key===\" \")&&d(c);}),this._favStar=l,o.appendChild(l);}this.element.appendChild(o),this._hintEl=g(this._doc,\"div\",{class:\"hw-rna-builder__hint\",\"data-testid\":\"rna-builder-hint\",hidden:true}),this.element.appendChild(this._hintEl);let r=this._buildSvg();this.element.appendChild(r),this._preview=g(this._doc,\"div\",{class:\"hw-rna-builder__preview\",\"data-testid\":\"rna-builder-preview\"}),this.element.appendChild(this._preview),this._addBtn=g(this._doc,\"button\",{class:\"hw-rna-builder__add\",type:\"button\",\"data-testid\":\"rna-builder-add-btn\"},[\"Add triplet\"]),this._addBtn.addEventListener(\"click\",()=>this._onAddClicked()),this.element.appendChild(this._addBtn),e.appendChild(this.element);let s=t.getService().monomerLib.onChanged.subscribe(()=>{this._destroyed||this.refresh();}),a=t.on(\"theme:change\",()=>{this._destroyed||this._repaintSlotColors();});this._libUnsub=()=>{try{s();}catch{}try{a();}catch{}},this._populateDefaults(),this._updatePreview(),this._repaintSlotColors();}refresh(){this._populateDefaults(),this._updatePreview(),this._repaintSlotColors();}getSelection(){let e=this._slots.get(\"sugar\")?.value??\"\",t=this._slots.get(\"base\")?.value??\"\",n=this._slots.get(\"linker\")?.value??\"\",o=e!==\"\"&&t!==\"\"&&n!==\"\"?We(e,t,n):\"\";return {sugar:e,base:t,linker:n,preview:o}}setField(e,t){let n=this._slots.get(e);n!==void 0&&(n.value=t,this._setLabelText(n.labelEl,t),this._repaintSlot(n),this._updatePreview(),this.onValueSet.next({field:e,symbol:t}));}startPickMode(e){if(this._pickMode===e){this.cancelPickMode();return}this._pickMode!==null&&this._setSlotPressed(this._pickMode,false),this._pickMode=e,this._setSlotPressed(e,true),this._setHintActive(e),this.onPickModeChange.next({field:e}),this._hooks!==null&&this._hooks.beginBiotypeFilter(Ei[e],t=>{this.setField(e,t),this._exitPickMode();},()=>{this._exitPickMode();});}cancelPickMode(){this._pickMode!==null&&(this._hooks!==null&&this._hooks.endBiotypeFilter(),this._exitPickMode());}getPickMode(){return this._pickMode}triggerAdd(){this._onAddClicked();}destroy(){this._destroyed||(this._destroyed=true,this._pickMode!==null&&this._hooks!==null&&this._hooks.endBiotypeFilter(),this._libUnsub(),this.onValueSet.complete(),this.onPickModeChange.complete(),this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element));}_buildSvg(){let e=this._doc.createElementNS(ce,\"svg\");e.setAttribute(\"class\",\"hw-rna-builder__triplet\"),e.setAttribute(\"viewBox\",`0 0 ${va} ${wa}`),e.setAttribute(\"data-testid\",\"rna-builder-triplet-svg\"),e.setAttribute(\"role\",\"group\"),e.setAttribute(\"aria-label\",\"Triplet preview\");let t=this._doc.createElementNS(ce,\"line\");t.setAttribute(\"class\",\"hw-rna-builder__bond\"),t.setAttribute(\"x1\",String(st.x+je)),t.setAttribute(\"y1\",String(st.y)),t.setAttribute(\"x2\",String(Nn.x-Ci)),t.setAttribute(\"y2\",String(Nn.y)),e.appendChild(t);let n=this._doc.createElementNS(ce,\"line\");n.setAttribute(\"class\",\"hw-rna-builder__bond\"),n.setAttribute(\"x1\",String(st.x)),n.setAttribute(\"y1\",String(st.y+je)),n.setAttribute(\"x2\",String(Fn.x)),n.setAttribute(\"y2\",String(Fn.y-at)),e.appendChild(n);let o=this._doc.createElementNS(ce,\"rect\");o.setAttribute(\"class\",\"hw-rna-builder__slot-shape\"),o.setAttribute(\"x\",String(-je)),o.setAttribute(\"y\",String(-je)),o.setAttribute(\"width\",String(je*2)),o.setAttribute(\"height\",String(je*2)),o.setAttribute(\"rx\",\"8\"),o.setAttribute(\"ry\",\"8\");let r=this._buildSlot(\"sugar\",\"Pick sugar (backbone)\",st,o),s=this._doc.createElementNS(ce,\"circle\");s.setAttribute(\"class\",\"hw-rna-builder__slot-shape\"),s.setAttribute(\"cx\",\"0\"),s.setAttribute(\"cy\",\"0\"),s.setAttribute(\"r\",String(Ci));let a=this._buildSlot(\"linker\",\"Pick linker\",Nn,s),l=this._doc.createElementNS(ce,\"path\");l.setAttribute(\"class\",\"hw-rna-builder__slot-shape\"),l.setAttribute(\"d\",`M ${-at} 0 L 0 ${-at} L ${at} 0 L 0 ${at} Z`);let d=this._buildSlot(\"base\",\"Pick base\",Fn,l);return e.appendChild(a.groupEl),e.appendChild(r.groupEl),e.appendChild(d.groupEl),this._slots.set(\"sugar\",r),this._slots.set(\"linker\",a),this._slots.set(\"base\",d),e}_buildSlot(e,t,n,o){let r=this._doc.createElementNS(ce,\"g\");r.setAttribute(\"class\",\"hw-rna-builder__slot\"),r.setAttribute(\"data-slot\",e),r.setAttribute(\"data-testid\",`rna-builder-slot-${e}`),r.setAttribute(\"role\",\"button\"),r.setAttribute(\"tabindex\",\"0\"),r.setAttribute(\"aria-label\",t),r.setAttribute(\"aria-pressed\",\"false\"),r.setAttribute(\"transform\",`translate(${n.x} ${n.y})`),r.appendChild(o);let s=this._doc.createElementNS(ce,\"text\");s.setAttribute(\"class\",\"hw-rna-builder__slot-label\"),s.setAttribute(\"data-testid\",`rna-builder-${e}-value`),s.setAttribute(\"x\",\"0\"),s.setAttribute(\"y\",\"0\"),s.setAttribute(\"text-anchor\",\"middle\"),s.setAttribute(\"dominant-baseline\",\"central\"),r.appendChild(s);let a=l=>{l.stopPropagation(),this.startPickMode(e);};return r.addEventListener(\"click\",a),r.addEventListener(\"keydown\",l=>{let d=l;(d.key===\"Enter\"||d.key===\" \")&&a(l);}),r.addEventListener(\"mouseenter\",l=>this._showSlotTooltip(e,l)),r.addEventListener(\"mouseleave\",()=>this._hideSlotTooltip()),r.addEventListener(\"focus\",()=>this._showSlotTooltip(e,null)),r.addEventListener(\"blur\",()=>this._hideSlotTooltip()),{id:e,biotype:Ei[e],groupEl:r,shapeEl:o,labelEl:s,value:\"\"}}_setLabelText(e,t){let n=[];for(let a=e.firstChild;a!==null;a=a.nextSibling)a.nodeName===\"title\"||a.nodeName===\"TITLE\"||n.push(a);for(let a of n)e.removeChild(a);let o=xa(t);e.setAttribute(\"font-size\",String(o)),e.setAttribute(\"text-anchor\",\"middle\"),e.setAttribute(\"dominant-baseline\",\"central\");let r=t.length>10?`${t.slice(0,9)}\\u2026`:t;e.appendChild(this._doc.createTextNode(r));let s=e.parentNode;if(s!==null){let a=null;for(let l=s.firstChild;l!==null;l=l.nextSibling)if(l.nodeName===\"title\"||l.nodeName===\"TITLE\"){a=l;break}for(a===null&&(a=this._doc.createElementNS(ce,\"title\"),s.insertBefore(a,s.firstChild));a.firstChild!==null;)a.removeChild(a.firstChild);a.appendChild(this._doc.createTextNode(t));}}_repaintSlotColors(){for(let e of this._slots.values())this._repaintSlot(e);}_repaintSlot(e){let t=this._editor.getService().monomerLib,n=this._theme(),o=e.value===\"\"?null:Ma(t,e.biotype,e.value),r=$(o,e.biotype,n.colorTheme);e.shapeEl.style.fill=r.background,e.shapeEl.style.stroke=r.line,e.labelEl.style.fill=r.text;}_populateDefaults(){let e=this._editor.getService().monomerLib;for(let[t,n]of this._slots.entries()){let o=ka(e,n.biotype),r=Aa(o,_a[t]),s=n.value!==\"\"&&o.some(a=>a.symbol===n.value)?n.value:r??o[0]?.symbol??\"\";n.value=s,this._setLabelText(n.labelEl,s);}}_updatePreview(){let e=this.getSelection();for(;this._preview.firstChild!==null;)this._preview.removeChild(this._preview.firstChild);this._preview.appendChild(this._doc.createTextNode(e.preview===\"\"?\"-\":e.preview)),this._updateFavStar(e);}_updateFavStar(e){if(this._favStar===null||this._favHooks===null)return;let t=e.preview!==\"\",n=t&&this._favHooks.isFavoriteTriplet(e.sugar,e.base,e.linker);for(;this._favStar.firstChild!==null;)this._favStar.removeChild(this._favStar.firstChild);this._favStar.appendChild(this._doc.createTextNode(n?\"\\u2605\":\"\\u2606\")),this._favStar.setAttribute(\"aria-pressed\",n?\"true\":\"false\"),t?this._favStar.removeAttribute(\"aria-disabled\"):this._favStar.setAttribute(\"aria-disabled\",\"true\");let o=\"hw-rna-builder__fav\"+(n?\" hw-rna-builder__fav--active\":\"\")+(t?\"\":\" hw-rna-builder__fav--disabled\");this._favStar.setAttribute(\"class\",o);}_onAddClicked(){let e=this.getSelection();e.preview!==\"\"&&this._editor.placeRnaTriplet(e.sugar,e.base,e.linker);}_exitPickMode(){if(this._pickMode===null)return;let e=this._pickMode;this._setSlotPressed(e,false),this._pickMode=null,this._setHintActive(null),this.onPickModeChange.next({field:null});}_setHintActive(e){let t=this._hintEl;for(;t.firstChild!==null;)t.removeChild(t.firstChild);if(e===null){t.setAttribute(\"hidden\",\"\");return}t.removeAttribute(\"hidden\");let n=e===\"sugar\"?\"sugar\":e===\"base\"?\"base\":\"linker\";t.appendChild(this._doc.createTextNode(`Pick ${n} from palette`));}_setSlotPressed(e,t){let n=this._slots.get(e);if(n===void 0)return;n.groupEl.setAttribute(\"aria-pressed\",t?\"true\":\"false\");let r=(n.groupEl.getAttribute(\"class\")??\"\").split(/\\s+/).filter(s=>s!==\"hw-rna-builder__slot--active\").join(\" \");n.groupEl.setAttribute(\"class\",t?`${r} hw-rna-builder__slot--active`:r);}_theme(){let e=this._editor;return typeof e._currentTheme==\"function\"?e._currentTheme():this._editor.getService().theme}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}_builderRdkitSvgFor(e){if(e===null)return null;let t=e.smiles;if(t===void 0||t===\"\")return null;let n=this._rdkit();if(n===null)return null;let o=`${e.polymerType}:${e.symbol}`;if(this._builderRdkitCache.has(o))return this._builderRdkitCache.get(o)??null;let r=ye(n,t,220,140);if(this._builderRdkitCache.size>=Wt._BUILDER_RDKIT_CACHE_LIMIT){let s=this._builderRdkitCache.keys().next().value;s!==void 0&&this._builderRdkitCache.delete(s);}return this._builderRdkitCache.set(o,r),r}_slotHint(e){switch(e){case \"sugar\":return \"Click to choose a different sugar\";case \"base\":return \"Click to choose a different base\";case \"linker\":return \"Click to choose a different linker\"}}_slotTitle(e,t){let n=t===\"\"?\"?\":t;switch(e){case \"sugar\":return `Sugar: ${n}`;case \"base\":return `Base: ${n}`;case \"linker\":return `Linker: ${n}`}}_showSlotTooltip(e,t){let n=this._slots.get(e);if(n===void 0)return;let r=this._editor.getService().monomerLib.getMonomerSet(n.biotype),s=n.value===\"\"?null:r.get(n.value)??null,a=oe(this._doc,\"builder-tooltip\",\"hw-builder-tooltip\");Me(this._doc,a,{symbol:this._slotTitle(e,n.value),name:s?.name??\"\",rdkitSvg:this._builderRdkitSvgFor(s),rdkitTestid:\"builder-tooltip-rdkit-svg\",hint:this._slotHint(e)});let l=t;if(l!==null&&typeof l.clientX==\"number\"&&typeof l.clientY==\"number\")Y(a,l.clientX,l.clientY);else {let d=n.groupEl,c=typeof d.getBoundingClientRect==\"function\"?d.getBoundingClientRect():null;c!==null?Y(a,c.left+c.width/2,c.top+c.height/2):Y(a,0,0);}}_hideSlotTooltip(){let e=this._doc.body.querySelector('[data-testid=\"builder-tooltip\"]');V(e);}};Wt._BUILDER_RDKIT_CACHE_LIMIT=256;var Kt=Wt;function xa(i){let e=i.length;return e<=2?16:e<=4?11:e<=7?8:e<=10?6:5}function ka(i,e){let t=i.getMonomerSet(e),n=[];for(let o of t.values())n.push(o);return n.sort((o,r)=>o.symbol.localeCompare(r.symbol)),n}function Aa(i,e){let t=new Set;for(let n of i)t.add(n.symbol);for(let n of e)if(t.has(n))return n;return null}function Ma(i,e,t){return i.getMonomerSet(e).get(t)??null}var ue=\"Favorites\",Gn={[ue]:\"\\u2605 Favorites\",[v.PEPTIDE]:\"Peptides\",[v.RNA]:\"RNA\",[v.CHEM]:\"CHEM\",[v.BLOB]:\"BLOB\",G:\"G\"},jt=[ue,v.PEPTIDE,v.RNA,v.CHEM,v.BLOB,\"G\"],Li=\"hwe:palette:favorites\",Bi=\"hwe:palette:active-tab\",Ta=\"hwe.palette.favorites\";function qt(i){return `${i.sugar}|${i.base}|${i.linker}`}var qe=class qe{constructor(e,t,n){this.favoritesChanged=new Z;this._nextAddUnsub=()=>{};this._favorites=new Set;this._favoriteTriplets=[];this._pendingRnaSelection=null;this._visibleTabs=[ue];this._activeTab=ue;this._searchInput=null;this._filter=\"\";this._destroyed=false;this._rnaBuilder=null;this._activeBiotypeFilter=null;this._pickResolver=null;this._pickCanceller=null;this._pickEscapeListener=null;this._pickOutsideClickListener=null;this._paletteRdkitCache=new Map;this._editor=t,this._doc=n?.documentImpl??S(e),this._opts={documentImpl:this._doc,groupByNaturalAnalog:n?.groupByNaturalAnalog??true,allowFavorites:n?.allowFavorites??true},this._loadFavorites(),this._activeTab=this._resolveInitialTab(n?.initialTab),this.element=g(this._doc,\"div\",{class:\"hw-palette\",\"data-testid\":\"palette\"}),e.appendChild(this.element),this._render(),this._libUnsub=t.getService().monomerLib.onChanged.subscribe(()=>{this._destroyed||this.refresh();}),this._themeUnsub=t.on(\"theme:change\",()=>{this._destroyed||this.refresh();}),this._nextAddUnsub=t.on(\"option:change\",o=>{this._destroyed||o.key===\"nextAdd\"&&this._updatePrimedClasses();});}refresh(){this._render();}setFilter(e){this._filter=e.trim().toLowerCase(),this._searchInput!==null&&this._searchInput.value!==e&&(this._searchInput.value=e),this._applyFilter();}setActiveTab(e){this._visibleTabs.includes(e)&&(this._activeTab=e,this._persistActiveTab(),this._applyActiveTabClasses(),this._applyFilter());}getActiveTab(){return this._activeTab}getFavorites(){let e=this._editor.getService().monomerLib,t=[];for(let n of this._favorites)this._findMonomer(e,n)!==null&&t.push(n);return t}setFavorite(e,t){let n=this._favorites.has(e);t!==n&&(t?this._favorites.add(e):this._favorites.delete(e),this._saveFavorites(),this._hidePaletteTooltips(),this._render(),this._emitFavoritesChanged());}clearFavorites(){this._favorites.size===0&&this._favoriteTriplets.length===0||(this._favorites.clear(),this._favoriteTriplets.length=0,this._saveFavorites(),this._render(),this._emitFavoritesChanged());}getFavoriteTriplets(){return this._favoriteTriplets.map(e=>({...e}))}isFavoriteTriplet(e,t,n){let o=qt({sugar:e,base:t,linker:n});return this._favoriteTriplets.some(r=>qt(r)===o)}setFavoriteTriplet(e,t,n,o){let r=qt({sugar:e,base:t,linker:n}),s=this._favoriteTriplets.findIndex(l=>qt(l)===r),a=s>=0;o!==a&&(o?this._favoriteTriplets.push({sugar:e,base:t,linker:n}):this._favoriteTriplets.splice(s,1),this._saveFavorites(),this._hidePaletteTooltips(),this._render(),this._emitFavoritesChanged());}_hidePaletteTooltips(){let e=this._doc.body;V(e.querySelector('[data-testid=\"palette-tooltip\"]')),V(e.querySelector('[data-testid=\"palette-triplet-tooltip\"]'));}_emitFavoritesChanged(){this.favoritesChanged.next({favorites:this.getFavorites(),triplets:this.getFavoriteTriplets()});}destroy(){this._destroyed||(this._destroyed=true,this._rnaBuilder!==null&&(this._rnaBuilder.destroy(),this._rnaBuilder=null),this._libUnsub(),this._themeUnsub(),this._nextAddUnsub(),this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element));}getRnaBuilder(){return this._rnaBuilder}hasActiveBiotypeFilter(){return this._activeBiotypeFilter!==null}getActiveBiotypeFilter(){return this._activeBiotypeFilter}cancelBiotypeFilter(){if(this._activeBiotypeFilter===null)return;let e=this._pickCanceller;this._teardownPickMode(),e?.();}_buildPaletteFilterHooks(){return {beginBiotypeFilter:(e,t,n)=>{this._activeBiotypeFilter!==null&&this._teardownPickMode(),this._activeBiotypeFilter=e,this._pickResolver=t,this._pickCanceller=n,this._applyFilter();let o=l=>{l.key===\"Escape\"&&this.cancelBiotypeFilter();};this._pickEscapeListener=o,this._doc.defaultView?.addEventListener(\"keydown\",o);let s=l=>{if(this._activeBiotypeFilter===null)return;let d=l.target;if(d==null)return;let c=this._activeBiotypeFilter,u=d;for(;u!==null;){let m=u.getAttribute===void 0?null:u.getAttribute(\"class\");if(m!==null){let p=m.split(/\\s+/);if(p.includes(\"hw-palette__tile\")){if((u.getAttribute(\"data-biotype\")??\"\")===c)return;break}if(p.includes(\"hw-rna-builder__slot\")){if(this._isInsideOwnPalette(u))return;break}}u=u.parentElement;}this.cancelBiotypeFilter();};this._pickOutsideClickListener=s,this._doc.addEventListener(\"mousedown\",s,true);},endBiotypeFilter:()=>this._teardownPickMode()}}_scrollActivePaneToTop(){let e=this.element.querySelector(`.hw-palette__pane[data-tab=\"${this._activeTab}\"]`);if(e===null)return;let t=e;try{if(typeof t.scrollTo==\"function\"){t.scrollTo({top:0,behavior:\"smooth\"});return}}catch{}typeof t.scrollTop==\"number\"&&(t.scrollTop=0);}_isInsideOwnPalette(e){let t=e;for(;t!==null;){if(t===this.element)return true;t=t.parentElement;}return false}_teardownPickMode(){this._activeBiotypeFilter!==null&&(this._activeBiotypeFilter=null,this._pickResolver=null,this._pickCanceller=null,this._pickEscapeListener!==null&&(this._doc.defaultView?.removeEventListener(\"keydown\",this._pickEscapeListener),this._pickEscapeListener=null),this._pickOutsideClickListener!==null&&(this._doc.removeEventListener(\"mousedown\",this._pickOutsideClickListener,true),this._pickOutsideClickListener=null),this._applyFilter());}_render(){for(this._rnaBuilder!==null&&(this._pendingRnaSelection=this._rnaBuilder.getSelection(),this._rnaBuilder.destroy(),this._rnaBuilder=null);this.element.firstChild!==null;)this.element.removeChild(this.element.firstChild);let e=this._doc.createElement(\"input\");e.setAttribute(\"type\",\"search\"),e.setAttribute(\"class\",\"hw-palette__search\"),e.setAttribute(\"placeholder\",\"Search monomers...\"),e.setAttribute(\"data-testid\",\"palette-search\"),this._filter!==\"\"&&(e.value=this._filter),e.addEventListener(\"input\",()=>this.setFilter(e.value)),this._searchInput=e,this.element.appendChild(e),this._visibleTabs=this._computeVisibleTabs(),this._visibleTabs.includes(this._activeTab)||(this._activeTab=ue);let t=g(this._doc,\"div\",{class:\"hw-palette__tabs\",role:\"tablist\",\"data-testid\":\"palette-tabs\"});for(let s of this._visibleTabs){let a=s===this._activeTab,l=g(this._doc,\"button\",{class:\"hw-palette__tab\",type:\"button\",role:\"tab\",\"aria-controls\":`hw-palette-pane-${s}`,\"aria-selected\":a?\"true\":\"false\",\"data-testid\":`palette-tab-${s}`,\"data-tab\":s,title:Gn[s]},[Gn[s]]);l.addEventListener(\"click\",()=>this.setActiveTab(s)),t.appendChild(l);}this.element.appendChild(t);let n=g(this._doc,\"div\",{class:\"hw-palette__panes\"}),o=this._theme(),r=this._editor.getService().monomerLib;for(let s of this._visibleTabs){let a=s===this._activeTab,l=g(this._doc,\"div\",{class:\"hw-palette__pane\",id:`hw-palette-pane-${s}`,role:\"tabpanel\",\"data-testid\":`palette-pane-${s}`,\"data-tab\":s,hidden:!a});s===ue?this._buildFavoritesPane(l,r,o):this._buildPolymerPane(l,s,r,o),n.appendChild(l);}this.element.appendChild(n),this._applyFilter();}_computeVisibleTabs(){let e=this._editor.getService().monomerLib,t=new Set;for(let o of e.getPolymerTypes())t.add(o);let n=[];n.push(ue);for(let o of jt)o!==ue&&t.has(o)&&n.push(o);return n}_buildFavoritesPane(e,t,n){let o=this._resolveFavoriteMonomers(t),r=this._favoriteTriplets;if(o.length===0&&r.length===0){let s=g(this._doc,\"div\",{class:\"hw-palette__placeholder\",\"data-testid\":\"palette-favorites-empty\"},[\"No favorites yet \\u2014 click the \\u2606 on any tile to add one.\"]);e.appendChild(s);return}for(let[s,a]of this._groupByPolymerAndType(o))e.appendChild(this._renderGroup(s,a));r.length>0&&e.appendChild(this._renderTripletGroup(\"RNA \\xB7 Triplets\",r,t));}_groupByPolymerAndType(e){let t=new Map;for(let s of e){let a=s.polymerType,l=s.monomerType??\"Undefined\",d=`${a}|${l}`,c=t.get(d);c===void 0&&(c={pt:a,mt:l,list:[]},t.set(d,c)),c.list.push(s);}let n=s=>{let a=jt.indexOf(s);return a<0?99:a},o={Backbone:0,Branch:1,Terminal:2,Undefined:3};return Array.from(t.values()).sort((s,a)=>n(s.pt)-n(a.pt)||(o[s.mt]??9)-(o[a.mt]??9)||s.mt.localeCompare(a.mt)).map(s=>[`${this._polymerLabel(s.pt)} \\xB7 ${s.mt}`,s.list])}_polymerLabel(e){return Gn[e]??e}_renderTripletGroup(e,t,n){let o=g(this._doc,\"div\",{class:\"hw-palette__group\",\"data-natural-analog\":e}),r=g(this._doc,\"div\",{class:\"hw-palette__group-header\",\"data-testid\":`palette-group-${e}`},[e]),s=g(this._doc,\"div\",{class:\"hw-triplet-chips\",\"data-testid\":\"palette-triplet-favorites\"});for(let a of t)s.appendChild(this._renderTripletChip(a,n));return o.appendChild(r),o.appendChild(s),o}_renderTripletChip(e,t){let n=We(e.sugar,e.base,e.linker),o=t.getMonomerSet(b.BASE).get(e.base)??null,r=$(o,b.BASE,this._theme().colorTheme),s=this.isFavoriteTriplet(e.sugar,e.base,e.linker),a=o?.name!==void 0&&o.name!==\"\"?`${n} \\u2014 ${o.name}`:n,{root:l}=Si(this._doc,{sugar:e.sugar,base:e.base,linker:e.linker,label:n,title:a,background:xt(r.background),textColor:r.text,favorite:s,showStar:this._opts.allowFavorites});return this._wireTripletChip(l,e),l}_wireTripletChip(e,t){e.addEventListener(\"mouseenter\",n=>{let o=n,r=oe(this._doc,\"palette-triplet-tooltip\",\"hw-palette-tooltip hw-triplet-tooltip\");mi(this._doc,r,{title:We(t.sugar,t.base,t.linker),parts:this._tripletTooltipParts(t),hint:\"Click to add this triplet\",rdkitTestid:\"palette-triplet-tooltip-rdkit-svg\"}),Y(r,typeof o.clientX==\"number\"?o.clientX:0,typeof o.clientY==\"number\"?o.clientY:0);}),e.addEventListener(\"mouseleave\",()=>{V(this._doc.body.querySelector('[data-testid=\"palette-triplet-tooltip\"]'));}),e.addEventListener(\"click\",n=>{let o=n.target;if(this._opts.allowFavorites&&o?.classList?.contains(\"hw-triplet-chip__star\")===true){this.setFavoriteTriplet(t.sugar,t.base,t.linker,!this.isFavoriteTriplet(t.sugar,t.base,t.linker)),n.stopPropagation();return}this._editor.placeRnaTriplet(t.sugar,t.base,t.linker);}),e.addEventListener(\"keydown\",n=>{let o=n;(o.key===\"Enter\"||o.key===\" \")&&this._editor.placeRnaTriplet(t.sugar,t.base,t.linker);});}_buildRnaDefaultChips(e){let t=this._pickSymbol(e.getMonomerSet(b.SUGAR),[\"r\",\"R\"]),n=this._pickSymbol(e.getMonomerSet(b.LINKER),[\"p\",\"P\"]),o=e.getMonomerSet(b.BASE);if(t===null||n===null)return null;let r=qe._DEFAULT_TRIPLET_BASES.filter(a=>o.has(a));if(r.length===0)return null;let s=g(this._doc,\"div\",{class:\"hw-triplet-chips hw-triplet-chips--defaults\",\"data-testid\":\"rna-default-triplets\"});for(let a of r)s.appendChild(this._renderTripletChip({sugar:t,base:a,linker:n},e));return s}_tripletTooltipParts(e){let t=this._editor.getService().monomerLib,n=(o,r,s)=>{let a=t.getMonomerSet(r).get(s)??null;return {role:o,symbol:s,...a?.name!==void 0?{name:a.name}:{},rdkitSvg:a===null?null:this._paletteRdkitSvg(a)}};return [n(\"Sugar\",b.SUGAR,e.sugar),n(\"Base\",b.BASE,e.base),n(\"Linker\",b.LINKER,e.linker)]}_pickSymbol(e,t){for(let o of t)if(e.has(o))return o;let n=e.keys().next();return n.done===true?null:n.value}_restoreRnaSelection(){let e=this._pendingRnaSelection;if(this._pendingRnaSelection=null,e===null||this._rnaBuilder===null)return;let t=this._editor.getService().monomerLib;e.sugar!==\"\"&&t.getMonomerSet(b.SUGAR).has(e.sugar)&&this._rnaBuilder.setField(\"sugar\",e.sugar),e.base!==\"\"&&t.getMonomerSet(b.BASE).has(e.base)&&this._rnaBuilder.setField(\"base\",e.base),e.linker!==\"\"&&t.getMonomerSet(b.LINKER).has(e.linker)&&this._rnaBuilder.setField(\"linker\",e.linker);}_resolveFavoriteMonomers(e){let t=[];for(let n of this._favorites){let o=this._findMonomer(e,n);o!==null&&t.push(o);}return t}_findMonomer(e,t){for(let n of e.getPolymerTypes()){let o=e.getMonomer(n,t);if(o!==null)return o}return null}_buildPolymerPane(e,t,n,o){let r=t,s=this._monomersForPolymer(r,n);if(s.length===0)return;if(r===v.RNA){this._rnaBuilder=new Kt(e,this._editor,{documentImpl:this._doc,paletteHooks:this._buildPaletteFilterHooks(),favoriteHooks:this._opts.allowFavorites?{isFavoriteTriplet:(m,p,h)=>this.isFavoriteTriplet(m,p,h),toggleFavoriteTriplet:(m,p,h)=>this.setFavoriteTriplet(m,p,h,!this.isFavoriteTriplet(m,p,h))}:null}),this._restoreRnaSelection();let c=this._buildRnaDefaultChips(n);c!==null&&e.appendChild(c);let u=this._groupRna(s);for(let[m,p]of u)p.length!==0&&e.appendChild(this._renderGroup(m,p));return}if(r===v.PEPTIDE&&this._opts.groupByNaturalAnalog){let c=this._groupByAnalog(s);for(let[u,m]of c){let p=u===\"\"?\"Other\":u;e.appendChild(this._renderGroup(p,m));}return}let a=g(this._doc,\"div\",{class:\"hw-palette__group-tiles\"}),l=this._editor.getNextAddSymbol(),d=this._sortByColor(s);for(let c of d){let u=this._biotype(c,r);a.appendChild(this._renderTile(c,u,l));}e.appendChild(a);}_renderGroup(e,t){let n=g(this._doc,\"div\",{class:\"hw-palette__group\",\"data-natural-analog\":e}),o=g(this._doc,\"div\",{class:\"hw-palette__group-header\",\"data-testid\":`palette-group-${e}`},[e]),r=g(this._doc,\"div\",{class:\"hw-palette__group-tiles\"}),s=this._editor.getNextAddSymbol(),a=this._sortByColor(t);for(let l of a){let d=this._biotype(l,l.polymerType);r.appendChild(this._renderTile(l,d,s));}return n.appendChild(o),n.appendChild(r),n}_sortByColor(e){let t=this._theme(),n=e.map((o,r)=>{let s=this._biotype(o,o.polymerType),a=$(o,s,t.colorTheme),l=Qn(a.background),d=l.s===0?1:0;return {m:o,idx:r,h:l.h,s:l.s,l:l.l,isGrey:d}});return n.sort((o,r)=>o.isGrey!==r.isGrey?o.isGrey-r.isGrey:o.h!==r.h?o.h-r.h:o.s!==r.s?o.s-r.s:o.l!==r.l?o.l-r.l:o.idx-r.idx),n.map(o=>o.m)}_monomersForPolymer(e,t){let n=t.getMonomerSymbolsByType(e),o=[];for(let r of n){let s=t.getMonomer(e,r);s!==null&&o.push(s);}return o.sort((r,s)=>r.symbol.localeCompare(s.symbol)),o}_groupByAnalog(e){let t=new Map;for(let r of e){let s=r.naturalAnalog??\"\",a=t.get(s);a===void 0&&(a=[],t.set(s,a)),a.push(r);}let n=[],o=Array.from(t.keys()).sort((r,s)=>r===\"\"&&s!==\"\"?1:s===\"\"&&r!==\"\"?-1:r.localeCompare(s));for(let r of o)n.push([r,t.get(r)]);return new Map(n)}_groupRna(e){let t=[],n=[],o=[],r=[];for(let a of e){let l=ee(a);l===b.SUGAR?t.push(a):l===b.BASE?n.push(a):l===b.LINKER?o.push(a):r.push(a);}let s=new Map;return s.set(\"Backbones\",t),s.set(\"Bases\",n),s.set(\"Linkers\",o),r.length>0&&s.set(\"Other\",r),s}_renderTile(e,t,n){let o=this._favorites.has(e.symbol),r=n!==null&&n.symbol===e.symbol&&n.biotype===t,{root:s,star:a}=Ti(this._doc,{monomer:e,biotype:t,theme:this._theme(),favorite:o,primed:r});return this._wireTile(s,a,e,t),s}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}_paletteRdkitSvg(e){let t=e.smiles;if(t===void 0||t===\"\")return null;let n=this._rdkit();if(n===null)return null;let o=`${e.polymerType}:${e.symbol}`;if(this._paletteRdkitCache.has(o))return this._paletteRdkitCache.get(o)??null;let r=ye(n,t,220,140);if(this._paletteRdkitCache.size>=qe._PALETTE_RDKIT_CACHE_LIMIT){let s=this._paletteRdkitCache.keys().next().value;s!==void 0&&this._paletteRdkitCache.delete(s);}return this._paletteRdkitCache.set(o,r),r}_wireTile(e,t,n,o){e.addEventListener(\"mouseenter\",r=>{let s=r,a=oe(this._doc,\"palette-tooltip\",\"hw-palette-tooltip\");Me(this._doc,a,{symbol:n.symbol,name:n.name??\"\",rdkitSvg:this._paletteRdkitSvg(n),rdkitTestid:\"palette-tooltip-rdkit-svg\"});let l=typeof s.clientX==\"number\"?s.clientX:0,d=typeof s.clientY==\"number\"?s.clientY:0;Y(a,l,d);}),e.addEventListener(\"mouseleave\",()=>{V(this._doc.body.querySelector('[data-testid=\"palette-tooltip\"]'));}),e.addEventListener(\"click\",r=>{let s=r.target;if(this._opts.allowFavorites&&s!==void 0&&s?.classList?.contains(\"hw-palette__star\")===true){this.setFavorite(n.symbol,!this._favorites.has(n.symbol)),r.stopPropagation();return}if(this._activeBiotypeFilter!==null&&this._activeBiotypeFilter===o){let d=this._pickResolver;this._teardownPickMode(),d?.(n.symbol),this._scrollActivePaneToTop(),r.stopPropagation();return}let a=this._editor.getSelection();if(a.atoms.size>0){let d=this._editor.getMol(),c=[];for(let m of a.atoms){let p=d.atoms.find(h=>h.id===m);p!==void 0&&c.push(p);}if(c.length>0&&c.every(m=>m.biotype===o)){this._editor.replaceMonomers(c,n.symbol),r.stopPropagation();return}this._editor.fire(\"editor:status\",{message:`Cannot bulk-replace ${c.length} selected atom(s) with ${n.symbol}: selection contains incompatible biotypes for ${o}.`,severity:\"warn\",durationMs:3e3}),r.stopPropagation();return}let l=this._editor.getNextAddSymbol();if(l!==null&&l.symbol===n.symbol&&l.biotype===o){this._editor.setNextAddSymbol(null),this._updatePrimedClasses();return}this._editor.setNextAddSymbol(n.symbol,o),this._updatePrimedClasses();}),e.addEventListener(\"dragstart\",r=>{let s=r.dataTransfer;if(s!=null)try{s.setData(\"application/x-hwe-monomer\",JSON.stringify({symbol:n.symbol,biotype:o})),s.effectAllowed=\"copy\";}catch{}V(this._doc.body.querySelector('[data-testid=\"palette-tooltip\"]')),this._editor.startPaletteDrag(n.symbol,o);});}_biotype(e,t){let n=ee(e);if(n!==null)return n;switch(t){case v.PEPTIDE:return b.AA;case v.RNA:return b.SUGAR;case v.CHEM:return b.CHEM;case v.BLOB:return b.BLOB;default:return b.CHEM}}_theme(){let e=this._editor;return typeof e._currentTheme==\"function\"?e._currentTheme():this._editor.getService().theme}_applyFilter(){let e=this._filter,t=this._activeBiotypeFilter,n=this.element.querySelector(`.hw-palette__pane[data-tab=\"${this._activeTab}\"]`),o=(n??this.element).querySelectorAll(\".hw-palette__tile\");for(let a=0;a<o.length;a++){let l=o[a],d=(l.getAttribute(\"data-symbol\")??\"\").toLowerCase(),c=(l.getAttribute(\"title\")??\"\").toLowerCase(),u=l.getAttribute(\"data-biotype\")??\"\",h=(e===\"\"||d.indexOf(e)>=0||c.indexOf(e)>=0)&&(t===null||u===t);l.style.display=h?\"\":\"none\";}let r=(n??this.element).querySelectorAll(\".hw-triplet-chip\");for(let a=0;a<r.length;a++){let l=r[a],d=[l.getAttribute(\"data-triplet\")??\"\",l.getAttribute(\"data-sugar\")??\"\",l.getAttribute(\"data-base\")??\"\",l.getAttribute(\"data-linker\")??\"\"].join(\" \").toLowerCase(),c=(e===\"\"||d.indexOf(e)>=0)&&t===null;l.style.display=c?\"\":\"none\";}let s=(n??this.element).querySelectorAll(\".hw-palette__group\");for(let a=0;a<s.length;a++){let l=s[a],d=l.querySelectorAll(\".hw-palette__tile, .hw-triplet-chip\"),c=false;for(let u=0;u<d.length;u++)if(d[u].style.display!==\"none\"){c=true;break}c?(l.removeAttribute(\"hidden\"),l.removeAttribute(\"data-section-empty\")):(l.setAttribute(\"hidden\",\"\"),l.setAttribute(\"data-section-empty\",\"true\"));}}_updatePrimedClasses(){let e=this._editor.getNextAddSymbol(),t=this.element.querySelectorAll(\".hw-palette__tile\");for(let n=0;n<t.length;n++){let o=t[n],r=o.getAttribute(\"data-symbol\")??\"\",s=o.getAttribute(\"data-biotype\")??\"\",a=e!==null&&e.symbol===r&&e.biotype===s,d=(o.getAttribute(\"class\")??\"\").split(/\\s+/).filter(c=>c!==\"hw-palette__tile--primed\").join(\" \");o.setAttribute(\"class\",a?`${d} hw-palette__tile--primed`:d),o.setAttribute(\"aria-pressed\",a?\"true\":\"false\");}}_applyActiveTabClasses(){let e=this.element.querySelectorAll(\".hw-palette__tab\");for(let n=0;n<e.length;n++){let o=e[n],r=o.getAttribute(\"data-tab\")??\"\";o.setAttribute(\"aria-selected\",r===this._activeTab?\"true\":\"false\");}let t=this.element.querySelectorAll(\".hw-palette__pane\");for(let n=0;n<t.length;n++){let o=t[n];(o.getAttribute(\"data-tab\")??\"\")===this._activeTab?o.removeAttribute(\"hidden\"):o.setAttribute(\"hidden\",\"\");}}_localStorage(){if(!this._opts.allowFavorites)return null;let e=this._doc.defaultView;if(e==null)return null;try{return e.localStorage??null}catch{return null}}_resolveInitialTab(e){if(e!==void 0&&jt.includes(e))return e;let t=this._localStorage();if(t!==null)try{let n=t.getItem(Bi);if(n!==null&&jt.includes(n))return n}catch{}return ue}_persistActiveTab(){let e=this._localStorage();if(e!==null)try{e.setItem(Bi,this._activeTab);}catch{}}_loadFavorites(){let e=this._localStorage();if(e!==null){try{let t=e.getItem(Li);if(t!==null&&t!==\"\"){let n=JSON.parse(t),o=this._extractSymbols(n);for(let r of o)this._favorites.add(r);for(let r of this._extractTriplets(n))this._favoriteTriplets.push(r);return}}catch{}try{let t=e.getItem(Ta);if(t===null||t===\"\")return;let n=JSON.parse(t);if(Array.isArray(n)){for(let o of n){if(typeof o!=\"string\")continue;let r=o.indexOf(\"|\"),s=r>=0?o.slice(r+1):o;s!==\"\"&&this._favorites.add(s);}this._saveFavorites();}}catch{}}}_extractSymbols(e){if(Array.isArray(e)){let t=[];for(let n of e)typeof n==\"string\"&&t.push(n);return t}if(e!==null&&typeof e==\"object\"){let t=e;if(Array.isArray(t.symbols)){let n=[];for(let o of t.symbols)typeof o==\"string\"&&n.push(o);return n}}return []}_extractTriplets(e){if(e===null||typeof e!=\"object\")return [];let t=e;if(!Array.isArray(t.triplets))return [];let n=[];for(let o of t.triplets){if(o===null||typeof o!=\"object\")continue;let r=o;typeof r.sugar==\"string\"&&typeof r.base==\"string\"&&typeof r.linker==\"string\"&&n.push({sugar:r.sugar,base:r.base,linker:r.linker});}return n}_saveFavorites(){let e=this._localStorage();if(e!==null)try{let t={symbols:Array.from(this._favorites)};this._favoriteTriplets.length>0&&(t.triplets=this._favoriteTriplets.map(n=>({...n}))),e.setItem(Li,JSON.stringify(t));}catch{}}};qe._DEFAULT_TRIPLET_BASES=[\"A\",\"C\",\"G\",\"U\",\"T\"],qe._PALETTE_RDKIT_CACHE_LIMIT=256;var lt=qe;var U='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">',Sa={new:`${U}<path d=\"M13 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9z\"/><path d=\"M13 3v6h6\"/><line x1=\"12\" y1=\"12.5\" x2=\"12\" y2=\"17.5\"/><line x1=\"9.5\" y1=\"15\" x2=\"14.5\" y2=\"15\"/></svg>`,open:`${U}<path d=\"m6 14 1.45-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.55 6a2 2 0 0 1-1.94 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H18a2 2 0 0 1 2 2v2\"/></svg>`,save:`${U}<rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"/><path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"/><path d=\"m9 14 2 2 4-4\"/></svg>`,undo:`${U}<path d=\"M3 12a9 9 0 1 0 9-9 9.7 9.7 0 0 0-6.7 2.8L3 8\"/><path d=\"M3 3v5h5\"/></svg>`,redo:`${U}<path d=\"M21 12a9 9 0 1 1-9-9 9.7 9.7 0 0 1 6.7 2.8L21 8\"/><path d=\"M21 3v5h-5\"/></svg>`,eraser:`${U}<path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\"/><path d=\"M22 21H7\"/><path d=\"m5 11 9 9\"/></svg>`,select:`${U}<path d=\"m4 4 7.07 17 2.51-7.39L21 11.07z\"/></svg>`,hbond:`${U}<path d=\"M9 17H7A5 5 0 0 1 7 7h2\"/><path d=\"M15 7h2a5 5 0 1 1 0 10h-2\"/><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"/></svg>`,\"zoom-in\":`${U}<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>`,\"zoom-out\":`${U}<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"/></svg>`,fit:`${U}<polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"/><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"/></svg>`,move:`${U}<polyline points=\"5 9 2 12 5 15\"/><polyline points=\"9 5 12 2 15 5\"/><polyline points=\"15 19 12 22 9 19\"/><polyline points=\"19 9 22 12 19 15\"/><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\"/></svg>`,clean:`${U}<path d=\"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72Z\"/><path d=\"m14 7 3 3\"/><path d=\"M5 6v4\"/><path d=\"M19 14v4\"/><path d=\"M10 2v2\"/><path d=\"M7 8H3\"/><path d=\"M21 16h-4\"/><path d=\"M11 3H9\"/></svg>`,find:`${U}<circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>`,theme:`${U}<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 3a9 9 0 0 1 0 18z\" fill=\"currentColor\" stroke=\"none\"/></svg>`},Ea={new:\"New \\u2014 clear the canvas\",open:\"Open \\u2014 paste a HELM string\",save:\"Save \\u2014 copy HELM string to clipboard\",undo:\"Undo last action\",redo:\"Redo last undone action\",eraser:\"Eraser \\u2014 click an atom or bond to delete it\",select:\"Select mode (default)\",hbond:\"H-Bond mode \\u2014 drag between two RNA bases to add a Watson-Crick pair\",\"zoom-in\":\"Zoom in\",\"zoom-out\":\"Zoom out\",fit:\"Fit to content \\u2014 reset zoom and pan\",move:\"Move/Pan mode \\u2014 drag the canvas to scroll\",clean:\"Clean layout \\u2014 re-run automatic layout\",find:\"Find / Replace monomer\",theme:\"Toggle dark / light theme\"},Ri=[{id:\"new\",label:\"New\",icon:\"New\"},{id:\"open\",label:\"Open\",icon:\"Open\"},{id:\"save\",label:\"Save\",icon:\"Save\"},{id:\"undo\",label:\"Undo\",icon:\"\\u21BA\",shortcut:\"Ctrl+Z\",separator:true},{id:\"redo\",label:\"Redo\",icon:\"\\u21BB\",shortcut:\"Ctrl+Y\"},{id:\"eraser\",label:\"Eraser\",icon:\"Eraser\",separator:true},{id:\"select\",label:\"Select\",icon:\"Select\"},{id:\"hbond\",label:\"H-Bond\",icon:\"H-Bond\"},{id:\"zoom-in\",label:\"Zoom In\",icon:\"+\",shortcut:\"Ctrl++\",separator:true},{id:\"zoom-out\",label:\"Zoom Out\",icon:\"\\u2212\",shortcut:\"Ctrl+\\u2212\"},{id:\"fit\",label:\"Fit\",icon:\"Fit\",shortcut:\"0\"},{id:\"move\",label:\"Move\",icon:\"Move\"},{id:\"clean\",label:\"Clean\",icon:\"Clean\",separator:true},{id:\"find\",label:\"Find\",icon:\"Find\",shortcut:\"Ctrl+F\"},{id:\"theme\",label:\"Theme\",icon:\"Theme\",separator:true}],dt=class{constructor(e,t,n){this._buttons=new Map;this._unsubs=[];this._destroyed=false;this._editor=t,this._doc=n?.documentImpl??S(e);let o=n?.buttons??Ri;this.element=g(this._doc,\"div\",{class:\"hw-toolbar\",\"data-testid\":\"toolbar\"}),e.appendChild(this.element);for(let s of o){if(s.separator===true){let l=g(this._doc,\"span\",{class:\"hw-toolbar__separator\"});this.element.appendChild(l);}let a=this._buildButton(s);this.element.appendChild(a),this._buttons.set(s.id,a);}let r=()=>this._refreshHistoryState();this._unsubs.push(t.on(\"mol:changed\",r)),this._unsubs.push(t.on(\"helm:changed\",r)),r(),this._reflectMode(),this._unsubs.push(t.on(\"option:change\",s=>{s.key===\"mode\"&&this._reflectMode();}));}setButtonEnabled(e,t){let n=this._buttons.get(e);n!==void 0&&(t?n.removeAttribute(\"disabled\"):n.setAttribute(\"disabled\",\"\"));}destroy(){if(!this._destroyed){this._destroyed=true,this._hideTip();for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_buildButton(e){let t=this._doc.createElement(\"button\");t.setAttribute(\"class\",\"hw-toolbar__btn\"),t.setAttribute(\"type\",\"button\"),t.setAttribute(\"data-action\",e.id),t.setAttribute(\"data-testid\",`toolbar-${e.id}`);let n=Ea[e.id]??e.label,o=e.shortcut!==void 0?`${n} (${e.shortcut})`:n;t.setAttribute(\"data-tooltip\",o),t.setAttribute(\"aria-label\",n),t.addEventListener(\"mouseenter\",s=>{let a=s;this._showTip(o,typeof a.clientX==\"number\"?a.clientX:0,typeof a.clientY==\"number\"?a.clientY:0);}),t.addEventListener(\"mouseleave\",()=>this._hideTip()),t.addEventListener(\"click\",()=>this._hideTip());let r=Sa[e.id];if(r!==void 0){let s=this._doc.createElement(\"span\");s.setAttribute(\"class\",\"hw-toolbar__btn-icon\"),s.setAttribute(\"aria-hidden\",\"true\"),s.innerHTML=r,t.appendChild(s);}else {let s=e.icon??e.label;t.appendChild(this._doc.createTextNode(s));}return t.addEventListener(\"click\",()=>this._invoke(e.id)),t}_showTip(e,t,n){let o=oe(this._doc,\"toolbar-tooltip\",\"hw-toolbar-tooltip\");for(;o.firstChild!==null;)o.removeChild(o.firstChild);o.appendChild(this._doc.createTextNode(e)),Y(o,t,n);}_hideTip(){V(this._doc.body.querySelector('[data-testid=\"toolbar-tooltip\"]'));}_invoke(e){let t=false;this._editor.fire(\"key:command\",{command:e,preventDefault:()=>{t=true;}}),!t&&this._execute(e);}_execute(e){switch(e){case \"new\":this._editor.setHelm(\"\");return;case \"open\":{let t=this._doc.defaultView;if(t!=null&&typeof t.prompt==\"function\"){let n=t.prompt(\"Enter HELM string\");n!==null&&this._editor.setHelm(n);}return}case \"save\":{let t=this._editor.getHelm();this._editor.fire(\"clipboard:copy\",{format:\"helm\",payload:t});return}case \"undo\":this._editor.undo();return;case \"redo\":this._editor.redo();return;case \"eraser\":{if(!this._editor.getSelection().isEmpty){this._editor.deleteSelection();return}this._editor.setMode(\"eraser\");return}case \"select\":case \"hbond\":case \"move\":this._editor.setMode(e);return;case \"zoom-in\":this._editor.zoom(1.1,this._molCenterOrUndefined());return;case \"zoom-out\":this._editor.zoom(1/1.1,this._molCenterOrUndefined());return;case \"fit\":this._editor.fitToContent();return;case \"clean\":this._editor.cleanLayout();return;case \"find\":this._editor.openFindReplace();return;case \"theme\":{let t=this._editor,n=typeof t._currentTheme==\"function\"?t._currentTheme():null,o=n!==null&&n.name===\"dark\";this._editor.setTheme(o?H:En);return}default:return}}_refreshHistoryState(){this.setButtonEnabled(\"undo\",this._editor.canUndo()),this.setButtonEnabled(\"redo\",this._editor.canRedo());}_molCenterOrUndefined(){let e=this._editor.getMol();if(e.atoms.length===0)return;let t=e.atoms[0].p.x,n=t,o=e.atoms[0].p.y,r=o;for(let s=1;s<e.atoms.length;s++){let a=e.atoms[s].p;a.x<t&&(t=a.x),a.x>n&&(n=a.x),a.y<o&&(o=a.y),a.y>r&&(r=a.y);}return {x:(t+n)/2,y:(o+r)/2}}_reflectMode(){let e=this._editor.getMode();for(let t of [\"select\",\"eraser\",\"hbond\",\"move\"]){let n=this._buttons.get(t);if(n===void 0)continue;let r=(n.getAttribute(\"class\")??\"\").split(/\\s+/).filter(s=>s!==\"hw-toolbar__btn--active\").join(\" \");n.setAttribute(\"class\",t===e?`${r} hw-toolbar__btn--active`:r);}}};var ct=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._editor=t,this._doc=n?.documentImpl??S(e),this._content=g(this._doc,\"pre\",{class:\"hw-pane__content hw-pane__sequence\",\"data-testid\":\"sequence-pane-content\"}),this.element=g(this._doc,\"div\",{class:\"hw-pane hw-pane--sequence\",\"data-testid\":\"pane-sequence\"},[this._content]),e.appendChild(this.element),this.refresh(),this._unsubs.push(t.on(\"helm:changed\",()=>this.refresh())),this._unsubs.push(t.on(\"mol:changed\",()=>this.refresh()));}refresh(){if(this._destroyed)return;let e=this._compute();for(;this._content.firstChild!==null;)this._content.removeChild(this._content.firstChild);this._content.appendChild(this._doc.createTextNode(e));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_compute(){let e=this._editor.getMol(),t=[],n;for(let o of e.atoms){let r=o.bio.chainId;n!==void 0&&r!==n&&t.push(\"|\"),n=r;let s=o.monomer?.naturalAnalog;t.push(s!==void 0&&s!==\"\"?s:o.symbol);}return t.join(\"\")}};var ut=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._suppressNext=false;this._editor=t,this._doc=n?.documentImpl??S(e),this._input=g(this._doc,\"div\",{class:\"hw-pane__content hw-pane__notation\",contenteditable:\"true\",spellcheck:\"false\",\"data-testid\":\"notation-pane-content\"}),this._error=g(this._doc,\"div\",{class:\"hw-pane__error\",\"data-testid\":\"notation-pane-error\"}),this.element=g(this._doc,\"div\",{class:\"hw-pane hw-pane--notation\",\"data-testid\":\"pane-helm\"},[this._input,this._error]),e.appendChild(this.element),this.refresh(),this._input.addEventListener(\"blur\",()=>this._commit()),this._input.addEventListener(\"keydown\",o=>{o.key===\"Enter\"&&(o.preventDefault(),o.stopPropagation(),o.stopImmediatePropagation(),this._commit());}),this._unsubs.push(t.on(\"helm:changed\",()=>{if(this._suppressNext){this._suppressNext=false;return}this.refresh();})),this._unsubs.push(t.on(\"mol:changed\",()=>this.refresh()));}refresh(){if(this._destroyed)return;let e=this._editor.getHelm();for(;this._input.firstChild!==null;)this._input.removeChild(this._input.firstChild);this._input.appendChild(this._doc.createTextNode(e)),this._clearError();}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_commit(){if(this._destroyed)return;let e=(this._input.textContent??\"\").trim(),t=this._editor.getHelm();if(e===t){this._clearError();return}let r=this._editor.getService().validate(e).filter(s=>s.severity===\"error\");if(r.length>0){this._showError(r.map(s=>s.message).join(\"; \"));return}this._clearError(),this._suppressNext=true,this._editor.setHelm(e);}_showError(e){for(;this._error.firstChild!==null;)this._error.removeChild(this._error.firstChild);this._error.appendChild(this._doc.createTextNode(e)),this._error.setAttribute(\"class\",\"hw-pane__error hw-pane__error--visible\");}_clearError(){for(;this._error.firstChild!==null;)this._error.removeChild(this._error.firstChild);this._error.setAttribute(\"class\",\"hw-pane__error\");}};var Ca=1e3,mt=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._editor=t,this._doc=n?.documentImpl??S(e),this._body=g(this._doc,\"div\",{class:\"hw-pane__content hw-pane__properties\",\"data-testid\":\"properties-pane-content\"}),this.element=g(this._doc,\"div\",{class:\"hw-pane hw-pane--properties\",\"data-testid\":\"pane-properties\"},[this._body]),e.appendChild(this.element),this.refresh(),this._unsubs.push(t.on(\"helm:changed\",()=>this.refresh())),this._unsubs.push(t.on(\"mol:changed\",()=>this.refresh()));}refresh(){if(this._destroyed)return;for(;this._body.firstChild!==null;)this._body.removeChild(this._body.firstChild);let e=this._editor.getHelm();if(e.length>Ca){this._body.appendChild(g(this._doc,\"div\",{class:\"hw-pane__placeholder\"},[\"(too long)\"]));return}let t=this._editor.getService(),n=\"\",o=0,r=0;try{let s=t.getFormula(e);n=La(s.elements),o=s.mw;}catch{n=\"\\u2014\";}try{o=t.getMolWeight(e);}catch{}try{r=t.getExtinctionCoefficient(e);}catch{}this._body.appendChild(this._makeRow(\"Formula\",n,\"formula\")),this._body.appendChild(this._makeRow(\"Molecular Weight\",o===0?\"\\u2014\":o.toFixed(2),\"mw\")),this._body.appendChild(this._makeRow(\"Extinction Coefficient\",r===0?\"\\u2014\":r.toFixed(0),\"extinction\"));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_makeRow(e,t,n){let o=g(this._doc,\"span\",{class:\"hw-pane__prop-label\"},[e]),r=g(this._doc,\"span\",{class:\"hw-pane__prop-value\",\"data-testid\":`properties-${n}`},[t]);return g(this._doc,\"div\",{class:\"hw-pane__prop-row\"},[o,r])}};function La(i){let e=Array.from(i.keys()).sort((n,o)=>n===o?0:n===\"C\"?-1:o===\"C\"?1:n===\"H\"?-1:o===\"H\"?1:n.localeCompare(o)),t=\"\";for(let n of e){let o=i.get(n);o===void 0||o===0||(t+=o===1?n:`${n}${o}`);}return t===\"\"?\"\\u2014\":t}var pt=class{constructor(e,t,n){this._unsubs=[];this._destroyed=false;this._refreshToken=0;this._editor=t,this._doc=n?.documentImpl??S(e),this._content=g(this._doc,\"pre\",{class:\"hw-pane__content hw-pane__atomic\",\"data-testid\":\"atomic-pane-content\"}),this.element=g(this._doc,\"div\",{class:\"hw-pane hw-pane--atomic\",\"data-testid\":\"pane-atomic\"},[this._content]),e.appendChild(this.element),this.refresh(),this._unsubs.push(t.on(\"helm:changed\",()=>{this.refresh();}));}async refresh(){if(this._destroyed)return;let e=++this._refreshToken,t=this._editor.getHelm(),n=this._editor.getService();if(!n.hasAtomicMolfileProvider()){this._render(\"Atomic structure unavailable\");return}try{let o=await n.getAtomicMolfile(t);if(this._destroyed||e!==this._refreshToken)return;this._render(o);}catch(o){if(this._destroyed||e!==this._refreshToken)return;let r=o instanceof Error?o.message:String(o);this._render(`Atomic structure unavailable: ${r}`);}}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_render(e){for(;this._content.firstChild!==null;)this._content.removeChild(this._content.firstChild);this._content.appendChild(this._doc.createTextNode(e));}};function Yt(i){return i.toLowerCase().replace(/[^a-z0-9]+/g,\"-\").replace(/^-|-$/g,\"\")}var ht=class{constructor(e,t,n,o,r){this._unsubs=[];this._destroyed=false;this._active=false;this._dirty=true;this._refreshToken=0;this._editor=t,this._provider=o,this.name=n,this._doc=r?.documentImpl??S(e);let s=Yt(n);this._content=g(this._doc,\"div\",{class:\"hw-pane__content hw-pane__extra\",\"data-testid\":`extra-pane-content-${s}`}),this.element=g(this._doc,\"div\",{class:\"hw-pane hw-pane--extra\",\"data-testid\":`pane-extra-${s}`},[this._content]),e.appendChild(this.element),this._unsubs.push(t.on(\"helm:changed\",()=>{this._dirty=true,this._active&&this.refresh();}));}setActive(e){this._active=e,e&&this._dirty&&this.refresh();}async refresh(){if(this._destroyed)return;let e=++this._refreshToken;this._dirty=false;let t=this._editor.getHelm();try{let n=await this._provider(t);if(this._destroyed||e!==this._refreshToken)return;this._mount(n);}catch(n){if(this._destroyed||e!==this._refreshToken)return;let o=n instanceof Error?n.message:String(n);this._renderText(`Pane \"${this.name}\" failed: ${o}`);}}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element);}}_mount(e){for(;this._content.firstChild!==null;)this._content.removeChild(this._content.firstChild);this._content.appendChild(e);}_renderText(e){for(;this._content.firstChild!==null;)this._content.removeChild(this._content.firstChild);this._content.appendChild(this._doc.createTextNode(e));}};var Ba=\"extra:\";function Xt(i){return Ba+i}var Ra=[{id:\"sequence\",label:\"Sequence\"},{id:\"helm\",label:\"HELM\"},{id:\"properties\",label:\"Properties\"},{id:\"atomic\",label:\"Atomic Structure\"}],ft=class{constructor(e,t){this._paneByName=new Map;this._tabsByName=new Map;this._unsubs=[];this._activePane=\"helm\";this._destroyed=false;this._statusModeNode=null;this._statusMessageNode=null;this._statusMessageTimeout=null;this._host=e,this._doc=t.documentImpl??S(e);let o=(t.theme??H).name===\"dark\"?\"hw-app hw-app--dark\":\"hw-app\";this.element=g(this._doc,\"div\",{class:o,\"data-testid\":\"app-root\"}),this._toolbarHost=g(this._doc,\"div\",{class:\"hw-app__toolbar\"}),this._paletteHost=g(this._doc,\"div\",{class:\"hw-app__palette\"}),this._canvasHost=g(this._doc,\"div\",{class:\"hw-app__canvas\",\"data-testid\":\"canvas-host\"});let r=g(this._doc,\"div\",{class:\"hw-app__main\"},[this._paletteHost,this._canvasHost]);this._tabsHost=g(this._doc,\"div\",{class:\"hw-app__tabs\",role:\"tablist\"}),this._paneBody=g(this._doc,\"div\",{class:\"hw-app__pane-body\"});let s=g(this._doc,\"div\",{class:\"hw-app__panes\"},[this._tabsHost,this._paneBody]);this.element.appendChild(this._toolbarHost),this.element.appendChild(r),this.element.appendChild(s),e.appendChild(this.element);let a={service:t.service};t.initialHelm!==void 0&&(a.initialHelm=t.initialHelm),t.width!==void 0&&(a.width=t.width),t.height!==void 0&&(a.height=t.height),this.canvas=new rt(this._canvasHost,a),t.theme!==void 0&&this.canvas.setTheme(t.theme);let l={documentImpl:this._doc};t.toolbarButtons!==void 0&&(l.buttons=t.toolbarButtons),this.toolbar=new dt(this._toolbarHost,this.canvas,l),this.palette=new lt(this._paletteHost,this.canvas,{documentImpl:this._doc,...t.paletteOptions}),this.sequencePane=new ct(this._paneBody,this.canvas,{documentImpl:this._doc}),this.notationPane=new ut(this._paneBody,this.canvas,{documentImpl:this._doc}),this.propertiesPane=new mt(this._paneBody,this.canvas,{documentImpl:this._doc}),t.service.hasAtomicMolfileProvider()?this.atomicStructurePane=new pt(this._paneBody,this.canvas,{documentImpl:this._doc}):this.atomicStructurePane=null,this._paneByName.set(\"sequence\",this.sequencePane.element),this._paneByName.set(\"helm\",this.notationPane.element),this._paneByName.set(\"properties\",this.propertiesPane.element),this.atomicStructurePane!==null&&this._paneByName.set(\"atomic\",this.atomicStructurePane.element);let d=[];for(let[p,h]of t.service.getExtraPanes()){let f=new ht(this._paneBody,this.canvas,p,h,{documentImpl:this._doc});d.push(f),this._paneByName.set(Xt(p),f.element);}this.extraPanes=d;let c=this._resolveVisiblePanes(t),u=[];for(let p of c){let h=Ra.find(f=>f.id===p);h!==void 0&&u.push({id:h.id,label:h.label,testid:`tab-${h.id}`});}for(let p of d)u.push({id:Xt(p.name),label:p.name,testid:`tab-extra-${Yt(p.name)}`});for(let{id:p,label:h,testid:f}of u){let y=this._doc.createElement(\"button\");y.setAttribute(\"type\",\"button\"),y.setAttribute(\"class\",\"hw-app__tab\"),y.setAttribute(\"role\",\"tab\"),y.setAttribute(\"data-pane\",p),y.setAttribute(\"data-testid\",f),y.appendChild(this._doc.createTextNode(h)),y.addEventListener(\"click\",()=>this.activatePane(p)),this._tabsHost.appendChild(y),this._tabsByName.set(p,y);}let m=c.includes(\"helm\")?\"helm\":c[0]??\"helm\";this.activatePane(m),this._unsubs.push(this.canvas.on(\"theme:change\",p=>this._applyTheme(p.theme))),this._buildStatusBar(),this._applyMode(this.canvas.getMode()),this._unsubs.push(this.canvas.on(\"option:change\",p=>{p.key===\"mode\"&&this._applyMode(p.newValue),p.key===\"nextAdd\"&&this._refreshStatus();})),this._unsubs.push(this.canvas.on(\"mol:changed\",()=>this._refreshStatus())),this._unsubs.push(this.canvas.on(\"helm:changed\",()=>this._refreshStatus())),this._unsubs.push(this.canvas.on(\"editor:status\",p=>{this._showStatusMessage(p.message,p.severity,p.durationMs);})),this._unsubs.push(this.canvas.on(\"monomer:contextmenu\",p=>{p.preventDefault(),this.canvas.openAtomProps(p.atom);})),this._unsubs.push(this.canvas.on(\"bond:contextmenu\",p=>{p.preventDefault(),this.canvas.openBondProps(p.bond);})),this._onDocKeydown=p=>this._handleEscape(p),this._doc.addEventListener(\"keydown\",this._onDocKeydown,true);}_handleEscape(e){let t=e;t.key===\"Escape\"&&(Ot(this._doc),X.closeTopmost()&&(t.stopImmediatePropagation?.(),t.preventDefault?.()));}_buildStatusBar(){let e=g(this._doc,\"div\",{class:\"hw-status-bar\",\"data-testid\":\"status-bar\"}),t=g(this._doc,\"span\",{class:\"hw-status-bar__mode\",\"data-testid\":\"status-mode\"}),n=g(this._doc,\"span\",{class:\"hw-status-bar__message\",\"data-testid\":\"status-message\",role:\"status\",\"aria-live\":\"polite\"});e.appendChild(t),e.appendChild(n),this._canvasHost.appendChild(e),this._statusModeNode=t,this._statusMessageNode=n,this._refreshStatus();}_refreshStatus(){let e=this._statusModeNode;if(e===null)return;let t=this.canvas.getMode(),n=this.canvas.getNextAddSymbol();for(;e.firstChild!==null;)e.removeChild(e.firstChild);if(n===null){e.appendChild(this._doc.createTextNode(`Mode: ${t} | Next add: none`));return}e.appendChild(this._doc.createTextNode(`Mode: ${t} | Next add: `));let o=g(this._doc,\"span\",{class:\"hw-status-bar__next-add-symbol\",\"data-testid\":\"status-next-add-symbol\"},[n.symbol]);e.appendChild(o);let r=g(this._doc,\"button\",{type:\"button\",class:\"hw-status-bar__next-add-clear\",\"data-testid\":\"status-next-add-clear\",\"aria-label\":\"Clear next-add monomer\",title:\"Clear (Esc)\"},[\"\\xD7\"]);r.addEventListener(\"click\",s=>{s.preventDefault(),s.stopPropagation(),this.canvas.setNextAddSymbol(null);}),e.appendChild(r);}_showStatusMessage(e,t,n){let o=this._statusMessageNode;if(o!==null){for(this._statusMessageTimeout!==null&&(clearTimeout(this._statusMessageTimeout),this._statusMessageTimeout=null);o.firstChild!==null;)o.removeChild(o.firstChild);o.appendChild(this._doc.createTextNode(e)),o.setAttribute(\"data-severity\",t),n>0&&(this._statusMessageTimeout=setTimeout(()=>{let r=this._statusMessageNode;if(r!==null){for(;r.firstChild!==null;)r.removeChild(r.firstChild);r.removeAttribute(\"data-severity\"),this._statusMessageTimeout=null;}},n));}}_applyMode(e){let t=this._canvasHost.querySelector(\".hw-editor-view\");if(t===null)return;let o=(t.getAttribute(\"class\")??\"\").split(/\\s+/).filter(r=>!r.startsWith(\"hw-editor-view--\")).join(\" \");t.setAttribute(\"class\",`${o} hw-editor-view--${e}`.trim()),this._refreshStatus();}setHelm(e){this.canvas.setHelm(e);}getHelm(){return this.canvas.getHelm()}on(e,t){return this.canvas.on(e,t)}activatePane(e){if(!(!this._paneByName.has(e)&&!this._tabsByName.has(e))){this._activePane=e;for(let[t,n]of this._paneByName.entries())n.style.display=t===e?\"\":\"none\";for(let[t,n]of this._tabsByName.entries()){let r=(n.getAttribute(\"class\")??\"\").split(/\\s+/).filter(s=>s!==\"hw-app__tab--active\").join(\" \");n.setAttribute(\"class\",t===e?`${r} hw-app__tab--active`:r);}for(let t of this.extraPanes)t.setActive(this._activePane===Xt(t.name));}}getActivePane(){return this._activePane}destroy(){if(!this._destroyed){this._destroyed=true,this._statusMessageTimeout!==null&&(clearTimeout(this._statusMessageTimeout),this._statusMessageTimeout=null),this._doc.removeEventListener(\"keydown\",this._onDocKeydown,true);for(let e of this._unsubs)e();for(let e of this.extraPanes)e.destroy();this.atomicStructurePane!==null&&this.atomicStructurePane.destroy(),this.propertiesPane.destroy(),this.notationPane.destroy(),this.sequencePane.destroy(),this.palette.destroy(),this.toolbar.destroy(),this.canvas.destroy(),this.element.parentNode!==null&&this.element.parentNode.removeChild(this.element),this._host;}}_resolveVisiblePanes(e){let t=e.service.hasAtomicMolfileProvider(),n=e.visiblePanes??[\"sequence\",\"helm\",\"properties\",\"atomic\"];return t||(n=n.filter(o=>o!==\"atomic\")),n}_applyTheme(e){let t=e.name===\"dark\",o=(this.element.getAttribute(\"class\")??\"\").split(/\\s+/).filter(r=>r!==\"hw-app--dark\").join(\" \");this.element.setAttribute(\"class\",t?`${o} hw-app--dark`:o);}};var Vn=class{constructor(e){this.T=\"ATOM\";this.selected=e.selected,this.highlighted=e.highlighted,this.p={x:e.p.x,y:e.p.y},this.elem=e.symbol,this.bio={type:e.biotype,continuousId:e.bio.continuousId,chainId:e.bio.chainId,positionInChain:e.bio.positionInChain,...e.bio.annotation!==void 0?{annotation:e.bio.annotation}:{},...e.bio.blobtype!==void 0?{blobtype:e.bio.blobtype}:{},...e.bio.ambiguity!==void 0?{ambiguity:e.bio.ambiguity}:{},id:e.id},e.inlineSource!==void 0&&(this.inlineSource=e.inlineSource);}biotype(){return this.bio.type}},Un=class{constructor(e,t,n){this.a1=t,this.a2=n,this.r1=Ii(e.r1),this.r2=Ii(e.r2),this.kind=e.kind;}};function Ii(i){switch(i.kind){case \"numeric\":return i.r;case \"positional\":return i.r;default:return 0}}function re(i){let e=[],t=new Map;for(let r of i.atoms){let s=new Vn(r);e.push(s),t.set(r.id,s);}let n=[];for(let r of i.bonds){let s=t.get(r.a1.id),a=t.get(r.a2.id);s===void 0||a===void 0||n.push(new Un(r,s,a));}return {atoms:e,bonds:n,clone(r){return re(i)},_internalMol:i}}var Ia=400,Pa=100,Ha=14,se=class{constructor(e,t,n){this._laidMol=null;this._currentHelm=\"\";this._drawOptions={fontsize:Ha};this._noDraw=false;this._svgEl=null;this.host=e,this._service=t,this._doc=n?.documentImpl??S(e),this._width=n?.width??Ia,this._height=n?.height??Pa,this._mol=me(),this._molView=re(this._mol),this.editor=this._buildEditor();}resizeEditor(e,t){this._width=e,this._height=t,this._redraw();}_buildEditor(){let e=this,t={get noDraw(){return e._noDraw},set noDraw(n){e._noDraw=n;},get jsd(){return e.editor}};return {get div(){return e.host},get m(){return e._molView},set m(n){e._molView=n;},get helm(){return t},get options(){return {width:e._width,height:e._height}},setData(n,o){if(o!==\"helm\")throw new Error(`LegacyEditorWrapper: only 'helm' format supported (got '${o}').`);e._setHelm(n);},setHelm(n){e._setHelm(n);},setMol(n){e._mol=n._internalMol,e._molView=e._buildView(e._mol),e._currentHelm=e._service.serialize(e._mol),e._redraw();},getHelm(n){return e._currentHelm},getMolfile(){return Pt(e._mol)},resize(n,o){e._width=n,e._height=o,e._redraw();},setSize(n,o){e._width=n,e._height=o,e._redraw();},redraw(){e._redraw();},reset(){e._mol=me(),e._laidMol=null,e._molView=re(e._mol),e._currentHelm=\"\",e._removeSvg();},getFormula(n){return $a(fe(e._mol))},getMolWeight(){return Pe(e._mol)},getExtinctionCoefficient(){return He(e._mol)},getDrawOptions(){return e._drawOptions}}}_setHelm(e){this._currentHelm=e;let t=this._service.parse(e,{mode:\"lenient\",resolveMonomers:true});this._mol=t.mol,this._molView=this._buildView(this._mol),this._redraw();}_buildView(e){return this._laidMol=this._noDraw?null:ne(e),re(this._laidMol??e)}_redraw(){if(this._noDraw){this._removeSvg();return}if(this._currentHelm===\"\"||this._laidMol===null){this._removeSvg();return}let e=new Set,t=new Set;for(let o of this._molView.atoms){let r=o.bio.id;r!==void 0&&(o.selected&&e.add(r),o.highlighted&&t.add(r));}let n=this._service.renderMolResult(this._laidMol,{width:this._width,height:this._height,maxScale:1/0,showIds:true,selectedAtomIds:e,highlightedAtomIds:t});this._bakeViewToSurface(n.bbox,n.drawBox),this._mountSvg(n.svg);}_bakeViewToSurface(e,t){if(this._laidMol===null)return;let n=t.scale,o=t.x-e.x*n,r=t.y-e.y*n,s=this._laidMol.atoms,a=this._molView.atoms,l=Math.min(s.length,a.length);for(let d=0;d<l;d++){let c=s[d].p,u=a[d].p;u.x=c.x*n+o,u.y=c.y*n+r;}}_mountSvg(e){this._removeSvg();let t=Da(this._doc,e,this._width,this._height);t.setAttribute(\"pointer-events\",\"none\"),this.host.firstChild!==null?this.host.insertBefore(t,this.host.firstChild):this.host.appendChild(t),this._svgEl=t;}_removeSvg(){this._svgEl!==null&&this._svgEl.parentNode!==null&&this._svgEl.parentNode.removeChild(this._svgEl),this._svgEl=null;}},Pi=[\"C\",\"H\",\"N\",\"O\",\"S\",\"P\"];function $a(i){let e=o=>{let r=Pi.indexOf(o);return r===-1?Pi.length:r},t=[...i.elements.keys()].sort((o,r)=>{let s=e(o),a=e(r);return s!==a?s-a:o<r?-1:o>r?1:0}),n=[];for(let o of t){let r=i.elements.get(o);n.push(r===1?o:`${o}${r}`);}return n.join(\"\")}function Da(i,e,t,n){let o=Oa(i,e);if(o!==null)return o;let r=i.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");return r.setAttribute(\"width\",String(t)),r.setAttribute(\"height\",String(n)),r}function Oa(i,e){let t=globalThis.DOMParser;if(t===void 0)return null;try{let r=new t().parseFromString(e,\"image/svg+xml\").documentElement;return r==null?null:i.importNode(r,!0)}catch{return null}}var Na=800,Fa=400,Ga=32,Va=14,zn=class{constructor(e){this._width=0;this._height=0;this._doc=e;}resize(e,t){this._width=e,this._height=t;}select(){}dblclick(){}createMonomerDiv(e,t,n){let o=g(this._doc,\"div\",{\"data-monomer\":t,\"data-biotype\":n,\"data-testid\":`legacy-mex-monomer-${t}`});return e.appendChild(o),o}getSize(){return {width:this._width,height:this._height}}},bt=class{constructor(e,t,n){this.toolbarheight=Ga;this._drawOptions={fontsize:Va};this._unsubs=[];this._destroyed=false;this._host=e,this._service=t,this._doc=n?.documentImpl??S(e),this._width=n?.width??Na,this._height=n?.height??Fa;let o={service:t};n?.initialHelm!==void 0&&(o.initialHelm=n.initialHelm),n?.documentImpl!==void 0&&(o.documentImpl=n.documentImpl),n?.width!==void 0&&(o.width=n.width),n?.height!==void 0&&(o.height=n.height),this._app=new ft(e,o),this.sequence=this._app.sequencePane.element,this.notation=this._app.notationPane.element,this.properties={parent:this._app.propertiesPane.element},this._structureviewHost=g(this._doc,\"div\",{class:\"hwe-legacy-app__structureview\",\"data-testid\":\"legacy-app-structureview\"}),this._structureviewWrapper=new se(this._structureviewHost,t,{documentImpl:this._doc}),this.structureview=this._structureviewWrapper,this.mex=new zn(this._doc),this._editorFacade=this._buildEditorFacade();let r=this._editorFacade;this.canvas={get host(){return r.div},get editor(){return r},get helm(){return r.helm},resizeEditor:(a,l)=>{this._resize(a,l);},getHelm:a=>r.getHelm(a),setHelm:a=>{r.setHelm(a);}};let s=()=>{this._structureviewWrapper.editor.setHelm(this._app.getHelm());};this._unsubs.push(this._app.canvas.on(\"helm:changed\",s)),n?.initialHelm!==void 0&&n.initialHelm.length>0&&s();}get editorApp(){return this._app}_buildEditorFacade(){let e=this,t=this._app,n={noDraw:false,get jsd(){return e._editorFacade}};return {get div(){return t.element},get m(){return e._currentMolView()},set m(o){o!=null&&o._internalMol!==void 0&&t.canvas.setMol(o._internalMol);},get helm(){return n},get options(){return {width:e._width,height:e._height}},setData(o,r){if(r!==\"helm\")throw new Error(`LegacyAppWrapper: only 'helm' format supported (got '${r}').`);t.setHelm(o);},setHelm(o){t.setHelm(o);},setMol(o){t.canvas.setMol(o._internalMol);},getHelm(o){return t.getHelm()},getMolfile(){return e._service.getMolfile(t.getHelm())},resize(o,r){e._resize(o,r);},setSize(o,r){e._resize(o,r);},redraw(){t.canvas.redraw();},reset(){t.setHelm(\"\");},getFormula(o){return Ua(fe(t.canvas.getMol()))},getMolWeight(){return Pe(t.canvas.getMol())},getExtinctionCoefficient(){return He(t.canvas.getMol())},getDrawOptions(){return e._drawOptions}}}_currentMolView(){let e=this._app.canvas.getMol(),t=re(e),n=this._app.canvas.getSelection();if(!n.isEmpty)for(let o of t.atoms){let r=o.bio.id;typeof r==\"number\"&&(o.selected=n.atoms.has(r));}return t}_resize(e,t){this._width=e,this._height=t,this._app.canvas.resize(e,t);}calculateSizes(){let e=Hi(this._host.clientWidth,this._width),t=Hi(this._host.clientHeight,this._height);this._resize(e,Math.max(50,t-this.toolbarheight));}destroy(){if(!this._destroyed){this._destroyed=true;for(let e of this._unsubs)e();this._unsubs.length=0,this._app.destroy();}}};function Ua(i){let e=[];for(let[t,n]of i.elements.entries())e.push(n===1?t:`${t}${n}`);return e.join(\"\")}function Hi(i,e){return typeof i!=\"number\"||isNaN(i)||i<=0?e:i}var za=240,Ka=80,yt=class{constructor(e,t,n){this._tooltip=null;this._destroyed=false;this.name=e,this._service=t;let o=n?.documentImpl??Wa();if(o===null)throw new Error(\"LegacyInputWrapper: no Document available.\");this._doc=o,this._host=g(this._doc,\"div\",{class:\"hwe-legacy-input\",\"data-testid\":\"legacy-input-host\"}),this.viewer=new se(this._host,t,{width:n?.editorOptions?.width??za,height:n?.editorOptions?.height??Ka,documentImpl:this._doc});}get value(){return this.viewer.editor.getHelm()}set value(e){this._ensureLive(),this.viewer.editor.setHelm(e);}get molValue(){return this.viewer.editor.m}set molValue(e){this._ensureLive(),this.viewer.editor.setMol(e);}redraw(){this._ensureLive(),this.viewer.editor.redraw();}showTooltip(e,t){this._ensureLive(),this._tooltip!==null&&this._tooltip.parentNode!==null&&this._tooltip.parentNode.removeChild(this._tooltip);let n=g(this._doc,\"div\",{class:\"hwe-legacy-input__tooltip\",\"data-testid\":\"legacy-input-tooltip\",style:`position: absolute; left: ${t.p.x}px; top: ${t.p.y}px;`});typeof e==\"string\"?n.appendChild(this._doc.createTextNode(e)):n.appendChild(e),this._host.appendChild(n),this._tooltip=n;}destroy(){this._destroyed||(this._destroyed=true,this._tooltip!==null&&this._tooltip.parentNode!==null&&this._tooltip.parentNode.removeChild(this._tooltip),this._host.parentNode!==null&&this._host.parentNode.removeChild(this._host));}getHost(){return this._host}getTooltip(){return this._tooltip}_ensureLive(){if(this._destroyed)throw new Error(\"LegacyInputWrapper: this instance has been destroyed.\");this._service;}};function Wa(){return globalThis.document??null}var ja=/^R([1-9][0-9]*)$/,Di=new Set([v.PEPTIDE,v.RNA,v.CHEM,v.BLOB]),qa=new Set([\"Backbone\",\"Branch\",\"Terminal\",\"Undefined\"]);function $i(i){if(typeof i.symbol!=\"string\"||i.symbol.length===0||typeof i.molfile!=\"string\"||!Di.has(i.polymerType)||!qa.has(i.monomerType))return null;let e=[];for(let n of i.rgroups??[]){if(typeof n.label!=\"string\"||!ja.test(n.label))continue;let o={label:n.label,capGroupName:typeof n.capGroupName==\"string\"?n.capGroupName:\"\",capGroupSMILES:Je(n)??\"\"};typeof n.alternateId==\"string\"&&(o.alternateId=n.alternateId),e.push(o);}let t={symbol:i.symbol,molfile:i.molfile,polymerType:i.polymerType,monomerType:i.monomerType,rgroups:e};return typeof i.name==\"string\"&&(t.name=i.name),typeof i.smiles==\"string\"&&(t.smiles=i.smiles),typeof i.naturalAnalog==\"string\"&&(t.naturalAnalog=i.naturalAnalog),i.meta!==void 0&&i.meta!==null&&(t.meta={...i.meta}),typeof i.author==\"string\"&&(t.author=i.author),i.createDate!==void 0&&(t.createDate=i.createDate),typeof i.id==\"number\"&&(t.id=i.id),t}function Ya(i){return i===v.PEPTIDE?b.AA:i===v.RNA?b.SUGAR:i===v.CHEM?b.CHEM:i===v.BLOB?b.BLOB:b.AA}function Kn(i,e,t){if(i===v.PEPTIDE)return b.AA;if(i===v.CHEM)return b.CHEM;if(i===v.BLOB)return b.BLOB;if(i===v.RNA){if(e===\"Branch\")return b.BASE;if(e===\"Backbone\")return t===\"P\"||t===\"p\"?b.LINKER:b.SUGAR}return b.AA}function Xa(i,e){let t=i.subscribe(e);return ()=>{t!=null&&typeof t.unsubscribe==\"function\"&&t.unsubscribe();}}var Jt=class{constructor(e,t){this._cache=new Map;this._polymerTypesCache=null;this._version=0;this._base=e,this.source=t??(typeof e.source==\"string\"?e.source:\"datagrok-bridge\"),this.onChanged=new Z,this._unsub=Xa(e.onChanged,()=>{this._cache.clear(),this._polymerTypesCache=null,this._version+=1,this.onChanged.next({type:\"reload\"});});}get version(){return this._version}get isEmpty(){return typeof this._base.isEmpty==\"boolean\"?this._base.isEmpty:this.getPolymerTypes().length===0}getMonomer(e,t){let n=`${e}|${t}`;if(this._cache.has(n))return this._cache.get(n)??null;let o=this._base.getMonomer(e,t),r=o==null?null:this._enrichColors($i(o));return this._cache.set(n,r),r}_enrichColors(e){if(e===null)return null;let t=this._base;if(typeof t.getMonomerColors!=\"function\")return e;let n=Kn(e.polymerType,e.monomerType,e.naturalAnalog),o=null;try{o=t.getMonomerColors(n,e.symbol);}catch{o=null;}if(o==null)return e;let r=o.backgroundcolor,s=o.textcolor,a=o.linecolor;if(typeof r!=\"string\"||typeof s!=\"string\"||typeof a!=\"string\")return e;let l={...e.meta??{},colors:{...e.meta?.colors??{},default:{line:a,text:s,background:r}}};return {...e,meta:l}}registerInlineSmilesMonomer(e,t){let n=this._base;typeof n.getWebEditorMonomer==\"function\"&&n.getWebEditorMonomer(Ya(e),t);let o=n.getMonomer(e,t),r=o==null?null:this._enrichColors($i(o));if(r===null)throw new Error(`BridgedMonomerLib: could not register inline SMILES monomer '${t}'`);return this._cache.set(`${e}|${t}`,r),this._cache.set(`${e}|${r.symbol}`,r),r}getMonomerSet(e){let t=new Map;for(let n of this.getPolymerTypes())for(let o of this.getMonomerSymbolsByType(n)){let r=this.getMonomer(n,o);r!==null&&Kn(r.polymerType,r.monomerType,r.naturalAnalog)===e&&t.set(o,r);}return t}getMonomerSymbolsByType(e){return this._base.getMonomerSymbolsByType(e)}getByNaturalAnalog(e,t){let n=[];for(let o of this.getMonomerSymbolsByType(e)){let r=this.getMonomer(e,o);r!==null&&r.naturalAnalog===t&&n.push(r);}return n}getPolymerTypes(){if(this._polymerTypesCache!==null)return this._polymerTypesCache;let e=[],t=typeof this._base.getPolymerTypes==\"function\"?this._base.getPolymerTypes():Object.values(v);for(let n of t){if(!Di.has(n))continue;let o=this._base.getMonomerSymbolsByType(n);Array.isArray(o)&&o.length>0&&e.push(n);}return this._polymerTypesCache=e,e}getColors(e,t){let n=t===\"dark\"?Be:we,o=e===null?b.AA:Kn(e.polymerType,e.monomerType,e.naturalAnalog);return $(e,o,n)}addMonomer(e){throw new Error(\"BridgedMonomerLib: mutation is not supported on a Datagrok-bridged library.\")}removeMonomer(e,t){return false}merge(e){throw new Error(\"BridgedMonomerLib: mutation is not supported on a Datagrok-bridged library.\")}toJSON(){let e=[];for(let t of this.getPolymerTypes())for(let n of this.getMonomerSymbolsByType(t)){let o=this.getMonomer(t,n);o!==null&&e.push(o);}return e}destroy(){this._unsub(),this.onChanged.complete(),this._cache.clear();}};function Wn(i,e){return new Jt(i,e)}var Zt=class Zt{constructor(e){this._overriddenFuncs=null;this._originalFuncs=null;this._molfilesEditor=null;this._molfilesEditorHost=null;this._molfilesGcTimer=null;if(e.service===void 0||e.service===null)throw new TypeError(\"HelmHelperAdapter: options.service is required\");this._service=e.service,this.seqHelper=e.seqHelper??null,this._logger=e.logger??new Se,this._bridge=e.monomerLibBridge??(t=>Wn(t)),this._doc=e.documentImpl??Oi();}get service(){return this._service}createHelmInput(e,t){let n={...t};return n.documentImpl===void 0&&this._doc!==null&&(n.documentImpl=this._doc),new yt(e,this._service,n)}createHelmWebEditor(e,t){let n=e??this._createDetachedHost();return new se(n,this._service,{...t?.width!==void 0?{width:t.width}:{},...t?.height!==void 0?{height:t.height}:{},...this._doc!==null?{documentImpl:this._doc}:{}})}createWebEditorApp(e,t){return new bt(e,this._service,{...t!==void 0?{initialHelm:t}:{},...this._doc!==null?{documentImpl:this._doc}:{}})}get originalMonomersFuncs(){return this._originalFuncs}buildMonomersFuncsFromLib(e){let t=this._bridge(e),n=e;function o(s,a){if(typeof n.getWebEditorMonomer==\"function\"){let p=n.getWebEditorMonomer(s,a);if(p!=null)return p}let{biotype:l,symbol:d}=Ni(s,a);if(d===null)return null;let c=Za(d),u=Fi(l),m=t.getMonomer(u,c);return m===null?null:Gi(m,c)}function r(s){let{biotype:a}=Ni(s,void 0),l=Fi(a),d={};for(let c of t.getMonomerSymbolsByType(l)){let u=t.getMonomer(l,c);u!==null&&(d[c]=Gi(u,c));}return d}return {getMonomer:o,getMonomerSet:r}}overrideMonomersFuncs(e){let t=this._overriddenFuncs;return this._originalFuncs===null&&(this._originalFuncs=t??this._defaultFuncs()),this._overriddenFuncs=e,t??this._originalFuncs}revertOriginalMonomersFuncs(){let e=this._originalFuncs??this._defaultFuncs(),t=this._overriddenFuncs??e;return this._overriddenFuncs=e,this._originalFuncs=null,t}getHoveredAtom(e,t,n,o){let s=new q(n._internalMol,H).test({x:e,y:t});if(s===null||s.atom===void 0)return null;for(let a of n.atoms)if(a.bio.id===s.atom.id||a.bio.id===void 0&&a.bio.continuousId===s.atom.bio.continuousId)return a;return null}getMolfiles(e){let t=this._ensureMolfilesEditor();t.editor.helm.noDraw=true;try{let n=[];for(let o of e){if(typeof o!=\"string\"||o.length===0){n.push(\"\");continue}t.editor.setHelm(o),n.push(t.editor.getMolfile());}return n}finally{t.editor.helm.noDraw=false,this._scheduleMolfilesEditorGc();}}parse(e,t){let n=this._service.parse(e,{mode:\"lenient\",resolveMonomers:false}),o=ne(n.mol);return re(o)}removeGaps(e){let t;try{t=this._service.removeGaps(e);}catch(o){throw o instanceof j&&o.type===void 0&&(o.type=\"HelmNotSupportedError\"),o}let n=Ja(this._service,e);return {srcHelm:t.srcHelm,resHelm:t.resHelm,monomerMap:n?new Map(t.monomerMap):null}}destroy(){this._molfilesGcTimer!==null&&(clearTimeout(this._molfilesGcTimer),this._molfilesGcTimer=null),this._removeMolfilesEditorNow();}_defaultFuncs(){return {getMonomer:(e,t)=>null,getMonomerSet:e=>({})}}_createDetachedHost(){let e=this._doc??Oi();if(e===null)throw new Error(\"HelmHelperAdapter: no Document available\");let t=e.createElement(\"div\");return t.style.width=\"0px\",t.style.height=\"0px\",t.style.position=\"fixed\",t}_ensureMolfilesEditor(){if(this._molfilesEditor!==null)return this._molfilesGcTimer!==null&&(clearTimeout(this._molfilesGcTimer),this._molfilesGcTimer=null),this._molfilesEditor;let e=this._createDetachedHost();return this._molfilesEditorHost=e,this._molfilesEditor=new se(e,this._service,{width:100,height:100,...this._doc!==null?{documentImpl:this._doc}:{}}),this._logger,this._molfilesEditor}_scheduleMolfilesEditorGc(){this._molfilesGcTimer!==null&&clearTimeout(this._molfilesGcTimer),typeof setTimeout==\"function\"&&(this._molfilesGcTimer=setTimeout(()=>{this._molfilesGcTimer=null,this._removeMolfilesEditorNow();},Zt._MOLFILES_GC_MS));}_removeMolfilesEditorNow(){this._molfilesEditor=null,this._molfilesEditorHost!==null&&this._molfilesEditorHost.parentNode!==null&&this._molfilesEditorHost.parentNode.removeChild(this._molfilesEditorHost),this._molfilesEditorHost=null;}};Zt._MOLFILES_GC_MS=1e3;var gt=Zt;function Oi(){return globalThis.document??null}function Ja(i,e){try{let t=i.parse(e,{mode:\"lenient\",resolveMonomers:!1});for(let n of t.mol.atoms)if(n.symbol===\"*\")return !0;return !1}catch{return false}}function Za(i){return i.length>=2&&i.charAt(0)===\"[\"&&i.charAt(i.length-1)===\"]\"?i.slice(1,i.length-1):i}function Ni(i,e){if(typeof i==\"string\")return {biotype:i,symbol:e??null};if(i!==null&&typeof i==\"object\"&&i.T===\"ATOM\"){let t=i;return {biotype:t.bio.type,symbol:e??t.elem}}return {biotype:b.AA,symbol:e??null}}function Fi(i){switch(i){case b.AA:return v.PEPTIDE;case b.SUGAR:case b.BASE:case b.LINKER:case b.NUCLEOTIDE:return v.RNA;case b.CHEM:return v.CHEM;case b.BLOB:return v.BLOB;default:return v.PEPTIDE}}function Gi(i,e){let t={};for(let o of i.rgroups)t[o.label]=o.capGroupName;let n={id:e??i.symbol,m:i.molfile,rs:i.rgroups.length,type:i.polymerType,mt:i.monomerType,at:t};return i.name!==void 0&&(n.n=i.name),i.naturalAnalog!==void 0&&(n.na=i.naturalAnalog),i.smiles!==void 0&&(n.smiles=i.smiles),n}function Qa(i,e){if(e==null)throw new TypeError(\"registerWithDatagrok: options is required\");let t=new gt({service:e.service,...e.seqHelper!==void 0?{seqHelper:e.seqHelper}:{},...e.logger!==void 0?{logger:e.logger}:{},...e.documentImpl!==void 0?{documentImpl:e.documentImpl}:{}}),n=()=>{};if(typeof e.libProvider==\"function\"){let o=e.libProvider;Promise.resolve().then(()=>o()).then(r=>{if(r==null)return;let s=r.onChanged.subscribe(()=>{t.buildMonomersFuncsFromLib(r);});n=()=>{s!=null&&typeof s.unsubscribe==\"function\"&&s.unsubscribe();};}).catch(()=>{});}return {adapter:t,unsubscribe(){n();}}}\nexport{Ue as AtomPropsDialog,pt as AtomicStructurePane,ze as BondPropsDialog,Jt as BridgedMonomerLib,Ve as ChooseRDialog,Ri as DEFAULT_TOOLBAR_BUTTONS,De as EventBus,ht as ExtraPane,Ke as FindReplaceDialog,rt as HelmEditor,ft as HelmEditorApp,gt as HelmHelperAdapter,j as HelmNotSupportedError,N as HelmParseError,Dn as HelmService,b as HelmTypes,Ye as HelmValidationError,Oe as HistoryStack,I as HwError,bt as LegacyAppWrapper,se as LegacyEditorWrapper,yt as LegacyInputWrapper,dn as MonomerLib,Qt as MonomerNotFoundError,lt as MonomerPalette,ji as MonomerTypes,ut as NotationPane,v as PolymerTypes,mt as PropertiesPane,G as Selection,ct as SequencePane,dt as Toolbar,Ht as bondsOnAtom,Wn as bridgeMonomerLib,re as buildHelmMolView,En as darkTheme,Qr as defineTheme,Xt as extraPaneId,Yt as extraPaneSlug,W as freeRgroups,js as hasFreeRgroup,H as lightTheme,Qa as registerWithDatagrok,ai as takenRgroups,be as totalRgroups};","// HELM type vocabulary is owned by `@datagrok-libraries/hwe` (the standalone\n// HELM editor) and re-exported here as the single source of truth. The string\n// values match the canonical Pistoia HELM Web Editor, except `NUCLEOTIDE` which\n// uses the corrected spelling `HELM_NUCLEOTIDE` (was `HELM_NUCLETIDE`).\nimport { HelmTypes, MonomerTypes, PolymerTypes } from '@datagrok-libraries/hwe';\nexport { HelmTypes, MonomerTypes, PolymerTypes };\n// hwe migration: these two small enums are not part of the hwe value vocabulary.\n// They are defined here locally (replicating the legacy HELM Web Editor values)\n// so `@datagrok-libraries/bio` no longer depends on\n// `@datagrok-libraries/helm-web-editor`.\nexport var MonomerNumberingTypes;\n(function (MonomerNumberingTypes) {\n MonomerNumberingTypes[MonomerNumberingTypes[\"default\"] = 0] = \"default\";\n MonomerNumberingTypes[MonomerNumberingTypes[\"continuous\"] = 1] = \"continuous\";\n})(MonomerNumberingTypes || (MonomerNumberingTypes = {}));\nexport var HelmTabKeys;\n(function (HelmTabKeys) {\n HelmTabKeys[\"Sequence\"] = \"sequence\";\n HelmTabKeys[\"Helm\"] = \"notation\";\n HelmTabKeys[\"Properties\"] = \"properties\";\n HelmTabKeys[\"StructureView\"] = \"structureview\";\n})(HelmTabKeys || (HelmTabKeys = {}));\n//# sourceMappingURL=consts.js.map","export const R_GROUP_ELEMENT_SYMBOL = 'R#';\nexport const HYDROGEN_SYMBOL = 'H';\nexport var V2K_CONST;\n(function (V2K_CONST) {\n V2K_CONST[\"TYPE\"] = \"V2000\";\n V2K_CONST[V2K_CONST[\"NUM_OF_HEADER_LINES\"] = 3] = \"NUM_OF_HEADER_LINES\";\n V2K_CONST[V2K_CONST[\"NUM_OF_COUNTS_DIGITS\"] = 3] = \"NUM_OF_COUNTS_DIGITS\";\n V2K_CONST[V2K_CONST[\"ATOM_TYPE_COL\"] = 4] = \"ATOM_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"FIRST_BONDED_ATOM_COL\"] = 1] = \"FIRST_BONDED_ATOM_COL\";\n V2K_CONST[V2K_CONST[\"BOND_TYPE_COL\"] = 3] = \"BOND_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"RGP_SHIFT\"] = 8] = \"RGP_SHIFT\";\n V2K_CONST[V2K_CONST[\"MAX_ATOM_COUNT\"] = 999] = \"MAX_ATOM_COUNT\";\n V2K_CONST[\"RGP_LINE_START\"] = \"M RGP\";\n V2K_CONST[\"ATOM_ALIAS_LINE_START\"] = \"A \";\n V2K_CONST[\"END\"] = \"M END\";\n})(V2K_CONST || (V2K_CONST = {}));\nexport const MALFORMED_MOL_V2000 = `\nMalformed\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\nM END`;\nexport const EMPTY_MOL_V3000 = `\nEmpty input\n\n 0 0 0 0 0 0 999 V3000\nM END`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1jb25zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtY29uc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVksU0FnQlg7QUFoQkQsV0FBWSxTQUFTO0lBQ25CLDJCQUFjLENBQUE7SUFDZCx1RUFBdUIsQ0FBQTtJQUV2Qix5RUFBd0IsQ0FBQTtJQUN4QiwyREFBaUIsQ0FBQTtJQUNqQiwyRUFBeUIsQ0FBQTtJQUN6QiwyREFBaUIsQ0FBQTtJQUVqQixtREFBYSxDQUFBO0lBQ2IsK0RBQW9CLENBQUE7SUFFcEIsc0NBQXlCLENBQUE7SUFDekIsMENBQTZCLENBQUE7SUFFN0IsMkJBQWMsQ0FBQTtBQUNoQixDQUFDLEVBaEJXLFNBQVMsS0FBVCxTQUFTLFFBZ0JwQjtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHOzs7O09BSTVCLENBQUM7QUF1Q1IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHOzs7O09BSXhCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUl9HUk9VUF9FTEVNRU5UX1NZTUJPTCA9ICdSIyc7XG5leHBvcnQgY29uc3QgSFlEUk9HRU5fU1lNQk9MID0gJ0gnO1xuXG5leHBvcnQgZW51bSBWMktfQ09OU1Qge1xuICBUWVBFID0gJ1YyMDAwJyxcbiAgTlVNX09GX0hFQURFUl9MSU5FUyA9IDMsXG5cbiAgTlVNX09GX0NPVU5UU19ESUdJVFMgPSAzLFxuICBBVE9NX1RZUEVfQ09MID0gNCxcbiAgRklSU1RfQk9OREVEX0FUT01fQ09MID0gMSxcbiAgQk9ORF9UWVBFX0NPTCA9IDMsXG5cbiAgUkdQX1NISUZUID0gOCxcbiAgTUFYX0FUT01fQ09VTlQgPSA5OTksXG5cbiAgUkdQX0xJTkVfU1RBUlQgPSAnTSAgUkdQJyxcbiAgQVRPTV9BTElBU19MSU5FX1NUQVJUID0gJ0EgICcsXG5cbiAgRU5EID0gJ00gIEVORCcsXG59XG5cbmV4cG9ydCBjb25zdCBNQUxGT1JNRURfTU9MX1YyMDAwID0gYFxuTWFsZm9ybWVkXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMDk5OSBWMjAwMFxuTSAgRU5EYDtcblxuZXhwb3J0IGNvbnN0IGVudW0gVjNLX0NPTlNUIHtcbiAgVFlQRSA9ICdWMzAwMCcsXG4gIEhFQURFUl9TRUNPTkRfTElORSA9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nLFxuXG4gIEJFR0lOX0RBVEFfTElORSA9ICdNICBWMzAgJyxcblxuICBCRUdJTl9DT1VOVFNfTElORSA9ICdNICBWMzAgQ09VTlRTICcsXG4gIC8qKiBJbmRleCBzaGlmdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlICdDT1VOVFMnIGxpbmUgdG8gdGhlIG51bWJlciBvZiBhdG9tcyAgKi9cbiAgQ09VTlRTX1NISUZUID0gMTQsXG5cbiAgQkVHSU5fQ1RBQl9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQ1RBQicsXG4gIEVORF9DVEFCX0JMT0NLID0gJ00gIFYzMCBFTkQgQ1RBQicsXG5cbiAgQkVHSU5fQVRPTV9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQVRPTScsXG4gIEVORF9BVE9NX0JMT0NLID0gJ00gIFYzMCBFTkQgQVRPTScsXG5cbiAgQkVHSU5fQk9ORF9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQk9ORCcsXG4gIEVORF9CT05EX0JMT0NLID0gJ00gIFYzMCBFTkQgQk9ORCcsXG4gIEJPTkRfQ09ORklHID0gJyBDRkc9JyxcblxuICBBVE9NX1RZUEVfQ09MID0gNCxcbiAgWF9DT0wgPSA1LFxuICBGSVJTVF9CT05ERURfQVRPTV9DT0wgPSA1LFxuICBCT05EX1RZUEVfQ09MID0gNCxcbiAgRFVNTVlfSEVBREVSID0gYFxuICAgICBEYXRhZ3Jva1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDA5OTkgVjMwMDBgLFxuICBCRUdJTl9DVEFCID0gJ00gIFYzMCBCRUdJTiBDVEFCJyxcbiAgQ09VTlRTX0xJTkVfU1RBUlQgPSAnTSAgVjMwIENPVU5UUyAnLFxuICBDT1VOVFNfTElORV9EVU1NWV9FTkQgPSAnIDAgMCAwJyxcbiAgQkVHSU5fQ09MTEVDVElPTl9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTicsXG4gIEVORF9DT0xMRUNUSU9OX0JMT0NLID0gJ00gIFYzMCBFTkQgQ09MTEVDVElPTicsXG4gIEVORF9DVEFCID0gJ00gIFYzMCBFTkQgQ1RBQicsXG4gIEVORCA9ICdNICBFTkQnLFxufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfTU9MX1YzMDAwID0gYFxuRW1wdHkgaW5wdXRcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgOTk5IFYzMDAwXG5NICBFTkRgO1xuIl19","import * as DG from 'datagrok-api/dg';\nimport { SeqPaletteBase } from './seq-palettes';\nimport { getMonomerLibHelper } from './types/monomer-library';\nimport { PolymerTypes } from './helm/consts';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color color in string format either hex or rgb.\n * @param {boolean} scale if scale is needed to 210 brightness.\n * @return {string} color in rgb format.\n * */\nfunction correctColor(color, scale = true) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n if (scale) {\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}\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(_m, _polymerType) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static get palette() {\n if (!UnknownColorPalette._pallete)\n UnknownColorPalette._pallete = UnknownColorPalette.buildPalette();\n return UnknownColorPalette._pallete;\n }\n static buildPalette() {\n getMonomerLibHelper().then((lh) => {\n lh.awaitLoaded(Infinity).then(() => {\n const monLib = lh.getMonomerLib();\n monLib.onChanged.subscribe(() => {\n UnknownColorPalette.customMonomerColors = {};\n UnknownColorPalette.polymerTypes = monLib.getPolymerTypes();\n for (const polymerType of this.polymerTypes) {\n const monomerSymbols = monLib.getMonomerSymbolsByType(polymerType);\n for (const monomerSymbol of monomerSymbols) {\n const monomer = monLib.getMonomer(polymerType, monomerSymbol);\n if (monomer?.meta?.colors?.default?.background) {\n if (!this.customMonomerColors[monomerSymbol])\n this.customMonomerColors[monomerSymbol] = {};\n this.customMonomerColors[monomerSymbol][polymerType] =\n correctColor(monomer.meta.colors.default.background);\n }\n }\n }\n });\n });\n });\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m, polymerType) {\n const palleteLength = UnknownColorPalette.palette.length;\n const colorObj = UnknownColorPalette.customMonomerColors[m];\n const polType = polymerType ?? PolymerTypes.PEPTIDE;\n if (colorObj && colorObj[polType])\n return colorObj[polType];\n const hash = StringUtils.hashCode(m);\n const pI = hash % palleteLength;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette._pallete = null;\n// this way is just more future-proof, when we start distinguishing\n// between different polymer types for coloring of non natural aa's or nucleotides\nUnknownColorPalette.customMonomerColors = {};\nUnknownColorPalette.polymerTypes = [];\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 * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\nimport {fromEvent} from 'rxjs';\n\nimport {\n after, before, category, test, expect, awaitCheck, delay, testEvent\n} from '@datagrok-libraries/test/src/test';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {awaitGrid, initHelmMainPackage} from './utils';\nimport {TAGS as helmTAGS} from '../constants';\n\nimport {_package} from '../package-test';\n\ncategory('renderers', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n\n test('missedInLib', async () => { await _testMissedInLib(); });\n\n test('scatterPlotTooltip', async () => { await _testScatterPlotTooltip(); });\n\n async function _testMissedInLib() {\n const df: DG.DataFrame = await grok.dapi.files.readCsv('System:AppData/Helm/tests/sample_HELM-missedInLib.csv');\n const helmCol: DG.Column<string> = df.getCol('HELM');\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n await awaitCheck(() => {\n return $(tv.root).find('.d4-grid canvas').length > 0;\n }, 'Table view canvas not found', 100);\n\n await grok.data.detectSemanticTypes(df);\n\n expect(helmCol.semType, DG.SEMTYPE.MACROMOLECULE);\n expect(helmCol.meta.units, NOTATION.HELM);\n expect(helmCol.getTag(DG.TAGS.CELL_RENDERER), 'helm');\n\n const cellRendererErrorJson: string = helmCol.getTag(helmTAGS.cellRendererRenderError);\n if (!!cellRendererErrorJson) {\n const cellRendererError: any = JSON.parse(cellRendererErrorJson);\n const err = new Error(cellRendererError['message']);\n err.stack = cellRendererError['stack'];\n throw err;\n }\n }\n\n const helmCoordsCsv = `seq,x,y\nPEPTIDE1{I.H.A.N.T.Thr_PO3H2.Aca.D-Tyr_Et}$$$$,0,0\nRNA1{r(A)p.r(C)p.r(G)p.r(U)p}$$$$,1,0\nRNA1{d(A)p.d(C)p.d(G)p.d(U)p}|PEPTIDE1{I.H.A.N.T.Thr_PO3H2}$$$$,0,1\n`;\n\n async function _testScatterPlotTooltip(): Promise<void> {\n const df = DG.DataFrame.fromCsv(helmCoordsCsv);\n df.currentRowIdx = 0;\n const view = grok.shell.addTableView(df);\n await grok.data.detectSemanticTypes(df);\n const sp: DG.ScatterPlotViewer = df.plot.scatter({x: 'x', y: 'y'});\n view.dockManager.dock(sp, DG.DOCK_TYPE.RIGHT, null);\n await Promise.all([\n testEvent(sp.onAfterDrawScene, () => {}, () => { sp.invalidateCanvas(); }, 1000),\n awaitGrid(view.grid, 500)\n ]);\n\n const spBcr = sp.root.getBoundingClientRect();\n const wp = sp.worldToScreen(1, 0);\n const ev = new MouseEvent('mousemove', {\n cancelable: true, bubbles: true, view: window, button: 0,\n clientX: spBcr.left + wp.x, clientY: spBcr.top + wp.y\n });\n const spCanvas = $(sp.root).find('canvas').get()[0] as HTMLCanvasElement;\n await testEvent(fromEvent(spCanvas, 'mousemove'), () => {\n _package.logger.debug(`Test: event, currentRowIdx=${df.currentRowIdx}`);\n expect($(ui.tooltip.root).find('div table.d4-row-tooltip-table tr td canvas').length, 1);\n expect(sp.hitTest(wp.x, wp.y), 1);\n }, () => {\n spCanvas.dispatchEvent(ev);\n }, 500);\n // TODO: Any error occurred become 'Cannot read properties of null (reading 'get$columns')' because of scatter plot\n //await testEvent(sp.onAfterDrawScene, () => {}, () => { sp.invalidateCanvas(); }, 200);\n await awaitGrid(view.grid, 1000);\n }\n});\n","/** Base for Molfile or Mol2 parser/handler */\nexport class ChemicalTableParserBase {\n constructor(fileContent) {\n this.init(fileContent);\n }\n ;\n init(fileContent) {\n this.fileContent = fileContent.replace(/\\r/g, '');\n this._atomCount = undefined;\n this._atomTypes = undefined;\n this._bondCount = undefined;\n this._bondTypes = undefined;\n this.xyzAtomCoordinates = undefined;\n this._pairsOfBondedAtoms = undefined;\n }\n /** Total number of atoms in a molecule */\n get atomCount() {\n if (this._atomCount === undefined)\n this.setAtomAndBondCounts();\n return this._atomCount;\n }\n /** Number of bonds in a molecule */\n get bondCount() {\n if (this._bondCount === undefined)\n this.setAtomAndBondCounts();\n return this._bondCount;\n }\n /** X coordinates of all atoms in a molecule */\n get x() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.x;\n }\n ;\n /** Y coordinates of all atoms in a molecule */\n get y() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.y;\n }\n ;\n /** Z coordinates of all atoms in a molecule */\n get z() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.z;\n }\n ;\n get atomTypes() {\n var _a;\n (_a = this._atomTypes) !== null && _a !== void 0 ? _a : (this._atomTypes = this.parseAtomTypes());\n return this._atomTypes;\n }\n get pairsOfBondedAtoms() {\n var _a;\n (_a = this._pairsOfBondedAtoms) !== null && _a !== void 0 ? _a : (this._pairsOfBondedAtoms = this.parseBondedAtomPairs());\n return this._pairsOfBondedAtoms;\n }\n get bondTypes() {\n var _a;\n (_a = this._bondTypes) !== null && _a !== void 0 ? _a : (this._bondTypes = this.parseBondTypes());\n return this._bondTypes;\n }\n setAtomAndBondCounts() {\n const { atomCount, bondCount } = this.parseAtomAndBondCounts();\n this._atomCount = atomCount;\n this._bondCount = bondCount;\n }\n getNextColumnIdx(idx) {\n // skip non-whitespace, if necessary\n while (!this.isWhitespace(idx))\n ++idx;\n // skip whitespace\n while (this.isWhitespace(idx))\n ++idx;\n return idx;\n }\n shiftIdxToSpecifiedColumn(lineStartIdx, columnNumber) {\n let idx = lineStartIdx;\n const numberOfJumps = this.isWhitespace(idx) ? columnNumber : columnNumber - 1;\n for (let i = 0; i < numberOfJumps; i++)\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n parseAtomTypes() {\n const atomCount = this.atomCount;\n const atomTypes = new Array(atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n atomTypes[i] = this.parseAtomType(idx);\n idx = this.getNextLineIdx(idx);\n }\n return atomTypes;\n }\n ;\n parseAtomCoordinates() {\n const x = new Float32Array(this.atomCount);\n const y = new Float32Array(this.atomCount);\n const z = new Float32Array(this.atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++) {\n idx = this.shiftIdxToXColumn(idx);\n for (const item of [x, y, z]) {\n item[i] = this.parseFloatValue(idx);\n idx = this.getNextColumnIdx(idx);\n }\n idx = this.getNextLineIdx(idx);\n }\n return { x: x, y: y, z: z };\n }\n parseBondedAtomPairs() {\n const bondedAtomPairs = new Array(this.bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < this.bondCount; i++) {\n idx = this.shiftIdxToBondedAtomsPair(idx);\n const pair = new Uint16Array(2);\n pair[0] = this.parseIntValue(idx);\n idx = this.getNextColumnIdx(idx);\n pair[1] = this.parseIntValue(idx);\n bondedAtomPairs[i] = pair;\n idx = this.getNextLineIdx(idx);\n }\n return bondedAtomPairs;\n }\n parseBondTypes() {\n const bondCount = this.bondCount;\n const bondTypes = new Uint16Array(bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < bondCount; i++) {\n idx = this.shiftIdxToBondType(idx);\n bondTypes[i] = this.parseIntValue(idx);\n idx = this.getNextLineIdx(idx);\n }\n return bondTypes;\n }\n ;\n isWhitespace(idx) {\n const symbol = this.fileContent[idx];\n return symbol === ' ' || symbol === '\\t';\n }\n getNextLineIdx(idx) {\n if (this.fileContent[idx] !== '\\n')\n return this.fileContent.indexOf('\\n', idx) + 1;\n else\n return idx + 1;\n }\n parseFloatValue(idxOfNumber) {\n return this.parseNumericValue(parseFloat, idxOfNumber);\n }\n parseIntValue(idxOfNumber) {\n return this.parseNumericValue(parseInt, idxOfNumber);\n }\n parseNumericValue(parserFunction, idxOfNumber) {\n let end = idxOfNumber + 1;\n while (!this.isWhitespace(end))\n ++end;\n const value = parserFunction(this.fileContent.substring(idxOfNumber, end));\n return value;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGVtaWNhbC10YWJsZS1wYXJzZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSw4Q0FBOEM7QUFDOUMsTUFBTSxPQUFnQix1QkFBdUI7SUFDM0MsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQSxDQUFDO0lBVVEsSUFBSSxDQUFDLFdBQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxDQUFDOztRQUNILE1BQUEsSUFBSSxDQUFDLGtC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QVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXRvbUFuZEJvbmRDb3VudHMgPSB7XG4gIGF0b21Db3VudDogbnVtYmVyLFxuICBib25kQ291bnQ6IG51bWJlclxufVxuXG50eXBlIENvb3JkaW5hdGVBcnJheXMgPSB7XG4gIHg6IEZsb2F0MzJBcnJheSxcbiAgeTogRmxvYXQzMkFycmF5LFxuICB6OiBGbG9hdDMyQXJyYXksXG59XG5cbi8qKiBCYXNlIGZvciBNb2xmaWxlIG9yIE1vbDIgcGFyc2VyL2hhbmRsZXIgKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSB7XG4gIGNvbnN0cnVjdG9yKGZpbGVDb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmluaXQoZmlsZUNvbnRlbnQpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBmaWxlQ29udGVudCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hdG9tQ291bnQ/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfYm9uZENvdW50PzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgeHl6QXRvbUNvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZUFycmF5cztcbiAgcHJvdGVjdGVkIF9hdG9tVHlwZXM/OiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF9wYWlyc09mQm9uZGVkQXRvbXM/OiBVaW50MTZBcnJheVtdO1xuICBwcm90ZWN0ZWQgX2JvbmRUeXBlcz86IFVpbnQxNkFycmF5O1xuXG4gIHByb3RlY3RlZCBpbml0KGZpbGVDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVDb250ZW50ID0gZmlsZUNvbnRlbnQucmVwbGFjZSgvXFxyL2csICcnKTtcbiAgICB0aGlzLl9hdG9tQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYXRvbVR5cGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9ib25kVHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54eXpBdG9tQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFpcnNPZkJvbmRlZEF0b21zID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBhdG9tcyBpbiBhIG1vbGVjdWxlICovXG4gIGdldCBhdG9tQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYXRvbUNvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2F0b21Db3VudCE7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGJvbmRzIGluIGEgbW9sZWN1bGUgICovXG4gIGdldCBib25kQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYm9uZENvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRDb3VudCE7XG4gIH1cblxuICAvKiogWCBjb29yZGluYXRlcyBvZiBhbGwgYXRvbXMgaW4gYSBtb2xlY3VsZSAgKi9cbiAgZ2V0IHgoKTogRmxvYXQzMkFycmF5IHtcbiAgICB0aGlzLnh5ekF0b21Db29yZGluYXRlcyA/Pz0gdGhpcy5wYXJzZUF0b21Db29yZGluYXRlcygpO1xuICAgIHJldHVybiB0aGlzLnh5ekF0b21Db29yZGluYXRlcy54O1xuICB9O1xuXG4gIC8qKiBZIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeSgpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS55O1xuICB9O1xuXG4gIC8qKiBaIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeigpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS56O1xuICB9O1xuXG4gIGdldCBhdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHRoaXMuX2F0b21UeXBlcyA/Pz0gdGhpcy5wYXJzZUF0b21UeXBlcygpO1xuICAgIHJldHVybiB0aGlzLl9hdG9tVHlwZXM7XG4gIH1cblxuICBnZXQgcGFpcnNPZkJvbmRlZEF0b21zKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIHRoaXMuX3BhaXJzT2ZCb25kZWRBdG9tcyA/Pz0gdGhpcy5wYXJzZUJvbmRlZEF0b21QYWlycygpO1xuICAgIHJldHVybiB0aGlzLl9wYWlyc09mQm9uZGVkQXRvbXMhO1xuICB9XG5cbiAgZ2V0IGJvbmRUeXBlcygpOiBVaW50MTZBcnJheSB7XG4gICAgdGhpcy5fYm9uZFR5cGVzID8/PSB0aGlzLnBhcnNlQm9uZFR5cGVzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRUeXBlcyE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VBdG9tQW5kQm9uZENvdW50cygpOiBBdG9tQW5kQm9uZENvdW50cztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENvdW50c0xpbmVJZHgoKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBzZXRBdG9tQW5kQm9uZENvdW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB7YXRvbUNvdW50LCBib25kQ291bnR9ID0gdGhpcy5wYXJzZUF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgdGhpcy5fYXRvbUNvdW50ID0gYXRvbUNvdW50O1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IGJvbmRDb3VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0Q29sdW1uSWR4KGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBza2lwIG5vbi13aGl0ZXNwYWNlLCBpZiBuZWNlc3NhcnlcbiAgICB3aGlsZSAoIXRoaXMuaXNXaGl0ZXNwYWNlKGlkeCkpXG4gICAgICArK2lkeDtcbiAgICAvLyBza2lwIHdoaXRlc3BhY2VcbiAgICB3aGlsZSAodGhpcy5pc1doaXRlc3BhY2UoaWR4KSlcbiAgICAgICsraWR4O1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlciwgY29sdW1uTnVtYmVyOiBudW1iZXIpIHtcbiAgICBsZXQgaWR4ID0gbGluZVN0YXJ0SWR4O1xuICAgIGNvbnN0IG51bWJlck9mSnVtcHMgPSB0aGlzLmlzV2hpdGVzcGFjZShpZHgpID8gY29sdW1uTnVtYmVyIDogY29sdW1uTnVtYmVyIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mSnVtcHM7IGkrKylcbiAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VBdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGNvbnN0IGF0b21UeXBlcyA9IG5ldyBBcnJheTxzdHJpbmc+KGF0b21Db3VudCk7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdG9tQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQXRvbVR5cGUoaWR4KTtcbiAgICAgIGF0b21UeXBlc1tpXSA9IHRoaXMucGFyc2VBdG9tVHlwZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbVR5cGVzO1xuICB9O1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21Db29yZGluYXRlcygpOiBDb29yZGluYXRlQXJyYXlzIHtcbiAgICBjb25zdCB4ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmF0b21Db3VudCk7XG4gICAgY29uc3QgeSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hdG9tQ291bnQpO1xuICAgIGNvbnN0IHogPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXRvbUNvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb1hDb2x1bW4oaWR4KTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBbeCwgeSwgel0pIHtcbiAgICAgICAgaXRlbVtpXSA9IHRoaXMucGFyc2VGbG9hdFZhbHVlKGlkeCk7XG4gICAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgICAgfVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4ge3g6IHgsIHk6IHksIHo6IHp9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZGVkQXRvbVBhaXJzKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIGNvbnN0IGJvbmRlZEF0b21QYWlycyA9IG5ldyBBcnJheTxVaW50MTZBcnJheT4odGhpcy5ib25kQ291bnQpO1xuICAgIGxldCBpZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib25kQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGlkeCk7XG4gICAgICBjb25zdCBwYWlyID0gbmV3IFVpbnQxNkFycmF5KDIpO1xuICAgICAgcGFpclswXSA9IHRoaXMucGFyc2VJbnRWYWx1ZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGlkeCk7XG4gICAgICBwYWlyWzFdID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBib25kZWRBdG9tUGFpcnNbaV0gPSBwYWlyO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYm9uZGVkQXRvbVBhaXJzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZFR5cGVzKCk6IFVpbnQxNkFycmF5IHtcbiAgICBjb25zdCBib25kQ291bnQgPSB0aGlzLmJvbmRDb3VudDtcbiAgICBjb25zdCBib25kVHlwZXMgPSBuZXcgVWludDE2QXJyYXkoYm9uZENvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvbmRDb3VudDsgaSsrKSB7XG4gICAgICBpZHggPSB0aGlzLnNoaWZ0SWR4VG9Cb25kVHlwZShpZHgpO1xuICAgICAgYm9uZFR5cGVzW2ldID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiBib25kVHlwZXM7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGlzV2hpdGVzcGFjZShpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltYm9sID09PSAnICcgfHwgc3ltYm9sID09PSAnXFx0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0TGluZUlkeChpZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZmlsZUNvbnRlbnRbaWR4XSAhPT0gJ1xcbicpXG4gICAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCdcXG4nLCBpZHgpICsgMTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gaWR4ICsgMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUZsb2F0VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VGbG9hdCwgaWR4T2ZOdW1iZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlSW50VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VJbnQsIGlkeE9mTnVtYmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZU51bWVyaWNWYWx1ZShcbiAgICBwYXJzZXJGdW5jdGlvbjogKHN0cjogc3RyaW5nKSA9PiBudW1iZXIsXG4gICAgaWR4T2ZOdW1iZXI6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBlbmQgPSBpZHhPZk51bWJlciArIDE7XG4gICAgd2hpbGUgKCF0aGlzLmlzV2hpdGVzcGFjZShlbmQpKVxuICAgICAgKytlbmQ7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZXJGdW5jdGlvbih0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhpZHhPZk51bWJlciwgZW5kKSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=","import { ChemicalTableParserBase } from './chemical-table-parser-base';\nimport { ASTERISK, D_QUOTE, L, R, S_QUOTE } from './const';\nimport { isAlpha } from './utils';\nexport class MolfileHandlerBase extends ChemicalTableParserBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n init(molfile) {\n super.init(molfile);\n }\n parseAtomType(idx) {\n let begin = idx;\n let end = begin;\n if (this.isQuote(begin)) {\n end = this.getNextIdenticalChar(begin);\n begin++;\n }\n else {\n end = this.fileContent.indexOf(' ', end);\n }\n return this.fileContent.substring(begin, end);\n }\n isQuote(idx) {\n const letter = this.fileContent[idx].charCodeAt(0);\n return letter === S_QUOTE || letter === D_QUOTE;\n }\n getNextIdenticalChar(idx) {\n const sym = this.fileContent[idx];\n return sym ? this.fileContent.indexOf(sym, idx + 1) : -1;\n }\n isQuery() {\n return this.isQueryOrFragment((char, idx) => {\n return char === S_QUOTE || char === D_QUOTE ||\n (char === L && !isAlpha(this.fileContent.charCodeAt(idx + 1)));\n });\n }\n ;\n isFragment() {\n return this.isQueryOrFragment((char) => {\n return char === R || char === ASTERISK;\n });\n }\n ;\n isQueryOrFragment(condition) {\n const atomCount = this.atomCount;\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n const char = this.fileContent.charCodeAt(idx);\n if (condition(char, idx))\n return true;\n idx = this.getNextLineIdx(idx);\n }\n return false;\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLWhhbmRsZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQW9CLE1BQU0sOEJBQThCLENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDekQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLE9BQWdCLGtCQUFtQixTQUFRLHVCQUF1QjtJQUN0RSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsSUFBSSxDQUFDLE9BQWU7UUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBV1MsYUFBYSxDQUFDLEdBQVc7UUFDakMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLEVBQUUsQ0FBQztTQUNUO2FBQU07WUFDTCxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVTLE9BQU8sQ0FBQyxHQUFXO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssT0FBTyxDQUFDO0lBQ2xELENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxHQUFXO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUU7WUFDMUQsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPO2dCQUMzQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQSxDQUFDO0lBRUssVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDN0MsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUEsQ0FBQztJQUVRLGlCQUFpQixDQUFDLFNBQWlEO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQztZQUNkLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQUEsQ0FBQztDQUtIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSwgQXRvbUFuZEJvbmRDb3VudHN9IGZyb20gJy4vY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UnO1xuaW1wb3J0IHtBU1RFUklTSywgRF9RVU9URSwgTCwgUiwgU19RVU9URX0gZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQge2lzQWxwaGF9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9sZmlsZUhhbmRsZXJCYXNlIGV4dGVuZHMgQ2hlbWljYWxUYWJsZVBhcnNlckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtb2xmaWxlKTtcbiAgICB0aGlzLmluaXQobW9sZmlsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdChtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQXRvbUFuZEJvbmRDb3VudHMoKTogQXRvbUFuZEJvbmRDb3VudHM7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEF0b21CbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hpZnRJZHhUb0JvbmRUeXBlKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBsZXQgYmVnaW4gPSBpZHg7XG4gICAgbGV0IGVuZCA9IGJlZ2luO1xuICAgIGlmICh0aGlzLmlzUXVvdGUoYmVnaW4pKSB7XG4gICAgICBlbmQgPSB0aGlzLmdldE5leHRJZGVudGljYWxDaGFyKGJlZ2luKTtcbiAgICAgIGJlZ2luKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhiZWdpbiwgZW5kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1F1b3RlKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGV0dGVyID0gdGhpcy5maWxlQ29udGVudFtpZHhdLmNoYXJDb2RlQXQoMCk7XG4gICAgcmV0dXJuIGxldHRlciA9PT0gU19RVU9URSB8fCBsZXR0ZXIgPT09IERfUVVPVEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dElkZW50aWNhbENoYXIoaWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN5bSA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltID8gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKHN5bSwgaWR4ICsgMSkgOiAtMTtcbiAgfVxuXG4gIHB1YmxpYyBpc1F1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUXVlcnlPckZyYWdtZW50KChjaGFyOiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhciA9PT0gU19RVU9URSB8fCBjaGFyID09PSBEX1FVT1RFIHx8XG4gICAgICAoY2hhciA9PT0gTCAmJiAhaXNBbHBoYSh0aGlzLmZpbGVDb250ZW50LmNoYXJDb2RlQXQoaWR4ICsgMSkpKTtcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgaXNGcmFnbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5T3JGcmFnbWVudCgoY2hhcjogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhciA9PT0gUiB8fCBjaGFyID09PSBBU1RFUklTSztcbiAgICB9KTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgaXNRdWVyeU9yRnJhZ21lbnQoY29uZGl0aW9uOiAoY2hhcjogbnVtYmVyLCBpZHg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGxldCBpZHggPSB0aGlzLmdldEF0b21CbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb0F0b21UeXBlKGlkeCk7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5maWxlQ29udGVudC5jaGFyQ29kZUF0KGlkeCk7XG4gICAgICBpZiAoY29uZGl0aW9uKGNoYXIsIGlkeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgYWJzdHJhY3QgZ2V0QXRvbUxpbmVzKCk6IHN0cmluZ1tdO1xuICBhYnN0cmFjdCBnZXRCb25kTGluZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IGdldFJHcm91cElkVG9BdG9taWNJZHhNYXAoKTogTWFwPG51bWJlciwgbnVtYmVyPjtcbn1cbiJdfQ==","export const R = 82;\nexport const L = 76;\nexport const D_QUOTE = 34;\nexport const S_QUOTE = 39;\nexport const ASTERISK = 42;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUiA9IDgyO1xuZXhwb3J0IGNvbnN0IEwgPSA3NjtcbmV4cG9ydCBjb25zdCBEX1FVT1RFID0gMzQ7XG5leHBvcnQgY29uc3QgU19RVU9URSA9IDM5O1xuZXhwb3J0IGNvbnN0IEFTVEVSSVNLID0gNDI7XG4iXX0=","export function isAlpha(charCode) {\n return (charCode > 64 && charCode < 91) ||\n (charCode > 96 && charCode < 123);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzQWxwaGEoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY2hhckNvZGUgPiA2NCAmJiBjaGFyQ29kZSA8IDkxKSB8fFxuICAgICAgICAoY2hhckNvZGUgPiA5NiAmJiBjaGFyQ29kZSA8IDEyMyk7XG59XG4iXX0=","import { R_GROUP_ELEMENT_SYMBOL, V2K_CONST } from '../formats/molfile-const';\nimport { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV2KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n }\n getAtomLines() {\n const atomBlockIdx = this.getAtomBlockIdx();\n const end = this.getBondBlockIdx();\n return this.fileContent.substring(atomBlockIdx, end).split('\\n').slice(0, this.atomCount);\n }\n getBondLines() {\n const bondBlockIdx = this.getBondBlockIdx();\n return this.fileContent.substring(bondBlockIdx).split('\\n').slice(0, this.bondCount);\n }\n getRGroupIdToAtomicIdxMap() {\n const map = new Map();\n const lines = this.fileContent.split('\\n');\n const rgroupLines = lines.filter((line) => line.startsWith(V2K_CONST.RGP_LINE_START));\n rgroupLines.forEach((line) => {\n const atomIdxToRgpIdxList = this.getAtomIdxToRgpIdxList(line);\n for (const [key, value] of atomIdxToRgpIdxList) {\n if (map.has(key))\n throw new Error(`R group ${key} is already in the map`);\n map.set(key, value);\n }\n });\n const atomAliasLinesIndices = lines.map((line, idx) => {\n if (line.startsWith(V2K_CONST.ATOM_ALIAS_LINE_START))\n return idx;\n }).filter((idx) => idx !== undefined);\n const atomAliasLines = atomAliasLinesIndices.map((idx) => lines[idx]);\n const atomAliasTextLines = atomAliasLinesIndices.map((idx) => lines[idx + 1]);\n atomAliasLines.forEach((line, idx) => {\n const rgpAtomIdx = parseInt(line.split(/\\s+/)[1]) - 1;\n const rgpId = parseInt(atomAliasTextLines[idx].substring(1));\n if (map.has(rgpId))\n throw new Error(`R group ${rgpId} is already in the map`);\n map.set(rgpId, rgpAtomIdx);\n });\n const rGroupAtomicIndices = this.getRGroupAtomicIndices();\n const unaccounted = rGroupAtomicIndices.filter((idx) => !Array.from(map.values()).includes(idx));\n if (unaccounted.length !== 0)\n throw new Error(`Unaccounted R group indices: ${unaccounted}`);\n return map;\n }\n getAtomIdxToRgpIdxList(rgpLine) {\n const indices = rgpLine.split(/\\s+/).filter((item) => item)\n .slice(3).map((item) => parseInt(item));\n const atomIdxToRgpIdxList = new Array(indices.length / 2);\n for (let i = 0; i < indices.length; i += 2)\n atomIdxToRgpIdxList[i / 2] = [indices[i + 1], indices[i] - 1];\n return atomIdxToRgpIdxList;\n }\n getRGroupAtomicIndices() {\n return this.atomTypes.map((line, idx) => {\n if (line.includes(R_GROUP_ELEMENT_SYMBOL))\n return idx;\n }).filter((idx) => idx !== undefined);\n }\n static isValidMolfile(molfile) {\n return (molfile.indexOf(V2K_CONST.TYPE) !== -1 &&\n molfile.indexOf(V2K_CONST.END) !== -1);\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.ATOM_TYPE_COL);\n }\n getCountsLineIdx() {\n let idx = 0;\n for (let i = 0; i < V2K_CONST.NUM_OF_HEADER_LINES; ++i)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n getAtomBlockIdx() {\n let idx = this.getCountsLineIdx();\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n return this.getNextColumnIdx(lineStartIdx);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.FIRST_BONDED_ATOM_COL);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.BOND_TYPE_COL);\n }\n getBondBlockIdx() {\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n parseAtomAndBondCounts() {\n let begin = this.getCountsLineIdx();\n let end = begin + V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const atomCount = parseInt(this.fileContent.substring(begin, end));\n begin = end;\n end += V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const bondCount = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: atomCount, bondCount: bondCount };\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjJrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTNFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTFELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7SUFDdkQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxD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QztRQUNqRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNaLEdBQUcsSUFBSSxTQUFTLENBQUMsb0JBQW9CLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUEsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSX0dST1VQX0VMRU1FTlRfU1lNQk9MLCBWMktfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS1jb25zdCc7XG5pbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWMktIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gIH1cblxuICBnZXRBdG9tTGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21CbG9ja0lkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYXRvbUJsb2NrSWR4LCBlbmQpLnNwbGl0KCdcXG4nKS5zbGljZSgwLCB0aGlzLmF0b21Db3VudCk7XG4gIH1cblxuICBnZXRCb25kTGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJvbmRCbG9ja0lkeCA9IHRoaXMuZ2V0Qm9uZEJsb2NrSWR4KCk7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJvbmRCbG9ja0lkeCkuc3BsaXQoJ1xcbicpLnNsaWNlKDAsIHRoaXMuYm9uZENvdW50KTtcbiAgfVxuXG4gIGdldFJHcm91cElkVG9BdG9taWNJZHhNYXAoKTogTWFwPG51bWJlciwgbnVtYmVyPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBjb25zdCBsaW5lcyA9IHRoaXMuZmlsZUNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHJncm91cExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lOiBzdHJpbmcpID0+IGxpbmUuc3RhcnRzV2l0aChWMktfQ09OU1QuUkdQX0xJTkVfU1RBUlQpKTtcbiAgICByZ3JvdXBMaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGF0b21JZHhUb1JncElkeExpc3QgPSB0aGlzLmdldEF0b21JZHhUb1JncElkeExpc3QobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhdG9tSWR4VG9SZ3BJZHhMaXN0KSB7XG4gICAgICAgIGlmIChtYXAuaGFzKGtleSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSIGdyb3VwICR7a2V5fSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcbiAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGF0b21BbGlhc0xpbmVzSW5kaWNlcyA9IGxpbmVzLm1hcCgobGluZTogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChWMktfQ09OU1QuQVRPTV9BTElBU19MSU5FX1NUQVJUKSlcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9KS5maWx0ZXIoKGlkeCkgPT4gaWR4ICE9PSB1bmRlZmluZWQpIGFzIG51bWJlcltdO1xuICAgIGNvbnN0IGF0b21BbGlhc0xpbmVzID0gYXRvbUFsaWFzTGluZXNJbmRpY2VzLm1hcCgoaWR4KSA9PiBsaW5lc1tpZHhdKTtcbiAgICBjb25zdCBhdG9tQWxpYXNUZXh0TGluZXMgPSBhdG9tQWxpYXNMaW5lc0luZGljZXMubWFwKChpZHgpID0+IGxpbmVzW2lkeCArIDFdKTtcbiAgICBhdG9tQWxpYXNMaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCByZ3BBdG9tSWR4ID0gcGFyc2VJbnQobGluZS5zcGxpdCgvXFxzKy8pWzFdKSAtIDE7XG4gICAgICBjb25zdCByZ3BJZCA9IHBhcnNlSW50KGF0b21BbGlhc1RleHRMaW5lc1tpZHhdLnN1YnN0cmluZygxKSk7XG4gICAgICBpZiAobWFwLmhhcyhyZ3BJZCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCAke3JncElkfSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcbiAgICAgIG1hcC5zZXQocmdwSWQsIHJncEF0b21JZHgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgckdyb3VwQXRvbWljSW5kaWNlcyA9IHRoaXMuZ2V0Ukdyb3VwQXRvbWljSW5kaWNlcygpO1xuICAgIGNvbnN0IHVuYWNjb3VudGVkID0gckdyb3VwQXRvbWljSW5kaWNlcy5maWx0ZXIoKGlkeCkgPT4gIUFycmF5LmZyb20obWFwLnZhbHVlcygpKS5pbmNsdWRlcyhpZHgpKTtcbiAgICBpZiAodW5hY2NvdW50ZWQubGVuZ3RoICE9PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFjY291bnRlZCBSIGdyb3VwIGluZGljZXM6ICR7dW5hY2NvdW50ZWR9YCk7XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdG9tSWR4VG9SZ3BJZHhMaXN0KHJncExpbmU6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHJncExpbmUuc3BsaXQoL1xccysvKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0pXG4gICAgICAuc2xpY2UoMykubWFwKChpdGVtKSA9PiBwYXJzZUludChpdGVtKSk7XG4gICAgY29uc3QgYXRvbUlkeFRvUmdwSWR4TGlzdCA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPihpbmRpY2VzLmxlbmd0aCAvIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGF0b21JZHhUb1JncElkeExpc3RbaSAvIDJdID0gW2luZGljZXNbaSArIDFdLCBpbmRpY2VzW2ldIC0gMV07XG4gICAgcmV0dXJuIGF0b21JZHhUb1JncElkeExpc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldFJHcm91cEF0b21pY0luZGljZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLmF0b21UeXBlcy5tYXAoKGxpbmU6IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChsaW5lLmluY2x1ZGVzKFJfR1JPVVBfRUxFTUVOVF9TWU1CT0wpKVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH0pLmZpbHRlcigoaWR4KSA9PiBpZHggIT09IHVuZGVmaW5lZCkgYXMgbnVtYmVyW107XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1vbGZpbGUobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChtb2xmaWxlLmluZGV4T2YoVjJLX0NPTlNULlRZUEUpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWMktfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5BVE9NX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBWMktfQ09OU1QuTlVNX09GX0hFQURFUl9MSU5FUzsgKytpKVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0Q291bnRzTGluZUlkeCgpO1xuICAgIGlkeCA9IHRoaXMuZ2V0TmV4dExpbmVJZHgoaWR4KTtcbiAgICByZXR1cm4gaWR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9YQ29sdW1uKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGxpbmVTdGFydElkeCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb0JvbmRlZEF0b21zUGFpcihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5GSVJTVF9CT05ERURfQVRPTV9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5CT05EX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRCb25kQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspXG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21BbmRCb25kQ291bnRzKCk6IEF0b21BbmRCb25kQ291bnRzIHtcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmdldENvdW50c0xpbmVJZHgoKTtcbiAgICBsZXQgZW5kID0gYmVnaW4gKyBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYXRvbUNvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIGJlZ2luID0gZW5kO1xuICAgIGVuZCArPSBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYm9uZENvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIHJldHVybiB7YXRvbUNvdW50OiBhdG9tQ291bnQsIGJvbmRDb3VudDogYm9uZENvdW50fTtcbiAgfTtcbn1cbiJdfQ==","import { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV3KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n getAtomLines() {\n const atomBlockIdx = this.getAtomBlockIdx();\n const end = this.getBondBlockIdx();\n return this.fileContent.substring(atomBlockIdx, end).split('\\n').slice(0, this.atomCount);\n }\n getBondLines() {\n const bondBlockIdx = this.getBondBlockIdx();\n return this.fileContent.substring(bondBlockIdx).split('\\n').slice(0, this.bondCount);\n }\n getRGroupIdToAtomicIdxMap() {\n const map = new Map();\n this.getAtomLines().forEach((line, idx) => {\n const rGroupMatches = line.match(/RGROUPS=\\(([\\d\\s]+)\\)/);\n if (rGroupMatches) {\n const rGroupData = rGroupMatches[1].split(/\\s+/).map((rgId) => parseInt(rgId));\n // todo: handle cases when there are more than 2 r groups\n if (rGroupData.length > 2)\n throw new Error(`R group data ${rGroupData} has more than 2 elements`);\n const rGroupId = rGroupData[1];\n if (map.has(rGroupId))\n throw new Error(`R group ${rGroupId} is already in the map`);\n map.set(rGroupId, idx);\n }\n });\n return map;\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.ATOM_TYPE_COL */);\n }\n getCountsLineIdx() {\n return this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */);\n }\n getAtomBlockIdx() {\n let idx = this.fileContent.indexOf(\"M V30 BEGIN ATOM\" /* V3K_CONST.BEGIN_ATOM_BLOCK */);\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n let idx = this.shiftIdxToAtomType(lineStartIdx);\n if (this.isQuote(idx)) {\n idx = this.getNextIdenticalChar(idx);\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.X_COL */);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.FIRST_BONDED_ATOM_COL */);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.BOND_TYPE_COL */);\n }\n getBondBlockIdx() {\n return this.getNextLineIdx(this.fileContent.indexOf(\"M V30 BEGIN BOND\" /* V3K_CONST.BEGIN_BOND_BLOCK */));\n }\n static isValidMolfile(molfile) {\n return (molfile.indexOf(\"V3000\" /* V3K_CONST.TYPE */) !== -1 &&\n molfile.indexOf(\"M END\" /* V3K_CONST.END */) !== -1);\n }\n parseAtomAndBondCounts() {\n // parse atom count\n let begin = this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */) + 14 /* V3K_CONST.COUNTS_SHIFT */;\n let end = this.fileContent.indexOf(' ', begin + 1);\n const numOfAtoms = parseInt(this.fileContent.substring(begin, end));\n // parse bond count\n begin = end + 1;\n end = this.fileContent.indexOf(' ', begin + 1);\n const numOfBonds = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: numOfAtoms, bondCount: numOfBonds };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12M2staGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjNrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGtCQUFrQjtJQUN2RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxD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LENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFcEUsbUJBQW1CO1FBQ25CLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwRSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWM0tfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS1jb25zdCc7XG5pbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWM0tIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gICAgdGhpcy5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgZ2V0QXRvbUxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdG9tQmxvY2tJZHggPSB0aGlzLmdldEF0b21CbG9ja0lkeCgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0Qm9uZEJsb2NrSWR4KCk7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGF0b21CbG9ja0lkeCwgZW5kKS5zcGxpdCgnXFxuJykuc2xpY2UoMCwgdGhpcy5hdG9tQ291bnQpO1xuICB9XG5cbiAgZ2V0Qm9uZExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBib25kQmxvY2tJZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhib25kQmxvY2tJZHgpLnNwbGl0KCdcXG4nKS5zbGljZSgwLCB0aGlzLmJvbmRDb3VudCk7XG4gIH1cblxuICBnZXRSR3JvdXBJZFRvQXRvbWljSWR4TWFwKCk6IE1hcDxudW1iZXIsIG51bWJlcj4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgdGhpcy5nZXRBdG9tTGluZXMoKS5mb3JFYWNoKChsaW5lLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHJHcm91cE1hdGNoZXMgPSBsaW5lLm1hdGNoKC9SR1JPVVBTPVxcKChbXFxkXFxzXSspXFwpLyk7XG5cbiAgICAgIGlmIChyR3JvdXBNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHJHcm91cERhdGEgPSByR3JvdXBNYXRjaGVzWzFdLnNwbGl0KC9cXHMrLykubWFwKChyZ0lkKSA9PiBwYXJzZUludChyZ0lkKSk7XG4gICAgICAgIC8vIHRvZG86IGhhbmRsZSBjYXNlcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiByIGdyb3Vwc1xuICAgICAgICBpZiAockdyb3VwRGF0YS5sZW5ndGggPiAyKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCBkYXRhICR7ckdyb3VwRGF0YX0gaGFzIG1vcmUgdGhhbiAyIGVsZW1lbnRzYCk7XG4gICAgICAgIGNvbnN0IHJHcm91cElkID0gckdyb3VwRGF0YVsxXTtcbiAgICAgICAgaWYgKG1hcC5oYXMockdyb3VwSWQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCAke3JHcm91cElkfSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcblxuICAgICAgICBtYXAuc2V0KHJHcm91cElkLCBpZHgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQXRvbVR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuQVRPTV9UWVBFX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q291bnRzTGluZUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoVjNLX0NPTlNULkJFR0lOX0NPVU5UU19MSU5FKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBdG9tQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9BVE9NX0JMT0NLKTtcbiAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuc2hpZnRJZHhUb0F0b21UeXBlKGxpbmVTdGFydElkeCk7XG4gICAgaWYgKHRoaXMuaXNRdW90ZShpZHgpKSB7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRJZGVudGljYWxDaGFyKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRDb2x1bW5JZHgoaWR4KTtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuWF9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuRklSU1RfQk9OREVEX0FUT01fQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuQk9ORF9UWVBFX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Qm9uZEJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV4dExpbmVJZHgodGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9CT05EX0JMT0NLKSk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1vbGZpbGUobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChtb2xmaWxlLmluZGV4T2YoVjNLX0NPTlNULlRZUEUpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWM0tfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQXRvbUFuZEJvbmRDb3VudHMoKTogQXRvbUFuZEJvbmRDb3VudHMge1xuICAgIC8vIHBhcnNlIGF0b20gY291bnRcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoVjNLX0NPTlNULkJFR0lOX0NPVU5UU19MSU5FKSArIFYzS19DT05TVC5DT1VOVFNfU0hJRlQ7XG4gICAgbGV0IGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGJlZ2luICsgMSk7XG4gICAgY29uc3QgbnVtT2ZBdG9tcyA9IHBhcnNlSW50KHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICAgIC8vIHBhcnNlIGJvbmQgY291bnRcbiAgICBiZWdpbiA9IGVuZCArIDE7XG4gICAgZW5kID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCcgJywgYmVnaW4gKyAxKTtcbiAgICBjb25zdCBudW1PZkJvbmRzID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuXG4gICAgcmV0dXJuIHthdG9tQ291bnQ6IG51bU9mQXRvbXMsIGJvbmRDb3VudDogbnVtT2ZCb25kc307XG4gIH1cbn1cbiJdfQ==","import { MolfileV2KHandler } from './molfile-v2k-handler';\nimport { MolfileV3KHandler } from './molfile-v3k-handler';\n/** Defines the proper handler based on the molfile type */\nexport class MolfileHandler {\n constructor() { }\n static getInstance(molfile) {\n if (MolfileHandler.isMolfileV2K(molfile))\n return new MolfileV2KHandler(molfile);\n else if (MolfileHandler.isMolfileV3K(molfile))\n return new MolfileV3KHandler(molfile);\n else\n throw new Error('Malformed molfile');\n }\n static isMolfileV2K(molfile) {\n return MolfileV2KHandler.isValidMolfile(molfile);\n }\n static isMolfileV3K(molfile) {\n return MolfileV3KHandler.isValidMolfile(molfile);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9sZmlsZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELDREQUE0RDtBQUM1RCxNQUFNLE9BQU8sY0FBYztJQUN6QixnQkFBdUIsQ0FBQztJQUV4QixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7O1lBRXRDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ2pDLE9BQU8saUJBQWlCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQWU7UUFDakMsT0FBTyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2xmaWxlSGFuZGxlckJhc2V9IGZyb20gJy4vbW9sZmlsZS1oYW5kbGVyLWJhc2UnO1xuaW1wb3J0IHtNb2xmaWxlVjJLSGFuZGxlcn0gZnJvbSAnLi9tb2xmaWxlLXYyay1oYW5kbGVyJztcbmltcG9ydCB7TW9sZmlsZVYzS0hhbmRsZXJ9IGZyb20gJy4vbW9sZmlsZS12M2staGFuZGxlcic7XG5cbi8qKiBEZWZpbmVzIHRoZSBwcm9wZXIgaGFuZGxlciBiYXNlZCBvbiB0aGUgbW9sZmlsZSB0eXBlICAqL1xuZXhwb3J0IGNsYXNzIE1vbGZpbGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKG1vbGZpbGU6IHN0cmluZyk6IE1vbGZpbGVIYW5kbGVyQmFzZSB7XG4gICAgaWYgKE1vbGZpbGVIYW5kbGVyLmlzTW9sZmlsZVYySyhtb2xmaWxlKSlcbiAgICAgIHJldHVybiBuZXcgTW9sZmlsZVYyS0hhbmRsZXIobW9sZmlsZSk7XG4gICAgZWxzZSBpZiAoTW9sZmlsZUhhbmRsZXIuaXNNb2xmaWxlVjNLKG1vbGZpbGUpKVxuICAgICAgcmV0dXJuIG5ldyBNb2xmaWxlVjNLSGFuZGxlcihtb2xmaWxlKTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBtb2xmaWxlJyk7XG4gIH1cblxuICBzdGF0aWMgaXNNb2xmaWxlVjJLKG1vbGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBNb2xmaWxlVjJLSGFuZGxlci5pc1ZhbGlkTW9sZmlsZShtb2xmaWxlKTtcbiAgfVxuXG4gIHN0YXRpYyBpc01vbGZpbGVWM0sobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1vbGZpbGVWM0tIYW5kbGVyLmlzVmFsaWRNb2xmaWxlKG1vbGZpbGUpO1xuICB9XG59XG4iXX0=","import * as DG from 'datagrok-api/dg';\nexport async function getSeqHelper() {\n const packageName = 'Bio';\n const funcList = DG.Func.find({ package: packageName, name: `getSeqHelper` });\n if (funcList.length === 0)\n throw new Error(`Package '${packageName}' must be installed for SeqHelper.`);\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=seq-helper.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/test/src/test';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {\n getUserLibSettings, setUserLibSettings,\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';\n\nimport {awaitGrid, initHelmMainPackage} from './utils';\n\nimport {_package} from '../package-test';\n\ncategory('getMolfiles', () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n await monomerLibHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true);\n });\n\n const csv = `Helm, atoms, bonds\nPEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et.Tyr_ab-dehydroMe.dV}$$$$,11,10\nPEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV}$$$$,11,10\nPEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2}$$$$,9,8`;\n\n test('linear1', async () => {\n const df = DG.DataFrame.fromCsv(csv);\n const helmCol = df.getCol('Helm');\n const view = grok.shell.addTableView(df);\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 1');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 1');\n\n const resCol: DG.Column<string> = await grok.functions.call('Helm:getMolfiles', {col: helmCol});\n expect(resCol.length, helmCol.length);\n const resMolfileList: MolfileHandlerBase[] = resCol.toList().map((molfile) => MolfileHandler.getInstance(molfile));\n expectArray(resMolfileList.map((mf) => mf.atomCount), df.getCol('atoms').toList());\n expectArray(resMolfileList.map((mf) => mf.bondCount), df.getCol('bonds').toList());\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 2');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 2');\n });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {ISeqHandler} from '@datagrok-libraries/bio/src/utils/macromolecule/seq-handler';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\n\nimport {removeGapsFromHelm} from '../utils';\n\nexport class SeqPropertiesError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n }\n}\n\n// hwe migration (Phase 7): formula / MW / extinction coefficient now come from\n// the standalone `@datagrok-libraries/hwe` editor (via the adapter's\n// `LegacyEditorWrapper`), replacing the legacy `new JSDraw2.Editor(...)`. The\n// helper is obtained through the async `getHelmHelper()` factory (which ensures\n// the Helm package is initialized) rather than `_package.helmHelper` — the\n// latter is not initialized in the standalone test bundle. This makes the\n// property calc async (it previously relied on the eagerly-loaded JSDraw2\n// global). The adapter emits the formula in the legacy element order\n// (C,H,N,O,S,P) with no `<sub>` markup, so the strip below is a defensive no-op.\nexport async function getPropertiesDict(seq: string, sh: ISeqHandler): Promise<{}> {\n const host = ui.div([], {style: {width: '0', height: '0'}});\n document.documentElement.appendChild(host);\n try {\n if (seq.length > 1000)\n throw new SeqPropertiesError('Too long sequence to calculate molecular properties.');\n\n const helmString = sh.isHelm() ? seq : sh.getConverter(NOTATION.HELM)(seq);\n // Remove gap symbols for compatibility with the editor\n const helmString2 = removeGapsFromHelm(helmString);\n\n const helmHelper = await getHelmHelper();\n const editor = helmHelper.createHelmWebEditor(host).editor;\n editor.setHelm(helmString2);\n\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient() * 100) / 100;\n return {\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n };\n } finally {\n $(host).empty();\n host.remove();\n }\n}\n\n\nexport async function getPropertiesWidget(value: DG.SemanticValue<string>): Promise<DG.Widget> {\n const helmHelper = await getHelmHelper();\n const sh = helmHelper.seqHelper.getSeqHandler(value.cell.column as DG.Column<string>);\n try {\n const propDict = await getPropertiesDict(value.value, sh);\n return new DG.Widget(\n ui.tableFromMap(propDict, true)\n );\n } catch (err: any) {\n if (err instanceof SeqPropertiesError) {\n // Display warning from err.message\n return new DG.Widget(ui.divText(err.message));\n }\n throw err;\n }\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {after, before, category, expect, expectObject, test, timeout} from '@datagrok-libraries/test/src/test';\nimport {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {generateLongSequence} from '@datagrok-libraries/bio/src/utils/generator';\nimport {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';\n\nimport {initHelmMainPackage} from './utils';\nimport {getPropertiesDict, SeqPropertiesError} from '../widgets/properties-widget';\n\nconst enum MolProps {\n formula = 'formula',\n mw = 'molecular weight',\n extinctCoef = 'extinction coefficient',\n}\n\nconst enum Tests {\n helm = 'Helm',\n separator = 'separator',\n separator2 = 'separator2', // with a few gaps in a row\n separatorGaps = 'separator-gaps',\n fastaPt = 'fasta-PT',\n fastaPtMsa = 'fasta-PT-MSA',\n fastaRna = 'fasta-RNA',\n fastaDna = 'fasta-DNA',\n}\n\n// hwe migration (Phase 7): molecular-weight goldens updated to the standalone\n// `@datagrok-libraries/hwe` calculator, which uses IUPAC-2013 standard atomic\n// weights (C 12.011, O 15.999, S 32.06, P 30.974) instead of the legacy\n// JSDraw2 PT.Lite table (C 12.0107, O 15.9994, S 32.065, P 30.9738). Formulas\n// (legacy C,H,N,O,S,P order) and extinction coefficients are unchanged; only\n// MW shifts by ≤0.04 Da. Source: hwe src/calc/formula.ts.\nconst TestsData: {\n [testName: string]: { seq: string, units: NOTATION, separator?: string, alphabet?: ALPHABET, res: {} }\n} = {\n [Tests.helm]: {\n seq: 'PEPTIDE1{I.H.A.C.T.[Thr_PO3H2].[Aca].[D-Tyr_Et]}|PEPTIDE2{E.A.[meG]}$PEPTIDE1,PEPTIDE2,4:R3-1:R1$$$V2.0',\n units: NOTATION.HELM,\n res: {[MolProps.formula]: 'C58H94N13O21SP', [MolProps.mw]: 1372.49, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator]: {\n seq: 'I/H/A/C/T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C47H77N10O15SP', [MolProps.mw]: 1085.22, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator2]: {\n seq: 'meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca/D-Tyr_Et/Aze/dV/E/N////Phe_4Me',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C91H146N19O25P', [MolProps.mw]: 1937.25, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.separatorGaps]: {\n seq: 'I/H/A//T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C44H72N9O14P', [MolProps.mw]: 982.08, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.fastaPt]: {\n seq: 'IHACTTAY',\n units: NOTATION.FASTA, alphabet: ALPHABET.PT,\n res: {[MolProps.formula]: 'C38H58N10O12S', [MolProps.mw]: 879, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.fastaRna]: {\n seq: 'ACGUAUUCC',\n units: NOTATION.FASTA, alphabet: ALPHABET.RNA,\n // hwe migration: EC now uses hwe's nearest-neighbor stacking model\n // (ε = 2·ΣNN − Σinternal-singletons) instead of the legacy Pistoia\n // sum-of-single-base ε (which gave 96.27). T is scored as U.\n res: {[MolProps.formula]: 'C84H107N30O65P9', [MolProps.mw]: 2855.69, [MolProps.extinctCoef]: 86.96}\n },\n [Tests.fastaDna]: {\n seq: 'ACGTATTCC',\n units: NOTATION.FASTA, alphabet: ALPHABET.DNA,\n // hwe NN model with T≈U (was 91.74 under the legacy sum-of-singles model).\n res: {[MolProps.formula]: 'C87H113N30O56P9', [MolProps.mw]: 2753.78, [MolProps.extinctCoef]: 86.96}\n }\n};\n\ncategory('properties-widget', () => {\n let seqHelper: ISeqHelper;\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: any = null;\n\n before(async () => {\n await initHelmMainPackage();\n seqHelper = await getSeqHelper();\n\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = getUserLibSettings();\n\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n for (const [testName, testData] of Object.entries(TestsData)) {\n test(testName, async () => {\n await testPropertiesDict(testData.seq, testData.units, testData.separator, testData.alphabet, testData.res);\n });\n }\n\n test('too-long', async () => {\n const colList = generateLongSequence();\n const df = DG.DataFrame.fromColumns(colList);\n const col = df.getCol('MSA');\n\n const sh = seqHelper.getSeqHandler(col);\n let errCatched = true;\n try {\n const _actPropDict = await getPropertiesDict(col.get(0), sh);\n const k = 11;\n } catch (err: any) {\n if (err instanceof SeqPropertiesError) errCatched = true;\n }\n expect(errCatched, true);\n });\n\n async function testPropertiesDict(\n seq: string, units: NOTATION, separator: string | undefined, alphabet: ALPHABET | undefined, expPropDict: {}\n ) {\n const col = DG.Column.fromStrings('seq', [seq]) as DG.Column<string>;\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.meta.units = units;\n if (separator) col.setTag(bioTAGS.separator, separator);\n if (alphabet) col.setTag(bioTAGS.alphabet, alphabet);\n const sh = seqHelper.getSeqHandler(col);\n const actPropDict = await getPropertiesDict(seq, sh);\n expectObject(actPropDict, expPropDict);\n }\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n\nimport {after, before, category, delay, expect, test, expectArray, timeout} from '@datagrok-libraries/test/src/test';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {HelmAtom} from '@datagrok-libraries/bio/src/helm/types';\n\nimport {initHelmMainPackage} from './utils';\n\ntype TestTgtType = { atomCount: number, bondCount: number, helm: string };\n\n// hwe migration (Phase 7): `helmHelper.parse` now delegates to the standalone\n// `@datagrok-libraries/hwe` parser (immutable `Mol`, exposed as a legacy\n// `HelmMol`-shaped view). The legacy variants that drove `org.helm.webeditor.IO`\n// / `new JSDraw2.Editor(...)` directly were removed with the forked editor.\ncategory('parseHelm', () => {\n const testData: { [testName: string]: { src: string, tgt: TestTgtType } } = {\n 'PT': {\n src: 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n tgt: {\n atomCount: 6, bondCount: 5,\n helm: 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0'\n }\n },\n 'PT-cyclic': {\n src: 'PEPTIDE1{[meI].C.[Aca].[Cys_SEt].T.C.[Thr_PO3H2].[Aca]}$PEPTIDE1,PEPTIDE1,8:R2-1:R1$$$V2.0',\n tgt: {\n atomCount: 8, bondCount: 8,\n helm: 'PEPTIDE1{[meI].C.[Aca].[Cys_SEt].T.C.[Thr_PO3H2].[Aca]}$PEPTIDE1,PEPTIDE1,8:R2-1:R1$$$V2.0'\n },\n },\n 'RNA': {\n src: 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n tgt: {\n atomCount: 12, bondCount: 11,\n helm: 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n }\n },\n 'PT-with-gap': {\n src: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$$$$V2.0',\n tgt: {\n atomCount: 8, bondCount: 7,\n helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$$$$V2.0',\n }\n },\n 'PT-with-gap-at-connection': {\n src: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0',\n tgt: {\n atomCount: 8, bondCount: 8,\n helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0',\n }\n },\n };\n\n let helmHelper: IHelmHelper;\n let libHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n await initHelmMainPackage();\n\n helmHelper = await getHelmHelper();\n\n libHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // parseHelm is dependent on monomers RGroups available, test requires default monomer library\n await libHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await libHelper.loadMonomerLib(true);\n });\n\n for (const [testName, {src, tgt}] of Object.entries(testData)) {\n test(`HelmHelper-${testName}`, async () => {\n _testParseHelmWithHelmHelper(src, tgt, helmHelper);\n });\n }\n});\n\nfunction _testParseHelmWithHelmHelper(src: string, tgt: TestTgtType, helmHelper: IHelmHelper): void {\n const resMol = helmHelper.parse(src);\n\n expect(resMol.atoms.length, tgt.atomCount);\n expect(resMol.bonds.length, tgt.bondCount);\n expect(resMol.atoms.every((a: HelmAtom) => !a.elem.startsWith('[') && !a.elem.endsWith(']')), true,\n 'Atoms should not contain square braces.');\n}\n","export var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzNCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpbVJlZHVjdGlvbk1ldGhvZHN7XG4gICAgVU1BUCA9ICdVTUFQJyxcbiAgICBUX1NORSA9ICd0LVNORSdcbn07XG4iXX0=","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { ALPHABET, getAlphabet, NOTATION, TAGS } from './macromolecule';\nimport { StringListSeqSplitted } from './macromolecule/utils';\nimport { PolymerTypes } from '../helm/consts';\nimport { GapOriginals } from './macromolecule/consts';\nexport function generateManySequences() {\n const columns = [];\n columns.push(DG.Column.fromList('string', 'MSA', new Array(10 ** 6).fill('meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me')));\n columns.push(DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'Activity', new Array(10 ** 6).fill(5.30751)));\n return columns;\n}\n/** Generates the column 'MSA' with sequences length of order 10^5 and the 'Activity' float column. */\nexport function generateLongSequence(length = 10 ** 4) {\n const longSequence = `meI/hHis/Aca/N//dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe`.repeat(Math.ceil(length / 10)).slice(0, -1);\n const msaCol = DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'MSA', new Array(10 ** 2).fill(longSequence));\n msaCol.semType = DG.SEMTYPE.MACROMOLECULE;\n msaCol.meta.units = NOTATION.SEPARATOR;\n msaCol.setTag(TAGS.separator, '/');\n msaCol.setTag(TAGS.alphabet, ALPHABET.UN);\n msaCol.setTag(TAGS.alphabetIsMultichar, 'true');\n const columns = [];\n columns.push(msaCol);\n columns.push(DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'Activity', new Array(10 ** 2).fill(7.30751)));\n return columns;\n}\nexport function generateLongSequence2(seqHelper, notation = NOTATION.SEPARATOR, alphabet = ALPHABET.PT, separator = (notation === NOTATION.SEPARATOR ? '-' : undefined), monomerLib = undefined, colName = 'seq', rowCount = 100, seqLength = 10 ** 6) {\n const alphabetSet = alphabet === ALPHABET.UN ?\n monomerLib?.getMonomerSymbolsByType(PolymerTypes.PEPTIDE) ?? [] : Array.from(getAlphabet(alphabet));\n const alphabetSize = alphabetSet.length;\n const col = DG.Column.fromType(DG.COLUMN_TYPE.STRING, colName, rowCount);\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.meta.units = notation;\n col.setTag(TAGS.alphabet, alphabet);\n if (notation == NOTATION.SEPARATOR)\n col.setTag(TAGS.separator, separator);\n const sh = seqHelper.getSeqHandler(col);\n for (let rowI = 0; rowI < rowCount; rowI++) {\n const seqMList = wu.count(0).take(seqLength)\n .map((i) => { return alphabetSet[Math.floor(Math.random() * alphabetSize)]; })\n .toArray();\n const seq = sh.joiner(new StringListSeqSplitted(seqMList, GapOriginals[notation]));\n col.set(rowI, seq);\n }\n return col;\n}\n//# sourceMappingURL=generator.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/test/src/test';\nimport {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {initHelmMainPackage} from './utils';\n\ncategory('helm-web-editor', async () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n let hh: IHelmHelper;\n\n before(async () => {\n await initHelmMainPackage();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n await monomerLibHelper.loadMonomerLibForTests();\n\n hh = await getHelmHelper();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true);\n });\n\n test('helm-web-editor', async () => {\n const editor = hh.createHelmWebEditor();\n });\n\n test('web-editor-app', async () => {\n const helmStr: string = 'PEPTIDE1{I.H.A.N.T.Thr_PO3H2.Aca.D-Tyr_Et}$$$$';\n\n const appHost = ui.div([],\n {style: {width: '700px', height: '432px'}});\n const app = hh.createWebEditorApp(appHost, helmStr);\n\n const dlg = ui.dialog().add(appHost).show();\n try {\n\n } finally {\n dlg.close();\n }\n });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {after, before, category, delay, expect, test, testEvent} from '@datagrok-libraries/test/src/test';\nimport {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings,\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\n\nimport type {HelmInput} from '../widgets/helm-input';\n\ncategory('HelmInput', () => {\n let helmHelper: IHelmHelper;\n\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n helmHelper = await getHelmHelper();\n\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n test('inDialog', async () => {\n const helmValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = helmValue;\n const dlg = ui.dialog('Helm Input Test')\n .add(helmInput)\n .show();\n await delay(500);\n\n const mol = helmInput.molValue;\n expect(mol.atoms.length, 4);\n expect(mol.bonds.length, 3);\n });\n\n test('renders-with-nonzero-height (root in a dialog)', async () => {\n // Regression: `ui.input.helmAsync` placed in a content-sized container\n // (no explicit height) used to collapse the editor host to 0 px, rendering\n // an empty div. Assert the editor host AND its mounted SVG are visibly tall.\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm Input Height Test').add(helmInput).show();\n try {\n await delay(500);\n const hostEl = helmInput.getInput();\n expect(hostEl.clientHeight > 0, true, `editor host height must be > 0 (was ${hostEl.clientHeight})`);\n const svg = hostEl.querySelector('svg');\n expect(svg != null, true, 'an SVG must be mounted in the editor host');\n const svgH = (svg as SVGSVGElement).getBoundingClientRect().height;\n expect(svgH > 0, true, `mounted SVG height must be > 0 (was ${svgH})`);\n } finally {\n dlg.close();\n }\n });\n\n test('default size is 250x250', async () => {\n // `ui.input.helmAsync` with no `editorOptions` should render a compact\n // 250×250 box, NOT stretch to the form row or fall back to hwe's 400×100.\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm Input Default Size').add(helmInput).show();\n try {\n await delay(500);\n const host = helmInput.getInput();\n expect(Math.abs(host.clientWidth - 250) <= 4, true, `default width ~250 (was ${host.clientWidth})`);\n expect(Math.abs(host.clientHeight - 250) <= 4, true, `default height ~250 (was ${host.clientHeight})`);\n } finally {\n dlg.close();\n }\n });\n\n test('editorOptions.width/height override the default size', async () => {\n const helmInput = await ui.input.helmAsync('Macromolecule', {editable: true, editorOptions: {width: 320, height: 180}});\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm Input Custom Size').add(helmInput).show();\n try {\n await delay(500);\n const host = helmInput.getInput();\n expect(Math.abs(host.clientWidth - 320) <= 4, true, `width ~320 from editorOptions (was ${host.clientWidth})`);\n expect(Math.abs(host.clientHeight - 180) <= 4, true, `height ~180 from editorOptions (was ${host.clientHeight})`);\n } finally {\n dlg.close();\n }\n });\n\n test('editor canvas sizes from getInput() box (consumer sets height on the host)', async () => {\n // The real consumer pattern (e.g. libraries/db-explorer/renderer.ts) sets an\n // explicit size directly on `getInput()` (the editor host). The editor\n // canvas must follow the HOST's own box — the old code derived the size from\n // `this.root` and painted a 0-height SVG when a consumer sized only the host\n // (the reported \"height 0 / width 105\" bug). Mount via the input so layout\n // is real, then size the host and assert the SVG tracks it.\n const helmInput = await ui.input.helmAsync('Macromolecule');\n helmInput.stringValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const dlg = ui.dialog('Helm getInput() Size Test').add(helmInput).show();\n try {\n await delay(300);\n const host = helmInput.getInput();\n // Consumer sizes the host element directly (the db-explorer pattern).\n host.style.setProperty('width', '360px', 'important');\n host.style.setProperty('height', '260px', 'important');\n await delay(500); // ResizeObserver → editor.setSize → re-render\n\n expect(host.clientWidth, 360, `host width (was ${host.clientWidth})`);\n expect(host.clientHeight, 260, `host height (was ${host.clientHeight})`);\n const svg = host.querySelector('svg') as SVGSVGElement | null;\n expect(svg != null, true, 'an SVG must be mounted');\n const r = svg!.getBoundingClientRect();\n // The canvas tracks the host box (NOT root): both dimensions filled.\n expect(r.height >= host.clientHeight - 8, true,\n `SVG height should track the host's ${host.clientHeight} (was ${r.height})`);\n expect(r.width >= host.clientWidth - 8, true,\n `SVG width should track the host's ${host.clientWidth} (was ${r.width})`);\n } finally {\n dlg.close();\n }\n });\n\n test('tooltip', async () => {\n await _testTooltipOnHelmInput();\n }, {timeout: 300000});\n});\n\nasync function _testTooltipOnHelmInput(): Promise<void> {\n const helmValue = 'PEPTIDE1{[meY].A.G.T}$$$$';\n const helmInput = (await ui.input.helmAsync('Macromolecule')) as HelmInput;\n helmInput.stringValue = helmValue;\n // Show dialog to the right of the TestManager test tree\n // to prevent interfering mousemove position for tooltip.\n const tmBcr = grok.shell.v ? grok.shell.v.root.getBoundingClientRect() : null;\n const dlg = ui.dialog('Helm Input Test')\n .add(helmInput)\n .show({...(tmBcr ? {x: tmBcr.right + 20, y: tmBcr.top + 20} : {})});\n try {\n const dialogInputEl = $(dlg.root)\n .find('div.d4-dialog-contents > div.ui-input-helm > div.ui-input-editor').get(0);\n expect(helmInput.getInput(), dialogInputEl);\n\n const mon = {i: 0, elem: 'meY'};\n const a = helmInput.molValue.atoms[mon.i];\n const iEl = helmInput.getInput();\n const iBcr = iEl.getBoundingClientRect();\n const ev = new MouseEvent('mousemove', {\n cancelable: true, bubbles: true, view: window, button: 0,\n clientX: iBcr.left + a.p.x, clientY: iBcr.top + a.p.y\n });\n await testEvent(ui.tooltip.onTooltipShown, () => { /* tooltip shown*/ },\n () => {\n iEl.dispatchEvent(ev);\n // do not await after event dispatch before test tooltip content\n // await leads to tooltip changed (with TestManager tree node tooltip)\n }, 100, 'timeout await ui.tooltip.onTooltipShown');\n const tooltipEl = $(document).find('body > div.d4-tooltip').get(0) as HTMLElement;\n const elemDiv = $(tooltipEl).find('div > div.d4-flex-row.ui-div > div:nth-child(1)').get(0);\n expect(tooltipEl.style.display != 'none', true);\n expect(elemDiv?.innerText, mon.elem);\n } finally {\n await delay(50);\n ui.tooltip.hide();\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\n/* eslint-disable max-len */\nimport {after, before, category, delay, expect, expectArray, test, testEvent} from '@datagrok-libraries/test/src/test';\nimport {HelmNotSupportedError, HelmNotSupportedErrorType, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\n/* eslint-enable max-len */\n\nimport {_package} from '../package-test';\n\ntype TestSrcType = { helm: string };\ntype TestTgtType = { helm: string | null, map: [number, number][], errType?: string };\n\ncategory('HelmHelper: removeGaps', () => {\n let helmHelper: IHelmHelper;\n let libHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n helmHelper = await getHelmHelper();\n libHelper = await getMonomerLibHelper();\n\n userLibSettings = await getUserLibSettings();\n // Cysteine has different R-groups in other libraries\n await libHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await libHelper.loadMonomerLib(true);\n });\n\n const tests: { [testName: string]: { src: TestSrcType, tgt: TestTgtType } } = {\n 'single-linear-start': {\n src: {helm: 'PEPTIDE1{*.[meY].A.G.T}$$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',\n map: [[1, 0], [2, 1], [3, 2], [4, 3]],\n }\n },\n 'single-linear-end': {\n src: {helm: 'PEPTIDE1{[meY].A.G.T.*}$$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',\n map: [[0, 0], [1, 1], [2, 2], [3, 3]],\n }\n },\n 'single-linear-middle': {\n src: {helm: 'PEPTIDE1{[meY].A.*.G.T}$$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',\n map: [[0, 0], [1, 1], [3, 2], [4, 3]],\n }\n },\n 'single-cycle-start': {\n src: {helm: 'PEPTIDE1{*.[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,3:R3-7:R3$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',\n map: [[1, 0], [2, 1], [3, 2], [4, 3], [5, 4], [6, 5], [7, 6]],\n }\n },\n 'single-cycle-end': {\n src: {helm: 'PEPTIDE1{[meY].C.R.N.P.C.T.*}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',\n map: [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]],\n }\n },\n 'single-cycle-middle': {\n src: {helm: 'PEPTIDE1{[meY].C.R.N.*.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},\n tgt: {\n helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',\n map: [[0, 0], [1, 1], [2, 2], [3, 3], [5, 4], [6, 5], [7, 6]],\n }\n },\n 'single-cycle-gap-at-connection': {\n src: {helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},\n tgt: {helm: null, map: [], errType: HelmNotSupportedErrorType}\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(`${testName}`, async () => {\n let resErr: HelmNotSupportedError | null = null;\n try {\n const res = helmHelper.removeGaps(testData.src.helm);\n expect(res.resHelm, testData.tgt.helm);\n expectArray(Array.from(res.monomerMap!.entries()), testData.tgt.map);\n } catch (err: any) {\n resErr = err;\n }\n\n if (testData.tgt.errType)\n expect(resErr?.type, testData.tgt.errType, 'HelmNotSupportedError thrown expected');\n });\n }\n});\n","import { Subject } from 'rxjs';\n/** Fasta and Helm */\nexport class BioFilterProps {\n constructor(substructure, \n /** Pass false from an inheritors constructor, at the end set true. */ readOnly = true, logger) {\n this.substructure = substructure;\n this.readOnly = readOnly;\n this.logger = logger;\n return new Proxy(this, {\n set: (target, key, value) => {\n this.logger?.debug(`BioFilterProps.set ${key.toString()}( '${value}' )`);\n if (this.readOnly)\n throw new Error('Properties are immutable.');\n target[key] = value;\n return true;\n }\n });\n }\n}\n/** Encapsulates input controls handling */\nexport class BioFilterBase {\n constructor() {\n this.onChanged = new Subject();\n this._props = null;\n this._propsChanging = false;\n }\n get props() {\n if (!this._props)\n this._props = this.emptyProps;\n return this._props;\n }\n ;\n set props(value) {\n this._propsChanging = true;\n try {\n this._props = value;\n this.applyProps();\n this.onChanged.next();\n }\n finally {\n this._propsChanging = false;\n }\n }\n ;\n saveProps() {\n const propsObj = {};\n for (const [key, value] of Object.entries(this.props)) {\n if (key !== '_onChanged' && key !== 'logger') {\n // @ts-ignore\n propsObj[key] = this.props[key];\n }\n }\n return propsObj;\n }\n async detach() { }\n get filterSummary() { return this.props.substructure; }\n ;\n get isFiltering() { return this.props.substructure !== ''; }\n resetFilter() {\n this.props = this.emptyProps;\n this.onChanged.next();\n }\n}\n//# sourceMappingURL=bio-substructure-filter-types.js.map","/* eslint-disable max-lines */\n/* eslint-disable max-lines-per-function */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, test, expect, delay, testEvent} from '@datagrok-libraries/test/src/test';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';\n\nimport {awaitGrid, readDataframe} from './utils';\n\nimport {BioFilterProps, IBioFilter}\n from '@datagrok-libraries/bio/src/substructure-filter/bio-substructure-filter-types';\n\nimport {_package} from '../package-test';\n\ncategory('bio-substructure-filters', async () => {\n let seqHelper: ISeqHelper;\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n seqHelper = await getSeqHelper();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n\n test('helm-dialog', async () => {\n const logPrefix = 'Bio tests: substructureFilters/helm-dialog';\n const df = await readDataframe('tests/filter_HELM.csv');\n const view = grok.shell.addTableView(df);\n await grok.data.detectSemanticTypes(df);\n await df.meta.detectSemanticTypes();\n\n _package.logger.debug(`${logPrefix}, filter attaching.`);\n const filter = await grok.functions.call('Bio:bioSubstructureFilterTest');\n filter.attach(df);\n const dlg = ui.dialog('Test filters').add(filter.root).show(); // to waitForElementInDom\n await filter.awaitRendered();\n try {\n const bf = filter.bioFilter as IBioFilter;\n expect(filter.bioFilter !== null, true, 'bioFilter is not created');\n\n // filter 1\n _package.logger.debug(`${logPrefix}, filter 1 change awaiting...`);\n await testEvent(df.onRowsFiltered, () => {}, () => {\n bf.props = new BioFilterProps('PEPTIDE1{A.C}$$$$V2.0', undefined, _package.logger);\n }, 20000);\n _package.logger.debug(`${logPrefix}, filter 1 changed.`);\n expect(filter.dataFrame!.filter.trueCount, 1);\n expect(filter.dataFrame!.filter.toBinaryString(), '0001');\n\n // filter 2\n _package.logger.debug(`${logPrefix}, filter 2 change awaiting...`);\n await testEvent(df.onRowsFiltered, () => {}, () => {\n bf.props = new BioFilterProps('PEPTIDE1{C}$$$$V2.0', undefined, _package.logger);\n }, 20000);\n setTimeout(() => view.grid.invalidate(), 500);\n await awaitGrid(view.grid);\n await delay(1000);\n _package.logger.debug(`${logPrefix}, filter 2 changed.`);\n expect(filter.dataFrame!.filter.trueCount, 2);\n expect(filter.dataFrame!.filter.toBinaryString(), '1001');\n } finally {\n dlg.close();\n }\n await filter.awaitRendered();\n await delay(3000); //TODO: await for grid.onLookChanged\n }, {});\n\n\n // Generates unhandled exception accessing isFiltering before bioFilter created\n test('helm-view', async () => {\n const logPrefix = 'Bio tests: substructureFilters/helm-view';\n const df = await readDataframe('tests/filter_HELM.csv');\n const col = df.getCol('HELM string');\n await grok.data.detectSemanticTypes(df);\n const view = grok.shell.addTableView(df);\n\n const fg = view.getFiltersGroup();\n\n // await awaitCheck(() => fg.filters.length == 1, 'await filters.length == 1', 1000);\n // const filter = fg.filters.filter((f) => f.columnName == col.name)[0] as BioSubstructureFilter;\n await awaitGrid(view.grid);\n });\n\n\n test('sync-helm', async () => {\n const df = await _package.files.readCsv('tests/filter_HELM.csv');\n await grok.data.detectSemanticTypes(df);\n const view = grok.shell.addTableView(df);\n\n const fSubStr: string = 'PEPTIDE1{A.C}$$$$V2.0';\n const fTrueCount: number = 1;\n\n const f1 = await createFilter('HELM string', df);\n const f2 = await createFilter('HELM string', df);\n const dlg = ui.dialog('Test filters').add(f1.root).add(f2.root).show(); // to waitForElementInDom\n await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);\n try {\n expect(!!f1.bioFilter, true);\n expect(!!f2.bioFilter, true);\n expect(f1.bioFilter!.type, 'HelmBioFilter');\n expect(f2.bioFilter!.type, 'HelmBioFilter');\n const bf1 = f1.bioFilter as IBioFilter;\n const bf2 = f2.bioFilter as IBioFilter;\n\n await testEvent(df.onRowsFiltered, () => {}, () => {\n bf1.props = new BioFilterProps(fSubStr, undefined, _package.logger);\n }, 60000, 'await onRowsFiltered'); // wait to load monomers\n await awaitGrid(view.grid);\n //debugger;\n\n _package.logger.debug('Bio tests: substructureFilters/sync-helm, before changed event');\n await delay(f1.debounceTime * 2);\n _package.logger.debug('Bio tests: substructureFilters/sync-helm, after changed event');\n expect(df.filter.trueCount, fTrueCount);\n\n await f1.awaitRendered();\n expect((bf2.props as BioFilterProps).substructure, fSubStr);\n } finally {\n f1.detach();\n f2.detach();\n dlg.close();\n }\n await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);\n await awaitGrid(view.grid);\n await delay(3000); //TODO: await for grid.onLookChanged\n });\n\n\n async function createFilter(colName: string, df: DG.DataFrame): Promise<any> {\n if (!df.columns.names().includes(colName)) {\n throw new Error(`The column '${colName}' not found. ` +\n `Available in data frame are ${JSON.stringify(df.columns.names())}`);\n }\n\n const filter = await grok.functions.call('Bio:bioSubstructureFilterTest');\n filter.attach(df);\n filter.applyState({columnName: colName});\n filter.column = df.col(colName);\n filter.columnName = colName;\n //filter.tableName = df.name;\n return filter;\n };\n} );\n\n","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","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunsch } 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[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunsch,\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: hamming\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25EOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFLWDtBQUxELFdBQVksd0JBQXdCO0lBQ2xDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0lBQ3ZDLG1GQUF1RCxDQUFBO0FBQ3pELENBQUMsRUFMVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBS25DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxlQUFlO0lBQzdELENBQUMsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsRUFBRSxPQUFPO0NBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bnNjaH0gZnJvbSAnLi9uZWVkbGVtYW4td3Vuc2NoJztcbmltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKiBFbnVtIGNvbnRhaW5pbmcgY3VycmVudGx5IHN1cHBvcnRlZCBtYWNyb21vbGVjdWxlIGRpc3RhbmNlIGZ1bmN0aW9uc1xuICogSGFtbWluZyBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgaWYgdGhlIHNlcXVlbmNlcyBhcmUgYWxyZWFkeSBhbGlnbmVkXG4gKiBOZWVkbGVtYW4gZGlzdGFuY2Ugd2lsbCBiZSB1c2VkIGZvciBwcm90ZWluIHNlcXVlbmNlcyB3aXRoIGtub3duIEJMT1NVTTYyIG1hdHJpeFxuICogTGV2ZW5zaHRlaW4gZGlzdGFuY2Ugd2lsbCBiZSB1c2VkIGZvciBudWNsZW90aWRlIHNlcXVlbmNlcyBhcyBmb3IgdGhlbSBzdWJzdGl0dXRpb24gbWF0cml4IGlzIHNhbWUgYXMgaWRlbnRpdHkgbWF0cml4XG4gKi9cbmV4cG9ydCBlbnVtIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB7XG4gIEhBTU1JTkcgPSAnSGFtbWluZycsXG4gIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgTkVFRExFTUFOTl9XVU5TQ0ggPSAnTmVlZGxlbWFubi1XdW5zY2gnLFxuICBNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFID0gJ01vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2UnXG59O1xuXG5leHBvcnQgY29uc3QgbW1EaXN0YW5jZUZ1bmN0aW9uczogUmVjb3JkPE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcywgKHZhbHVlPzogYW55KSA9PiBtbURpc3RhbmNlRnVuY3Rpb25UeXBlPiA9IHtcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogaGFtbWluZyxcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IGxldmVuc3RlaW4sXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdOiBuZWVkbGVtYW5XdW5zY2gsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IGhhbW1pbmdcbn07XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, awaitCheck, before, category, test} from '@datagrok-libraries/test/src/test';\n\nimport {BitArrayMetricsNames} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {\n getUserLibSettings, setUserLibSettings\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';\nimport {getHelmHelper, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\nimport {expect} from '@datagrok-libraries/test/src/test';\nimport {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport {BitArrayMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {BYPASS_LARGE_DATA_WARNING} from '@datagrok-libraries/ml/src/functionEditors/consts';\n\nimport {_package} from '../package-test';\n\n\ncategory('activityCliffs', async () => {\n let helmHelper: IHelmHelper;\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n const helmEncodingFunc = DG.Func.find({name: 'macromoleculePreprocessingFunction', package: 'Bio'})[0];\n before(async () => {\n helmHelper = await getHelmHelper(); // init Helm package\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests();\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n\n test('Helm', async () => {\n const df = await _package.files.readCsv('samples/HELM_50.csv');\n const _view = grok.shell.addTableView(df);\n\n await _testActivityCliffsOpen(_view, df, DimReductionMethods.UMAP,\n 'HELM', 'Activity', 65, 311, MmDistanceFunctionsNames.HAMMING, helmEncodingFunc);\n });\n});\n\n\nasync function _testActivityCliffsOpen(tv: DG.TableView, df: DG.DataFrame, drMethod: DimReductionMethods,\n seqColName: string, activityColName: string, similarityThr: number, tgtNumberCliffs: number,\n similarityMetric: MmDistanceFunctionsNames | BitArrayMetrics, preprocessingFunction: DG.Func,\n): Promise<void> {\n await grok.data.detectSemanticTypes(df);\n (await grok.functions.call('Bio:activityCliffs', {\n table: df,\n molecules: df.getCol(seqColName),\n activities: df.getCol(activityColName),\n similarity: similarityThr,\n methodName: drMethod,\n similarityMetric: similarityMetric,\n preprocessingFunction: preprocessingFunction,\n options: {[`${BYPASS_LARGE_DATA_WARNING}`]: true},\n demo: false,\n })) as DG.Viewer | undefined;\n const scatterPlot = Array.from(tv.viewers).find((v) => v.type === DG.VIEWER.SCATTER_PLOT);\n\n expect(scatterPlot != null, true);\n\n const checkScatterPlotInitialized = () => {\n const cliffsLink = scatterPlot!.root.getElementsByClassName('scatter_plot_link');\n return cliffsLink.length > 0 &&\n ((cliffsLink[0] as HTMLElement).innerText.toLowerCase() === `${tgtNumberCliffs} cliffs`);\n };\n await awaitCheck(() => {\n return checkScatterPlotInitialized();\n }, 'activity cliffs failed');\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {after, before, category, expect, test} from '@datagrok-libraries/test/src/test';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';\nimport {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\n\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {getRdKitModule} from '@datagrok-libraries/bio/src/chem/rdkit-module';\nimport {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';\n\ntype TestDataTargetType = { atomCount: number, bondCount: number };\ntype TestDataType = {\n src: { seq: string, units: NOTATION },\n tgt: TestDataTargetType,\n};\n\ncategory('toAtomicLevel-ui', () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n let monomerLib: IMonomerLib;\n let rdKitModule: RDModule;\n\n before(async () => {\n rdKitModule = await getRdKitModule();\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Test 'helm' requires default monomer library loaded\n await monomerLibHelper.loadMonomerLibForTests(); // load default libraries\n\n monomerLib = monomerLibHelper.getMonomerLib();\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadMonomerLib(true); // load user settings libraries\n });\n\n const tests: { [testName: string]: TestDataType } = {\n 'fasta': {\n src: {seq: 'MDYKETLLMPK', units: NOTATION.FASTA},\n tgt: {atomCount: 94, bondCount: 95},\n },\n 'fasta-with-gap': {\n src: {seq: 'MD-YKETLLMPK', units: NOTATION.FASTA},\n tgt: {atomCount: 94, bondCount: 95},\n },\n 'helm': {\n src: {seq: 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2}$$$$', units: NOTATION.HELM},\n tgt: {atomCount: 68, bondCount: 68},\n },\n 'helm-with-gap': {\n src: {seq: 'PEPTIDE1{meI.hHis.*.Aca.N.T.dK.Thr_PO3H2}$$$$', units: NOTATION.HELM},\n tgt: {atomCount: 68, bondCount: 68},\n },\n };\n\n const getDfAndSeqCol = async (testData: TestDataType): Promise<{df: DG.DataFrame, seqCol: DG.Column<string>}> => {\n const seq = testData.src.seq;\n const df = DG.DataFrame.fromColumns([DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'seq', [seq])]);\n await grok.data.detectSemanticTypes(df);\n return {df: df, seqCol: df.getCol('seq')};\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(`${testName}-nonlinear`, async () => {\n const res = await getDfAndSeqCol(testData);\n await _testToAtomicLevelFunc(res.df, res.seqCol, true, testData.tgt);\n });\n }\n\n async function _testToAtomicLevelFunc(\n df: DG.DataFrame, seqCol: DG.Column<string>, nonlinear: boolean, tgt: TestDataTargetType,\n ): Promise<void> {\n await grok.functions.call('Bio:toAtomicLevel', {\n table: df, seqCol: seqCol, nonlinear: true, highlight: false\n });\n const molCol = df.col('molfile(seq)');\n expect(molCol?.semType, DG.SEMTYPE.MOLECULE);\n const resMolStr = molCol?.get(0)!;\n const resRdMol = rdKitModule.get_mol(resMolStr);\n expect(resRdMol != null, true, 'No molecule generated');\n try {\n const resAtomCount = resRdMol.get_num_atoms();\n const resBondCount = resRdMol.get_num_bonds();\n expect(resAtomCount, tgt.atomCount);\n expect(resBondCount, tgt.bondCount);\n } finally {\n resRdMol.delete();\n }\n }\n});\n","import * as DG from 'datagrok-api/dg';\nexport async function getRdKitModule() {\n const funcList = DG.Func.find({ package: 'Chem', name: 'getRdKitModule' });\n if (funcList.length === 0)\n throw new Error('Package \"Chem\" must be installed for getRdKitModule.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=rdkit-module.js.map","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {runTests, tests, TestContext, initAutoTests as initTests} from '@datagrok-libraries/test/src/test';\n\nimport './tests/_first-tests';\nimport './tests/helm-tests';\nimport './tests/findMonomers-tests';\nimport './tests/renderers-tests';\nimport './tests/get-molfiles-tests';\nimport './tests/properties-widget-tests';\nimport './tests/parse-helm-tests';\nimport './tests/helm-web-editor-tests';\nimport './tests/helm-input-tests';\nimport './tests/helm-helper-tests';\nimport './tests/helm-substructure-filter';\nimport './tests/helm-activity-cliffs';\nimport './tests/to-atomic-level-ui-non-linear';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n // verbose: true - for tests returning dataframe\n const data = await runTests({category, test, testContext, verbose: true});\n return DG.DataFrame.fromObjects(data)!;\n}\n\n//name: initAutoTests\nexport async function initAutoTests() {\n await initTests(_package, _package.getModule('package-test.js'));\n}\n"],"names":["__WEBPACK_AMD_DEFINE_RESULT__","exports","__esModule","digestLength","blockSize","K","Uint32Array","hashBlocks","w","v","p","pos","len","a","b","c","d","e","f","g","h","u","i","j","t1","t2","Hash","this","state","Int32Array","temp","buffer","Uint8Array","bufferLength","bytesHashed","finished","reset","prototype","clean","length","update","data","dataLength","Error","dataPos","finish","out","left","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","from","HMAC","key","inner","outer","pad","istate","ostate","hash","hmac","fillBuffer","info","counter","num","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","fill","pbkdf2","password","iterations","dkLen","prf","ctr","t","dk","k","factory","sha256","module","undefined","call","__webpack_require__","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","n","getter","definition","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","value","external_DG_namespaceObject","DG","testData","DataFrame","fromCsv","columns","add","Column","fromList","TYPE","BYTE_ARRAY","Array","test_awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","STANDART_TIMEOUT","BENCHMARK_TIMEOUT","stdLog","console","log","bind","stdInfo","stdWarn","warn","stdError","error","tests","autoTestsCatName","demoCatName","detectorsCatName","coreCatName","wasRegistered","currentCategory","assure","notNull","name","TestContext","constructor","catchUnhandled","report","returnOnFail","closeAll","Test","category","test","options","_a","timeout","_b","isInDebug","res","toString","test_testEvent","event","handler","trigger","ms","reason","sub","subscribe","args","unsubscribe","clearTimeout","setTimeout","push","test_expect","actual","expected","expectFloat","tolerance","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","NaN","isNaN","areEqual","Math","abs","expectObject","expectedKey","expectedValue","entries","actualValue","expectArray","isFinite","actualLength","expectedLength","tests_","clear","benchmarks","stressTests","owner","before","after","addNamespace","s","replace","RegExp","nqName","initAutoTests","package_","_c","_d","_e","_f","_g","_h","_j","_k","packageId","id","moduleTests","_package","window","dartTests","arr","split","pop","cat","join","fullName","unshift","isAggregated","skipReason","benchmark","moduleAutoTests","moduleDemo","moduleDetectors","packFunctions","grok","dapi","functions","filter","list","reg","demo","isArray","matchAll","map","forEach","startsWith","parseInt","eval","wait","test_delay","skip","isInBenchmark","benchmarkTimeout","friendlyName","shell","clearLastError","unhandled","lastError","hasTag","detectorsTestData","files","openTable","col","clone","semType","resArr","getResult","x","stack","Logger","translateStackTrace","execTest","predicate","logs","testTimeout","packageName","verbose","_l","_m","_o","_p","toLowerCase","start","Date","now","startDate","toISOString","date","success","skipped","package","flaking","isReproducing","timeout_","isProfiling","profile","profileEnd","stats","sum","df","remove","rows","removeWhere","toCsv","params","keys","reduce","acc","assign","JSON","stringify","toJson","reportTest","shuffle","array","newArr","slice","sort","random","awaitCheck","checkHandler","interval","clearInterval","intervalId","setInterval","func","timeoutReason","timeoutPromise","_","race","fromColumns","fromStrings","async","helmGapStartRe","helmGapIntRe","helmGapEndRe","parseHelm","monomers","seqs","detachAnnotation","str","indexOf","substring","ss","monomer","includes","closingIndex","findClosing","element","residue","endsWith","openingIndex","findOpening","firstPiece","thirdPiece","lastIndexOf","elements","el","open","close","count","sep","ret","frag","parentheses","bracket","braces","quote","c2","_detachAppendix","tag","repeat","m","utils_unescape","external_ui_namespaceObject","ui","JsInputBase","getHelmHelper","funcList","Func","find","prepare","getOutputParamValue","initHelmMainPackage","awaitGrid","grid","onAfterDrawContent","invalidate","readDataframe","tableName","file","readAsText","loadFileAsText","getMonomerLibHelper","input","helmAsync","createHelmInput","complexMonomersExpected","complexTestNames","expectedResults","helmStrings","idx","monomerSet","Set","monomerArray","helm","monomersArray","external_grok_namespaceObject","LIB_STORAGE_NAME","LIB_SETTINGS_KEY","DUPLICATE_MONOMER_PREFERENCES_KEY","MAX_USER_SETTINGS_STRING_LENGTH","CHUNK_KEY_SUFFIX","userLibSettingsPromise","getUserLibSettings","resStr","userSettings","getValue","parse","exclude","explicit","duplicateMonomerPreferences","duplicatePrefs","iter","nextChunkKeysCount","nextChunkIndex","charAt","nextChunkKey","nextChunkStr","err","getDuplicatePrefsFull","polymerType","libraryName","monomerSymbol","setUserLibSettings","duplicatePrefsShortHand","valueStr","chunksCount","ceil","nextKey","chunkStr","chunkStrToStore","setDuplicatePrefsFull","monomerLibHelper","userLibSettings","loadMonomerLibForTests","loadMonomerLib","withoutMissed","tgt","withMissed","testName","_testFindMonomers","testHelmValue","tgtMissedSet","monomerLib","getMonomerLib","resMissedSet","seqMonomerSymbolList","getMonomer","findMonomers","external_$_namespaceObject","$","external_rxjs_namespaceObject","rxjs","NOTATION","ALPHABET","TAGS","CandidateType","alphabet","cutoff","Alphabets","fasta","peptide","dna","rna","PT","DNA","RNA","FASTA","SEPARATOR","HELM","BILN","wu","SeqPaletteBase","makePalette","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","orange","all_green","all_blue","magenta","red","st_blue","dark_blue","light_blue","lilac_blue","dark_green","green","light_green","st_green","pink","brown","gray","yellow","white","AminoacidsPalettes","Lesk","lesk","GrokGroups","grokGroups","RasMol","rasMol","D","E","C","M","R","S","T","F","Y","N","Q","G","L","V","I","A","W","H","others","resM","aaSynonyms","super","MeNle","MeA","MeG","MeF","Aminoacids","getPalette","scheme","getInnerOuter","isInner","char","getColorAAPivot","chemPaletteInstance","outerMonomer","innerMonomer","amino","toUpperCase","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Ala","Arg","Asn","Asp","Cys","Gln","Glu","Gly","His","Ile","Leu","Lys","Met","Phe","Pro","Ser","Thr","Trp","Tyr","Val","Nucleotides","U","performance","PROCESS","process","AC","globalThis","AbortController","AS","AbortSignal","onabort","_onabort","aborted","addEventListener","fn","warnACPolyfill","signal","abort","printACPolyfillWarning","env","LRU_CACHE_IGNORE_AC_WARNING","msg","type","code","emitWarning","iterator","Map","PEPTIDE","CHEM","BLOB","Z","_listeners","_completed","delete","complete","observerCount","size","B","line","text","background","Ji","rn","Le","exec","nn","padStart","sn","an","max","min","l","on","Jn","round","xt","Xn","pow","vt","Zi","wt","Qi","eo","to","no","oo","io","ro","so","we","fallback","errorTriple","b_BASE","b_SUGAR","b_LINKER","b_AA","b_CHEM","b_BLOB","b_NUCLEOTIDE","ve","Be","dist_$","meta","colors","light","dark","default","naturalAnalog","ee","monomerType","PI","Et","y","width","height","isInteger","is","An","Do","cos","sin","Mn","Tn","Sn","sqrt","Ko","Wo","aa","strokeWidth","sugar","cornerRadius","base","linker","chem","blob","nucleotide","defaultStroke","defaultFill","selectionColor","highlightColor","errorColor","fontSize","fontFamily","bondLength","textColor","idColor","annotationColor","tagDotColor","hbondColor","nonCanonicalHbondColor","crossPolymerBondColor","colorTheme","softenCanvas","shapes","nt","Lt","Ie","biotype","symbol","Vo","Oo","No","Fo","Go","pe","he","es","ns","Ae","In","class","atoms","has","stroke","Pn","WeakMap","bonds","isEmpty","freeze","ownerDocument","document","createElement","setAttribute","String","appendChild","createTextNode","ye","get_mol","get_svg","oe","body","children","getAttribute","style","display","Me","firstChild","removeChild","rdkitSvg","rdkitTestid","innerHTML","hint","top","Ot","Ft","_baseTransform","_viewport","scale","offset","_pinnedBbox","_tooltip","_bondTooltip","_rdkitSvgCache","_unsubs","_destroyed","host","_editor","_doc","documentImpl","_width","_height","querySelector","textContent","head","documentElement","ci","_svgRoot","_renderFresh","_hideTooltip","_hideBondTooltip","_refreshOverlays","_applyResize","viewport","_applyViewport","_showTooltip","atom","clientX","clientY","_showBondTooltip","bond","_paintBondPreview","cursor","candidate","_clearBondPreview","_paintSelectionRect","origin","_paintSelectionRectFromRect","rect","_clearSelectionRect","svgRoot","resize","redraw","destroy","parentNode","getService","_currentTheme","getMol","Rn","renderMol","theme","fixedModelBbox","dist_ui","_applyOverlaysToCurrent","getSelection","selectedAtomIds","highlightLayer","highlightedAtomIds","selectionLayer","di","_editorHighlights","_spliceLayer","createElementNS","replaceChild","_currentHighlights","bio","positionInChain","chainId","_renderRdkitTooltipSvg","rdkitModule","smiles","_RDKIT_CACHE_LIMIT","set","pi","r1","r2","a1","a2","kind","_paintSelectionRectAt","position","ie","_onClose","_primaryAction","_host","role","testId","title","stopPropagation","target","tagName","preventDefault","stopImmediatePropagation","root","anyOpen","_openStack","closeTopmost","splice","setPrimaryAction","isOpen","On","We","ce","Ei","st","Nn","Fn","Wt","onValueSet","onPickModeChange","_slots","_favStar","_pickMode","_builderRdkitCache","_hooks","paletteHooks","_favHooks","favoriteHooks","tabindex","preview","toggleFavoriteTriplet","_hintEl","hidden","_buildSvg","_preview","_addBtn","_onAddClicked","onChanged","refresh","_repaintSlotColors","_libUnsub","_populateDefaults","_updatePreview","setField","_setLabelText","labelEl","_repaintSlot","field","startPickMode","_setSlotPressed","_setHintActive","beginBiotypeFilter","_exitPickMode","cancelPickMode","endBiotypeFilter","getPickMode","triggerAdd","je","_buildSlot","groupEl","_showSlotTooltip","_hideSlotTooltip","shapeEl","nextSibling","nodeName","xa","insertBefore","values","_theme","getMonomerSet","Ma","ka","Aa","some","_updateFavStar","isFavoriteTriplet","removeAttribute","placeRnaTriplet","_rdkit","_builderRdkitSvgFor","_BUILDER_RDKIT_CACHE_LIMIT","_slotHint","_slotTitle","getBoundingClientRect","Kt","localeCompare","ue","Gn","jt","Li","Bi","qt","qe","favoritesChanged","_nextAddUnsub","_favorites","_favoriteTriplets","_pendingRnaSelection","_visibleTabs","_activeTab","_searchInput","_filter","_rnaBuilder","_activeBiotypeFilter","_pickResolver","_pickCanceller","_pickEscapeListener","_pickOutsideClickListener","_paletteRdkitCache","_opts","groupByNaturalAnalog","allowFavorites","_loadFavorites","_resolveInitialTab","initialTab","_render","_themeUnsub","_updatePrimedClasses","setFilter","trim","_applyFilter","setActiveTab","_persistActiveTab","_applyActiveTabClasses","getActiveTab","getFavorites","_findMonomer","setFavorite","_saveFavorites","_hidePaletteTooltips","_emitFavoritesChanged","clearFavorites","getFavoriteTriplets","setFavoriteTriplet","findIndex","favorites","triplets","getRnaBuilder","hasActiveBiotypeFilter","getActiveBiotypeFilter","cancelBiotypeFilter","_teardownPickMode","_buildPaletteFilterHooks","defaultView","_isInsideOwnPalette","parentElement","_scrollActivePaneToTop","scrollTo","behavior","scrollTop","removeEventListener","_computeVisibleTabs","_buildFavoritesPane","_buildPolymerPane","getPolymerTypes","_resolveFavoriteMonomers","_groupByPolymerAndType","_renderGroup","_renderTripletGroup","pt","mt","Backbone","Branch","Terminal","Undefined","_polymerLabel","_renderTripletChip","showStar","favorite","label","star","Si","_wireTripletChip","parts","mi","_tripletTooltipParts","classList","contains","_buildRnaDefaultChips","_pickSymbol","_DEFAULT_TRIPLET_BASES","_paletteRdkitSvg","_restoreRnaSelection","_monomersForPolymer","_groupRna","_groupByAnalog","getNextAddSymbol","_sortByColor","_biotype","_renderTile","Qn","isGrey","getMonomerSymbolsByType","Zn","ga","primed","draggable","Ti","_wireTile","_PALETTE_RDKIT_CACHE_LIMIT","every","replaceMonomers","fire","message","severity","durationMs","setNextAddSymbol","dataTransfer","setData","effectAllowed","startPaletteDrag","querySelectorAll","_localStorage","localStorage","getItem","setItem","_extractSymbols","_extractTriplets","symbols","MonomerNumberingTypes","HelmTabKeys","V2K_CONST","correctColor","color","dgColor","Color","fromHtml","distToBlack","toRgb","StringUtils","hashCode","charCodeAt","UnknownSeqPalette","UnknownColorPalette","_pallete","buildPalette","lh","awaitLoaded","Infinity","monLib","customMonomerColors","polymerTypes","monomerSymbols","concat","palleteLength","colorObj","polType","pI","readCsv","helmCol","getCol","tv","addTableView","external_$_default","detectSemanticTypes","SEMTYPE","MACROMOLECULE","units","getTag","CELL_RENDERER","cellRendererErrorJson","cellRendererError","_testMissedInLib","helmCoordsCsv","currentRowIdx","view","sp","plot","scatter","dockManager","dock","DOCK_TYPE","RIGHT","all","onAfterDrawScene","invalidateCanvas","spBcr","wp","worldToScreen","ev","MouseEvent","cancelable","bubbles","button","spCanvas","fromEvent","logger","debug","tooltip","hitTest","dispatchEvent","_testScatterPlotTooltip","ChemicalTableParserBase","fileContent","init","_atomCount","_atomTypes","_bondCount","_bondTypes","xyzAtomCoordinates","_pairsOfBondedAtoms","atomCount","setAtomAndBondCounts","bondCount","parseAtomCoordinates","z","atomTypes","parseAtomTypes","pairsOfBondedAtoms","parseBondedAtomPairs","bondTypes","parseBondTypes","parseAtomAndBondCounts","getNextColumnIdx","isWhitespace","shiftIdxToSpecifiedColumn","lineStartIdx","columnNumber","numberOfJumps","getAtomBlockIdx","shiftIdxToAtomType","parseAtomType","getNextLineIdx","Float32Array","shiftIdxToXColumn","item","parseFloatValue","bondedAtomPairs","getBondBlockIdx","shiftIdxToBondedAtomsPair","pair","Uint16Array","parseIntValue","shiftIdxToBondType","idxOfNumber","parseNumericValue","parseFloat","parserFunction","end","MolfileHandlerBase","molfile","begin","isQuote","getNextIdenticalChar","letter","sym","isQuery","isQueryOrFragment","charCode","isFragment","condition","MolfileV2KHandler","getAtomLines","atomBlockIdx","getBondLines","bondBlockIdx","getRGroupIdToAtomicIdxMap","lines","RGP_LINE_START","atomIdxToRgpIdxList","getAtomIdxToRgpIdxList","atomAliasLinesIndices","ATOM_ALIAS_LINE_START","atomAliasLines","atomAliasTextLines","rgpAtomIdx","rgpId","unaccounted","getRGroupAtomicIndices","rgpLine","indices","isValidMolfile","END","ATOM_TYPE_COL","getCountsLineIdx","NUM_OF_HEADER_LINES","FIRST_BONDED_ATOM_COL","BOND_TYPE_COL","NUM_OF_COUNTS_DIGITS","MolfileV3KHandler","rGroupMatches","match","rGroupData","rgId","rGroupId","numOfAtoms","MolfileHandler","getInstance","isMolfileV2K","isMolfileV3K","getSeqHelper","resCol","resMolfileList","toList","mf","SeqPropertiesError","getPropertiesDict","seq","sh","div","helmString2","isHelm","getConverter","replaceAll","editor","createHelmWebEditor","setHelm","formula","getFormula","molWeight","getMolWeight","coef","getExtinctionCoefficient","empty","TestsData","Helm","separator","UN","separator2","_testParseHelmWithHelmHelper","src","helmHelper","resMol","elem","DimReductionMethods","seqHelper","testPropertiesDict","expPropDict","setTag","getSeqHandler","colList","longSequence","msaCol","COLUMN_TYPE","STRING","alphabetIsMultichar","FLOAT","generateLongSequence","errCatched","libHelper","hh","appHost","createWebEditorApp","dialog","show","helmInput","stringValue","mol","molValue","dlg","hostEl","getInput","clientHeight","svg","svgH","clientWidth","editable","editorOptions","setProperty","tmBcr","right","dialogInputEl","mon","iEl","iBcr","onTooltipShown","tooltipEl","elemDiv","innerText","hide","_testTooltipOnHelmInput","errType","resErr","removeGaps","resHelm","monomerMap","BioFilterProps","substructure","readOnly","Proxy","createFilter","colName","names","attach","applyState","columnName","column","logPrefix","awaitRendered","bf","bioFilter","onRowsFiltered","props","dataFrame","trueCount","toBinaryString","getFiltersGroup","fSubStr","f1","f2","bf1","bf2","debounceTime","detach","MmDistanceFunctionsNames","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","helmEncodingFunc","_view","drMethod","seqColName","activityColName","similarityThr","tgtNumberCliffs","similarityMetric","preprocessingFunction","table","molecules","activities","similarity","methodName","bypassLargeDataWarning","scatterPlot","viewers","VIEWER","SCATTER_PLOT","cliffsLink","getElementsByClassName","checkScatterPlotInitialized","_testActivityCliffsOpen","UMAP","rdKitModule","getRdKitModule","getDfAndSeqCol","seqCol","_testToAtomicLevelFunc","nonlinear","highlight","molCol","MOLECULE","resMolStr","resRdMol","resAtomCount","get_num_atoms","resBondCount","get_num_bonds","Package","package_test_test","testContext","nodeOptions","getCurrentCall","packageOwner","results","redefineConsole","categoriesToInvoke","skippingCategories","skipToCategory","isTargetCategory","skippedCount","beforeStatus","invokeCategoryMethod","stressTest","tags","testElem","widgetsDifference","invokeTestsInCategory","afterStatus","skipToTest","invokeTests","method","invokationResult","_q","_r","_s","_t","_u","widgetsBefore","getWidgetsCountSafe","skippingTests","testRun","Balloon","Widget","getAll","runTests","fromObjects","package_test_initAutoTests","getModule"],"sourceRoot":""}