@datagrok/bio 2.1.12 → 2.4.3

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.
Files changed (61) hide show
  1. package/.eslintrc.json +1 -1
  2. package/README.md +11 -12
  3. package/css/helm.css +10 -0
  4. package/detectors.js +97 -69
  5. package/dist/package-test.js +2 -13168
  6. package/dist/package-test.js.map +1 -0
  7. package/dist/package.js +2 -10560
  8. package/dist/package.js.map +1 -0
  9. package/dockerfiles/Dockerfile +86 -0
  10. package/files/icons/composition-analysis.svg +17 -0
  11. package/files/icons/sequence-diversity-viewer.svg +4 -0
  12. package/files/icons/sequence-similarity-viewer.svg +4 -0
  13. package/files/icons/vdregions-viewer.svg +22 -0
  14. package/files/icons/weblogo-viewer.svg +7 -0
  15. package/files/tests/testUrl.csv +11 -0
  16. package/files/tests/toAtomicLevelTest.csv +4 -0
  17. package/package.json +24 -25
  18. package/src/analysis/sequence-activity-cliffs.ts +11 -9
  19. package/src/analysis/sequence-search-base-viewer.ts +2 -1
  20. package/src/analysis/sequence-similarity-viewer.ts +3 -3
  21. package/src/analysis/sequence-space.ts +2 -1
  22. package/src/calculations/monomerLevelMols.ts +4 -4
  23. package/src/package-test.ts +10 -2
  24. package/src/package.ts +215 -131
  25. package/src/substructure-search/substructure-search.ts +19 -16
  26. package/src/tests/Palettes-test.ts +1 -1
  27. package/src/tests/WebLogo-positions-test.ts +113 -57
  28. package/src/tests/_first-tests.ts +9 -0
  29. package/src/tests/activity-cliffs-tests.ts +8 -7
  30. package/src/tests/activity-cliffs-utils.ts +17 -9
  31. package/src/tests/bio-tests.ts +4 -5
  32. package/src/tests/checkInputColumn-tests.ts +1 -1
  33. package/src/tests/converters-test.ts +52 -17
  34. package/src/tests/detectors-benchmark-tests.ts +3 -2
  35. package/src/tests/detectors-tests.ts +177 -172
  36. package/src/tests/detectors-weak-and-likely-tests.ts +129 -0
  37. package/src/tests/fasta-export-tests.ts +1 -1
  38. package/src/tests/monomer-libraries-tests.ts +34 -0
  39. package/src/tests/pepsea-tests.ts +21 -0
  40. package/src/tests/renderers-test.ts +21 -19
  41. package/src/tests/sequence-space-test.ts +6 -4
  42. package/src/tests/similarity-diversity-tests.ts +4 -4
  43. package/src/tests/splitters-test.ts +4 -5
  44. package/src/tests/substructure-filters-tests.ts +23 -1
  45. package/src/tests/utils/sequences-generators.ts +1 -1
  46. package/src/tests/utils.ts +2 -1
  47. package/src/tests/viewers.ts +16 -0
  48. package/src/utils/cell-renderer.ts +88 -35
  49. package/src/utils/constants.ts +7 -6
  50. package/src/utils/convert.ts +8 -2
  51. package/src/utils/monomer-lib.ts +174 -0
  52. package/src/utils/multiple-sequence-alignment.ts +44 -20
  53. package/src/utils/pepsea.ts +78 -0
  54. package/src/utils/save-as-fasta.ts +2 -1
  55. package/src/utils/ui-utils.ts +15 -3
  56. package/src/viewers/vd-regions-viewer.ts +113 -72
  57. package/src/viewers/web-logo-viewer.ts +1031 -0
  58. package/src/widgets/bio-substructure-filter.ts +38 -24
  59. package/tsconfig.json +71 -72
  60. package/webpack.config.js +4 -11
  61. package/dist/vendors-node_modules_datagrok-libraries_ml_src_workers_dimensionality-reducer_js.js +0 -9039
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-test.js","mappings":"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EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,GAAS2sC,YAAcG,UAAU9sC,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,GAAS6sC,WAAaC,UAAU9sC,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,ICvmB5C,mBACA,wB,2SCiNL,SA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","sources":["webpack://bio/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/fasta-handler.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/viewers/web-logo.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/random.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.js","webpack://bio/./node_modules/@datagrok-libraries/ml/css/styles.css","webpack://bio/./node_modules/css-loader/dist/runtime/api.js","webpack://bio/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://bio/./node_modules/fast-sha256/sha256.js","webpack://bio/./node_modules/jaro-winkler-typescript/lib/index.js","webpack://bio/./node_modules/is-any-array/src/index.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/errorCalculation.js","webpack://bio/./node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/lib-es6/index.js","webpack://bio/./node_modules/ml-array-min/lib-es6/index.js","webpack://bio/./node_modules/ml-array-max/lib-es6/index.js","webpack://bio/./node_modules/ml-matrix/src/inspect.js","webpack://bio/./node_modules/ml-matrix/src/util.js","webpack://bio/./node_modules/ml-matrix/src/matrix.js","webpack://bio/./node_modules/ml-matrix/src/stat.js","webpack://bio/./node_modules/ml-matrix/src/mathOperations.js","webpack://bio/./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","webpack://bio/./node_modules/ml-matrix/src/dc/lu.js","webpack://bio/./node_modules/ml-matrix/src/dc/util.js","webpack://bio/./node_modules/ml-matrix/src/dc/qr.js","webpack://bio/./node_modules/ml-matrix/src/dc/svd.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/step.js","webpack://bio/./node_modules/ml-matrix/src/decompositions.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://bio/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://bio/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://bio/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://bio/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://bio/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://bio/./src/calculations/monomerLevelMols.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://bio/./src/utils/cell-renderer.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/viewers/vd-regions.js","webpack://bio/./src/viewers/vd-regions-viewer.ts","webpack://bio/./src/analysis/sequence-space.ts","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/dataframe-utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/css/styles.css?8c03","webpack://bio/./node_modules/@datagrok-libraries/ml/src/viewers/activity-cliffs.js","webpack://bio/./node_modules/fastest-levenshtein/esm/mod.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics.js","webpack://bio/./src/analysis/sequence-activity-cliffs.ts","webpack://bio/./src/analysis/sequence-search-base-viewer.ts","webpack://bio/./node_modules/@datagrok-libraries/ml/src/spe.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/functionEditors/seq-space-base-editor.js","webpack://bio/./src/package.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/splitter.js","webpack://bio/./src/substructure-search/substructure-search.ts","webpack://bio/./src/utils/constants.ts","webpack://bio/external var \"$\"","webpack://bio/./src/utils/convert.ts","webpack://bio/./src/utils/monomer-lib.ts","webpack://bio/./node_modules/@biowasm/aioli/dist/aioli.mjs","webpack://bio/./node_modules/@datagrok-libraries/bio/src/sequence-encoder.js","webpack://bio/./src/utils/multiple-sequence-alignment.ts","webpack://bio/./src/utils/pepsea.ts","webpack://bio/./src/utils/save-as-fasta.ts","webpack://bio/./src/utils/ui-utils.ts","webpack://bio/./src/viewers/web-logo-viewer.ts","webpack://bio/external var \"rxjs.operators\"","webpack://bio/./src/widgets/bio-substructure-filter.ts","webpack://bio/./node_modules/umap-js/dist/heap.js","webpack://bio/./node_modules/umap-js/dist/index.js","webpack://bio/./node_modules/umap-js/dist/matrix.js","webpack://bio/./node_modules/umap-js/dist/nn_descent.js","webpack://bio/./node_modules/umap-js/dist/tree.js","webpack://bio/./node_modules/umap-js/dist/umap.js","webpack://bio/./node_modules/umap-js/dist/utils.js","webpack://bio/external var \"DG\"","webpack://bio/external var \"grok\"","webpack://bio/external var \"rxjs\"","webpack://bio/external var \"ui\"","webpack://bio/external var \"wu\"","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/compat get default export","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/make namespace object","webpack://bio/webpack/runtime/nonce","webpack://bio/./src/tests/_first-tests.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/tests/palettes-tests.js","webpack://bio/./src/tests/Palettes-test.ts","webpack://bio/./src/tests/detectors-tests.ts","webpack://bio/./src/tests/detectors-weak-and-likely-tests.ts","webpack://bio/./src/tests/detectors-benchmark-tests.ts","webpack://bio/./src/tests/msa-tests.ts","webpack://bio/./src/tests/splitters-test.ts","webpack://bio/./src/tests/monomer-libraries-tests.ts","webpack://bio/./src/tests/utils/sequences-generators.ts","webpack://bio/./src/tests/renderers-test.ts","webpack://bio/./src/tests/converters-test.ts","webpack://bio/./src/tests/fasta-handler-test.ts","webpack://bio/./src/tests/fasta-export-tests.ts","webpack://bio/./src/tests/bio-tests.ts","webpack://bio/./src/tests/WebLogo-positions-test.ts","webpack://bio/./src/tests/checkInputColumn-tests.ts","webpack://bio/./src/tests/utils.ts","webpack://bio/./src/tests/similarity-diversity-tests.ts","webpack://bio/./src/tests/substructure-filters-tests.ts","webpack://bio/./src/tests/pepsea-tests.ts","webpack://bio/./src/tests/viewers.ts","webpack://bio/./src/tests/activity-cliffs-utils.ts","webpack://bio/./src/tests/activity-cliffs-tests.ts","webpack://bio/./src/tests/sequence-space-utils.ts","webpack://bio/./src/tests/sequence-space-test.ts","webpack://bio/./src/package-test.ts"],"sourcesContent":["import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n var _a, _b, _c;\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","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};\n// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { getSplitter } from '../utils/macromolecule';\nexport const expectedMonomerData = ['symbol', 'name', 'molfile', 'rgroups', 'polymerType', 'monomerType'];\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag(\"separator\" /* TAGS.separator */);\n const splitterFunc = getSplitter(units, sep);\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n monomers.forEach((m) => {\n if (!monomerSymbolDict[m]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[m] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[m]);\n });\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n for (let i = 0; i < col.length; ++i) {\n const macroMolecule = col.get(i);\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n // what is the reason of double conversion?\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const units = cell.column.tags[DG.TAGS.UNITS];\n const sep = cell.column.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const macroMolecule = cell.value;\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n return molFiles;\n}\nexport function createMomomersMolDict(lib) {\n const dict = {};\n lib.forEach((it) => {\n if (it['polymerType'] === 'PEPTIDE') {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n monomerObject[field] = it[field];\n });\n dict[it[\"symbol\" /* HELM_FIELDS.SYMBOL */]] = monomerObject;\n }\n });\n return dict;\n}\nexport function createJsonMonomerLibFromSdf(table) {\n const resultLib = [];\n for (let i = 0; i < table.rowCount; i++) {\n const monomer = {};\n Object.keys(jsonSdfMonomerLibDict).forEach((key) => {\n if (key === \"symbol\" /* HELM_FIELDS.SYMBOL */) {\n const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);\n monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;\n }\n else if (key === \"rgroups\" /* HELM_FIELDS.RGROUPS */) {\n const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\\n');\n const jsonRgroups = [];\n rgroups.forEach((g) => {\n const rgroup = {};\n const altAtom = g.substring(g.lastIndexOf(']') + 1);\n const radicalNum = g.match(/\\[R(\\d+)\\]/)[1];\n rgroup[\"capGroupSmiles\" /* RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* RGROUP_FIELDS.ALTER_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* RGROUP_FIELDS.LABEL */] = `R${radicalNum}`;\n jsonRgroups.push(rgroup);\n });\n monomer[key] = jsonRgroups;\n }\n else {\n if (jsonSdfMonomerLibDict[key])\n monomer[key] = table.get(jsonSdfMonomerLibDict[key], i);\n }\n });\n resultLib.push(monomer);\n }\n return resultLib;\n}\nexport function getMonomerLibHelper() {\n return __awaiter(this, void 0, void 0, function* () {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installer for MonomerLibraryHelper.');\n const res = (yield funcList[0].prepare().call()).getOutputParamValue();\n return res;\n });\n}\n//# sourceMappingURL=monomer-utils.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","export const HELM_CORE_LIB_FILENAME = '/data/HELMCoreLibrary.json';\n// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n \"symbol\" /* HELM_FIELDS.SYMBOL */,\n \"molfile\" /* HELM_FIELDS.MOLFILE */,\n \"rgroups\" /* HELM_FIELDS.RGROUPS */,\n \"name\" /* HELM_FIELDS.NAME */,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\nexport const SDF_MONOMER_NAME = 'MonomerName';\n// todo: ideally, keys should be expressed via constants\nexport const jsonSdfMonomerLibDict = {\n 'monomerType': null,\n 'smiles': null,\n 'name': 'MonomerName',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerCode'\n};\n// range of hex nubers used in PepSea library to endode monomers\nexport const MONOMER_ENCODE_MIN = 0x100;\nexport const MONOMER_ENCODE_MAX = 0x40A;\n//# sourceMappingURL=const.js.map","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\n/** Class for parsing FASTA files */\nexport class FastaFileHandler {\n // private _columnsParsed: boolean = false;\n get descriptionsArray() { return this._descriptionsArray; }\n get sequencesArray() { return this._sequencesArray; }\n /**\n * Helper method to parse a macromolecule from a FASTA file (string)\n *\n * @param {number} startOfSequence index of macromolecule substring beginning\n * @param {number} endOfSequence index of macromolecule substring end\n \n * @return {string} parsed macromolecule\n */\n parseMacromolecule(startOfSequence, endOfSequence) {\n const seq = this._fileContent.slice(startOfSequence, endOfSequence);\n const seqArray = seq.split(/\\s/);\n return seqArray.join('');\n }\n /** Parse descriptions and sequences from a FASTA string */\n parseColumns() {\n const regex = /^>(.*)$/gm; // match 'description' lines starting with >\n let startOfSequence = 0;\n let match; // match.index is the beginning of the matched line\n while (match = regex.exec(this._fileContent)) {\n const description = this._fileContent.substring(match.index + 1, regex.lastIndex);\n this._descriptionsArray.push(description);\n if (startOfSequence !== 0)\n this._sequencesArray.push(this.parseMacromolecule(startOfSequence, match.index));\n startOfSequence = regex.lastIndex + 1;\n }\n this._sequencesArray.push(this.parseMacromolecule(startOfSequence, -1));\n // this._columnsParsed = true;\n }\n /**\n * File-handler method for import as FASTA\n *\n * @return {DG.DataFrame[]} dataframe with parsed FASTA content\n */\n importFasta() {\n const descriptionsArrayCol = DG.Column.fromStrings('description', this.descriptionsArray);\n const sequenceCol = DG.Column.fromStrings('sequence', this.sequencesArray);\n sequenceCol.semType = DG.SEMTYPE.MACROMOLECULE;\n // here should go the code from units handler\n UnitsHandler.setUnitsToFastaColumn(sequenceCol);\n return [DG.DataFrame.fromColumns([\n descriptionsArrayCol,\n sequenceCol,\n ])];\n }\n constructor(fileContent) {\n this._descriptionsArray = []; // parsed FASTA descriptions\n this._sequencesArray = []; // parsed FASTA sequeces\n this._fileContent = fileContent;\n this.parseColumns();\n }\n}\n//# sourceMappingURL=fasta-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorLength, vectorDotProduct } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../aminoacids';\nimport { NucleotidesPalettes } from '../nucleotides';\nimport { UnknownSeqPalettes } from '../unknown';\nimport { UnitsHandler } from '../utils/units-handler';\n;\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStats(seqCol, minLength, splitter) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const seq of seqCol.categories) {\n const mSeq = splitter(seq);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\nexport const monomerRe = /\\[(\\w+)\\]|(\\w)|(-)/g;\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n let mRes;\n const m = ma[0];\n if (m.length > 1) {\n mRes = ma[1];\n }\n else {\n mRes = m;\n }\n return mRes;\n }).toArray();\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n var _a, _b;\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;\n const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return UnitsHandler.DnaFastaAlphabet;\n case \"RNA\" /* ALPHABET.RNA */:\n return UnitsHandler.RnaFastaAlphabet;\n case \"PT\" /* ALPHABET.PT */:\n return UnitsHandler.PeptideFastaAlphabet;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\nexport function detectAlphabet(stats) {\n const alphabetCandidates = [\n [\"PT\" /* ALPHABET.PT */, UnitsHandler.PeptideFastaAlphabet],\n [\"DNA\" /* ALPHABET.DNA */, UnitsHandler.DnaFastaAlphabet],\n [\"RNA\" /* ALPHABET.RNA */, UnitsHandler.RnaFastaAlphabet],\n ];\n // Calculate likelihoods for alphabet_candidates\n const alphabetCandidatesSim = alphabetCandidates.map((c) => getAlphabetSimilarity(stats.freq, c[1]));\n const maxCos = Math.max(...alphabetCandidatesSim);\n const alphabet = maxCos > 0.65 ? alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][0] : 'UN';\n return alphabet;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStats(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case 'PT':\n return AminoacidsPalettes.GrokGroups;\n case 'NT':\n case 'DNA':\n case 'RNA':\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n var _a;\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = (_a = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n })) !== null && _a !== void 0 ? _a : null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=macromolecule.js.map","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn, getStats } from './macromolecule';\n/** Class for handling conversion of notation systems in Macromolecule columns */\nexport class NotationConverter extends UnitsHandler {\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === \"fasta\" /* NOTATION.FASTA */; }\n toSeparator(targetNotation) { return targetNotation === \"separator\" /* NOTATION.SEPARATOR */; }\n toHelm(targetNotation) { return targetNotation === \"helm\" /* NOTATION.HELM */; }\n /**\n * Convert a Macromolecule column from FASTA to SEPARATOR notation\n *\n * @param {string} separator A specific separator to be used\n * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default\n * @return {DG.Column} A new column in SEPARATOR notation\n */\n convertFastaToSeparator(separator, fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = this.defaultGapSymbol;\n const newColumn = this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n // assign the values to the newly created empty column\n newColumn.init((idx) => {\n const fastaPolymer = this.column.get(idx);\n const fastaMonomersArray = this.splitter(fastaPolymer);\n for (let i = 0; i < fastaMonomersArray.length; i++) {\n if (fastaMonomersArray[i] === fastaGapSymbol)\n fastaMonomersArray[i] = UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n return fastaMonomersArray.join(separator);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n return newColumn;\n }\n /**\n * Get the wrapper strings for HELM, depending on the type of the\n * macromolecule (peptide, DNA, RNA)\n *\n * @return {string[]} Array of wrappers\n */\n getHelmWrappers() {\n const prefix = (this.isDna()) ? 'DNA1{' :\n (this.isRna()) ? 'RNA1{' :\n (this.isPeptide()) ? 'PEPTIDE1{' :\n 'Unknown'; // this case should be handled as exceptional\n if (prefix === 'Unknown')\n throw new Error('Neither peptide, nor nucleotide');\n const postfix = '}$$$';\n const leftWrapper = (this.isDna()) ? 'D(' :\n (this.isRna()) ? 'R(' : ''; // no wrapper for peptides\n const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n // A helper function for converting strings to HELM\n convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {\n const monomerArray = this.splitter(sourcePolymer);\n const monomerHelmArray = monomerArray.map((mm) => {\n if (mm === sourceGapSymbol)\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n else\n return `${leftWrapper}${mm}${rightWrapper}`;\n });\n return `${prefix}${monomerHelmArray.join('.')}${postfix}`;\n }\n /**\n * Convert a string with SEPARATOR/FASTA notation to HELM\n *\n * @param {string} sourcePolymer A string to be converted\n * @param {string | null} sourceGapSymbol An optional gap symbol, set to\n * default values ('-' for FASTA and '' for SEPARATOR) unless specified\n * @return {string} The target HELM string\n */\n convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n }\n /**\n * Convert a column to HELM\n *\n * @param {string | null} sourceGapSymbol\n * @return {DG.Column}\n */\n convertToHelm(sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n const newColumn = this.getNewColumn(\"helm\" /* NOTATION.HELM */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const sourcePolymer = this.column.get(idx);\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n return newColumn;\n }\n /**\n * Convert SEPARATOR column to FASTA notation\n *\n * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA\n * @return {DG.Column} Converted column\n */\n convertSeparatorToFasta(fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = UnitsHandler._defaultGapSymbolsDict.FASTA;\n const newColumn = this.getNewColumn(\"fasta\" /* NOTATION.FASTA */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const separatorPolymer = this.column.get(idx);\n // items can be monomers or separators\n const separatorItemsArray = this.splitter(separatorPolymer);\n const fastaMonomersArray = [];\n for (let i = 0; i < separatorItemsArray.length; i++) {\n const item = separatorItemsArray[i];\n if (item.length === 0) {\n fastaMonomersArray.push(fastaGapSymbol);\n }\n else if (item.length > 1) {\n // the case of a multi-character monomer\n const monomer = '[' + item + ']';\n fastaMonomersArray.push(monomer);\n }\n else {\n fastaMonomersArray.push(item);\n }\n }\n return fastaMonomersArray.join('');\n });\n newColumn.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n return newColumn;\n }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} helmPolymer A string to be converted\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol) {\n if (!tgtGapSymbol) {\n tgtGapSymbol = (this.toFasta(tgtNotation)) ?\n UnitsHandler._defaultGapSymbolsDict.FASTA :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n if (!tgtSeparator) {\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n }\n const helmWrappersRe = /(R\\(|D\\(|\\)|P)/g;\n const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(helmPolymer);\n const tgtMonomersArray = [];\n for (let i = 0; i < helmItemsArray.length; i++) {\n let item = helmItemsArray[i];\n if (isNucleotide)\n item = item.replace(helmWrappersRe, '');\n if (item === UnitsHandler._defaultGapSymbolsDict.HELM) {\n tgtMonomersArray.push(tgtGapSymbol);\n }\n else if (this.toFasta(tgtNotation) && item.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + item + ']';\n tgtMonomersArray.push(monomer);\n }\n else {\n tgtMonomersArray.push(item);\n }\n }\n return tgtMonomersArray.join(tgtSeparator);\n }\n /**\n * Convert HELM column to FASTA/SEPARATOR\n *\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {DG.Column} Converted column\n */\n convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {\n // This function must not contain calls of isDna() and isRna(), for\n // source helm columns may contain RNA, DNA and PT across different rows\n const newColumn = this.getNewColumn(tgtNotation);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const helmPolymer = this.column.get(idx);\n return this.convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol);\n // we cannot use isDna() or isRna() because source helm columns can\n // contain DNA, RNA and PT in different cells, so the corresponding\n // tags cannot be set for the whole column\n });\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n const splitter = getSplitterForColumn(newColumn);\n const stats = getStats(newColumn, 5, splitter);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n return newColumn;\n }\n convertHelmToSeparator() {\n // TODO: implementatioreturn this.getNewColumn();\n return this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n }\n /** Dispatcher method for notation conversion\n *\n * @param {NOTATION} tgtNotation Notation we want to convert to\n * @param {string | null} tgtSeparator Possible separator\n * @return {DG.Column} Converted column\n */\n convert(tgtNotation, tgtSeparator = null) {\n // possible exceptions\n if (this.notation === tgtNotation)\n throw new Error('tgt notation is invalid');\n if (this.toSeparator(tgtNotation) && tgtSeparator === null)\n throw new Error('tgt separator is not specified');\n if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)\n return this.convertFastaToSeparator(tgtSeparator);\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))\n return this.convertToHelm();\n else if (this.isSeparator() && this.toFasta(tgtNotation))\n return this.convertSeparatorToFasta();\n else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM\n return this.convertHelm(tgtNotation);\n else if (this.isHelm() && this.toSeparator(tgtNotation))\n return this.convertHelm(tgtNotation, tgtSeparator);\n else\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=notation-converter.js.map","import * as DG from 'datagrok-api/dg';\nimport { detectAlphabet, getSplitterForColumn, getStats, splitterAsFasta } from './macromolecule';\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error('Fasta column must be MACROMOLECULE');\n const stats = getStats(col, 5, splitterAsFasta);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n const alphabet = detectAlphabet(stats);\n col.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n col.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n col.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n var _a;\n const separator = (_a = this.column.getTag(\"separator\" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const splitter = getSplitterForColumn(this.column);\n const stats = getStats(this.column, 1, splitter);\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */)\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) == 'true';\n else\n return false;\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule');\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = new UnitsHandler(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n constructor(col) {\n this._column = col;\n const units = this._column.tags[DG.TAGS.UNITS];\n if (units !== null)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */)) {\n if (this.isFasta() || this.isSeparator())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\"aligned\" /* TAGS.aligned */}' is mandatory.`);\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n else if (['UN'].includes(this.alphabet))\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\nUnitsHandler.PeptideFastaAlphabet = new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n]);\nUnitsHandler.DnaFastaAlphabet = new Set(['A', 'C', 'G', 'T']);\nUnitsHandler.RnaFastaAlphabet = new Set(['A', 'C', 'G', 'U']);\n//# sourceMappingURL=units-handler.js.map","export var PositionHeight;\n(function (PositionHeight) {\n PositionHeight[\"Entropy\"] = \"Entropy\";\n PositionHeight[\"full\"] = \"100%\";\n})(PositionHeight || (PositionHeight = {}));\nexport class WebLogoPropsDefault {\n constructor() {\n // -- Data --\n this.sequenceColumnName = null;\n this.startPositionName = null;\n this.endPositionName = null;\n this.skipEmptySequences = true;\n this.skipEmptyPositions = false;\n this.shrinkEmptyTail = true;\n }\n}\nexport const positionSeparator = ', ';\nexport const positionRe = /(\\d+)([A-Z]?)/;\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"positionNames\"] = \".positionNames\";\n})(TAGS || (TAGS = {}));\n//# sourceMappingURL=web-logo.js.map","/**\n * Generates single random float from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random float generated.\n */\nexport function randomFloat(range) {\n return Math.random() * range;\n}\n/**\n * Generates single random integer from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random integer generated.\n */\nexport function randomInt(range) {\n return Math.floor(randomFloat(range));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==","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 * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\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) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\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 = 30000);\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 let result = '';\n try {\n result = yield test();\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport function testEvent(event, handler, trigger, ms = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n let sub;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n }\n catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\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})`);\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) {\n currentCategory = category;\n tests();\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(packageId, module) {\n return __awaiter(this, void 0, void 0, function* () {\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (moduleTests[autoTestsCatName] !== undefined) {\n wasRegistered[packageId] = true;\n return;\n }\n const moduleAutoTests = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n for (const f of packFunctions) {\n const tests = f.options['test'];\n if (!(tests && Array.isArray(tests) && tests.length))\n continue;\n for (let i = 0; i < tests.length; i++) {\n moduleAutoTests.push(new Test(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 // eslint-disable-next-line no-throw-literal\n if (res !== true)\n throw `Failed: ${tests[i]}`;\n })));\n }\n }\n wasRegistered[packageId] = true;\n if (!moduleAutoTests.length)\n return;\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests };\n });\n}\nexport function runTests(options) {\n var _a, _b, _c, _d;\n var _e;\n return __awaiter(this, void 0, void 0, function* () {\n const package_ = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n yield initAutoTests(package_.id);\n const results = [];\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {\n if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = x.toString();\n }\n const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));\n const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: package_\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n return results;\n });\n}\nfunction execTest(t, predicate) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n let r;\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else\n r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };\n }\n catch (x) {\n r = { success: false, result: x.toString(), ms: 0, skipped: false };\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n });\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) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n });\n}\nexport function isDialogPresent(dialogTitle) {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\nexport function testViewer(v, df, detectSemanticTypes = false) {\n return __awaiter(this, void 0, void 0, function* () {\n if (detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++)\n df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n yield delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);\n yield delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n }\n finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3RDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSGUsY0FBTyxVQUd0QixDQUFBO0FBQ0gsQ0FBQyxFQUxnQixNQUFNLEtBQU4sTUFBTSxRQUt0QjtBQVFELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksY0FBd0IsRUFBRSxNQUFnQjtRQUh0RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2IsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FB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Q0FBQztZQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IFRpbWVvdXQgPSBOb2RlSlMuVGltZW91dDtcbmltcG9ydCB7RGF0YUZyYW1lfSBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5leHBvcnQgY29uc3QgdGVzdHM6IHtcbiAgW2tleTogc3RyaW5nXToge1xuICAgIHRlc3RzPzogVGVzdFtdLCBiZWZvcmU/OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBhZnRlcj86ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgYmVmb3JlU3RhdHVzPzogc3RyaW5nLCBhZnRlclN0YXR1cz86IHN0cmluZ1xuICB9XG59ID0ge307XG5cbmNvbnN0IGF1dG9UZXN0c0NhdE5hbWUgPSAnQXV0byBUZXN0cyc7XG5jb25zdCB3YXNSZWdpc3RlcmVkOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5OiBzdHJpbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgYXNzdXJlIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIG5vdE51bGwodmFsdWU6IGFueSwgbmFtZT86IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWUgPT0gbnVsbCA/ICdWYWx1ZScgOiBuYW1lfSBub3QgZGVmaW5lZGApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICB1bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0PzogbnVtYmVyO1xuICBza2lwUmVhc29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENvbnRleHQge1xuICBjYXRjaFVuaGFuZGxlZCA9IHRydWU7XG4gIHJlcG9ydCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGNoVW5oYW5kbGVkPzogYm9vbGVhbiwgcmVwb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjYXRjaFVuaGFuZGxlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLmNhdGNoVW5oYW5kbGVkID0gY2F0Y2hVbmhhbmRsZWQ7XG4gICAgaWYgKHJlcG9ydCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlcG9ydCA9IHJlcG9ydDtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT47XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgb3B0aW9ucz86IFRlc3RPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGVnb3J5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPz89IDMwMDAwO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy50ZXN0ID0gYXN5bmMgKCk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGVzdCgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEV2ZW50PFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gdm9pZCwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDApOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgc3ViOiBTdWJzY3JpcHRpb247XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3ViID0gZXZlbnQuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyKGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHJlc29sdmUoJ09LJyk7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzIS5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuXG4vKiBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhleSBhcmUgbm90IGVxdWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdChhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSA9IHRydWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlcnJvcilcbiAgICBlcnJvciA9IGAke2Vycm9yfSwgYDtcbiAgZWxzZSBlcnJvciA9ICcnO1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3J9RXhwZWN0ZWQgXCIke2V4cGVjdGVkfVwiLCBnb3QgXCIke2FjdHVhbH1cImApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RmxvYXQoYWN0dWFsOiBudW1iZXIsIGV4cGVjdGVkOiBudW1iZXIsIHRvbGVyYW5jZSA9IDAuMDAxLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoKGFjdHVhbCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgJiYgZXhwZWN0ZWQgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgfHxcbiAgICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbiAgaWYgKCFhcmVFcXVhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RUYWJsZShhY3R1YWw6IERhdGFGcmFtZSwgZXhwZWN0ZWQ6IERhdGFGcmFtZSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWRSb3dDb3VudCA9IGV4cGVjdGVkLnJvd0NvdW50O1xuICBjb25zdCBhY3R1YWxSb3dDb3VudCA9IGFjdHVhbC5yb3dDb3VudDtcbiAgZXhwZWN0KGFjdHVhbFJvd0NvdW50LCBleHBlY3RlZFJvd0NvdW50LCBgJHtlcnJvciA/PyAnJ30sIHJvdyBjb3VudGApO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGV4cGVjdGVkLmNvbHVtbnMpIHtcbiAgICBjb25zdCBhY3R1YWxDb2x1bW4gPSBhY3R1YWwuY29sdW1ucy5ieU5hbWUoY29sdW1uLm5hbWUpO1xuICAgIGlmIChhY3R1YWxDb2x1bW4gPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmIChhY3R1YWxDb2x1bW4udHlwZSAhPSBjb2x1bW4udHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IHR5cGUgZXhwZWN0ZWQgJHtjb2x1bW4udHlwZX0gZ290ICR7YWN0dWFsQ29sdW1uLnR5cGV9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZFJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmdldChpKTtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsQ29sdW1uLmdldChpKTtcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PSBERy5UWVBFLkZMT0FUKVxuICAgICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgdmFsdWUsIDAuMDAwMSwgZXJyb3IpO1xuICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5EQVRFX1RJTUUpXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZS5pc1NhbWUodmFsdWUpLCB0cnVlLCBlcnJvcik7XG4gICAgICBlbHNlXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZSwgdmFsdWUsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdE9iamVjdChhY3R1YWw6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGV4cGVjdGVkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIGZvciAoY29uc3QgW2V4cGVjdGVkS2V5LCBleHBlY3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICBpZiAoIWFjdHVhbC5oYXNPd25Qcm9wZXJ0eShleHBlY3RlZEtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHByb3BlcnR5IFwiJHtleHBlY3RlZEtleX1cIiBub3QgZm91bmRgKTtcblxuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsW2V4cGVjdGVkS2V5XTtcbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGFjdHVhbFZhbHVlKSAmJiBOdW1iZXIuaXNGaW5pdGUoZXhwZWN0ZWRWYWx1ZSkpXG4gICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgKCR7ZXhwZWN0ZWRWYWx1ZX0pIGZvciBrZXkgJyR7ZXhwZWN0ZWRLZXl9JywgZ290ICgke2FjdHVhbFZhbHVlfSlgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0QXJyYXkoYWN0dWFsOiBBcnJheUxpa2U8YW55PiwgZXhwZWN0ZWQ6IEFycmF5TGlrZTxhbnk+KSB7XG4gIGNvbnN0IGFjdHVhbExlbmd0aCA9IGFjdHVhbC5sZW5ndGg7XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoO1xuXG4gIGlmIChhY3R1YWxMZW5ndGggIT0gZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aDogYWN0dWFsIGFycmF5IGxlbmd0aCBpcyAke2FjdHVhbExlbmd0aH0gYCArXG4gICAgICBgYW5kIGV4cGVjdGVkIGFycmF5IGxlbmd0aCBpcyAke2V4cGVjdGVkTGVuZ3RofWApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykge1xuICAgIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSAhPSBleHBlY3RlZFtpXSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZFtpXX0gYXQgcG9zaXRpb24gJHtpfSwgZ290ICR7YWN0dWFsW2ldfWApO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSB0ZXN0IHN1aXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcsIHRlc3RzOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gIGN1cnJlbnRDYXRlZ29yeSA9IGNhdGVnb3J5O1xuICB0ZXN0cygpO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmUoYmVmb3JlOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuZnVuY3Rpb24gYWRkTmFtZXNwYWNlKHM6IHN0cmluZywgZjogREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VJZDogc3RyaW5nLCBtb2R1bGU/OiBhbnkpIHtcbiAgaWYgKHdhc1JlZ2lzdGVyZWRbcGFja2FnZUlkXSkgcmV0dXJuO1xuICBjb25zdCBtb2R1bGVUZXN0cyA9IG1vZHVsZSA/IG1vZHVsZS50ZXN0cyA6IHRlc3RzO1xuICBpZiAobW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHdhc1JlZ2lzdGVyZWRbcGFja2FnZUlkXSA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG1vZHVsZUF1dG9UZXN0cyA9IFtdO1xuICBjb25zdCBwYWNrRnVuY3Rpb25zID0gYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5maWx0ZXIoYHBhY2thZ2UuaWQgPSBcIiR7cGFja2FnZUlkfVwiYCkubGlzdCgpO1xuICBmb3IgKGNvbnN0IGYgb2YgcGFja0Z1bmN0aW9ucykge1xuICAgIGNvbnN0IHRlc3RzID0gZi5vcHRpb25zWyd0ZXN0J107XG4gICAgaWYgKCEodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkgY29udGludWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgbW9kdWxlQXV0b1Rlc3RzLnB1c2gobmV3IFRlc3QoYXV0b1Rlc3RzQ2F0TmFtZSwgdGVzdHMubGVuZ3RoID09PSAxID8gZi5uYW1lIDogYCR7Zi5uYW1lfSAke2kgKyAxfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuZXZhbChhZGROYW1lc3BhY2UodGVzdHNbaV0sIGYpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgaWYgKHJlcyAhPT0gdHJ1ZSkgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX1gO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAoIW1vZHVsZUF1dG9UZXN0cy5sZW5ndGgpIHJldHVybjtcbiAgbW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gPSB7dGVzdHM6IG1vZHVsZUF1dG9UZXN0c307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzoge2NhdGVnb3J5Pzogc3RyaW5nLCB0ZXN0Pzogc3RyaW5nLCB0ZXN0Q29udGV4dD86IFRlc3RDb250ZXh0fSkge1xuICBjb25zdCBwYWNrYWdlXyA9IGdyb2suZnVuY3Rpb25zLmdldEN1cnJlbnRDYWxsKCk/LmZ1bmM/LnBhY2thZ2U7XG4gIGF3YWl0IGluaXRBdXRvVGVzdHMocGFja2FnZV8uaWQpO1xuICBjb25zdCByZXN1bHRzOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuIH1bXSA9IFtdO1xuICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICBvcHRpb25zID8/PSB7fTtcbiAgb3B0aW9ucyEudGVzdENvbnRleHQgPz89IG5ldyBUZXN0Q29udGV4dCgpO1xuICBncm9rLnNoZWxsLmxhc3RFcnJvciA9ICcnO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0cykpIHtcbiAgICBpZiAob3B0aW9ucz8uY2F0ZWdvcnkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgYXdhaXQgdmFsdWUuYmVmb3JlKCk7XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB2YWx1ZS50ZXN0cyA/PyBbXTtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspXG4gICAgICByZXMucHVzaChhd2FpdCBleGVjVGVzdCh0W2ldLCBvcHRpb25zPy50ZXN0KSk7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlX1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gIHRyeSB7XG4gICAgaWYgKHNraXApXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogc2tpcFJlYXNvbiEsIG1zOiAwLCBza2lwcGVkOiB0cnVlfTtcbiAgICBlbHNlXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdC50ZXN0KCkgPz8gJ09LJywgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgciA9IHtzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiB4LnRvU3RyaW5nKCksIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH1cbiAgY29uc3Qgc3RvcCA9IG5ldyBEYXRlKCk7XG4gIC8vIEB0cy1pZ25vcmVcbiAgci5tcyA9IHN0b3AgLSBzdGFydDtcbiAgaWYgKCFza2lwKVxuICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfSBmb3IgJHtyLm1zfSBtc2ApO1xuICByLmNhdGVnb3J5ID0gdC5jYXRlZ29yeTtcbiAgci5uYW1lID0gdC5uYW1lO1xuICByZXR1cm4gcjtcbn1cblxuLyogV2FpdHMgW21zXSBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdENoZWNrKGNoZWNrSGFuZGxlcjogKCkgPT4gYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyA9ICdUaW1lb3V0IGV4Y2VlZGVkJywgd2FpdDogbnVtYmVyID0gNTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICB9LCB3YWl0KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWw6IFRpbWVvdXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoY2hlY2tIYW5kbGVyKCkpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9LCA1MCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWFsb2dQcmVzZW50KGRpYWxvZ1RpdGxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKVtpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RWaWV3ZXIodjogc3RyaW5nLCBkZjogREcuRGF0YUZyYW1lLCBkZXRlY3RTZW1hbnRpY1R5cGVzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGRldGVjdFNlbWFudGljVHlwZXMpIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbiAgY29uc3QgdHYgPSBncm9rLnNoZWxsLmFkZFRhYmxlVmlldyhkZik7XG4gIGNvbnN0IHZpZXdlck5hbWUgPSBgW25hbWU9dmlld2VyLSR7di5yZXBsYWNlKC9cXHMrL2csICctJyl9IGldYDtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgJHt2aWV3ZXJOYW1lfSBjYW52YXMsJHt2aWV3ZXJOYW1lfSBzdmcsJHt2aWV3ZXJOYW1lfSBpbWcsXG4gICAgJHt2aWV3ZXJOYW1lfSBpbnB1dCwke3ZpZXdlck5hbWV9IGgxLCR7dmlld2VyTmFtZX0gYWA7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICB0cnkge1xuICAgIGxldCB2aWV3ZXIgPSB0di5hZGRWaWV3ZXIodik7XG4gICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbCxcbiAgICAgICdjYW5ub3QgbG9hZCB2aWV3ZXInLCAzMDAwKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgQXJyYXkuZnJvbShkZi5yb3coMCkuY2VsbHMpLmZvckVhY2goKGMpID0+IGMudmFsdWUgPSBudWxsKTtcbiAgICBkZi5yb3dzLnNlbGVjdCgocm93KSA9PiByb3cuaWR4ID4gMSAmJiByb3cuaWR4IDwgNyk7XG4gICAgZm9yIChsZXQgaSA9IDc7IGkgPCAxMjsgaSsrKSBkZi5maWx0ZXIuc2V0KGksIGZhbHNlKTtcbiAgICBkZi5jdXJyZW50Um93SWR4ID0gMTtcbiAgICBjb25zdCBwcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgY29uc3QgbmV3UHJvcHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoaykgPT4gdHlwZW9mIHByb3BzW2tdID09PSAnYm9vbGVhbicpLmZvckVhY2goKGspID0+IG5ld1Byb3BzW2tdID0gIXByb3BzW2tdKTtcbiAgICB2aWV3ZXIuc2V0T3B0aW9ucyhuZXdQcm9wcyk7XG4gICAgYXdhaXQgZGVsYXkoMjUwKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2s7XG4gICAgdHYucmVzZXRMYXlvdXQoKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdHYubG9hZExheW91dChsYXlvdXQpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgYXdhaXQgZGVsYXkoMjUwKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdmlld2VyID0gQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5maW5kKCh2KSA9PiB2LnR5cGUgIT09ICdHcmlkJykhO1xuICAgIGV4cGVjdEFycmF5KHJlcywgWzIsIDEsIDJdKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0di5jbG9zZSgpO1xuICAgIGdyb2suc2hlbGwuY2xvc2VUYWJsZShkZik7XG4gIH1cbn1cbiJdfQ==","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ((typeof err == 'object' || err instanceof Object) && '$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxDQUFDLElBQUksZ0JBQWdCLElBQUksR0FBRyxFQUFFO1FBQ3ZGLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7S0FDOUM7U0FBTSxJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUU7UUFDL0IsT0FBTyxNQUFDLEdBQWEsQ0FBQyxLQUFLLG1DQUFLLEdBQWEsQ0FBQyxPQUFPLENBQUM7S0FDdkQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBYTtJQUN6QyxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvclRvQ29uc29sZShlcnI6IGFueSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJyB8fCBlcnIgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICByZXR1cm4gZXJyIGFzIHN0cmluZztcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVyciA9PSAnb2JqZWN0JyB8fCBlcnIgaW5zdGFuY2VvZiBPYmplY3QpICYmICckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\n opt = opt || {};\n this.perplexity = this.getopt(opt, 'perplexity', 30); // effective number of nearest neighbors\n this.dim = this.getopt(opt, 'dim', 2); // by default 2-D tSNE\n this.epsilon = this.getopt(opt, 'epsilon', 10); // learning rate\n }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\n const c = Math.sqrt(-2 * Math.log(r) / r);\n this.vValue = v * c; // cache this for next function call for efficiency\n this.returnV = true;\n return u * c;\n }\n // return random normal number\n randn(mu, std) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(n); // typed arrays are faster\n }\n }\n // utility that returns 2d array filled with random numbers\n // or with value s, if provided\n randn2d(n, d, s) {\n const uses = typeof s !== 'undefined';\n const x = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\n }\n return x;\n }\n // compute L2 distance between two vectors\n L2(x1, x2) {\n const D = x1.length;\n let d = 0;\n for (let i = 0; i < D; i++) {\n const x1i = x1[i];\n const x2i = x2[i];\n d += (x1i - x2i) * (x1i - x2i);\n }\n return d;\n }\n // compute pairwise distance in all vectors in X\n xtod(X) {\n const N = X.length;\n const dist = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = this.L2(X[i], X[j]);\n dist[i * N + j] = d;\n dist[j * N + i] = d;\n }\n }\n return dist;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\n const nf = Math.sqrt(D.length); // this better be an integer\n const n = Math.floor(nf);\n this.assert(n === nf, 'D should have square number of elements.');\n const hTarget = Math.log(perplexity); // target entropy of distribution\n const P = this.zeros(n * n); // temporary probability matrix\n const prow = this.zeros(n); // a temporary storage compartment\n for (let i = 0; i < n; i++) {\n let betamin = -Infinity;\n let betamax = Infinity;\n let beta = 1; // initial value of precision\n let done = false;\n const maxtries = 50;\n // perform binary search to find a suitable precision beta\n // so that the entropy of the distribution is appropriate\n let num = 0;\n while (!done) {\n //debugger;\n // compute entropy and kernel row with beta precision\n let psum = 0.0;\n for (let j = 0; j < n; j++) {\n let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\n prow[j] = pj;\n psum += pj;\n }\n // normalize p and compute entropy\n let nHere = 0.0;\n for (let j = 0; j < n; j++) {\n let pj;\n if (psum === 0) {\n pj = 0;\n }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\n }\n // adjust beta based on result\n if (nHere > hTarget) {\n // entropy was too high (distribution too diffuse)\n // so we need to increase the precision for more peaky distribution\n betamin = beta; // move up the bounds\n if (betamax === Infinity) {\n beta = beta * 2;\n }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\n }\n // stopping conditions: too many tries or got a good precision\n num++;\n if (Math.abs(nHere - hTarget) < tol) {\n done = true;\n }\n if (num >= maxtries) {\n done = true;\n }\n }\n // console.log('data point ' + i + ' gets precision ' + beta + ' after ' + num + ' binary search steps.');\n // copy over the final prow to P at row i\n for (let j = 0; j < n; j++) {\n P[i * n + j] = prow[j];\n }\n } // end loop over examples i\n // symmetrize P and normalize it to sum to 1 over all ij\n const pOut = this.zeros(n * n);\n const N2 = n * 2;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n pOut[i * n + j] = Math.max((P[i * n + j] + P[j * n + i]) / N2, 1e-100);\n }\n }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n // this function takes a set of high-dimensional points\n // and creates matrix P from them using gaussian kernel\n initDataRaw(X) {\n const N = X.length;\n const D = X[0].length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n this.assert(D > 0, ' X[0] is empty? Where is the data?');\n const dists = this.xtod(X); // convert X to distances using gaussian kernel\n this.P = this.d2p(dists, this.perplexity, 1e-4); // attach to object\n this.N = N; // back up the size of the dataset\n this.initSolution(); // refresh this\n }\n // this function takes a given distance matrix and creates\n // matrix P from them.\n // D is assumed to be provided as a list of lists, and should be symmetric\n initDataDist(D) {\n const N = D.length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n // convert D to a (fast) typed array version\n const dists = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\n this.initSolution(); // refresh this\n }\n // (re)initializes the solution to random\n initSolution() {\n // generate random solution to t-SNE\n this.Y = this.randn2d(this.N, this.dim); // the solution\n this.gains = this.randn2d(this.N, this.dim, 1.0); // step gains to accelerate progress in unchanging directions\n this.ystep = this.randn2d(this.N, this.dim, 0.0); // momentum accumulator\n this.iter = 0;\n }\n // return pointer to current solution\n getSolution() {\n return this.Y;\n }\n // perform a single step of optimization to improve the embedding\n step() {\n this.iter += 1;\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n // perform gradient step\n const ymean = this.zeros(this.dim);\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const gid = grad[i][d];\n const sid = this.ystep[i][d];\n const gainid = this.gains[i][d];\n // compute gain update\n let newgain = this.sign(gid) === this.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n if (newgain < 0.01) {\n newgain = 0.01;\n } // clamp\n this.gains[i][d] = newgain; // store for next turn\n // compute momentum step direction\n const momval = this.iter < 250 ? 0.5 : 0.8;\n const newsid = momval * sid - this.epsilon * newgain * grad[i][d];\n this.ystep[i][d] = newsid; // remember the step we took\n // step!\n this.Y[i][d] += newsid;\n ymean[d] += this.Y[i][d]; // accumulate mean so that we can center later\n }\n }\n // reproject Y to be zero mean\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n this.Y[i][d] -= ymean[d] / N;\n }\n }\n //if(this.iter%100===0) console.log('iter ' + this.iter + ', cost: ' + cost);\n return cost; // return current cost\n }\n // for debugging: gradient check\n debugGrad() {\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n const e = 1e-5;\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const yold = this.Y[i][d];\n this.Y[i][d] = yold + e;\n const cg0 = this.costGrad(this.Y);\n this.Y[i][d] = yold - e;\n const cg1 = this.costGrad(this.Y);\n const analytic = grad[i][d];\n const numerical = (cg0.cost - cg1.cost) / (2 * e);\n console.log(i + ',' + d + ': gradcheck analytic: ' + analytic + ' vs. numerical: ' + numerical);\n this.Y[i][d] = yold;\n }\n }\n }\n // return cost and gradient, given an arrangement\n costGrad(Y) {\n const N = this.N;\n const dim = this.dim; // dim of output space\n const P = this.P;\n const pmul = this.iter < 100 ? 4 : 1; // trick that helps with local optima\n // compute current Q distribution, unnormalized first\n const quArr = this.zeros(N * N);\n let qsum = 0.0;\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n quArr[j * N + i] = qu;\n qsum += 2 * qu;\n }\n }\n // normalize Q distribution to sum to 1\n const NN = N * N;\n const Q = this.zeros(NN);\n for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".scatter_plot_link {\\n position: absolute!important;\\n right: 10px;\\n}\\n\\n.cliffs_grid {\\n top: 10px;\\n}\\n\\n.show_only_cliffs {\\n top: 30px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@datagrok-libraries/ml/css/styles.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,4BAA4B;IAC5B,WAAW;AACf;;AAEA;IACI,SAAS;AACb;;AAEA;IACI,SAAS;AACb\",\"sourcesContent\":[\".scatter_plot_link {\\n position: absolute!important;\\n right: 10px;\\n}\\n\\n.cliffs_grid {\\n top: 10px;\\n}\\n\\n.show_only_cliffs {\\n top: 30px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","(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","\"use strict\";\n// Reference: https://www.geeksforgeeks.org/jaro-and-jaro-winkler-similarity/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jaroWinkler = exports.jaro = void 0;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaro(str1, str2, options) {\n // Exit early if either are empty.\n if (str1.length === 0 || str2.length === 0) {\n return 0;\n }\n // Convert to upper if case-sensitive is false.\n if (options && !options.caseSensitive) {\n str1 = str1.toUpperCase();\n str2 = str2.toUpperCase();\n }\n // Exact match\n if (str1 === str2) {\n return 1;\n }\n // Number of matches\n var m = 0;\n // Length of two Strings\n var len1 = str1.length;\n var len2 = str2.length;\n // Maximum distance\n var window = Math.floor(Math.max(len1, len2) / 2) - 1;\n // Hash for matches\n var str1Hash = new Array(len1);\n var str2Hash = new Array(len2);\n for (var i = 0; i < len1; i++) {\n for (var j = Math.max(0, i - window); j <= Math.min(len2, i + window + 1); j++) {\n if (!str1Hash[i] && !str2Hash[j] && str1[i] === str2[j]) {\n ++m;\n str1Hash[i] = str2Hash[j] = true;\n break;\n }\n }\n }\n // Exit early if no matches were found.\n if (m === 0) {\n return 0;\n }\n // Count the transpositions.\n var t = 0;\n var point = 0;\n for (var i = 0; i < len1; i++) {\n if (str1Hash[i]) {\n while (!str2Hash[point]) {\n point++;\n }\n if (str1.charAt(i) !== str2.charAt(point++)) {\n t++;\n }\n }\n }\n t /= 2;\n return (m / len1 + m / len2 + (m - t) / m) / 3;\n}\nexports.jaro = jaro;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaroWinkler(str1, str2, options) {\n // Jaro Distance\n var jaroDist = jaro(str1, str2, options);\n // Same prefix length, maxium is 4\n var prefix = 0;\n if (jaroDist > 0.7) {\n var minIndex = Math.min(str1.length, str2.length);\n var i = 0;\n while (str1[i] === str2[i] && i < 4 && i < minIndex) {\n ++prefix;\n i++;\n }\n jaroDist += 0.1 * prefix * (1 - jaroDist);\n }\n return jaroDist;\n}\nexports.jaroWinkler = jaroWinkler;\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n return toString.call(object).endsWith('Array]');\n}\n","/**\n * Calculate current error\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {number}\n */\nexport default function errorCalculation(\n data,\n parameters,\n parameterizedFunction,\n) {\n let error = 0;\n const func = parameterizedFunction(parameters);\n\n for (let i = 0; i < data.x.length; i++) {\n error += Math.abs(data.y[i] - func(data.x[i]));\n }\n\n return error;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = min(input);\n var currentMax = max(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nexport function newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n sumByRow,\n sumByColumn,\n sumAll,\n productByRow,\n productByColumn,\n productAll,\n varianceByRow,\n varianceByColumn,\n varianceAll,\n centerByRow,\n centerByColumn,\n centerAll,\n scaleByRow,\n scaleByColumn,\n scaleAll,\n getScaleByRow,\n getScaleByColumn,\n getScaleAll,\n} from './stat';\nimport {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n AbstractMatrix.add(a11, a22),\n AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n AbstractMatrix.sub(a21, a11),\n AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n AbstractMatrix.sub(a12, a22),\n AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = AbstractMatrix.add(m3, m5);\n let c21 = AbstractMatrix.add(m2, m4);\n let c22 = AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nexport function centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nexport function centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nexport function centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nexport function getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nexport function getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nexport function getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n constructor(matrix) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n let lu = matrix.clone();\n let rows = lu.rows;\n let columns = lu.columns;\n let pivotVector = new Float64Array(rows);\n let pivotSign = 1;\n let i, j, k, p, s, t, v;\n let LUcolj, kmax;\n\n for (i = 0; i < rows; i++) {\n pivotVector[i] = i;\n }\n\n LUcolj = new Float64Array(rows);\n\n for (j = 0; j < columns; j++) {\n for (i = 0; i < rows; i++) {\n LUcolj[i] = lu.get(i, j);\n }\n\n for (i = 0; i < rows; i++) {\n kmax = Math.min(i, j);\n s = 0;\n for (k = 0; k < kmax; k++) {\n s += lu.get(i, k) * LUcolj[k];\n }\n LUcolj[i] -= s;\n lu.set(i, j, LUcolj[i]);\n }\n\n p = j;\n for (i = j + 1; i < rows; i++) {\n if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n p = i;\n }\n }\n\n if (p !== j) {\n for (k = 0; k < columns; k++) {\n t = lu.get(p, k);\n lu.set(p, k, lu.get(j, k));\n lu.set(j, k, t);\n }\n\n v = pivotVector[p];\n pivotVector[p] = pivotVector[j];\n pivotVector[j] = v;\n\n pivotSign = -pivotSign;\n }\n\n if (j < rows && lu.get(j, j) !== 0) {\n for (i = j + 1; i < rows; i++) {\n lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n }\n }\n }\n\n this.LU = lu;\n this.pivotVector = pivotVector;\n this.pivotSign = pivotSign;\n }\n\n isSingular() {\n let data = this.LU;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n if (data.get(j, j) === 0) {\n return true;\n }\n }\n return false;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let lu = this.LU;\n let rows = lu.rows;\n\n if (rows !== value.rows) {\n throw new Error('Invalid matrix dimensions');\n }\n if (this.isSingular()) {\n throw new Error('LU matrix is singular');\n }\n\n let count = value.columns;\n let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n let columns = lu.columns;\n let i, j, k;\n\n for (k = 0; k < columns; k++) {\n for (i = k + 1; i < columns; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n for (k = columns - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / lu.get(k, k));\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n return X;\n }\n\n get determinant() {\n let data = this.LU;\n if (!data.isSquare()) {\n throw new Error('Matrix must be square');\n }\n let determinant = this.pivotSign;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n determinant *= data.get(j, j);\n }\n return determinant;\n }\n\n get lowerTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i > j) {\n X.set(i, j, data.get(i, j));\n } else if (i === j) {\n X.set(i, j, 1);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get upperTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i <= j) {\n X.set(i, j, data.get(i, j));\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get pivotPermutationVector() {\n return Array.from(this.pivotVector);\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n constructor(value) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n let qr = value.clone();\n let m = value.rows;\n let n = value.columns;\n let rdiag = new Float64Array(n);\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n let nrm = 0;\n for (i = k; i < m; i++) {\n nrm = hypotenuse(nrm, qr.get(i, k));\n }\n if (nrm !== 0) {\n if (qr.get(k, k) < 0) {\n nrm = -nrm;\n }\n for (i = k; i < m; i++) {\n qr.set(i, k, qr.get(i, k) / nrm);\n }\n qr.set(k, k, qr.get(k, k) + 1);\n for (j = k + 1; j < n; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * qr.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n rdiag[k] = -nrm;\n }\n\n this.QR = qr;\n this.Rdiag = rdiag;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let qr = this.QR;\n let m = qr.rows;\n\n if (value.rows !== m) {\n throw new Error('Matrix row dimensions must agree');\n }\n if (!this.isFullRank()) {\n throw new Error('Matrix is rank deficient');\n }\n\n let count = value.columns;\n let X = value.clone();\n let n = qr.columns;\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n for (j = 0; j < count; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n for (k = n - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n }\n }\n }\n\n return X.subMatrix(0, n - 1, 0, count - 1);\n }\n\n isFullRank() {\n let columns = this.QR.columns;\n for (let i = 0; i < columns; i++) {\n if (this.Rdiag[i] === 0) {\n return false;\n }\n }\n return true;\n }\n\n get upperTriangularMatrix() {\n let qr = this.QR;\n let n = qr.columns;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i < j) {\n X.set(i, j, qr.get(i, j));\n } else if (i === j) {\n X.set(i, j, this.Rdiag[i]);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get orthogonalMatrix() {\n let qr = this.QR;\n let rows = qr.rows;\n let columns = qr.columns;\n let X = new Matrix(rows, columns);\n let i, j, k, s;\n\n for (k = columns - 1; k >= 0; k--) {\n for (i = 0; i < rows; i++) {\n X.set(i, k, 0);\n }\n X.set(k, k, 1);\n for (j = k; j < columns; j++) {\n if (qr.get(k, k) !== 0) {\n s = 0;\n for (i = k; i < rows; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n\n s = -s / qr.get(k, k);\n\n for (i = k; i < rows; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n }\n return X;\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new Matrix(m, nu);\n let V = new Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return Matrix.diag(this.s);\n }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nfunction gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n paramFunction,\n) {\n const n = params.length;\n const m = data.x.length;\n\n let ans = new Array(n);\n\n for (let param = 0; param < n; param++) {\n ans[param] = new Array(m);\n let auxParams = params.slice();\n auxParams[param] += gradientDifference;\n let funcParam = paramFunction(auxParams);\n\n for (let point = 0; point < m; point++) {\n ans[param][point] = evaluatedData[point] - funcParam(data.x[point]);\n }\n }\n return new Matrix(ans);\n}\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n const m = data.x.length;\n\n let ans = new Array(m);\n\n for (let point = 0; point < m; point++) {\n ans[point] = [data.y[point] - evaluatedData[point]];\n }\n\n return new Matrix(ans);\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n data,\n params,\n damping,\n gradientDifference,\n parameterizedFunction,\n) {\n let value = damping * gradientDifference * gradientDifference;\n let identity = Matrix.eye(params.length, params.length, value);\n\n const func = parameterizedFunction(params);\n\n let evaluatedData = new Float64Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n evaluatedData[i] = func(data.x[i]);\n }\n\n let gradientFunc = gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n parameterizedFunction,\n );\n let matrixFunc = matrixFunction(data, evaluatedData);\n let inverseMatrix = inverse(\n identity.add(gradientFunc.mmul(gradientFunc.transpose())),\n );\n\n params = new Matrix([params]);\n params = params.sub(\n inverseMatrix\n .mmul(gradientFunc)\n .mmul(matrixFunc)\n .mul(gradientDifference)\n .transpose(),\n );\n\n return params.to1DArray();\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (useSVD) {\n return new SingularValueDecomposition(matrix).inverse();\n } else {\n return solve(matrix, Matrix.eye(matrix.rows));\n }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n if (useSVD) {\n return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n } else {\n return leftHandSide.isSquare()\n ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n : new QrDecomposition(leftHandSide).solve(rightHandSide);\n }\n}\n","import isArray from 'is-any-array';\n\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number} [options.damping] - Levenberg-Marquardt parameter\n * @param {number} [options.gradientDifference = 10e-2] - Adjustment for decrease the damping parameter\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n data,\n parameterizedFunction,\n options = {},\n) {\n let {\n maxIterations = 100,\n gradientDifference = 10e-2,\n damping = 0,\n errorTolerance = 10e-3,\n minValues,\n maxValues,\n initialValues,\n } = options;\n\n if (damping <= 0) {\n throw new Error('The damping option must be a positive number');\n } else if (!data.x || !data.y) {\n throw new Error('The data parameter must have x and y elements');\n } else if (\n !isArray(data.x) ||\n data.x.length < 2 ||\n !isArray(data.y) ||\n data.y.length < 2\n ) {\n throw new Error(\n 'The data parameter elements must be an array with more than 2 points',\n );\n } else if (data.x.length !== data.y.length) {\n throw new Error('The data parameter elements must have the same size');\n }\n\n let parameters =\n initialValues || new Array(parameterizedFunction.length).fill(1);\n let parLen = parameters.length;\n maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n if (maxValues.length !== minValues.length) {\n throw new Error('minValues and maxValues must be the same size');\n }\n\n if (!isArray(parameters)) {\n throw new Error('initialValues must be an array');\n }\n\n let error = errorCalculation(data, parameters, parameterizedFunction);\n\n let converged = error <= errorTolerance;\n\n let iteration;\n for (iteration = 0; iteration < maxIterations && !converged; iteration++) {\n parameters = step(\n data,\n parameters,\n damping,\n gradientDifference,\n parameterizedFunction,\n );\n\n for (let k = 0; k < parLen; k++) {\n parameters[k] = Math.min(\n Math.max(minValues[k], parameters[k]),\n maxValues[k],\n );\n }\n\n error = errorCalculation(data, parameters, parameterizedFunction);\n if (isNaN(error)) break;\n converged = error <= errorTolerance;\n }\n\n return {\n parameterValues: parameters,\n parameterError: error,\n iterations: iteration,\n };\n}\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as C from '../utils/constants';\nimport {getHelmMonomers} from '../package';\nimport {TAGS as bioTAGS, getSplitter, getStats} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nconst V2000_ATOM_NAME_POS = 31;\n\nexport async function getMonomericMols(mcol: DG.Column<string>,\n pattern: boolean = false, monomersDict?: Map<string, string>): Promise<DG.Column> {\n const separator: string = mcol.tags[bioTAGS.separator];\n const units: string = mcol.tags[DG.TAGS.UNITS];\n const splitter = getSplitter(units, separator);\n let molV3000Array;\n monomersDict ??= new Map();\n const monomers = units === 'helm' ?\n getHelmMonomers(mcol) : Object.keys(getStats(mcol, 0, splitter).freq).filter((it) => it !== '');\n\n for (let i = 0; i < monomers.length; i++) {\n if (!monomersDict.has(monomers[i]))\n monomersDict.set(monomers[i], `${monomersDict.size + 1}`);\n }\n\n if (units === 'helm') {\n molV3000Array = await grok.functions.call('HELM:getMolFiles', {col: mcol});\n molV3000Array = changeV2000ToV3000(molV3000Array, monomersDict, pattern);\n } else {\n molV3000Array = new Array<string>(mcol.length);\n for (let i = 0; i < mcol.length; i++) {\n const sequenceMonomers = splitter(mcol.get(i)!).filter((it) => it !== '');\n const molV3000 = molV3000FromNonHelmSequence(sequenceMonomers, monomersDict, pattern);\n molV3000Array[i] = molV3000;\n }\n }\n return DG.Column.fromStrings('monomericMols', molV3000Array);\n}\n\nfunction molV3000FromNonHelmSequence(\n monomers: Array<string>, monomersDict: Map<string, string>, pattern: boolean = false) {\n let molV3000 = `\n Datagrok macromolecule handler\n\n 0 0 0 0 0 0 999 V3000\nM V30 BEGIN CTAB\n`;\n\n molV3000 += `M V30 COUNTS ${monomers.length} ${monomers.length ? monomers.length - 1 : 0} 0 0 0\\n`;\n molV3000 += 'M V30 BEGIN ATOM\\n';\n\n for (let atomRowI = 0; atomRowI < monomers.length; atomRowI++) {\n molV3000 += pattern ?\n `M V30 ${atomRowI + 1} R${monomersDict.get(monomers[atomRowI])} 0.000 0.000 0 0\\n` :\n `M V30 ${atomRowI + 1} At 0.000 0.000 0 0 MASS=${monomersDict.get(monomers[atomRowI])}\\n`;\n }\n\n molV3000 += 'M V30 END ATOM\\n';\n molV3000 += 'M V30 BEGIN BOND\\n';\n\n for (let bondRowI = 0; bondRowI < monomers.length - 1; bondRowI++)\n molV3000 += `M V30 ${bondRowI + 1} 1 ${bondRowI + 1} ${bondRowI + 2}\\n`;\n\n molV3000 += 'M V30 END BOND\\n';\n molV3000 += 'M V30 END CTAB\\n';\n molV3000 += 'M END';\n return molV3000;\n}\n\nfunction changeV2000ToV3000(mols: DG.Column, dict: Map<string, string>, pattern: boolean = false): Array<string> {\n const molsArray = new Array<string>(mols.length);\n for (let i = 0; i < mols.length; i++) {\n let curPos = 0;\n let endPos = 0;\n let molV3000 = `\n Datagrok macromolecule handler\n\n 0 0 0 0 0 0 999 V3000\nM V30 BEGIN CTAB\n`;\n\n const mol = mols.get(i);\n curPos = mol.indexOf('\\n', curPos) + 1;\n curPos = mol.indexOf('\\n', curPos) + 1;\n curPos = mol.indexOf('\\n', curPos) + 1;\n\n const atomMonomerCounts = parseInt(mol.substring(curPos, curPos + 3));\n const bondMonomerCounts = parseInt(mol.substring(curPos + 3, curPos + 6));\n\n molV3000 += `M V30 COUNTS ${atomMonomerCounts} ${bondMonomerCounts} 0 0 0\\n`;\n molV3000 += 'M V30 BEGIN ATOM\\n';\n\n for (let atomRowI = 0; atomRowI < atomMonomerCounts; atomRowI++) {\n curPos = mol.indexOf('\\n', curPos) + 1 + V2000_ATOM_NAME_POS;\n endPos = mol.indexOf(' ', curPos);\n const monomerName: string = mol.substring(curPos, endPos);\n molV3000 += pattern ?\n `M V30 ${atomRowI + 1} R${dict.get(monomerName)} 0.000 0.000 0 0\\n` :\n `M V30 ${atomRowI + 1} At 0.000 0.000 0 0 MASS=${dict.get(monomerName)}\\n`;\n }\n\n molV3000 += 'M V30 END ATOM\\n';\n molV3000 += 'M V30 BEGIN BOND\\n';\n\n for (let bondRowI = 0; bondRowI < bondMonomerCounts; bondRowI++) {\n curPos = mol.indexOf('\\n', curPos) + 1;\n const firstMonomer = parseInt(mol.substring(curPos, curPos + 3).trim());\n const secondMonomer = parseInt(mol.substring(curPos + 3, curPos + 6).trim());\n const order = parseInt(mol.substring(curPos + 6, curPos + 9).trim());\n\n molV3000 += `M V30 ${bondRowI + 1} ${order} ${firstMonomer} ${secondMonomer}\\n`;\n }\n\n molV3000 += 'M V30 END BOND\\n';\n molV3000 += 'M V30 END CTAB\\n';\n molV3000 += 'M END';\n molsArray[i] = molV3000;\n }\n\n return molsArray;\n}\n","import { monomerToShort } from './macromolecule';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/**\n * A function that prints a string aligned to left or centered.\n *\n * @param {number} x x coordinate.\n * @param {number} y y coordinate.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {string} s String to print.\n * @param {string} [color=undefinedColor] String color.\n * @param {number} [pivot=0] Pirvot.\n * @param {boolean} [left=false] Is left aligned.\n * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent\n * @param {string} [separator=''] Is separator for sequence.\n * @param {boolean} [last=false] Is checker if element last or not.\n * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param maxWord Is array of max words for each line.\n * @param wordIdx Is index of word we currently draw.\n * @param gridCell Is grid cell.\n * @param referenceSequence Is reference sequence for diff mode.\n * @param maxLengthOfMonomer Is max length of monomer.\n * @return {number} x coordinate to start printing at.\n */\nexport const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {\n var _a, _b, _c;\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA) {\n grayPart = '';\n }\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;\n compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;\n highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n }\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null) {\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n }\n let textSize = g.measureText(colorPart + grayPart);\n const indent = 5;\n let maxColorTextSize = g.measureText(colorPart).width;\n let colorTextSize = g.measureText(colorPart).width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA) {\n g.fillStyle = drawColor;\n g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);\n }\n }\n if (left || textSize > w) {\n draw(indent, indent + maxColorTextSize);\n return x + maxColorTextSize + g.measureText(grayPart).width;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + dx + maxColorTextSize;\n }\n};\n//# sourceMappingURL=cell-renderer.js.map","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\n\nimport {printLeftOrCentered, DrawStyle} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport * as C from './constants';\nimport {\n ALIGNMENT,\n getPaletteByType,\n getSplitter,\n monomerToShort,\n NOTATION,\n SplitterFunc,\n TAGS as bioTAGS,\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {UnknownSeqPalettes} from '@datagrok-libraries/bio/src/unknown';\n\nconst enum tempTAGS {\n referenceSequence = 'reference-sequence',\n currentWord = 'current-word',\n monomerWidth = 'monomer-width',\n bioSumMaxLengthWords = 'bio-sum-maxLengthWords',\n bioMaxIndex = 'bio-maxIndex',\n bioMaxLengthWords = 'bio-maxLengthWords',\n}\n\ntype TempType = { [tagName: string]: any };\n\nconst undefinedColor = 'rgb(100,100,100)';\nconst monomerToShortFunction: (amino: string, maxLengthOfMonomer: number) => string = monomerToShort;\n\nfunction getUpdatedWidth(grid: DG.Grid | null, g: CanvasRenderingContext2D, x: number, w: number): number {\n return grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n}\n\nexport function processSequence(subParts: string[]): [string[], boolean] {\n const simplified = !subParts.some((amino, index) =>\n amino.length > 1 &&\n index != 0 &&\n index != subParts.length - 1);\n\n const text: string[] = [];\n const gap = simplified ? '' : ' ';\n subParts.forEach((amino: string, index) => {\n if (index < subParts.length)\n amino += `${amino ? '' : '-'}${gap}`;\n\n text.push(amino);\n });\n return [text, simplified];\n}\n\n\nexport class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {\n get name(): string { return 'sequence'; }\n\n get cellType(): string { return 'sequence'; }\n\n get defaultHeight(): number { return 30; }\n\n get defaultWidth(): number { return 230; }\n\n onClick(gridCell: DG.GridCell, e: MouseEvent): void {\n const colTemp: TempType = gridCell.cell.column.temp;\n colTemp[tempTAGS.currentWord] = gridCell.cell.value;\n gridCell.grid.invalidate();\n }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n if (gridCell.cell.column.getTag(bioTAGS.aligned) !== ALIGNMENT.SEQ_MSA)\n return;\n\n const colTemp: TempType = gridCell.cell.column.temp;\n const maxLengthWordsSum = colTemp[tempTAGS.bioSumMaxLengthWords];\n const maxIndex = colTemp[tempTAGS.bioMaxIndex];\n const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);\n let left = 0;\n let right = maxIndex;\n let found = false;\n maxLengthWordsSum[maxIndex + 1] = argsX + 1;\n let mid = 0;\n if (argsX > maxLengthWordsSum[0]) {\n while (!found) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < maxLengthWordsSum[mid]) {\n right = mid - 1;\n } else if (argsX > maxLengthWordsSum[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n }\n }\n left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;\n const separator = gridCell.cell.column.getTag('separator') ?? '';\n const splitterFunc: SplitterFunc = getSplitter('separator', separator);\n const subParts: string[] = splitterFunc(gridCell.cell.value);\n (((subParts[left]?.length ?? 0) > 0)) ?\n ui.tooltip.show(ui.div(subParts[left]), e.x + 16, e.y + 16) : ui.tooltip.hide();\n }\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} cellStyle Cell style.\n * @memberof AlignedSequenceCellRenderer\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n cellStyle: DG.GridCellStyle\n ) {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : null;\n const cell = gridCell.cell;\n const paletteType = gridCell.cell.column.getTag(bioTAGS.alphabet);\n const minDistanceRenderer = 50;\n w = getUpdatedWidth(grid, g, x, w);\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n\n //TODO: can this be replaced/merged with splitSequence?\n const units = gridCell.cell.column.getTag(DG.TAGS.UNITS);\n const aligned: string = gridCell.cell.column.getTag(bioTAGS.aligned);\n\n const palette = getPaletteByType(paletteType);\n\n const separator = gridCell.cell.column.getTag(bioTAGS.separator) ?? '';\n const splitLimit = w / 5;\n const splitterFunc: SplitterFunc = getSplitter(units, separator, splitLimit);\n\n // TODO: Store temp data to GridColumn\n // Now the renderer requires data frame table Column underlying GridColumn\n const colTemp: TempType = gridCell.cell.column.temp;\n\n const tempReferenceSequence: string | null = colTemp[tempTAGS.referenceSequence];\n const tempCurrentWord: string | null = colTemp[tempTAGS.currentWord];\n const tempMonomerWidth: string | null = colTemp[tempTAGS.monomerWidth];\n const referenceSequence: string[] = splitterFunc(\n ((tempReferenceSequence != null) && (tempReferenceSequence != '')) ?\n tempReferenceSequence : tempCurrentWord ?? '');\n const monomerWidth: string = (tempMonomerWidth != null) ? tempMonomerWidth : 'short';\n\n let gapRenderer = 5;\n let maxIndex = 0;\n let maxLengthOfMonomer = 8;\n\n if (monomerWidth === 'short') {\n gapRenderer = 12;\n maxLengthOfMonomer = 1;\n }\n\n let maxLengthWords: any = {};\n if (gridCell.cell.column.getTag('.calculatedCellRender') !== splitLimit.toString()) {\n let samples = 0;\n while (samples < Math.min(gridCell.cell.column.length, 100)) {\n const column = gridCell.cell.column.get(samples);\n const subParts: string[] = splitterFunc(column);\n subParts.forEach((amino, index) => {\n const textSize = monomerToShortFunction(amino, maxLengthOfMonomer).length * 7 + gapRenderer;\n if (textSize > (maxLengthWords[index] ?? 0))\n maxLengthWords[index] = textSize;\n if (index > maxIndex) maxIndex = index;\n });\n samples += 1;\n }\n const minLength = 3 * 7;\n for (let i = 0; i <= maxIndex; i++) {\n if (maxLengthWords[i] < minLength) maxLengthWords[i] = minLength;\n const maxLengthWordSum: any = {};\n maxLengthWordSum[0] = maxLengthWords[0];\n for (let i = 1; i <= maxIndex; i++) maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];\n colTemp[tempTAGS.bioSumMaxLengthWords] = maxLengthWordSum;\n colTemp[tempTAGS.bioMaxIndex] = maxIndex;\n colTemp[tempTAGS.bioMaxLengthWords] = maxLengthWords;\n gridCell.cell.column.setTag('.calculatedCellRender', splitLimit.toString());\n }\n } else {\n maxLengthWords = colTemp[tempTAGS.bioMaxLengthWords];\n }\n\n const subParts: string[] = splitterFunc(cell.value);\n let x1 = x;\n let color = undefinedColor;\n let drawStyle = DrawStyle.classic;\n\n\n if (aligned && aligned.includes('MSA') && units == NOTATION.SEPARATOR)\n drawStyle = DrawStyle.MSA;\n\n subParts.every((amino, index) => {\n color = palette.get(amino);\n g.fillStyle = undefinedColor;\n const last = index === subParts.length - 1;\n x1 = printLeftOrCentered(x1, y, w, h,\n g, amino, color, 0, true, 1.0, separator, last, drawStyle,\n maxLengthWords, index, gridCell, referenceSequence, maxLengthOfMonomer);\n return minDistanceRenderer <= w;\n });\n\n g.restore();\n return;\n }\n}\n\nexport class MonomerCellRenderer extends DG.GridCellRenderer {\n get name(): string { return C.SEM_TYPES.MONOMER; }\n\n get cellType(): string { return C.SEM_TYPES.MONOMER; }\n\n get defaultHeight(): number { return 15; }\n\n get defaultWidth(): number { return 30; }\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} _cellStyle Cell style.\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n _cellStyle: DG.GridCellStyle): void {\n g.font = `12px monospace`;\n g.textBaseline = 'middle';\n g.textAlign = 'center';\n\n const palette = getPaletteByType(gridCell.cell.column.getTag(bioTAGS.alphabet));\n const s: string = gridCell.cell.value;\n if (!s)\n return;\n const color = palette.get(s);\n\n g.fillStyle = color;\n g.fillText(monomerToShort(s, 3), x + (w / 2), y + (h / 2), w);\n }\n}\n\nexport class MacromoleculeDifferenceCellRenderer extends DG.GridCellRenderer {\n get name(): string { return 'MacromoleculeDifferenceCR'; }\n\n get cellType(): string { return C.SEM_TYPES.MACROMOLECULE_DIFFERENCE; }\n\n get defaultHeight(): number { return 30; }\n\n get defaultWidth(): number { return 230; }\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} _cellStyle Cell style.\n * @memberof AlignedSequenceDifferenceCellRenderer\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n _cellStyle: DG.GridCellStyle): void {\n const grid = gridCell.grid;\n const cell = gridCell.cell;\n const s: string = cell.value ?? '';\n const separator = gridCell.tableColumn!.tags[bioTAGS.separator];\n const units: string = gridCell.tableColumn!.tags[DG.TAGS.UNITS];\n w = getUpdatedWidth(grid, g, x, w);\n //TODO: can this be replaced/merged with splitSequence?\n const [s1, s2] = s.split('#');\n const splitter = getSplitter(units, separator);\n const subParts1 = splitter(s1);\n const subParts2 = splitter(s2);\n drawMoleculeDifferenceOnCanvas(g, x, y, w, h, subParts1, subParts2, units);\n }\n}\n\nexport function drawMoleculeDifferenceOnCanvas(\n g: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n subParts1: string [],\n subParts2: string [],\n units: string,\n fullStringLength?: boolean,\n molDifferences?: { [key: number]: HTMLCanvasElement }\n): void {\n if (subParts1.length !== subParts2.length) {\n const sequences: IComparedSequences = fillShorterSequence(subParts1, subParts2);\n subParts1 = sequences.subParts1;\n subParts2 = sequences.subParts2;\n }\n const textSize1 = g.measureText(processSequence(subParts1).join(''));\n const textSize2 = g.measureText(processSequence(subParts2).join(''));\n const textWidth = Math.max(textSize1.width, textSize2.width);\n if (fullStringLength) {\n w = textWidth + subParts1.length * 4;\n g.canvas.width = textWidth + subParts1.length * 4;\n }\n let updatedX = Math.max(x, x + (w - (textWidth + subParts1.length * 4)) / 2);\n // 28 is the height of the two substitutions on top of each other + space\n const updatedY = Math.max(y, y + (h - 28) / 2);\n\n g.save();\n g.beginPath();\n g.rect(x, y, fullStringLength ? textWidth + subParts1.length * 4 : w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n\n let palette: SeqPalette = UnknownSeqPalettes.Color;\n if (units != 'HELM')\n palette = getPaletteByType(units.substring(units.length - 2));\n\n const vShift = 7;\n for (let i = 0; i < subParts1.length; i++) {\n const amino1 = subParts1[i];\n const amino2 = subParts2[i];\n const color1 = palette.get(amino1);\n\n if (amino1 != amino2) {\n const color2 = palette.get(amino2);\n const subX0 = printLeftOrCentered(updatedX, updatedY - vShift, w, h, g, amino1, color1, 0, true);\n const subX1 = printLeftOrCentered(updatedX, updatedY + vShift, w, h, g, amino2, color2, 0, true);\n updatedX = Math.max(subX1, subX0);\n if (molDifferences)\n molDifferences[i] = createDifferenceCanvas(amino1, amino2, color1, color2, updatedY, vShift, h);\n } else { updatedX = printLeftOrCentered(updatedX, updatedY, w, h, g, amino1, color1, 0, true, 0.5); }\n updatedX += 4;\n }\n g.restore();\n}\n\ninterface IComparedSequences{\n subParts1: string[];\n subParts2: string[];\n}\n\nfunction createDifferenceCanvas(\n amino1: string,\n amino2: string,\n color1: string,\n color2: string,\n y: number,\n shift: number,\n h: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d')!;\n context.font = '12px monospace';\n const width1 = context.measureText(processSequence([amino1]).join('')).width;\n const width2 = context.measureText(processSequence([amino2]).join('')).width;\n const width = Math.max(width1, width2);\n canvas.height = h;\n canvas.width = width + 4;\n context.font = '12px monospace';\n context.textBaseline = 'top';\n printLeftOrCentered(0, y - shift, width, h, context, amino1, color1, 0, true);\n printLeftOrCentered(0, y + shift, width, h, context, amino2, color2, 0, true);\n return canvas;\n}\n\nfunction fillShorterSequence(subParts1: string[], subParts2: string[]): IComparedSequences {\n let numIdenticalStart = 0;\n let numIdenticalEnd = 0;\n const longerSeq = subParts1.length > subParts2.length ? subParts1 : subParts2;\n let shorterSeq = subParts1.length > subParts2.length ? subParts2 : subParts1;\n\n for (let i = 0; i < shorterSeq.length; i++) {\n if (longerSeq[i] === shorterSeq[i])\n numIdenticalStart++;\n }\n\n const lengthDiff = longerSeq.length - shorterSeq.length;\n for (let i = longerSeq.length - 1; i > lengthDiff; i--) {\n if (longerSeq[i] === shorterSeq[i - lengthDiff])\n numIdenticalEnd++;\n }\n\n const emptyMonomersArray = new Array<string>(Math.abs(subParts1.length - subParts2.length)).fill('');\n\n function concatWithEmptyVals(subparts: string[]): string[] {\n return numIdenticalStart > numIdenticalEnd ? subparts.concat(emptyMonomersArray) : emptyMonomersArray.concat(subparts);\n }\n\n subParts1.length > subParts2.length ? subParts2 = concatWithEmptyVals(subParts2) : subParts1 = concatWithEmptyVals(subParts1);\n return {subParts1: subParts1, subParts2: subParts2};\n}\n","import { PositionHeight } from './web-logo';\n// Data structures for V-Domain regions of antibodies\nexport var VdRegionType;\n(function (VdRegionType) {\n VdRegionType[\"Unknown\"] = \"unknown\";\n VdRegionType[\"FR\"] = \"framework\";\n VdRegionType[\"CDR\"] = \"cdr\";\n})(VdRegionType || (VdRegionType = {}));\nexport class VdRegionsPropsDefault {\n constructor() {\n this.regionTypes = [VdRegionType.CDR];\n this.chains = ['Heavy', 'Light'];\n //sequenceColumnNamePostfix: string = 'chain sequence';\n this.skipEmptyPositions = false;\n this.positionWidth = 16;\n this.positionHeight = PositionHeight.Entropy;\n }\n}\n//# sourceMappingURL=vd-regions.js.map","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as rxjs from 'rxjs';\nimport {FilterSources, WebLogoViewer, PROPS as wlPROPS} from '../viewers/web-logo-viewer';\nimport {\n VdRegionsPropsDefault, VdRegionsProps, IVdRegionsViewer,\n VdRegion, VdRegionType\n} from '@datagrok-libraries/bio/src/viewers/vd-regions';\nimport {PositionHeight} from '@datagrok-libraries/bio/src/viewers/web-logo';\nimport {Unsubscribable} from 'rxjs';\n\nconst vrt = VdRegionType;\n\n// Positions of regions for numbering schemes\n// http://www.bioinf.org.uk/abs/info.html\n\n// const imgtRegions: VdRegion[] = [\n// new VdRegion(vrt.FR, 'FR1', 'Light', 1, '1', '26'),\n// new VdRegion(vrt.FR, 'FR1', 'Heavy', 1, '1', '26'),\n//\n// new VdRegion(vrt.CDR, 'CDR1', 'Light', 2, '27', '38'), // 27-32\n// new VdRegion(vrt.CDR, 'CDR1', 'Heavy', 2, '27', '38'), // 27-32\n//\n// new VdRegion(vrt.FR, 'FR2', 'Light', 3, '39', '55'),\n// new VdRegion(vrt.FR, 'FR2', 'Heavy', 3, '39', '55'),\n//\n// new VdRegion(vrt.CDR, 'CDR2', 'Light', 4, '56', '65'),\n// new VdRegion(vrt.CDR, 'CDR2', 'Heavy', 4, '56', '65'),\n//\n// new VdRegion(vrt.FR, 'FR3', 'Light', 5, '66', '104'),\n// new VdRegion(vrt.FR, 'FR3', 'Heavy', 5, '66', '104'),\n//\n// new VdRegion(vrt.CDR, 'CDR3', 'Light', 6, '105', '117'),\n// new VdRegion(vrt.CDR, 'CDR3', 'Heavy', 6, '105', '117'),\n//\n// new VdRegion(vrt.FR, 'FR4', 'Light', 7, '118', null/*127*/),\n// new VdRegion(vrt.FR, 'FR4', 'Heavy', 7, '118', null/*128*/),\n// ];\n\n/** Viewer with tabs based on description of chain regions.\n * Used to define regions of an immunoglobulin LC.\n */\nexport class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {\n private viewed: boolean = false;\n\n // private regionsDf: DG.DataFrame;\n private regionsFg: DG.FilterGroup | null = null;\n // private regionsTV: DG.TableView;\n private regionsRoot: HTMLElement | null = null;\n\n private isOpened: boolean = false;\n private panelNode: DG.DockNode | null = null;\n\n public regions: VdRegion[] = [];\n public regionTypes: VdRegionType[];\n public chains: string[];\n // public sequenceColumnNamePostfix: string;\n\n public skipEmptyPositions: boolean;\n public positionWidth: number;\n public positionHeight: PositionHeight;\n\n constructor() {\n super();\n\n // To prevent ambiguous numbering scheme in MLB\n this.regionTypes = this.stringList('regionTypes', [vrt.CDR],\n {choices: Object.values(vrt).filter((t) => t != vrt.Unknown)}) as VdRegionType[];\n this.chains = this.stringList('chains', ['Heavy', 'Light'],\n {choices: ['Heavy', 'Light']});\n // this.sequenceColumnNamePostfix = this.string('sequenceColumnNamePostfix', 'chain sequence');\n\n this.skipEmptyPositions = this.bool('skipEmptyPositions', false);\n this.positionWidth = this.float('positionWidth', 16);\n this.positionHeight = this.string('positionHeight', PositionHeight.Entropy,\n {choices: Object.keys(PositionHeight)}) as PositionHeight;\n }\n\n public async init() {\n //#region regionsDF with filter\n // this.regionsDf = DG.DataFrame.fromObjects(this.regions);\n // this.regionsDf.rows.filter((row) => row.name == 'CDR1');\n // // To available options /\n // this.regionsFg = (await this.regionsDf.plot.fromType(DG.VIEWER.FILTERS, {\n // // columnNames: ['name',],\n // showFilterCountsIndication: false,\n // showHeader: false,\n // showSearchBox: false,\n // filters: [\n // {type: DG.FILTER_TYPE.CATEGORICAL, column: 'type', label: 'Region name', showHistogram: false},\n // {type: DG.FILTER_TYPE.CATEGORICAL, column: 'name', label: 'Region type', showHistogram: false},\n // ],\n // title: 'Regions filter',\n // showTitle: true,\n // description: 'Filter for regions of multiple alignment by IMGT nomenclature',\n // someProperty: 'Hello',\n // })) as DG.FilterGroup;\n\n //#endregion regionsDF with filter\n\n // this.mlbView.dockManager.dock(this.regionsFg.root, DG.DOCK_TYPE.LEFT, rootNode, 'Filter regions', 0.2);\n\n this.subs.push(ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this)));\n this.subs.push(rxjs.fromEvent<MouseEvent>(this.root, 'mousemove').subscribe(this.rootOnMouseMove.bind(this)));\n\n // await this.buildView('init'); // init\n }\n\n public override async onTableAttached() {\n const superOnTableAttached = super.onTableAttached.bind(this);\n this.viewPromise = this.viewPromise.then(async () => { // onTableAttached\n superOnTableAttached();\n if (!this.viewed) {\n await this.buildView('onTableAttached'); // onTableAttached\n this.viewed = true;\n }\n });\n }\n\n public override onPropertyChanged(property: DG.Property | null): void {\n super.onPropertyChanged(property);\n\n if (!property) {\n console.warn('Bio: VdRegionsViewer.onPropertyChanged() property is null');\n return;\n }\n\n if (property) {\n switch (property.name) {\n case 'regionTypes':\n break;\n case 'chains':\n break;\n case 'sequenceColumnNamePostfix':\n break;\n // for (let orderI = 0; orderI < this.logos.length; orderI++) {\n // for (let chainI = 0; chainI < this.chains.length; chainI++) {\n // const chain: string = this.chains[chainI];\n // this.logos[orderI][chain].setOptions({skipEmptyPositions: this.skipEmptyPositions});\n // }\n // }\n // this.calcSize();\n }\n }\n\n switch (property.name) {\n case 'skipEmptyPositions':\n case 'positionWidth':\n case 'positionHeight':\n this.setData(this.dataFrame, this.regions); // onPropertyChanged\n break;\n }\n }\n\n // -- Data --\n\n // TODO: .onTableAttached is not calling on dataFrame set, onPropertyChanged also not calling\n public setData(mlbDf: DG.DataFrame, regions: VdRegion[]) {\n console.debug('Bio: VdRegionsViewer.setData()');\n this.viewPromise = this.viewPromise.then(async () => { // setData\n if (this.viewed) {\n await this.destroyView('setData'); // setData\n this.viewed = false;\n }\n });\n\n this.regions = regions;\n this.dataFrame = mlbDf; // causes detach and onTableAttached\n\n this.viewPromise = this.viewPromise.then(async () => { // setData\n if (!this.viewed) {\n await this.buildView('setData'); // setData\n this.viewed = true;\n }\n });\n }\n\n override detach() {\n const superDetach = super.detach.bind(this);\n this.viewPromise = this.viewPromise.then(async () => { // detach\n if (this.viewed) {\n await this.destroyView('detach'); // detach\n this.viewed = false;\n }\n superDetach();\n });\n }\n\n // -- View --\n\n private viewPromise: Promise<void> = Promise.resolve();\n\n private host: HTMLElement | null = null;\n private filterSourceInput: DG.InputBase<boolean | null> | null = null;\n private mainLayout: HTMLTableElement | null = null;\n private logos: { [chain: string]: WebLogoViewer }[] = [];\n\n private viewSubs: Unsubscribable[] = [];\n\n private async destroyView(purpose: string): Promise<void> {\n // TODO: Unsubscribe from and remove all view elements\n console.debug(`Bio: VdRegionsViewer.destroyView( mainLayout = ${!this.mainLayout ? 'none' : 'value'} ), ` +\n `purpose = '${purpose}'`);\n if (this.filterSourceInput) {\n //\n ui.empty(this.filterSourceInput.root);\n }\n\n if (this.mainLayout != null) {\n // this.root.removeChild(this.host);\n this.mainLayout.remove();\n this.host!.remove();\n this.host = null;\n this.mainLayout = null;\n }\n\n for (const sub of this.viewSubs) sub.unsubscribe();\n }\n\n private async buildView(purpose: string): Promise<void> {\n console.debug(`Bio: VdRegionsViewer.buildView() begin, ` + `purpose = '${purpose}'`);\n\n const regionsFiltered: VdRegion[] = this.regions.filter((r: VdRegion) => this.regionTypes.includes(r.type));\n const orderList: number[] = Array.from(new Set(regionsFiltered.map((r) => r.order))).sort();\n\n this.logos = [];\n for (let orderI = 0; orderI < orderList.length; orderI++) {\n const regionChains: { [chain: string]: WebLogoViewer } = {};\n for (const chain of this.chains) {\n const region: VdRegion | undefined = regionsFiltered\n .find((r) => r.order == orderList[orderI] && r.chain == chain);\n regionChains[chain] = (await this.dataFrame.plot.fromType('WebLogo', {\n sequenceColumnName: region!.sequenceColumnName,\n startPositionName: region!.positionStartName,\n endPositionName: region!.positionEndName,\n fixWidth: true,\n skipEmptyPositions: this.skipEmptyPositions,\n positionWidth: this.positionWidth,\n positionHeight: this.positionHeight,\n })) as unknown as WebLogoViewer;\n }\n // WebLogo creation fires onRootSizeChanged event even before control being added to this.logos\n this.logos[orderI] = regionChains;\n }\n\n // ui.tableFromMap()\n // DG.HtmlTable.create()\n this.mainLayout = ui.table(\n this.chains,\n (chain) => {\n const elements = [\n // This is chain label\n ...(orderList.length > 0 ? [ui.div(chain, {\n style: {\n transform: 'rotate(-90deg)',\n font: '12px Roboto, Roboto Local, sans-serif',\n textAlign: 'center',\n width: '16px',\n marginTop: '24px',\n marginLeft: '6px',\n }\n })] : []),\n // List with controls for regions\n ...[...Array(orderList.length).keys()].map((orderI) => {\n const wl: WebLogoViewer = this.logos[orderI][chain];\n wl.root.style.height = '100%';\n\n const resDiv = ui.div([wl.root]/*`${chain} ${regionsFiltered[rI]}`*/, {\n style: {\n // height: '100%',\n marginTop: '4px',\n marginBottom: '4px',\n }\n });\n\n return resDiv;\n })];\n return elements;\n },\n ['', ...[...Array(orderList.length).keys()].map(\n (orderI: number) => regionsFiltered.find(\n (r: VdRegion) => r.order == orderList[orderI] && r.chain == this.chains[0]\n )!.name || 'Name')]\n );\n this.mainLayout.className = 'mlb-vd-regions-viewer-table2';\n // this.mainLayout.style.background = '#EEEEFF';\n // this.mainLayout.style.height = '100%';\n // this.mainLayout.style.border = '1px solid black';\n\n this.filterSourceInput = ui.boolInput('', false, this.filterSourceInputOnValueChanged.bind(this));\n this.filterSourceInput.root.style.position = 'absolute';\n this.filterSourceInput.root.style.left = '10px';\n this.filterSourceInput.root.style.top = '-3px';\n ui.tooltip.bind(this.filterSourceInput.root, 'Check to filter sequences for selected VRs');\n\n const color: string = `#ffbb${Math.ceil(Math.random() * 255).toString(16)}`;\n this.host = ui.div([this.mainLayout, this.filterSourceInput!.root],\n {/*style: {backgroundColor: color}*/});\n this.root.appendChild(this.host);\n this.root.style.overflowX = 'auto';\n\n this.calcSize();\n\n console.debug('Bio: VdRegionsViewer.buildView() end');\n }\n\n private calcSize() {\n const logoHeight = (this.root.clientHeight - 54) / this.chains.length;\n\n const maxHeight: number = Math.min(logoHeight,\n Math.max(...this.logos.map((wlDict) =>\n Math.max(...Object.values(wlDict).map((wl) => wl.maxHeight))))\n );\n\n for (let orderI = 0; orderI < this.logos.length; orderI++) {\n for (let chainI = 0; chainI < this.chains.length; chainI++) {\n const chain: string = this.chains[chainI];\n this.logos[orderI][chain].root.style.height = `${maxHeight}px`;\n }\n }\n }\n\n // -- Handle events --\n\n private rootOnSizeChanged(args: any): void {\n this.calcSize();\n }\n\n private rootOnMouseMove(e: MouseEvent) {\n // ui.tooltip.show('text', e.x + 8, e.y + 8,);\n // console.log(`onMouseMoveRoot.( x: ${e.x}, y: ${e.y} )`);\n }\n\n private filterSourceInputOnValueChanged(): void {\n const filterSource: FilterSources = this.filterSourceInput!.value == true ?\n FilterSources.Selected : FilterSources.Filtered;\n\n for (let orderI = 0; orderI < this.logos.length; orderI++) {\n for (let chainI = 0; chainI < this.chains.length; chainI++) {\n const chain: string = this.chains[chainI];\n const wl: DG.JsViewer = this.logos[orderI][chain];\n wl.setOptions({[wlPROPS.filterSource]: filterSource});\n }\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport {AvailableMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {reduceDimensinalityWithNormalization} from '@datagrok-libraries/ml/src/sequence-space';\nimport {BitArrayMetrics, StringMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {Matrix} from '@datagrok-libraries/utils/src/type-declarations';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {ISequenceSpaceParams} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';\nimport {invalidateMols, MONOMERIC_COL_TAGS} from '../substructure-search/substructure-search';\nimport * as grok from 'datagrok-api/grok';\n\nexport interface ISequenceSpaceResult {\n distance: Matrix;\n coordinates: DG.ColumnList;\n}\n\nexport async function sequenceSpace(spaceParams: ISequenceSpaceParams): Promise<ISequenceSpaceResult> {\n // code deprecated since seqCol is encoded\n /* let preparedData: any;\n if (!(spaceParams.seqCol!.tags[DG.TAGS.UNITS] === 'HELM')) {\n const sep = spaceParams.seqCol.getTag(UnitsHandler.TAGS.separator);\n const sepFinal = sep ? sep === '.' ? '\\\\\\.' : sep : '-';\n const regex = new RegExp(sepFinal, 'g');\n if (Object.keys(AvailableMetrics['String']).includes(spaceParams.similarityMetric))\n preparedData = spaceParams.seqCol.toList().map((v: string) => v.replace(regex, '')) as string[];\n else\n preparedData = spaceParams.seqCol.toList().map((v: string) => v.replace(regex, '')) as string[];\n } else {\n preparedData = spaceParams.seqCol.toList();\n } */\n\n const sequenceSpaceResult = await reduceDimensinalityWithNormalization(\n spaceParams.seqCol.toList(),\n spaceParams.methodName,\n spaceParams.similarityMetric as StringMetrics | BitArrayMetrics,\n spaceParams.options);\n const cols: DG.Column[] = spaceParams.embedAxesNames.map(\n (name: string, index: number) => DG.Column.fromFloat32Array(name, sequenceSpaceResult.embedding[index]));\n return {distance: sequenceSpaceResult.distance, coordinates: new DG.ColumnList(cols)};\n}\n\nexport async function sequenceSpaceByFingerprints(spaceParams: ISequenceSpaceParams): Promise<ISequenceSpaceResult> {\n if (spaceParams.seqCol.version !== spaceParams.seqCol.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION])\n await invalidateMols(spaceParams.seqCol, false);\n\n const result = await grok.functions.call('Chem:getChemSpaceEmbeddings', {\n col: spaceParams.seqCol.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS],\n methodName: spaceParams.methodName,\n similarityMetric: spaceParams.similarityMetric,\n xAxis: spaceParams.embedAxesNames[0],\n yAxis: spaceParams.embedAxesNames[1],\n options: spaceParams.options\n });\n return result;\n}\n\n\nexport function getEmbeddingColsNames(df: DG.DataFrame) {\n const axes = ['Embed_X', 'Embed_Y'];\n const colNameInd = df.columns.names().filter((it: string) => it.includes(axes[0])).length + 1;\n return axes.map((it) => `${it}_${colNameInd}`);\n}\n","export const similarityMetric = {\n 'Tanimoto': tanimotoSimilarity,\n 'Dice': diceSimilarity,\n 'Asymmetric': asymmetricSimilarity,\n 'Braun-Blanquet': braunBlanquetSimilarity,\n 'Cosine': cosineSimilarity,\n 'Kulczynski': kulczynskiSimilarity,\n 'Mc-Connaughey': mcConnaugheySimilarity,\n 'Rogot-Goldberg': rogotGoldbergSimilarity,\n 'Russel': russelSimilarity,\n 'Sokal': sokalSimilarity,\n 'Hamming': hammingSimilarity,\n 'Euclidean': euclideanSimilarity,\n};\nexport const distanceMetrics = {\n 'Tanimoto': tanimotoDistance,\n 'Dice': diceDistance,\n 'Asymmetric': asymmetricDistance,\n 'Braun-Blanquet': braunBlanquetDistance,\n 'Cosine': cosineDistance,\n 'Kulczynski': kulczynskiDistance,\n 'Mc-Connaughey': mcConnaugheyDistance,\n 'Rogot-Goldberg': rogotGoldbergDistance,\n 'Russel': russelDistance,\n 'Sokal': sokalDistance,\n 'Hamming': hammingDistance,\n 'Euclidean': euclideanDistance,\n};\nexport const CHEM_SIMILARITY_METRICS = ['Tanimoto', 'Dice', 'Cosine', 'Hamming', 'Euclidean'];\nexport const SEQ_SPACE_SIMILARITY_METRICS = ['Tanimoto', 'Asymmetric', 'Cosine', 'Sokal'];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return getDistanceFromSimilarity(tanimotoSimilarity(x, y));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return 1 / similarity - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixVQUFVLEVBQUUsa0JBQWtCO0lBQzlCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsZ0JBQWdCLEVBQUUsdUJBQXVCO0lBQ3pDLFFBQVEsRUFBRSxnQkFBZ0I7SUFDMUIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxlQUFlLEVBQUUsc0JBQXNCO0lBQ3ZDLGdCQUFnQixFQUFFLHVCQUF1QjtJQUN6QyxRQUFRLEVBQUUsZ0JBQWdCO0lBQzFCLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFNBQVMsRUFBRSxpQkFBaUI7SUFDNUIsV0FBVyxFQUFFLG1CQUFtQjtDQUNqQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUE2RDtJQUN2RixVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsZ0JBQWdCLEVBQUUscUJBQXFCO0lBQ3ZDLFFBQVEsRUFBRSxjQUFjO0lBQ3hCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsZUFBZSxFQUFFLG9CQUFvQjtJQUNyQyxnQkFBZ0IsRUFBRSxxQkFBcUI7SUFDdkMsUUFBUSxFQUFFLGNBQWM7SUFDeEIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsU0FBUyxFQUFFLGVBQWU7SUFDMUIsV0FBVyxFQUFFLGlCQUFpQjtDQUMvQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDOUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxVQUFVLEVB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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDOztRQUM1QyxPQUFPLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzVELE9BQU8seUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFnQjtJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQWtCO0lBQzFELE9BQU8sQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuXG5leHBvcnQgY29uc3Qgc2ltaWxhcml0eU1ldHJpYzogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gICdUYW5pbW90byc6IHRhbmltb3RvU2ltaWxhcml0eSxcbiAgJ0RpY2UnOiBkaWNlU2ltaWxhcml0eSxcbiAgJ0FzeW1tZXRyaWMnOiBhc3ltbWV0cmljU2ltaWxhcml0eSxcbiAgJ0JyYXVuLUJsYW5xdWV0JzogYnJhdW5CbGFucXVldFNpbWlsYXJpdHksXG4gICdDb3NpbmUnOiBjb3NpbmVTaW1pbGFyaXR5LFxuICAnS3VsY3p5bnNraSc6IGt1bGN6eW5za2lTaW1pbGFyaXR5LFxuICAnTWMtQ29ubmF1Z2hleSc6IG1jQ29ubmF1Z2hleVNpbWlsYXJpdHksXG4gICdSb2dvdC1Hb2xkYmVyZyc6IHJvZ290R29sZGJlcmdTaW1pbGFyaXR5LFxuICAnUnVzc2VsJzogcnVzc2VsU2ltaWxhcml0eSxcbiAgJ1Nva2FsJzogc29rYWxTaW1pbGFyaXR5LFxuICAnSGFtbWluZyc6IGhhbW1pbmdTaW1pbGFyaXR5LFxuICAnRXVjbGlkZWFuJzogZXVjbGlkZWFuU2ltaWxhcml0eSxcbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZU1ldHJpY3M6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICAnVGFuaW1vdG8nOiB0YW5pbW90b0Rpc3RhbmNlLFxuICAnRGljZSc6IGRpY2VEaXN0YW5jZSxcbiAgJ0FzeW1tZXRyaWMnOiBhc3ltbWV0cmljRGlzdGFuY2UsXG4gICdCcmF1bi1CbGFucXVldCc6IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgJ0Nvc2luZSc6IGNvc2luZURpc3RhbmNlLFxuICAnS3VsY3p5bnNraSc6IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgJ01jLUNvbm5hdWdoZXknOiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgJ1JvZ290LUdvbGRiZXJnJzogcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICAnUnVzc2VsJzogcnVzc2VsRGlzdGFuY2UsXG4gICdTb2thbCc6IHNva2FsRGlzdGFuY2UsXG4gICdIYW1taW5nJzogaGFtbWluZ0Rpc3RhbmNlLFxuICAnRXVjbGlkZWFuJzogZXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQ0hFTV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbJ1Rhbmltb3RvJywgJ0RpY2UnLCAnQ29zaW5lJywgJ0hhbW1pbmcnLCAnRXVjbGlkZWFuJ107XG5leHBvcnQgY29uc3QgU0VRX1NQQUNFX1NJTUlMQVJJVFlfTUVUUklDUyA9IFsnVGFuaW1vdG8nLCAnQXN5bW1ldHJpYycsICdDb3NpbmUnLCAnU29rYWwnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhbmltb3RvU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDEuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKHRvdGFsIC0gY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhbmltb3RvRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkodGFuaW1vdG9TaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAyICogY29tbW9uIC8gdG90YWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWNlRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoZGljZVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gTWF0aC5zcXJ0KHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGNvc2luZVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShldWNsaWRlYW5EaXN0YW5jZSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpIC0gMiAqIHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShoYW1taW5nRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2thbFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKDIgKiB0b3RhbCAtIDMgKiBjb21tb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShzb2thbFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsKSAvICgyICogdG90YWxQcm9kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGN6eW5za2lEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShrdWxjenluc2tpU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IHRvdGFsUHJvZCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWxQcm9kID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIChjb21tb24gKiB0b3RhbCAtIHRvdGFsUHJvZCkgLyB0b3RhbFByb2Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzeW1tZXRyaWNTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKHgudHJ1ZUNvdW50KCksIHkudHJ1ZUNvdW50KCkpO1xuICBpZiAobWluID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzeW1tZXRyaWNEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShhc3ltbWV0cmljU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCh4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1heCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtYXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVzc2VsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBpZiAoeC5sZW5ndGggPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8geC5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShydXNzZWxTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgY29uc3QgdG90YWwgPSB4LmNvdW50Qml0cyh0cnVlKSArIHkuY291bnRCaXRzKHRydWUpO1xuICBjb25zdCBsZW4gPSB4Lmxlbmd0aDtcbiAgY29uc3QgZGlmZiA9IGxlbiAtIHRvdGFsICsgY29tbW9uO1xuICBpZiAoKGNvbW1vbiA9PSBsZW4pIHx8IChkaWZmID09IGxlbikpIHJldHVybiAxLjA7XG4gIGVsc2UgcmV0dXJuIGNvbW1vbiAvIHRvdGFsICsgZGlmZiAvICgyICogbGVuIC0gdG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZGlzdGFuY2U6IG51bWJlcikge1xuICByZXR1cm4gMSAvICgxICsgZGlzdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShzaW1pbGFyaXR5OiBudW1iZXIpIHtcbiAgcmV0dXJuIDEgLyBzaW1pbGFyaXR5IC0gMTtcbn1cbiJdfQ==","import * as DG from 'datagrok-api/dg';\nimport * 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}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQW1CLEVBQUUsR0FBYztJQUN2RSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0lBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUMxRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDNUIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzVDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixrQkFBa0IsSUFBSSxDQUFDLENBQUM7U0FDekI7S0FDRjtJQUNELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBbUIsRUFBRSxLQUFnQjtJQUNqRSxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssSUFBTCxLQUFLLEdBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7UUFDeEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0ICogYXMgc2hhMjU2IGZyb20gJ2Zhc3Qtc2hhMjU2Jztcbi8qKlxuICogRm9yIGNvbHVtbnMgb2Ygc3RyaW5nIHR5cGUuIENoZWNrcyB3aGV0aGVyIGNvbHVtbiBjb250YWlucyBlbXB0eSB2YWx1ZXMgYW5kIHJlbW92ZXMgY29ycmVzcG9uZGluZyByb3dzIGluIGNhc2UgdXNlciBzZWxlY3RzIHRvIHJlbW92ZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbXB0eVN0cmluZ1Jvd3ModGFibGU6IERHLkRhdGFGcmFtZSwgY29sOiBERy5Db2x1bW4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGNhdHMgPSBjb2wuY2F0ZWdvcmllcztcbiAgY29uc3QgZW1wdHlSYXdJbmQgPSBjYXRzLm1hcCgodmFsLCBpbmQpID0+ICF2YWwgPyBpbmQgOiBudWxsKS5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gbnVsbCk7XG4gIGNvbnN0IHJhd0RhdGEgPSBbLi4uY29sLmdldFJhd0RhdGEoKV07XG4gIGNvbnN0IGVtcHR5UmF3c0luZGV4ZXMgPSBbXTtcbiAgbGV0IHJlbW92ZWRSb3dzQ291bnRlciA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93Q291bnQ7IGkrKykge1xuICAgIGlmIChlbXB0eVJhd0luZC5pbmNsdWRlcyhyYXdEYXRhW2ldKSkge1xuICAgICAgdGFibGUucm93cy5yZW1vdmVBdChpIC0gcmVtb3ZlZFJvd3NDb3VudGVyKTtcbiAgICAgIGVtcHR5UmF3c0luZGV4ZXMucHVzaChpKTtcbiAgICAgIHJlbW92ZWRSb3dzQ291bnRlciArPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1wdHlSYXdzSW5kZXhlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc2hEYXRhRnJhbWUodGFibGU6IERHLkRhdGFGcmFtZSwgbmFtZXM/OiBzdHJpbmdbXSk6IFVpbnQ4QXJyYXkge1xuICBuYW1lcyA/Pz0gdGFibGUuY29sdW1ucy5uYW1lcygpO1xuICBjb25zdCBoYXNoZXIgPSBuZXcgc2hhMjU2Lkhhc2goKTtcbiAgY29uc3Qgb3JkZXIgPSB0YWJsZS5nZXRTb3J0ZWRPcmRlcihuYW1lcyk7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGFibGUuY29sdW1ucy5ieU5hbWUobmFtZSk7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gY29sdW1uLmdldFJhd0RhdGEoKTtcbiAgICBjb25zdCBpc1N0cmluZyA9IGNvbHVtbi50eXBlID09IERHLlRZUEUuU1RSSU5HO1xuICAgIGNvbnN0IGNhdHMgPSBjb2x1bW4uY2F0ZWdvcmllcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjYXRzW2RhdGFBcnJheVtvcmRlcltpXV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKGVuY29kZXIuZW5jb2RlKGRhdGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhQXJyYXlbb3JkZXJbaV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKFVpbnQ4QXJyYXkuZnJvbShbZGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc2hlci5kaWdlc3QoKTtcbn1cbiJdfQ==","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!./styles.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!./styles.css\";\n export default content && content.locals ? content.locals : undefined;\n","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 * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport { getSimilarityFromDistance } from '../distance-metrics-methods';\nimport { removeEmptyStringRows } from '@datagrok-libraries/utils/src/dataframe-utils';\nimport { Subject } from 'rxjs';\nimport '../../css/styles.css';\nconst filterCliffsSubj = new Subject();\nconst nonNormalizedDistances = ['Levenshtein'];\nconst LINES_DF_ACT_DIFF_COL_NAME = 'act_diff';\nconst LINES_DF_SALI_COL_NAME = 'sali';\nconst LINES_DF_SIM_COL_NAME = 'sim';\nconst LINES_DF_LINE_IND_COL_NAME = 'line_index';\nconst LINES_DF_MOL_COLS_NAMES = ['1_seq', '2_seq'];\nconst CLIFFS_FILTER_APPLIED = 'filterCliffs';\n// Searches for activity cliffs in a chemical dataset by selected cutoff\nexport function getActivityCliffs(df, seqCol, encodedCol, axesNames, scatterTitle, activities, similarity, similarityMetric, methodName, semType, tags, seqSpaceFunc, simMatrixFunc, tooltipFunc, propertyPanelFunc, linesGridFunc, seqSpaceOptions) {\n return __awaiter(this, void 0, void 0, function* () {\n const similarityLimit = similarity / 100;\n const dimensionalityReduceCol = encodedCol !== null && encodedCol !== void 0 ? encodedCol : seqCol;\n let zoom = false;\n let ignoreSelectionChange = false;\n const cashedLinesData = {};\n let acc;\n let timer;\n const withoutEmptyValues = DG.DataFrame.fromColumns([dimensionalityReduceCol]).clone();\n const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, dimensionalityReduceCol);\n const seqSpaceParams = {\n seqCol: withoutEmptyValues.col(dimensionalityReduceCol.name),\n methodName: methodName,\n similarityMetric: similarityMetric,\n embedAxesNames: axesNames,\n options: seqSpaceOptions,\n };\n const { distance, coordinates } = yield seqSpaceFunc(seqSpaceParams);\n const coordsWithInsertedEmptyVals = getEmbeddingColsWithInsertedEmptyVals(coordinates, emptyValsIdxs, df.rowCount);\n for (const col of coordsWithInsertedEmptyVals) {\n df.columns.add(col);\n }\n const simArr = yield createSimilaritiesMatrix(dimensionalityReduceCol, distance, !distance || emptyValsIdxs.length !== 0 || nonNormalizedDistances.includes(similarityMetric), simMatrixFunc);\n const cliffsMetrics = getActivityCliffsMetrics(simArr, similarityLimit, activities);\n const sali = getSaliCountCol(dimensionalityReduceCol.length, cliffsMetrics.saliVals, cliffsMetrics.n1, cliffsMetrics.n2, axesNames, activities);\n df.columns.add(sali);\n const cliffCol = getCliffsBooleanCol(df, cliffsMetrics.cliffsMolIds);\n df.columns.add(cliffCol);\n const saliMinMax = getSaliMinMax(cliffsMetrics.saliVals);\n const saliOpacityCoef = 0.8 / (saliMinMax.max - saliMinMax.min);\n ;\n const view = grok.shell.getTableView(df.name);\n view.grid.columns.byName(cliffCol.name).visible = false;\n const sp = view.addViewer(DG.VIEWER.SCATTER_PLOT, {\n xColumnName: axesNames[0],\n yColumnName: axesNames[1],\n size: sali.name,\n color: activities.name,\n showXSelector: false,\n showYSelector: false,\n showSizeSelector: false,\n showColorSelector: false,\n markerMinSize: 5,\n markerMaxSize: 25,\n title: scatterTitle,\n });\n const canvas = sp.getInfo()['canvas'];\n const linesRes = createLines(cliffsMetrics, seqCol, activities, semType, tags);\n const linesDfGrid = linesGridFunc ?\n linesGridFunc(linesRes.linesDf, LINES_DF_MOL_COLS_NAMES).sort([LINES_DF_SALI_COL_NAME], [false]) :\n linesRes.linesDf.plot.grid().sort([LINES_DF_SALI_COL_NAME], [false]);\n const listCliffsLink = ui.button(`${linesRes.linesDf.rowCount} cliffs`, () => {\n view.dockManager.dock(linesDfGrid.root, 'down', null, 'Activity cliffs', 0.2);\n });\n listCliffsLink.classList.add('scatter_plot_link', 'cliffs_grid');\n sp.root.append(listCliffsLink);\n /* in case several activity cliffs viewers are opened cliffs filtering can\n be applyed only to one of the viewers. When 'Show only cliffs' is switched on one of the viewers\n switch inputs on other viewers are disabled */\n const filterCliffsButton = ui.switchInput(`Show only cliffs`, false, () => {\n if (filterCliffsButton.value) {\n sp.dataFrame.setTag(CLIFFS_FILTER_APPLIED, cliffCol.name);\n df.filter.copyFrom(createCliffsOnlyFilter(df, cliffCol.name));\n filterCliffsSubj.next(cliffCol.name);\n }\n else {\n sp.dataFrame.setTag(CLIFFS_FILTER_APPLIED, '');\n df.filter.setAll(true, true);\n filterCliffsSubj.next('');\n }\n });\n filterCliffsButton.root.classList.add('scatter_plot_link', 'show_only_cliffs');\n sp.root.append(filterCliffsButton.root);\n filterCliffsSubj.subscribe((s) => {\n if (s !== '') {\n if (s !== cliffCol.name)\n filterCliffsButton.enabled = false;\n }\n else {\n filterCliffsButton.enabled = true;\n }\n });\n //closing docked grid when viewer is closed\n const viewerClosedSub = grok.events.onViewerClosed.subscribe((v) => {\n //@ts-ignore\n if (v.args.viewer === sp) {\n view.dockManager.close(linesDfGrid.root);\n viewerClosedSub.unsubscribe();\n view.subs = view.subs.filter((sub) => sub !== viewerClosedSub);\n }\n });\n view.subs.push(viewerClosedSub);\n linesRes.linesDf.onCurrentCellChanged.subscribe(() => {\n zoom = true;\n const currentMolIdx = linesRes.linesDf.currentCol && linesRes.linesDf.currentCol.name === LINES_DF_MOL_COLS_NAMES[1] ? 1 : 0;\n const line = linesRes.linesDf.currentRowIdx !== -1 ? linesRes.lines[linesRes.linesDf.currentRowIdx] : null;\n sp.dataFrame.currentRowIdx = line ? line.mols[currentMolIdx] : -1;\n sp.dataFrame.filter.set(0, !linesRes.lines[0].selected); //calling filter to force scatter plot re-rendering\n sp.dataFrame.filter.set(0, linesRes.lines[0].selected);\n if (line) {\n setTimeout(() => {\n updatePropertyPanel(df, acc, cashedLinesData, line, seqCol, activities, linesRes.linesDf.get(LINES_DF_SALI_COL_NAME, line.id), propertyPanelFunc);\n const order = sp.dataFrame.getSortedOrder(view.grid.sortByColumns, view.grid.sortTypes);\n view.grid.scrollToCell(seqCol.name, order.indexOf(sp.dataFrame.currentRowIdx));\n }, 1000);\n }\n });\n linesRes.linesDf.onSelectionChanged.subscribe((_) => {\n if (linesRes.linesDf.selection.anyTrue === false) { //case when selection is reset by pushing Esc\n linesRes.lines.forEach((l) => { l.selected = false; });\n }\n else {\n if (linesRes.linesDf.mouseOverRowIdx !== -1) {\n const line = linesRes.lines[linesRes.linesDf.mouseOverRowIdx];\n line.selected = !line.selected;\n }\n }\n setTimeout(() => {\n const selection = DG.BitSet.create(df.rowCount);\n linesRes.lines.forEach((l) => {\n if (l.selected) {\n l.mols.forEach((m) => {\n selection.set(m, l.selected, true);\n });\n }\n });\n df.selection.copyFrom(selection);\n view.grid.invalidate();\n }, 300); //timeout is required because of resetting selection by clicking on scatter plot. First selection is reset and after it is set again using by this method\n });\n df.onSelectionChanged.subscribe((e) => {\n if (ignoreSelectionChange) {\n ignoreSelectionChange = false;\n }\n else {\n if (df.selection.anyTrue === false && typeof e === 'number') { //catching event when initial df selection is reset by pushing Esc\n linesRes.lines.forEach((l) => { l.selected = false; });\n linesDfGrid.dataFrame.selection.setAll(false, false);\n linesDfGrid.invalidate();\n }\n }\n });\n canvas.addEventListener('mousemove', function (event) {\n clearTimeout(timer);\n timer = global.setTimeout(function () {\n const line = checkCursorOnLine(event, canvas, linesRes.lines);\n if (line && df.mouseOverRowIdx === -1) {\n ui.tooltip.show(tooltipFunc({ cashedData: cashedLinesData, line: line, df: df, seqCol: seqCol,\n activityCol: activities }), event.clientX, event.clientY);\n }\n }, 500);\n });\n canvas.addEventListener('mousedown', function (event) {\n ignoreSelectionChange = true; //clicking on a scatter plot leads to selection reset. Variable is required to prevent from resetting (is used in df.onSelectionChanged.subscribe)\n const line = checkCursorOnLine(event, canvas, linesRes.lines);\n if (line && df.mouseOverRowIdx === -1) {\n if (event.ctrlKey) {\n line.selected = !line.selected;\n linesRes.linesDf.selection.set(line.id, line.selected);\n }\n else {\n if (linesRes.linesDf.currentRowIdx !== line.id) {\n linesRes.linesDf.currentRowIdx = line.id;\n df.currentRowIdx = line.mols[0];\n df.filter.set(0, !linesRes.lines[0].selected); //calling filter to force scatter plot re-rendering\n df.filter.set(0, linesRes.lines[0].selected);\n }\n }\n const order = linesRes.linesDf.getSortedOrder(linesDfGrid.sortByColumns, linesDfGrid.sortTypes);\n linesDfGrid.scrollToCell(LINES_DF_MOL_COLS_NAMES[0], order.indexOf(line.id));\n }\n });\n sp.onEvent('d4-before-draw-scene')\n .subscribe((_) => {\n const lines = renderLines(sp, axesNames[0], axesNames[1], linesRes, cliffsMetrics.saliVals, saliOpacityCoef, saliMinMax.min);\n if (zoom) {\n const currentLine = lines[linesRes.linesDf.currentRowIdx];\n setTimeout(() => {\n const { zoomLeft, zoomRight, zoomTop, zoomBottom } = getZoomCoordinates(sp.viewport.width, sp.viewport.height, sp.dataFrame.get(axesNames[0], currentLine.mols[0]), sp.dataFrame.get(axesNames[1], currentLine.mols[0]), sp.dataFrame.get(axesNames[0], currentLine.mols[1]), sp.dataFrame.get(axesNames[1], currentLine.mols[1]));\n sp.zoom(zoomLeft, zoomTop, zoomRight, zoomBottom);\n }, 300);\n zoom = false;\n }\n if (filterCliffsButton.value) {\n df.filter.copyFrom(createCliffsOnlyFilter(df, cliffCol.name));\n }\n else if (filterCliffsButton.enabled === true)\n df.filter.setAll(true, false);\n });\n sp.addProperty('similarityLimit', 'double', similarityLimit);\n acc = createPopertyPanel();\n return sp;\n });\n}\nfunction createCliffsOnlyFilter(df, colName) {\n const filter = DG.BitSet.create(df.rowCount);\n const raw = df.col(colName).getRawData();\n for (let i = 0; i < raw.length; i++) {\n filter.set(i, !!raw[i], false);\n }\n return filter;\n}\nfunction getEmbeddingColsWithInsertedEmptyVals(coordinates, emptyValsIdxs, length) {\n const coordsWithInsertedEmptyVals = [];\n for (const col of coordinates) {\n const listValues = col.toList();\n emptyValsIdxs.forEach((ind) => listValues.splice(ind, 0, null));\n coordsWithInsertedEmptyVals.push(DG.Column.float(col.name, length).init((i) => listValues[i]));\n }\n return coordsWithInsertedEmptyVals;\n}\nfunction createSimilaritiesMatrix(col, distance, countFromDistance, simMatrixFunc) {\n return __awaiter(this, void 0, void 0, function* () {\n const cats = col.categories;\n const raw = col.getRawData();\n const newCol = DG.Column.string('seq', col.length).init((i) => cats[raw[i]]);\n const dfSeq = DG.DataFrame.fromColumns([newCol]);\n const dim = col.length;\n let simArr = Array(dim - 1);\n if (countFromDistance) {\n simArr = yield simMatrixFunc(dim, col, dfSeq, 'seq', simArr);\n }\n else {\n getSimilaritiesFromDistances(dim, distance, simArr);\n }\n return simArr;\n });\n}\nfunction getActivityCliffsMetrics(simArr, similarityLimit, activities) {\n const simVals = [];\n const saliVals = [];\n const n1 = [];\n const n2 = [];\n const cliffsMolIds = new Set();\n for (let i = 0; i != simArr.length; ++i) {\n for (let j = 0; j != simArr.length - i; ++j) {\n const sim = simArr[i] ? simArr[i].get(j) : 0;\n if (sim >= similarityLimit) {\n n1.push(i);\n n2.push(i + j + 1);\n cliffsMolIds.add(i);\n cliffsMolIds.add(i + j + 1);\n simVals.push(sim);\n const diff = Math.abs(activities.get(i) - activities.get(i + j + 1));\n if (sim != 1) {\n saliVals.push(diff / (1 - sim));\n }\n else {\n saliVals.push(Infinity);\n }\n }\n }\n }\n return { simVals: simVals, saliVals: saliVals, n1: n1, n2: n2, cliffsMolIds: cliffsMolIds };\n}\nfunction getSaliMinMax(saliVals) {\n const saliValsWithoutInfinity = saliVals.filter((it) => it !== Infinity);\n const saliMin = Math.min(...saliValsWithoutInfinity);\n const saliMax = Math.max(...saliValsWithoutInfinity);\n return { max: saliMax, min: saliMin };\n}\nfunction getSaliCountCol(length, saliVals, n1, n2, axesNames, activities) {\n const saliCount = new Array(length).fill(0);\n for (let i = 0; i != n1.length; ++i) {\n if (saliVals[i] != Infinity) {\n if (activities.get(n1[i]) > activities.get(n2[i])) {\n saliCount[n1[i]] += saliVals[i];\n }\n else {\n saliCount[n2[i]] += saliVals[i];\n }\n }\n }\n return DG.Column.fromList('double', `sali_${axesNames[0].substring(axesNames[0].lastIndexOf('_'))}`, saliCount);\n}\nfunction createPopertyPanel() {\n const acc = ui.accordion();\n const accIcon = ui.element('i');\n accIcon.className = 'grok-icon svg-icon svg-view-layout';\n acc.addTitle(ui.span([accIcon, ui.label(`Activity cliffs`)]));\n acc.addPane('Cliff Details', () => ui.divText('Cliff has not been selected'), true);\n grok.shell.o = acc.root;\n return acc;\n}\nfunction updatePropertyPanel(df, acc, cashedData, line, seqCol, activities, sali, propPanelFunc) {\n const panel = acc.getPane('Cliff Details');\n ui.empty(panel.root);\n const panelElement = propPanelFunc({ cashedData: cashedData, line: line, df: df, seqCol: seqCol,\n activityCol: activities, sali: sali });\n panel.root.append(panelElement);\n setTimeout(() => {\n grok.shell.o = acc.root;\n }, 500);\n}\nfunction getZoomCoordinates(W0, H0, x1, y1, x2, y2) {\n const W1 = Math.abs(x1 - x2);\n const H1 = Math.abs(y1 - y2);\n const scaleW = W0 / W1;\n const scaleH = H0 / H1;\n const scale = Math.min(scaleW, scaleH);\n const W2 = (W0 / scale) * 5;\n const H2 = (H0 / scale) * 5;\n const left = x1 < x2 ? x1 : x2;\n const top = y1 > y2 ? y1 : y2;\n const zoomLeft = (left + W1 / 2) - W2 / 2;\n const zoomRight = zoomLeft + W2;\n const zoomTop = (top - H1 / 2) + H2 / 2;\n const zoomBottom = zoomTop - H2;\n return { zoomLeft: zoomLeft, zoomRight: zoomRight, zoomTop: zoomTop, zoomBottom: zoomBottom };\n}\nfunction checkCursorOnLine(event, canvas, lines) {\n const rect = canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n let closestLine = null;\n let minDist = 0;\n for (const line of lines) {\n const dist = Math.abs(Math.hypot(line.a[0] - x, line.a[1] - y) +\n Math.hypot(line.b[0] - x, line.b[1] - y) - Math.hypot(line.a[0] - line.b[0], line.a[1] - line.b[1]));\n if ((!minDist && dist < 2) || dist < minDist) {\n minDist = dist;\n closestLine = line;\n }\n }\n return closestLine;\n}\nfunction renderLines(sp, xAxis, yAxis, linesRes, saliVals, saliOpacityCoef, saliMin) {\n const lines = linesRes.lines;\n const canvas = sp.getInfo()['canvas'];\n const ctx = canvas.getContext('2d');\n const x = sp.dataFrame.columns.byName(xAxis);\n const y = sp.dataFrame.columns.byName(yAxis);\n for (let i = 0; i < lines.length; i++) {\n const pointFrom = sp.worldToScreen(x.get(lines[i].mols[0]), y.get(lines[i].mols[0]));\n const pointTo = sp.worldToScreen(x.get(lines[i].mols[1]), y.get(lines[i].mols[1]));\n lines[i].a = [pointFrom.x, pointFrom.y];\n lines[i].b = [pointTo.x, pointTo.y];\n const line = new Path2D();\n line.moveTo(lines[i].a[0], lines[i].a[1]);\n const color = lines[i].selected ? '255,255,0' : '0,128,0';\n const opacity = saliVals[i] === Infinity ? 1 : 0.2 + (saliVals[i] - saliMin) * saliOpacityCoef;\n ctx.strokeStyle = `rgba(${color},${opacity})`;\n ctx.lineWidth = lines[i].id === linesRes.linesDf.currentRowIdx ? 3 : 1;\n line.lineTo(lines[i].b[0], lines[i].b[1]);\n ctx.stroke(line);\n }\n return lines;\n}\nfunction createLines(params, seq, activities, semType, tags) {\n const lines = new Array(params.n1.length).fill(null);\n for (let i = 0; i < params.n1.length; i++) {\n const num1 = params.n1[i];\n const num2 = params.n2[i];\n lines[i] = ({ id: i, mols: [num1, num2], selected: false, a: [], b: [] });\n }\n const linesDf = DG.DataFrame.create(lines.length);\n LINES_DF_MOL_COLS_NAMES.forEach((it, idx) => {\n linesDf.columns.addNewString(it).init((i) => seq.get(lines[i].mols[idx]));\n setTags(linesDf.col(it), tags);\n linesDf.col(it).semType = semType;\n });\n linesDf.columns.addNewFloat(LINES_DF_ACT_DIFF_COL_NAME)\n .init((i) => Math.abs(activities.get(lines[i].mols[0]) - activities.get(lines[i].mols[1])));\n linesDf.columns.addNewInt(LINES_DF_LINE_IND_COL_NAME).init((i) => i);\n linesDf.columns.addNewFloat(LINES_DF_SALI_COL_NAME).init((i) => params.saliVals[i]);\n linesDf.columns.addNewFloat(LINES_DF_SIM_COL_NAME).init((i) => params.simVals[i]);\n return { lines, linesDf };\n}\nfunction setTags(col, tags) {\n Object.keys(tags).forEach((tag) => {\n col.tags[tag] = tags[tag];\n });\n}\nexport function getSimilaritiesMatrix(dim, seqCol, dfSeq, simArr, simFunc) {\n return __awaiter(this, void 0, void 0, function* () {\n for (let i = 0; i != dim - 1; ++i) {\n const mol = seqCol.get(i);\n dfSeq.rows.removeAt(0, 1, false);\n simArr[i] = (yield simFunc(dfSeq.col('seq'), mol));\n }\n return simArr;\n });\n}\nexport function getSimilaritiesFromDistances(dim, distances, simArr) {\n for (let i = 0; i < dim - 1; ++i) {\n const similarityArr = new Float32Array(dim - i - 1).fill(0);\n for (let j = i + 1; j < dim; ++j) {\n similarityArr[j - i - 1] = getSimilarityFromDistance(distances[i][j]);\n }\n simArr[i] = DG.Column.fromFloat32Array('similarity', similarityArr);\n }\n return simArr;\n}\nexport function getCliffsBooleanCol(df, ids) {\n const colname = 'containsCliff';\n const colNameInd = df.columns.names().filter((it) => it.includes(colname)).length + 1;\n const newColName = `${colname}_${colNameInd}`;\n return DG.Column.bool(newColName, df.rowCount).init((i) => ids.has(i));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktY2xpZmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYWN0aXZpdHktY2xpZmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztBQWtEOUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0FBQy9DLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMvQyxNQUFNLDBCQUEwQixHQUFHLFVBQVUsQ0FBQztBQUM5QyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztBQUN0QyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUNwQyxNQUFNLDBCQUEwQixHQUFHLFlBQVksQ0FBQztBQUNoRCxNQUFNLHVCQUF1QixHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25ELE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDO0FBRTdDLHdFQUF3RTtBQUN4RSxNQUFNLFVBQWdCLGlCQUFpQixDQUFDLEVBQWdCLEVBQUUsTUFBaUIsRUFBRSxVQUE0QixFQUN2RyxTQUFtQixFQUFFLFlBQW9CLEVBQUUsVUFBcUIsRUFBRSxVQUFrQixFQUFFLGdCQUF3QixFQUM5RyxVQUFrQixFQUFFLE9BQWUsRUFBRSxJQUErQixFQUNwRSxZQUE2RSxFQUM3RSxhQUM4QyxFQUM5QyxXQUE0RCxFQUM1RCxpQkFB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QUFFLEVBQUUsTUFBTSxFQUFFLE1BQU07UUFDNUYsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDVixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVU7SUFDaEcsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUN2QixNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUIs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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FB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Q0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQge01hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlfSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuaW1wb3J0IHtyZW1vdmVFbXB0eVN0cmluZ1Jvd3N9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2RhdGFmcmFtZS11dGlscyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgJy4uLy4uL2Nzcy9zdHlsZXMuY3NzJztcblxuZXhwb3J0IGludGVyZmFjZSBJTGluZSB7XG4gIGlkOiBudW1iZXI7XG4gIG1vbHM6IG51bWJlcltdO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgYTogbnVtYmVyW107IC8vIFt4LCB5XVxuICBiOiBudW1iZXJbXTsgLy8gW3gsIHldXG59XG5cbmludGVyZmFjZSBJUmVuZGVyZWRMaW5lcyB7XG4gIGxpbmVzOiBJTGluZVtdO1xuICBsaW5lc0RmOiBERy5EYXRhRnJhbWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcXVlbmNlU3BhY2VQYXJhbXMge1xuICBzZXFDb2w6IERHLkNvbHVtbixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBzaW1pbGFyaXR5TWV0cmljOiBzdHJpbmcsXG4gIGVtYmVkQXhlc05hbWVzOiBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXF1ZW5jZVNwYWNlUmVzdWx0IHtcbiAgZGlzdGFuY2U6IE1hdHJpeDtcbiAgY29vcmRpbmF0ZXM6IERHLkNvbHVtbkxpc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2x0aXBBbmRQYW5lbFBhcmFtcyB7XG4gIGNhc2hlZERhdGE6IGFueSxcbiAgbGluZTogSUxpbmUsXG4gIGRmOiBERy5EYXRhRnJhbWUsXG4gIHNlcUNvbDogREcuQ29sdW1uLFxuICBhY3Rpdml0eUNvbDogREcuQ29sdW1uLFxuICBzYWxpPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGl2aXR5Q2xpZmZzTWV0cmljcyB7XG4gIHNpbVZhbHM6IG51bWJlcltdO1xuICBzYWxpVmFsczogbnVtYmVyW107XG4gIG4xOiBudW1iZXJbXTtcbiAgbjI6IG51bWJlcltdO1xuICBjbGlmZnNNb2xJZHM6IFNldDxudW1iZXI+O1xufVxuXG5pbnRlcmZhY2UgSVNhbGlMaW1zIHtcbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xufVxuXG5jb25zdCBmaWx0ZXJDbGlmZnNTdWJqID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuY29uc3Qgbm9uTm9ybWFsaXplZERpc3RhbmNlcyA9IFsnTGV2ZW5zaHRlaW4nXTtcbmNvbnN0IExJTkVTX0RGX0FDVF9ESUZGX0NPTF9OQU1FID0gJ2FjdF9kaWZmJztcbmNvbnN0IExJTkVTX0RGX1NBTElfQ09MX05BTUUgPSAnc2FsaSc7XG5jb25zdCBMSU5FU19ERl9TSU1fQ09MX05BTUUgPSAnc2ltJztcbmNvbnN0IExJTkVTX0RGX0xJTkVfSU5EX0NPTF9OQU1FID0gJ2xpbmVfaW5kZXgnO1xuY29uc3QgTElORVNfREZfTU9MX0NPTFNfTkFNRVMgPSBbJzFfc2VxJywgJzJfc2VxJ107XG5jb25zdCBDTElGRlNfRklMVEVSX0FQUExJRUQgPSAnZmlsdGVyQ2xpZmZzJztcblxuLy8gU2VhcmNoZXMgZm9yIGFjdGl2aXR5IGNsaWZmcyBpbiBhIGNoZW1pY2FsIGRhdGFzZXQgYnkgc2VsZWN0ZWQgY3V0b2ZmXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWN0aXZpdHlDbGlmZnMoZGY6IERHLkRhdGFGcmFtZSwgc2VxQ29sOiBERy5Db2x1bW4sIGVuY29kZWRDb2w6IERHLkNvbHVtbiB8IG51bGwsXG4gIGF4ZXNOYW1lczogc3RyaW5nW10sIHNjYXR0ZXJUaXRsZTogc3RyaW5nLCBhY3Rpdml0aWVzOiBERy5Db2x1bW4sIHNpbWlsYXJpdHk6IG51bWJlciwgc2ltaWxhcml0eU1ldHJpYzogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsIHNlbVR5cGU6IHN0cmluZywgdGFnczoge1tpbmRleDogc3RyaW5nXTogc3RyaW5nfSxcbiAgc2VxU3BhY2VGdW5jOiAocGFyYW1zOiBJU2VxdWVuY2VTcGFjZVBhcmFtcykgPT4gUHJvbWlzZTxJU2VxdWVuY2VTcGFjZVJlc3VsdD4sXG4gIHNpbU1hdHJpeEZ1bmM6IChkaW06IG51bWJlciwgc2VxQ29sOiBERy5Db2x1bW4sIGRmOiBERy5EYXRhRnJhbWUsIGNvbE5hbWU6IHN0cmluZyxcbiAgICBzaW1BcnI6IERHLkNvbHVtbltdKSA9PiBQcm9taXNlPERHLkNvbHVtbltdPixcbiAgdG9vbHRpcEZ1bmM6IChwYXJhbXM6IElUb29sdGlwQW5kUGFuZWxQYXJhbXMpID0+IEhUTUxFbGVtZW50LFxuICBwcm9wZXJ0eVBhbmVsRnVuYzogKHBhcmFtczogSVRvb2x0aXBBbmRQYW5lbFBhcmFtcykgPT4gSFRNTEVsZW1lbnQsXG4gIGxpbmVzR3JpZEZ1bmM/OiAoZGY6IERHLkRhdGFGcmFtZSwgcGFpckNvbE5hbWVzOiBzdHJpbmdbXSkgPT4gREcuR3JpZCxcbiAgc2VxU3BhY2VPcHRpb25zPzogYW55KSA6IFByb21pc2U8REcuVmlld2VyPiB7XG4gXG4gIGNvbnN0IHNpbWlsYXJpdHlMaW1pdCA9IHNpbWlsYXJpdHkgLyAxMDA7XG4gIGNvbnN0IGRpbWVuc2lvbmFsaXR5UmVkdWNlQ29sID0gZW5jb2RlZENvbCA/PyBzZXFDb2w7XG4gIGxldCB6b29tID0gZmFsc2U7XG4gIGxldCBpZ25vcmVTZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZTtcbiAgY29uc3QgY2FzaGVkTGluZXNEYXRhOiBhbnkgPSB7fTtcbiAgbGV0IGFjYzogREcuQWNjb3JkaW9uO1xuICBsZXQgdGltZXI6IE5vZGVKUy5UaW1lb3V0O1xuXG4gIGNvbnN0IHdpdGhvdXRFbXB0eVZhbHVlcyA9IERHLkRhdGFGcmFtZS5mcm9tQ29sdW1ucyhbZGltZW5zaW9uYWxpdHlSZWR1Y2VDb2xdKS5jbG9uZSgpO1xuXG4gIGNvbnN0IGVtcHR5VmFsc0lkeHMgPSByZW1vdmVFbXB0eVN0cmluZ1Jvd3Mod2l0aG91dEVtcHR5VmFsdWVzLCBkaW1lbnNpb25hbGl0eVJlZHVjZUNvbCk7XG5cbiAgY29uc3Qgc2VxU3BhY2VQYXJhbXMgPSB7XG4gICAgc2VxQ29sOiB3aXRob3V0RW1wdHlWYWx1ZXMuY29sKGRpbWVuc2lvbmFsaXR5UmVkdWNlQ29sLm5hbWUpISxcbiAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgIHNpbWlsYXJpdHlNZXRyaWM6IHNpbWlsYXJpdHlNZXRyaWMsXG4gICAgZW1iZWRBeGVzTmFtZXM6IGF4ZXNOYW1lcyxcbiAgICBvcHRpb25zOiBzZXFTcGFjZU9wdGlvbnMsXG4gIH07XG5cbiAgY29uc3QgeyBkaXN0YW5jZSwgY29vcmRpbmF0ZXMgfSA9IGF3YWl0IHNlcVNwYWNlRnVuYyhzZXFTcGFjZVBhcmFtcyk7XG4gIGNvbnN0IGNvb3Jkc1dpdGhJbnNlcnRlZEVtcHR5VmFscyA9IGdldEVtYmVkZGluZ0NvbHNXaXRoSW5zZXJ0ZWRFbXB0eVZhbHMoY29vcmRpbmF0ZXMsIGVtcHR5VmFsc0lkeHMsIGRmLnJvd0NvdW50KTtcbiAgZm9yIChjb25zdCBjb2wgb2YgY29vcmRzV2l0aEluc2VydGVkRW1wdHlWYWxzKSB7XG4gICAgZGYuY29sdW1ucy5hZGQoY29sKTtcbiAgfVxuXG4gIGNvbnN0IHNpbUFyciA9IGF3YWl0IGNyZWF0ZVNpbWlsYXJpdGllc01hdHJpeChkaW1lbnNpb25hbGl0eVJlZHVjZUNvbCwgZGlzdGFuY2UsXG4gICAgIWRpc3RhbmNlIHx8IGVtcHR5VmFsc0lkeHMubGVuZ3RoICE9PSAwIHx8IG5vbk5vcm1hbGl6ZWREaXN0YW5jZXMuaW5jbHVkZXMoc2ltaWxhcml0eU1ldHJpYyksIHNpbU1hdHJpeEZ1bmMpO1xuICBcbiAgY29uc3QgY2xpZmZzTWV0cmljczogSUFjdGl2aXR5Q2xpZmZzTWV0cmljcyA9IGdldEFjdGl2aXR5Q2xpZmZzTWV0cmljcyhzaW1BcnIsIHNpbWlsYXJpdHlMaW1pdCwgYWN0aXZpdGllcyk7XG5cbiAgY29uc3Qgc2FsaTogREcuQ29sdW1uID0gZ2V0U2FsaUNvdW50Q29sKGRpbWVuc2lvbmFsaXR5UmVkdWNlQ29sLmxlbmd0aCwgY2xpZmZzTWV0cmljcy5zYWxpVmFscywgY2xpZmZzTWV0cmljcy5uMSxcbiAgICBjbGlmZnNNZXRyaWNzLm4yLCBheGVzTmFtZXMsIGFjdGl2aXRpZXMpO1xuICBkZi5jb2x1bW5zLmFkZChzYWxpKTtcblxuICBjb25zdCBjbGlmZkNvbDogREcuQ29sdW1uID0gZ2V0Q2xpZmZzQm9vbGVhbkNvbChkZiwgY2xpZmZzTWV0cmljcy5jbGlmZnNNb2xJZHMpO1xuICBkZi5jb2x1bW5zLmFkZChjbGlmZkNvbCk7XG5cbiAgY29uc3Qgc2FsaU1pbk1heCA9IGdldFNhbGlNaW5NYXgoY2xpZmZzTWV0cmljcy5zYWxpVmFscyk7XG4gIGNvbnN0IHNhbGlPcGFjaXR5Q29lZiA9IDAuOC8oc2FsaU1pbk1heC5tYXggLSBzYWxpTWluTWF4Lm1pbik7O1xuXG4gIGNvbnN0IHZpZXcgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyhkZi5uYW1lKTtcbiAgdmlldy5ncmlkLmNvbHVtbnMuYnlOYW1lKGNsaWZmQ29sLm5hbWUpIS52aXNpYmxlID0gZmFsc2U7XG4gIGNvbnN0IHNwID0gdmlldy5hZGRWaWV3ZXIoREcuVklFV0VSLlNDQVRURVJfUExPVCwge1xuICAgIHhDb2x1bW5OYW1lOiBheGVzTmFtZXNbMF0sXG4gICAgeUNvbHVtbk5hbWU6IGF4ZXNOYW1lc1sxXSxcbiAgICBzaXplOiBzYWxpLm5hbWUsXG4gICAgY29sb3I6IGFjdGl2aXRpZXMubmFtZSxcbiAgICBzaG93WFNlbGVjdG9yOiBmYWxzZSxcbiAgICBzaG93WVNlbGVjdG9yOiBmYWxzZSxcbiAgICBzaG93U2l6ZVNlbGVjdG9yOiBmYWxzZSxcbiAgICBzaG93Q29sb3JTZWxlY3RvcjogZmFsc2UsXG4gICAgbWFya2VyTWluU2l6ZTogNSxcbiAgICBtYXJrZXJNYXhTaXplOiAyNSxcbiAgICB0aXRsZTogc2NhdHRlclRpdGxlLFxuICB9KSBhcyBERy5TY2F0dGVyUGxvdFZpZXdlcjtcblxuICBjb25zdCBjYW52YXMgPSAoc3AuZ2V0SW5mbygpIGFzIGFueSlbJ2NhbnZhcyddO1xuICBjb25zdCBsaW5lc1JlcyA9IGNyZWF0ZUxpbmVzKGNsaWZmc01ldHJpY3MsIHNlcUNvbCwgYWN0aXZpdGllcywgc2VtVHlwZSwgdGFncyk7XG5cbiAgY29uc3QgbGluZXNEZkdyaWQgPSBsaW5lc0dyaWRGdW5jID9cbiAgbGluZXNHcmlkRnVuYyhsaW5lc1Jlcy5saW5lc0RmLCBMSU5FU19ERl9NT0xfQ09MU19OQU1FUykuc29ydChbTElORVNfREZfU0FMSV9DT0xfTkFNRV0sIFtmYWxzZV0pIDpcbiAgbGluZXNSZXMubGluZXNEZi5wbG90LmdyaWQoKS5zb3J0KFtMSU5FU19ERl9TQUxJX0NPTF9OQU1FXSwgW2ZhbHNlXSk7XG5cbiAgY29uc3QgbGlzdENsaWZmc0xpbmsgPSB1aS5idXR0b24oYCR7bGluZXNSZXMubGluZXNEZi5yb3dDb3VudH0gY2xpZmZzYCwgKCkgPT4ge1xuICAgIHZpZXcuZG9ja01hbmFnZXIuZG9jayhsaW5lc0RmR3JpZC5yb290LCAnZG93bicsIG51bGwsICdBY3Rpdml0eSBjbGlmZnMnLCAwLjIpO1xuICB9KTtcbiAgbGlzdENsaWZmc0xpbmsuY2xhc3NMaXN0LmFkZCgnc2NhdHRlcl9wbG90X2xpbmsnLCAnY2xpZmZzX2dyaWQnKTtcbiAgc3Aucm9vdC5hcHBlbmQobGlzdENsaWZmc0xpbmspO1xuXG4gIC8qIGluIGNhc2Ugc2V2ZXJhbCBhY3Rpdml0eSBjbGlmZnMgdmlld2VycyBhcmUgb3BlbmVkIGNsaWZmcyBmaWx0ZXJpbmcgY2FuIFxuICBiZSBhcHBseWVkIG9ubHkgdG8gb25lIG9mIHRoZSB2aWV3ZXJzLiBXaGVuICdTaG93IG9ubHkgY2xpZmZzJyBpcyBzd2l0Y2hlZCBvbiBvbmUgb2YgdGhlIHZpZXdlcnNcbiAgc3dpdGNoIGlucHV0cyBvbiBvdGhlciB2aWV3ZXJzIGFyZSBkaXNhYmxlZCAqL1xuICBjb25zdCBmaWx0ZXJDbGlmZnNCdXR0b24gPSB1aS5zd2l0Y2hJbnB1dChgU2hvdyBvbmx5IGNsaWZmc2AsIGZhbHNlLCAoKSA9PiB7XG4gICAgaWYgKGZpbHRlckNsaWZmc0J1dHRvbi52YWx1ZSkge1xuICAgICAgc3AuZGF0YUZyYW1lLnNldFRhZyhDTElGRlNfRklMVEVSX0FQUExJRUQsIGNsaWZmQ29sLm5hbWUpO1xuICAgICAgZGYuZmlsdGVyLmNvcHlGcm9tKGNyZWF0ZUNsaWZmc09ubHlGaWx0ZXIoZGYsIGNsaWZmQ29sLm5hbWUpKTtcbiAgICAgIGZpbHRlckNsaWZmc1N1YmoubmV4dChjbGlmZkNvbC5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3AuZGF0YUZyYW1lLnNldFRhZyhDTElGRlNfRklMVEVSX0FQUExJRUQsICcnKTtcbiAgICAgIGRmLmZpbHRlci5zZXRBbGwodHJ1ZSwgdHJ1ZSk7XG4gICAgICBmaWx0ZXJDbGlmZnNTdWJqLm5leHQoJycpO1xuICAgIH1cbiAgfSk7XG4gIGZpbHRlckNsaWZmc0J1dHRvbi5yb290LmNsYXNzTGlzdC5hZGQoJ3NjYXR0ZXJfcGxvdF9saW5rJywgJ3Nob3dfb25seV9jbGlmZnMnKTtcbiAgc3Aucm9vdC5hcHBlbmQoZmlsdGVyQ2xpZmZzQnV0dG9uLnJvb3QpO1xuXG4gIGZpbHRlckNsaWZmc1N1Ymouc3Vic2NyaWJlKChzOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocyAhPT0gJycpIHtcbiAgICAgIGlmIChzICE9PSBjbGlmZkNvbC5uYW1lKVxuICAgICAgICBmaWx0ZXJDbGlmZnNCdXR0b24uZW5hYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJDbGlmZnNCdXR0b24uZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuICB9KVxuXG4gIC8vY2xvc2luZyBkb2NrZWQgZ3JpZCB3aGVuIHZpZXdlciBpcyBjbG9zZWRcbiAgY29uc3Qgdmlld2VyQ2xvc2VkU3ViID0gZ3Jvay5ldmVudHMub25WaWV3ZXJDbG9zZWQuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYodi5hcmdzLnZpZXdlciA9PT0gc3ApIHtcbiAgICAgIHZpZXcuZG9ja01hbmFnZXIuY2xvc2UobGluZXNEZkdyaWQucm9vdCk7XG4gICAgICB2aWV3ZXJDbG9zZWRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHZpZXcuc3VicyA9IHZpZXcuc3Vicy5maWx0ZXIoKHN1YikgPT4gc3ViICE9PSB2aWV3ZXJDbG9zZWRTdWIpO1xuICAgIH0gIFxuICB9KVxuICB2aWV3LnN1YnMucHVzaCh2aWV3ZXJDbG9zZWRTdWIpO1xuXG5cbiAgbGluZXNSZXMubGluZXNEZi5vbkN1cnJlbnRDZWxsQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgIHpvb20gPSB0cnVlO1xuICAgIGNvbnN0IGN1cnJlbnRNb2xJZHggPSBsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRDb2wgJiYgbGluZXNSZXMubGluZXNEZi5jdXJyZW50Q29sLm5hbWUgPT09IExJTkVTX0RGX01PTF9DT0xTX05BTUVTWzFdID8gMSA6IDA7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzUmVzLmxpbmVzRGYuY3VycmVudFJvd0lkeCAhPT0gLTEgPyBsaW5lc1Jlcy5saW5lc1tsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRSb3dJZHhdIDogbnVsbDtcbiAgICBzcC5kYXRhRnJhbWUuY3VycmVudFJvd0lkeCA9IGxpbmUgPyBsaW5lLm1vbHNbY3VycmVudE1vbElkeF0gOiAtMTtcbiAgICBzcC5kYXRhRnJhbWUuZmlsdGVyLnNldCgwLCAhbGluZXNSZXMubGluZXNbMF0uc2VsZWN0ZWQpOyAvL2NhbGxpbmcgZmlsdGVyIHRvIGZvcmNlIHNjYXR0ZXIgcGxvdCByZS1yZW5kZXJpbmdcbiAgICBzcC5kYXRhRnJhbWUuZmlsdGVyLnNldCgwLCBsaW5lc1Jlcy5saW5lc1swXS5zZWxlY3RlZCk7XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB1cGRhdGVQcm9wZXJ0eVBhbmVsKGRmLCBhY2MsIGNhc2hlZExpbmVzRGF0YSwgbGluZSwgc2VxQ29sLCBhY3Rpdml0aWVzLFxuICAgICAgICAgIGxpbmVzUmVzLmxpbmVzRGYuZ2V0KExJTkVTX0RGX1NBTElfQ09MX05BTUUsIGxpbmUuaWQpLCBwcm9wZXJ0eVBhbmVsRnVuYyk7XG4gICAgICAgIGNvbnN0IG9yZGVyID0gc3AuZGF0YUZyYW1lLmdldFNvcnRlZE9yZGVyKHZpZXcuZ3JpZC5zb3J0QnlDb2x1bW5zLCB2aWV3LmdyaWQuc29ydFR5cGVzKTtcbiAgICAgICAgdmlldy5ncmlkLnNjcm9sbFRvQ2VsbChzZXFDb2wubmFtZSwgb3JkZXIuaW5kZXhPZihzcC5kYXRhRnJhbWUuY3VycmVudFJvd0lkeCkpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9KTtcblxuICBsaW5lc1Jlcy5saW5lc0RmLm9uU2VsZWN0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoKF86IGFueSkgPT4ge1xuICAgIGlmIChsaW5lc1Jlcy5saW5lc0RmLnNlbGVjdGlvbi5hbnlUcnVlID09PSBmYWxzZSkgeyAvL2Nhc2Ugd2hlbiBzZWxlY3Rpb24gaXMgcmVzZXQgYnkgcHVzaGluZyBFc2NcbiAgICAgIGxpbmVzUmVzLmxpbmVzLmZvckVhY2goKGwpID0+IHsgbC5zZWxlY3RlZCA9IGZhbHNlOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxpbmVzUmVzLmxpbmVzRGYubW91c2VPdmVyUm93SWR4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNSZXMubGluZXNbbGluZXNSZXMubGluZXNEZi5tb3VzZU92ZXJSb3dJZHhdO1xuICAgICAgICBsaW5lLnNlbGVjdGVkID0gIWxpbmUuc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gREcuQml0U2V0LmNyZWF0ZShkZi5yb3dDb3VudCk7XG4gICAgICBsaW5lc1Jlcy5saW5lcy5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgIGlmIChsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgbC5tb2xzLmZvckVhY2goKG0pID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5zZXQobSwgbC5zZWxlY3RlZCwgdHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGYuc2VsZWN0aW9uLmNvcHlGcm9tKHNlbGVjdGlvbik7XG4gICAgICB2aWV3LmdyaWQuaW52YWxpZGF0ZSgpO1xuICAgIH0sIDMwMCk7IC8vdGltZW91dCBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIHJlc2V0dGluZyBzZWxlY3Rpb24gYnkgY2xpY2tpbmcgb24gc2NhdHRlciBwbG90LiBGaXJzdCBzZWxlY3Rpb24gaXMgcmVzZXQgYW5kIGFmdGVyIGl0IGlzIHNldCBhZ2FpbiB1c2luZyBieSB0aGlzIG1ldGhvZFxuICB9KTtcblxuICBkZi5vblNlbGVjdGlvbkNoYW5nZWQuc3Vic2NyaWJlKChlOiBhbnkpID0+IHtcbiAgICBpZiAoaWdub3JlU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICBpZ25vcmVTZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRmLnNlbGVjdGlvbi5hbnlUcnVlID09PSBmYWxzZSAmJiB0eXBlb2YgZSA9PT0gJ251bWJlcicpIHsgLy9jYXRjaGluZyBldmVudCB3aGVuIGluaXRpYWwgZGYgc2VsZWN0aW9uIGlzIHJlc2V0IGJ5IHB1c2hpbmcgRXNjXG4gICAgICAgIGxpbmVzUmVzLmxpbmVzLmZvckVhY2goKGwpID0+IHtsLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICAgICAgICBsaW5lc0RmR3JpZC5kYXRhRnJhbWUuc2VsZWN0aW9uLnNldEFsbChmYWxzZSwgZmFsc2UpO1xuICAgICAgICBsaW5lc0RmR3JpZC5pbnZhbGlkYXRlKCk7XG4gICAgICB9IFxuICAgIH1cbiAgfSk7XG5cbiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGZ1bmN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB0aW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbGluZSA9IGNoZWNrQ3Vyc29yT25MaW5lKGV2ZW50LCBjYW52YXMsIGxpbmVzUmVzLmxpbmVzKTtcbiAgICAgIGlmIChsaW5lICYmIGRmLm1vdXNlT3ZlclJvd0lkeCA9PT0gLTEpIHtcbiAgICAgICAgdWkudG9vbHRpcC5zaG93KHRvb2x0aXBGdW5jKHtjYXNoZWREYXRhOiBjYXNoZWRMaW5lc0RhdGEsIGxpbmU6IGxpbmUsIGRmOiBkZiwgc2VxQ29sOiBzZXFDb2wsXG4gICAgICAgICAgYWN0aXZpdHlDb2w6IGFjdGl2aXRpZXN9KSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfSk7XG5cbiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWdub3JlU2VsZWN0aW9uQ2hhbmdlID0gdHJ1ZTsgLy9jbGlja2luZyBvbiBhIHNjYXR0ZXIgcGxvdCBsZWFkcyB0byBzZWxlY3Rpb24gcmVzZXQuIFZhcmlhYmxlIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgZnJvbSByZXNldHRpbmcgKGlzIHVzZWQgaW4gZGYub25TZWxlY3Rpb25DaGFuZ2VkLnN1YnNjcmliZSlcbiAgICBjb25zdCBsaW5lID0gY2hlY2tDdXJzb3JPbkxpbmUoZXZlbnQsIGNhbnZhcywgbGluZXNSZXMubGluZXMpO1xuICAgIGlmIChsaW5lICYmIGRmLm1vdXNlT3ZlclJvd0lkeCA9PT0gLTEpIHtcbiAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICAgIGxpbmUuc2VsZWN0ZWQgPSAhbGluZS5zZWxlY3RlZDtcbiAgICAgICAgbGluZXNSZXMubGluZXNEZi5zZWxlY3Rpb24uc2V0KGxpbmUuaWQsIGxpbmUuc2VsZWN0ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpbmVzUmVzLmxpbmVzRGYuY3VycmVudFJvd0lkeCAhPT0gbGluZS5pZCkge1xuICAgICAgICAgIGxpbmVzUmVzLmxpbmVzRGYuY3VycmVudFJvd0lkeCA9IGxpbmUuaWQ7XG4gICAgICAgICAgZGYuY3VycmVudFJvd0lkeCA9IGxpbmUubW9sc1swXTtcbiAgICAgICAgICBkZi5maWx0ZXIuc2V0KDAsICFsaW5lc1Jlcy5saW5lc1swXS5zZWxlY3RlZCk7IC8vY2FsbGluZyBmaWx0ZXIgdG8gZm9yY2Ugc2NhdHRlciBwbG90IHJlLXJlbmRlcmluZ1xuICAgICAgICAgIGRmLmZpbHRlci5zZXQoMCwgbGluZXNSZXMubGluZXNbMF0uc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBvcmRlciA9IGxpbmVzUmVzLmxpbmVzRGYuZ2V0U29ydGVkT3JkZXIobGluZXNEZkdyaWQuc29ydEJ5Q29sdW1ucywgbGluZXNEZkdyaWQuc29ydFR5cGVzKTtcbiAgICAgIGxpbmVzRGZHcmlkLnNjcm9sbFRvQ2VsbChMSU5FU19ERl9NT0xfQ09MU19OQU1FU1swXSwgb3JkZXIuaW5kZXhPZihsaW5lLmlkKSk7XG4gICAgfVxuICB9KTtcblxuICBzcC5vbkV2ZW50KCdkNC1iZWZvcmUtZHJhdy1zY2VuZScpXG4gICAgLnN1YnNjcmliZSgoXzogYW55KSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IHJlbmRlckxpbmVzKHNwLFxuICAgICAgICBheGVzTmFtZXNbMF0sIGF4ZXNOYW1lc1sxXSwgbGluZXNSZXMsIGNsaWZmc01ldHJpY3Muc2FsaVZhbHMsIHNhbGlPcGFjaXR5Q29lZiwgc2FsaU1pbk1heC5taW4pO1xuICAgICAgaWYgKHpvb20pIHtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmUgPSBsaW5lc1tsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRSb3dJZHhdO1xuICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgICAgIGNvbnN0IHt6b29tTGVmdCwgem9vbVJpZ2h0LCB6b29tVG9wLCB6b29tQm90dG9tfSA9IGdldFpvb21Db29yZGluYXRlcyhcbiAgICAgICAgICAgIHNwLnZpZXdwb3J0LndpZHRoLFxuICAgICAgICAgICAgc3Audmlld3BvcnQuaGVpZ2h0LFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMF0sIGN1cnJlbnRMaW5lLm1vbHNbMF0pLFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMV0sIGN1cnJlbnRMaW5lLm1vbHNbMF0pLFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMF0sIGN1cnJlbnRMaW5lLm1vbHNbMV0pLFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMV0sIGN1cnJlbnRMaW5lLm1vbHNbMV0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgc3Auem9vbSh6b29tTGVmdCxcbiAgICAgICAgICAgIHpvb21Ub3AsXG4gICAgICAgICAgICB6b29tUmlnaHQsXG4gICAgICAgICAgICB6b29tQm90dG9tKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgem9vbSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckNsaWZmc0J1dHRvbi52YWx1ZSkge1xuICAgICAgICBkZi5maWx0ZXIuY29weUZyb20oY3JlYXRlQ2xpZmZzT25seUZpbHRlcihkZiwgY2xpZmZDb2wubmFtZSkpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBpZiAoZmlsdGVyQ2xpZmZzQnV0dG9uLmVuYWJsZWQgPT09IHRydWUpXG4gICAgICAgICAgZGYuZmlsdGVyLnNldEFsbCh0cnVlLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgc3AuYWRkUHJvcGVydHkoJ3NpbWlsYXJpdHlMaW1pdCcsICdkb3VibGUnLCBzaW1pbGFyaXR5TGltaXQpO1xuICBhY2MgPSBjcmVhdGVQb3BlcnR5UGFuZWwoKTtcbiAgcmV0dXJuIHNwO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGlmZnNPbmx5RmlsdGVyKGRmOiBERy5EYXRhRnJhbWUsIGNvbE5hbWU6IHN0cmluZyk6IERHLkJpdFNldCB7XG4gIGNvbnN0IGZpbHRlciA9IERHLkJpdFNldC5jcmVhdGUoZGYucm93Q291bnQpO1xuICBjb25zdCByYXcgPSBkZi5jb2woY29sTmFtZSkhLmdldFJhd0RhdGEoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICBmaWx0ZXIuc2V0KGksICEhcmF3W2ldLCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcjtcbn1cblxuZnVuY3Rpb24gZ2V0RW1iZWRkaW5nQ29sc1dpdGhJbnNlcnRlZEVtcHR5VmFscyhjb29yZGluYXRlczogREcuQ29sdW1uTGlzdCwgZW1wdHlWYWxzSWR4czogbnVtYmVyW10sIGxlbmd0aDogbnVtYmVyKTogREcuQ29sdW1uW10ge1xuICBjb25zdCBjb29yZHNXaXRoSW5zZXJ0ZWRFbXB0eVZhbHMgPSBbXTtcbiAgZm9yIChjb25zdCBjb2wgb2YgY29vcmRpbmF0ZXMpIHtcbiAgICBjb25zdCBsaXN0VmFsdWVzID0gY29sLnRvTGlzdCgpO1xuICAgIGVtcHR5VmFsc0lkeHMuZm9yRWFjaCgoaW5kOiBudW1iZXIpID0+IGxpc3RWYWx1ZXMuc3BsaWNlKGluZCwgMCwgbnVsbCkpO1xuICAgIGNvb3Jkc1dpdGhJbnNlcnRlZEVtcHR5VmFscy5wdXNoKERHLkNvbHVtbi5mbG9hdChjb2wubmFtZSwgbGVuZ3RoKS5pbml0KChpKSA9PiBsaXN0VmFsdWVzW2ldKSk7XG4gIH1cbiAgcmV0dXJuIGNvb3Jkc1dpdGhJbnNlcnRlZEVtcHR5VmFscztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2ltaWxhcml0aWVzTWF0cml4KGNvbDogREcuQ29sdW1uLCBkaXN0YW5jZTogTWF0cml4LCBjb3VudEZyb21EaXN0YW5jZTogYm9vbGVhbixcbiAgc2ltTWF0cml4RnVuYzogKGRpbTogbnVtYmVyLCBzZXFDb2w6IERHLkNvbHVtbiwgZGY6IERHLkRhdGFGcmFtZSwgY29sTmFtZTogc3RyaW5nLCBzaW1BcnI6IERHLkNvbHVtbltdKSA9PiBQcm9taXNlPERHLkNvbHVtbltdPik6UHJvbWlzZTxERy5Db2x1bW5bXT4ge1xuICBjb25zdCBjYXRzID0gY29sLmNhdGVnb3JpZXM7XG4gIGNvbnN0IHJhdyA9IGNvbC5nZXRSYXdEYXRhKCk7XG4gIGNvbnN0IG5ld0NvbCA9IERHLkNvbHVtbi5zdHJpbmcoJ3NlcScsIGNvbC5sZW5ndGgpLmluaXQoKGkpID0+IGNhdHNbcmF3W2ldXSk7XG4gIGNvbnN0IGRmU2VxID0gREcuRGF0YUZyYW1lLmZyb21Db2x1bW5zKFtuZXdDb2xdKTtcbiAgY29uc3QgZGltID0gY29sLmxlbmd0aDtcbiAgbGV0IHNpbUFycjogREcuQ29sdW1uW10gPSBBcnJheShkaW0gLSAxKTtcblxuICBpZiAoY291bnRGcm9tRGlzdGFuY2UpIHtcbiAgICBzaW1BcnIgPSBhd2FpdCBzaW1NYXRyaXhGdW5jKGRpbSwgY29sLCBkZlNlcSwgJ3NlcScsIHNpbUFycik7XG4gIH0gZWxzZSB7XG4gICAgZ2V0U2ltaWxhcml0aWVzRnJvbURpc3RhbmNlcyhkaW0sIGRpc3RhbmNlLCBzaW1BcnIpO1xuICB9XG5cbiAgcmV0dXJuIHNpbUFycjtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZpdHlDbGlmZnNNZXRyaWNzKHNpbUFycjogREcuQ29sdW1uW10sIHNpbWlsYXJpdHlMaW1pdDogbnVtYmVyLCBhY3Rpdml0aWVzOiBERy5Db2x1bW4pOiBJQWN0aXZpdHlDbGlmZnNNZXRyaWNzIHtcbiAgY29uc3Qgc2ltVmFsczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2FsaVZhbHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG4xOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBuMjogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgY2xpZmZzTW9sSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgIT0gc2ltQXJyLmxlbmd0aDsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogIT0gc2ltQXJyLmxlbmd0aCAtIGk7ICsraikge1xuICAgICAgY29uc3Qgc2ltOiBudW1iZXIgPSBzaW1BcnJbaV0gPyBzaW1BcnJbaV0uZ2V0KGopIDogMDtcblxuICAgICAgaWYgKHNpbSA+PSBzaW1pbGFyaXR5TGltaXQpIHtcbiAgICAgICAgbjEucHVzaChpKTtcbiAgICAgICAgbjIucHVzaChpICsgaiArIDEpO1xuICAgICAgICBjbGlmZnNNb2xJZHMuYWRkKGkpO1xuICAgICAgICBjbGlmZnNNb2xJZHMuYWRkKGkgKyBqICsgMSk7XG4gICAgICAgIHNpbVZhbHMucHVzaChzaW0pO1xuICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoYWN0aXZpdGllcy5nZXQoaSkgLSBhY3Rpdml0aWVzLmdldChpICsgaiArIDEpKTtcbiAgICAgICAgaWYgKHNpbSAhPSAxKSB7XG4gICAgICAgICAgc2FsaVZhbHMucHVzaChkaWZmIC8gKDEgLSBzaW0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWxpVmFscy5wdXNoKEluZmluaXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7c2ltVmFsczogc2ltVmFscywgc2FsaVZhbHM6IHNhbGlWYWxzLCBuMTogbjEsIG4yOiBuMiwgY2xpZmZzTW9sSWRzOiBjbGlmZnNNb2xJZHN9O1xufVxuXG5mdW5jdGlvbiBnZXRTYWxpTWluTWF4KHNhbGlWYWxzOiBudW1iZXJbXSk6IElTYWxpTGltcyB7XG4gIGNvbnN0IHNhbGlWYWxzV2l0aG91dEluZmluaXR5ID0gc2FsaVZhbHMuZmlsdGVyKChpdCkgPT4gaXQgIT09IEluZmluaXR5KTtcbiAgY29uc3Qgc2FsaU1pbiA9IE1hdGgubWluKC4uLnNhbGlWYWxzV2l0aG91dEluZmluaXR5KTtcbiAgY29uc3Qgc2FsaU1heCA9IE1hdGgubWF4KC4uLnNhbGlWYWxzV2l0aG91dEluZmluaXR5KTtcbiAgcmV0dXJuIHttYXg6IHNhbGlNYXgsIG1pbjogc2FsaU1pbn07XG59XG5cbmZ1bmN0aW9uIGdldFNhbGlDb3VudENvbChsZW5ndGg6IG51bWJlciwgc2FsaVZhbHM6IG51bWJlcltdLCBuMTogbnVtYmVyW10sIG4yOiBudW1iZXJbXSxcbiAgYXhlc05hbWVzOiBzdHJpbmdbXSwgYWN0aXZpdGllczogREcuQ29sdW1uKTogREcuQ29sdW1uIHtcbiAgY29uc3Qgc2FsaUNvdW50ID0gbmV3IEFycmF5KGxlbmd0aCkuZmlsbCgwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSAhPSBuMS5sZW5ndGg7ICsraSkge1xuICAgIGlmIChzYWxpVmFsc1tpXSAhPSBJbmZpbml0eSkge1xuICAgICAgaWYgKGFjdGl2aXRpZXMuZ2V0KG4xW2ldKSA+IGFjdGl2aXRpZXMuZ2V0KG4yW2ldKSkge1xuICAgICAgICBzYWxpQ291bnRbbjFbaV1dICs9IHNhbGlWYWxzW2ldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2FsaUNvdW50W24yW2ldXSArPSBzYWxpVmFsc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gREcuQ29sdW1uLmZyb21MaXN0KCdkb3VibGUnLCBgc2FsaV8ke2F4ZXNOYW1lc1swXS5zdWJzdHJpbmcoYXhlc05hbWVzWzBdLmxhc3RJbmRleE9mKCdfJykpfWAsIHNhbGlDb3VudCk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlUG9wZXJ0eVBhbmVsKCk6IERHLkFjY29yZGlvbiB7XG4gIGNvbnN0IGFjYyA9IHVpLmFjY29yZGlvbigpO1xuICBjb25zdCBhY2NJY29uID0gdWkuZWxlbWVudCgnaScpO1xuICBhY2NJY29uLmNsYXNzTmFtZSA9ICdncm9rLWljb24gc3ZnLWljb24gc3ZnLXZpZXctbGF5b3V0JztcbiAgYWNjLmFkZFRpdGxlKHVpLnNwYW4oW2FjY0ljb24sIHVpLmxhYmVsKGBBY3Rpdml0eSBjbGlmZnNgKV0pKTtcbiAgYWNjLmFkZFBhbmUoJ0NsaWZmIERldGFpbHMnLCAoKSA9PiB1aS5kaXZUZXh0KCdDbGlmZiBoYXMgbm90IGJlZW4gc2VsZWN0ZWQnKSwgdHJ1ZSk7XG4gIGdyb2suc2hlbGwubyA9IGFjYy5yb290O1xuICByZXR1cm4gYWNjO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0eVBhbmVsKGRmOiBERy5EYXRhRnJhbWUsIGFjYzogREcuQWNjb3JkaW9uLCBjYXNoZWREYXRhOiBhbnksIGxpbmU6IElMaW5lLCBzZXFDb2w6IERHLkNvbHVtbixcbiAgYWN0aXZpdGllczogREcuQ29sdW1uLCBzYWxpOiBudW1iZXIsIHByb3BQYW5lbEZ1bmM6IChwYXJhbXM6IElUb29sdGlwQW5kUGFuZWxQYXJhbXMpID0+IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IHBhbmVsID0gYWNjLmdldFBhbmUoJ0NsaWZmIERldGFpbHMnKTtcbiAgdWkuZW1wdHkocGFuZWwucm9vdCk7XG4gIGNvbnN0IHBhbmVsRWxlbWVudCA9IHByb3BQYW5lbEZ1bmMoe2Nhc2hlZERhdGE6IGNhc2hlZERhdGEsIGxpbmU6IGxpbmUsIGRmOiBkZiwgc2VxQ29sOiBzZXFDb2wsXG4gICAgYWN0aXZpdHlDb2w6IGFjdGl2aXRpZXMsIHNhbGk6IHNhbGl9KTtcbiAgcGFuZWwucm9vdC5hcHBlbmQocGFuZWxFbGVtZW50KTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZ3Jvay5zaGVsbC5vID0gYWNjLnJvb3Q7XG4gIH0sIDUwMCk7XG59XG5cbmZ1bmN0aW9uIGdldFpvb21Db29yZGluYXRlcyhXMDogbnVtYmVyLCBIMDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gIGNvbnN0IFcxID0gTWF0aC5hYnMoeDEgLSB4Mik7XG4gIGNvbnN0IEgxID0gTWF0aC5hYnMoeTEgLSB5Mik7XG4gIGNvbnN0IHNjYWxlVyA9IFcwIC8gVzE7XG4gIGNvbnN0IHNjYWxlSCA9IEgwIC8gSDE7XG4gIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oc2NhbGVXLCBzY2FsZUgpO1xuICBjb25zdCBXMiA9IChXMCAvIHNjYWxlKSAqIDU7XG4gIGNvbnN0IEgyID0gKEgwIC8gc2NhbGUpICogNTtcbiAgY29uc3QgbGVmdCA9IHgxIDwgeDIgPyB4MSA6IHgyO1xuICBjb25zdCB0b3AgPSB5MSA+IHkyID8geTEgOiB5MjtcbiAgY29uc3Qgem9vbUxlZnQgPSAobGVmdCArIFcxIC8gMikgLSBXMiAvIDI7XG4gIGNvbnN0IHpvb21SaWdodCA9IHpvb21MZWZ0ICsgVzI7XG4gIGNvbnN0IHpvb21Ub3AgPSAodG9wIC0gSDEgLyAyKSArIEgyIC8gMjtcbiAgY29uc3Qgem9vbUJvdHRvbSA9IHpvb21Ub3AgLSBIMjtcbiAgcmV0dXJuIHt6b29tTGVmdDogem9vbUxlZnQsIHpvb21SaWdodDogem9vbVJpZ2h0LCB6b29tVG9wOiB6b29tVG9wLCB6b29tQm90dG9tOiB6b29tQm90dG9tfTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDdXJzb3JPbkxpbmUoZXZlbnQ6IGFueSwgY2FudmFzOiBhbnksIGxpbmVzOiBJTGluZVtdKTogSUxpbmUgfCBudWxsIHtcbiAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gIGNvbnN0IHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIGxldCBjbG9zZXN0TGluZSA9IG51bGw7XG4gIGxldCBtaW5EaXN0ID0gMDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgZGlzdCA9XG4gICAgICBNYXRoLmFicyhNYXRoLmh5cG90KGxpbmUuYVswXSAtIHgsIGxpbmUuYVsxXSAtIHkpICtcbiAgICAgIE1hdGguaHlwb3QobGluZS5iWzBdIC0geCwgbGluZS5iWzFdIC0geSkgLSBNYXRoLmh5cG90KGxpbmUuYVswXSAtIGxpbmUuYlswXSwgbGluZS5hWzFdIC0gbGluZS5iWzFdKSk7XG4gICAgaWYgKCghbWluRGlzdCAmJiBkaXN0IDwgMikgfHwgZGlzdCA8IG1pbkRpc3QpIHtcbiAgICAgIG1pbkRpc3QgPSBkaXN0O1xuICAgICAgY2xvc2VzdExpbmUgPSBsaW5lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2xvc2VzdExpbmU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpbmVzKHNwOiBERy5TY2F0dGVyUGxvdFZpZXdlciwgeEF4aXM6IHN0cmluZywgeUF4aXM6IHN0cmluZywgbGluZXNSZXM6IElSZW5kZXJlZExpbmVzLFxuICBzYWxpVmFsczogbnVtYmVyW10sIHNhbGlPcGFjaXR5Q29lZjogbnVtYmVyLCBzYWxpTWluOiBudW1iZXIpOiBJTGluZSBbXSB7XG4gIGNvbnN0IGxpbmVzID0gbGluZXNSZXMubGluZXM7XG4gIGNvbnN0IGNhbnZhcyA9IChzcC5nZXRJbmZvKCkgYXMge1tpbmRleDogc3RyaW5nXSA6IGFueX0pWydjYW52YXMnXTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBjb25zdCB4ID0gc3AuZGF0YUZyYW1lIS5jb2x1bW5zLmJ5TmFtZSh4QXhpcyk7XG4gIGNvbnN0IHkgPSBzcC5kYXRhRnJhbWUhLmNvbHVtbnMuYnlOYW1lKHlBeGlzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBvaW50RnJvbSA9IHNwLndvcmxkVG9TY3JlZW4oeC5nZXQobGluZXNbaV0ubW9sc1swXSksIHkuZ2V0KGxpbmVzW2ldLm1vbHNbMF0pKTtcbiAgICBjb25zdCBwb2ludFRvID0gc3Aud29ybGRUb1NjcmVlbih4LmdldChsaW5lc1tpXS5tb2xzWzFdKSwgeS5nZXQobGluZXNbaV0ubW9sc1sxXSkpO1xuICAgIGxpbmVzW2ldLmEgPSBbcG9pbnRGcm9tLngsIHBvaW50RnJvbS55XTtcbiAgICBsaW5lc1tpXS5iID0gW3BvaW50VG8ueCwgcG9pbnRUby55XTtcbiAgICBjb25zdCBsaW5lID0gbmV3IFBhdGgyRCgpO1xuICAgIGxpbmUubW92ZVRvKGxpbmVzW2ldLmFbMF0sIGxpbmVzW2ldLmFbMV0pO1xuICAgIGNvbnN0IGNvbG9yID0gbGluZXNbaV0uc2VsZWN0ZWQgPyAnMjU1LDI1NSwwJyA6ICcwLDEyOCwwJztcbiAgICBjb25zdCBvcGFjaXR5ID0gc2FsaVZhbHNbaV0gPT09IEluZmluaXR5ID8gMSA6IDAuMiArIChzYWxpVmFsc1tpXSAtIHNhbGlNaW4pKnNhbGlPcGFjaXR5Q29lZjtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBgcmdiYSgke2NvbG9yfSwke29wYWNpdHl9KWA7XG4gICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVzW2ldLmlkID09PSBsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRSb3dJZHggPyAzIDogMTtcbiAgICBsaW5lLmxpbmVUbyhsaW5lc1tpXS5iWzBdLCBsaW5lc1tpXS5iWzFdKTtcbiAgICBjdHguc3Ryb2tlKGxpbmUpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGluZXMocGFyYW1zOiBJQWN0aXZpdHlDbGlmZnNNZXRyaWNzLCBzZXE6IERHLkNvbHVtbiwgYWN0aXZpdGllczogREcuQ29sdW1uLCBzZW1UeXBlOiBzdHJpbmcsXG4gIHRhZ3M6IHtbaW5kZXg6IHN0cmluZ106IHN0cmluZ30pIDogSVJlbmRlcmVkTGluZXMge1xuICBjb25zdCBsaW5lczogSUxpbmVbXSA9IG5ldyBBcnJheShwYXJhbXMubjEubGVuZ3RoKS5maWxsKG51bGwpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5uMS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG51bTEgPSBwYXJhbXMubjFbaV07XG4gICAgY29uc3QgbnVtMiA9IHBhcmFtcy5uMltpXTtcbiAgICBsaW5lc1tpXSA9ICh7aWQ6IGksIG1vbHM6IFtudW0xLCBudW0yXSwgc2VsZWN0ZWQ6IGZhbHNlLCBhOiBbXSwgYjogW119KTtcbiAgfVxuICBjb25zdCBsaW5lc0RmID0gREcuRGF0YUZyYW1lLmNyZWF0ZShsaW5lcy5sZW5ndGgpO1xuICBMSU5FU19ERl9NT0xfQ09MU19OQU1FUy5mb3JFYWNoKChpdCwgaWR4KSA9PiB7XG4gICAgbGluZXNEZi5jb2x1bW5zLmFkZE5ld1N0cmluZyhpdCkuaW5pdCgoaTogbnVtYmVyKSA9PiBzZXEuZ2V0KGxpbmVzW2ldLm1vbHNbaWR4XSkpO1xuICAgIHNldFRhZ3MobGluZXNEZi5jb2woaXQpISwgdGFncyk7XG4gICAgbGluZXNEZi5jb2woaXQpIS5zZW1UeXBlID0gc2VtVHlwZTtcbiAgfSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdGbG9hdChMSU5FU19ERl9BQ1RfRElGRl9DT0xfTkFNRSlcbiAgICAuaW5pdCgoaTogbnVtYmVyKSA9PiBNYXRoLmFicyhhY3Rpdml0aWVzLmdldChsaW5lc1tpXS5tb2xzWzBdKSAtIGFjdGl2aXRpZXMuZ2V0KGxpbmVzW2ldLm1vbHNbMV0pKSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdJbnQoTElORVNfREZfTElORV9JTkRfQ09MX05BTUUpLmluaXQoKGk6IG51bWJlcikgPT4gaSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdGbG9hdChMSU5FU19ERl9TQUxJX0NPTF9OQU1FKS5pbml0KChpOiBudW1iZXIpID0+IHBhcmFtcy5zYWxpVmFsc1tpXSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdGbG9hdChMSU5FU19ERl9TSU1fQ09MX05BTUUpLmluaXQoKGk6IG51bWJlcikgPT4gcGFyYW1zLnNpbVZhbHNbaV0pO1xuICByZXR1cm4ge2xpbmVzLCBsaW5lc0RmfTtcbn1cblxuZnVuY3Rpb24gc2V0VGFncyhjb2w6IERHLkNvbHVtbiwgdGFnczoge1tpbmRleDogc3RyaW5nXTogc3RyaW5nfSkge1xuICBPYmplY3Qua2V5cyh0YWdzKS5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICBjb2wudGFnc1t0YWddID0gdGFnc1t0YWddO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpbWlsYXJpdGllc01hdHJpeCggZGltOiBudW1iZXIsIHNlcUNvbDogREcuQ29sdW1uLCBkZlNlcTogREcuRGF0YUZyYW1lLCBzaW1BcnI6IERHLkNvbHVtbltdLFxuICBzaW1GdW5jOiAoY29sOiBERy5Db2x1bW4sIG1vbDogc3RyaW5nKSA9PiBQcm9taXNlPERHLkNvbHVtbiB8IG51bGw+KTogUHJvbWlzZTxERy5Db2x1bW5bXT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSAhPSBkaW0gLSAxOyArK2kpIHtcbiAgICBjb25zdCBtb2wgPSBzZXFDb2wuZ2V0KGkpO1xuICAgIGRmU2VxLnJvd3MucmVtb3ZlQXQoMCwgMSwgZmFsc2UpO1xuICAgIHNpbUFycltpXSA9IChhd2FpdCBzaW1GdW5jKGRmU2VxLmNvbCgnc2VxJykhLCBtb2wpKSE7XG4gIH1cbiAgcmV0dXJuIHNpbUFycjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbWlsYXJpdGllc0Zyb21EaXN0YW5jZXMoZGltOiBudW1iZXIsIGRpc3RhbmNlczogTWF0cml4LCBzaW1BcnI6IERHLkNvbHVtbltdKVxuICA6IERHLkNvbHVtbltdIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW0gLSAxOyArK2kpIHtcbiAgICBjb25zdCBzaW1pbGFyaXR5QXJyID0gbmV3IEZsb2F0MzJBcnJheShkaW0gLSBpIC0gMSkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBkaW07ICsraikge1xuICAgICAgc2ltaWxhcml0eUFycltqIC0gaSAtIDFdID0gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShkaXN0YW5jZXNbaV1bal0pO1xuICAgIH1cbiAgICBzaW1BcnJbaV0gPSBERy5Db2x1bW4uZnJvbUZsb2F0MzJBcnJheSgnc2ltaWxhcml0eScsIHNpbWlsYXJpdHlBcnIpO1xuICB9XG4gIHJldHVybiBzaW1BcnI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGlmZnNCb29sZWFuQ29sKGRmOiBERy5EYXRhRnJhbWUsIGlkczogU2V0PG51bWJlcj4pOiBERy5Db2x1bW4ge1xuICBjb25zdCBjb2xuYW1lID0gJ2NvbnRhaW5zQ2xpZmYnO1xuICBjb25zdCBjb2xOYW1lSW5kID0gZGYuY29sdW1ucy5uYW1lcygpLmZpbHRlcigoaXQ6IHN0cmluZykgPT4gaXQuaW5jbHVkZXMoY29sbmFtZSkpLmxlbmd0aCArIDE7XG4gIGNvbnN0IG5ld0NvbE5hbWUgPSBgJHtjb2xuYW1lfV8ke2NvbE5hbWVJbmR9YDtcbiAgcmV0dXJuIERHLkNvbHVtbi5ib29sKG5ld0NvbE5hbWUsIGRmLnJvd0NvdW50KS5pbml0KChpKSA9PiBpZHMuaGFzKGkpKTtcbn1cbiJdfQ==","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 * as fl from 'fastest-levenshtein';\nimport { jaroWinkler } from 'jaro-winkler-typescript';\nimport { asymmetricDistance, braunBlanquetDistance, cosineDistance, diceDistance, euclideanDistance, hammingDistance, kulczynskiDistance, mcConnaugheyDistance, rogotGoldbergDistance, russelDistance, sokalDistance, tanimotoDistance, } from './distance-metrics-methods';\nimport { calculateEuclideanDistance } from '@datagrok-libraries/utils/src/vector-operations';\nexport var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport const vectorDistanceMetricsMethods = {\n [VectorMetricsNames.Euclidean]: calculateEuclideanDistance,\n};\nexport const stringDistanceMetricsMethods = {\n [StringMetricsNames.Levenshtein]: fl.distance,\n [StringMetricsNames.JaroWinkler]: jaroWinkler,\n [StringMetricsNames.Manhattan]: manhattanDistance,\n};\nexport const bitArrayDistanceMetricsMethods = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport var AvailableMetricsTypes;\n(function (AvailableMetricsTypes) {\n AvailableMetricsTypes[\"Vector\"] = \"Vector\";\n AvailableMetricsTypes[\"String\"] = \"String\";\n AvailableMetricsTypes[\"BitArray\"] = \"BitArray\";\n})(AvailableMetricsTypes || (AvailableMetricsTypes = {}));\nexport const AvailableMetrics = {\n [AvailableMetricsTypes.Vector]: {\n [VectorMetricsNames.Euclidean]: vectorDistanceMetricsMethods[VectorMetricsNames.Euclidean],\n },\n [AvailableMetricsTypes.String]: {\n [StringMetricsNames.Levenshtein]: stringDistanceMetricsMethods[StringMetricsNames.Levenshtein],\n [StringMetricsNames.JaroWinkler]: stringDistanceMetricsMethods[StringMetricsNames.JaroWinkler],\n [StringMetricsNames.Manhattan]: stringDistanceMetricsMethods[StringMetricsNames.Manhattan],\n },\n [AvailableMetricsTypes.BitArray]: {\n [BitArrayMetricsNames.Tanimoto]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Tanimoto],\n [BitArrayMetricsNames.Dice]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Dice],\n [BitArrayMetricsNames.Asymmetric]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Asymmetric],\n [BitArrayMetricsNames.BraunBlanquet]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.BraunBlanquet],\n [BitArrayMetricsNames.Cosine]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Cosine],\n [BitArrayMetricsNames.Kulczynski]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Kulczynski],\n [BitArrayMetricsNames.McConnaughey]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.McConnaughey],\n [BitArrayMetricsNames.RogotGoldberg]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.RogotGoldberg],\n [BitArrayMetricsNames.Russel]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Russel],\n [BitArrayMetricsNames.Sokal]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Sokal],\n },\n};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key])) {\n ret[val] = key;\n }\n return ret;\n}, {});\nexport function isStringMetric(name) {\n return MetricToDataType[name] == 'String';\n}\nexport function isBitArrayMetric(name) {\n return MetricToDataType[name] == 'BitArray';\n}\nexport function isVectorMetric(name) {\n return MetricToDataType[name] == 'Vector';\n}\n/** Manhattan distance between two sequences (match - 0, mismatch - 1) normalized for length. */\nexport function manhattanDistance(s1, s2) {\n if (s1.length !== s2.length) {\n return 1;\n }\n else {\n let dist = 0;\n for (let i = 1; i < s1.length; i++) {\n dist += s1[i] == s2[i] ? 0 : 1;\n }\n return dist / s1.length;\n }\n}\n/** Unified class implementing different string measures. */\nexport class Measure {\n /**\n * Creates an instance of Measure with .\n * @param {string} method Method to calculate distance between strings.\n * @memberof Measurer\n */\n constructor(method) {\n this.method = method;\n this.dataType = MetricToDataType[method];\n }\n /**\n * Returns custom string distance function specified.\n * @return {DistanceMetric} Callback of the measure chosen.\n * @memberof Measurer\n */\n getMeasure() {\n const dict = AvailableMetrics;\n return dict[this.dataType][this.method];\n }\n /**\n * Returns custom string distance by the given data type.\n * @param {AvailableDataTypes} dataType Metric's data type\n * @return {string[]} Metric names which expects the given data type\n * @memberof Measurer\n */\n static getMetricByDataType(dataType) {\n return Object.keys(AvailableMetrics[dataType]);\n }\n /** Returns metric names available.\n * @memberof Measurer\n */\n static get availableMeasures() {\n return Object.keys(AvailableMetrics);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEdBQ2pCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFJM0YsTUFBTSxDQUFOLElBQVksa0JBSVg7QUFKRCxXQUFZLGtCQUFrQjtJQUM1QixpREFBMkIsQ0FBQTtJQUMzQixrREFBNEIsQ0FBQTtJQUM1Qiw2Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSlcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUk3QjtBQUVELE1BQU0sQ0FBTixJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIsNkNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUZXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFFN0I7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFhWDtBQWJELFdBQVksb0JBQW9CO0lBQzlCLDZDQUFxQixDQUFBO0lBQ3JCLHFDQUFhLENBQUE7SUFDYixpREFBeUIsQ0FBQTtJQUN6Qix3REFBZ0MsQ0FBQTtJQUNoQyx5Q0FBaUIsQ0FBQTtJQUNqQixpREFBeUIsQ0FBQTtJQUN6QixzREFBOEIsQ0FBQTtJQUM5Qix3REFBZ0MsQ0FBQTtJQUNoQyx5Q0FBaUIsQ0FBQTtJQUNqQix1Q0FBZSxDQUFBO0lBQ2YsMkNBQW1CLENBQUE7SUFDbkIsK0NBQXVC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QUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sS0FBSyxpQkFBaUI7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmwgZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQge2phcm9XaW5rbGVyfSBmcm9tICdqYXJvLXdpbmtsZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgY29zaW5lRGlzdGFuY2UsXG4gIGRpY2VEaXN0YW5jZSxcbiAgZXVjbGlkZWFuRGlzdGFuY2UsXG4gIGhhbW1pbmdEaXN0YW5jZSxcbiAga3VsY3p5bnNraURpc3RhbmNlLFxuICBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBydXNzZWxEaXN0YW5jZSxcbiAgc29rYWxEaXN0YW5jZSxcbiAgdGFuaW1vdG9EaXN0YW5jZSxcbn0gZnJvbSAnLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7VmVjdG9yLCBTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5cbmV4cG9ydCBlbnVtIFN0cmluZ01ldHJpY3NOYW1lcyB7XG4gIExldmVuc2h0ZWluID0gJ0xldmVuc2h0ZWluJyxcbiAgSmFyb1dpbmtsZXIgPSAnSmFyby1XaW5rbGVyJyxcbiAgTWFuaGF0dGFuID0gJ01hbmhhdHRhbicsXG59XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gIEV1Y2xpZGVhbiA9ICdFdWNsaWRlYW4nLFxufVxuXG5leHBvcnQgZW51bSBCaXRBcnJheU1ldHJpY3NOYW1lcyB7XG4gIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgRGljZSA9ICdEaWNlJyxcbiAgQXN5bW1ldHJpYyA9ICdBc3ltbWV0cmljJyxcbiAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gIENvc2luZSA9ICdDb3NpbmUnLFxuICBLdWxjenluc2tpID0gJ0t1bGN6eW5za2knLFxuICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gIFJvZ290R29sZGJlcmcgPSAnUm9nb3QtR29sZGJlcmcnLFxuICBSdXNzZWwgPSAnUnVzc2VsJyxcbiAgU29rYWwgPSAnU29rYWwnLFxuICBIYW1taW5nID0gJ0hhbW1pbmcnLFxuICBFdWNsaWRlYW4gPSAnRXVjbGlkZWFuJyxcbn1cblxuZXhwb3J0IGNvbnN0IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBWZWN0b3IsIHk6IFZlY3RvcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IHN0cmluZywgeTogc3RyaW5nKSA9PiBudW1iZXIgfSA9IHtcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IGZsLmRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogamFyb1dpbmtsZXIsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogbWFuaGF0dGFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGVudW0gQXZhaWxhYmxlTWV0cmljc1R5cGVzIHtcbiAgVmVjdG9yID0gJ1ZlY3RvcicsXG4gIFN0cmluZyA9ICdTdHJpbmcnLFxuICBCaXRBcnJheSA9ICdCaXRBcnJheSdcbn1cblxuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZU1ldHJpY3MgPSB7XG4gIFtBdmFpbGFibGVNZXRyaWNzVHlwZXMuVmVjdG9yXToge1xuICAgIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXSxcbiAgfSxcbiAgW0F2YWlsYWJsZU1ldHJpY3NUeXBlcy5TdHJpbmddOiB7XG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXSxcbiAgfSxcbiAgW0F2YWlsYWJsZU1ldHJpY3NUeXBlcy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTWV0cmljVG9EYXRhVHlwZTogU3RyaW5nRGljdGlvbmFyeSA9IE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpXG4gIC5yZWR1Y2UoKHJldDogU3RyaW5nRGljdGlvbmFyeSwga2V5KSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1trZXkgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSkpIHtcbiAgICAgIHJldFt2YWwgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSA9IGtleTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSwge30pO1xuXG5leHBvcnQgdHlwZSBBdmFpbGFibGVEYXRhVHlwZXMgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljcztcbmV4cG9ydCB0eXBlIFZlY3Rvck1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tBdmFpbGFibGVNZXRyaWNzVHlwZXMuVmVjdG9yXTtcbmV4cG9ydCB0eXBlIFN0cmluZ01ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tBdmFpbGFibGVNZXRyaWNzVHlwZXMuU3RyaW5nXTtcbmV4cG9ydCB0eXBlIEJpdEFycmF5TWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0F2YWlsYWJsZU1ldHJpY3NUeXBlcy5CaXRBcnJheV07XG5leHBvcnQgdHlwZSBLbm93bk1ldHJpY3MgPSBTdHJpbmdNZXRyaWNzIHwgQml0QXJyYXlNZXRyaWNzIHwgVmVjdG9yTWV0cmljcztcblxuZXhwb3J0IHR5cGUgVmFsaWRUeXBlcyA9IHsgZGF0YTogc3RyaW5nW10sIG1ldHJpYzogU3RyaW5nTWV0cmljcyB9IHwgeyBkYXRhOiBWZWN0b3JbXSwgbWV0cmljOiBWZWN0b3JNZXRyaWNzIH0gfFxuICB7IGRhdGE6IEJpdEFycmF5W10sIG1ldHJpYzogQml0QXJyYXlNZXRyaWNzIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ01ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ1N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JpdEFycmF5TWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnQml0QXJyYXknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZWN0b3JNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdWZWN0b3InO1xufVxuXG4vKiogTWFuaGF0dGFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyAobWF0Y2ggLSAwLCBtaXNtYXRjaCAtIDEpIG5vcm1hbGl6ZWQgZm9yIGxlbmd0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5oYXR0YW5EaXN0YW5jZShzMTogc3RyaW5nLCBzMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHMxLmxlbmd0aCAhPT0gczIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRpc3Q6IG51bWJlciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzMS5sZW5ndGg7IGkrKykge1xuICAgICAgZGlzdCArPSBzMVtpXSA9PSBzMltpXSA/IDAgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdCAvIHMxLmxlbmd0aDtcbiAgfVxufVxuXG4vKiogVW5pZmllZCBjbGFzcyBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IHN0cmluZyBtZWFzdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBNZWFzdXJlIHtcbiAgcHJvdGVjdGVkIG1ldGhvZDogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlIHdpdGggLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBjYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1ldGhvZDogS25vd25NZXRyaWNzKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5kYXRhVHlwZSA9IE1ldHJpY1RvRGF0YVR5cGVbbWV0aG9kXSBhcyBBdmFpbGFibGVEYXRhVHlwZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZSgpOiBEaXN0YW5jZU1ldHJpYyB7XG4gICAgY29uc3QgZGljdDogeyBba2V5OiBzdHJpbmddOiB7IFtrZXkyOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpYyB9IH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIHJldHVybiBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {ITooltipAndPanelParams} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';\nimport {getSimilarityFromDistance} from '@datagrok-libraries/ml/src/distance-metrics-methods';\nimport {AvailableMetrics, AvailableMetricsTypes, StringMetricsNames} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {drawMoleculeDifferenceOnCanvas} from '../utils/cell-renderer';\nimport * as C from '../utils/constants';\nimport {GridColumn} from 'datagrok-api/dg';\nimport {invalidateMols, MONOMERIC_COL_TAGS} from '../substructure-search/substructure-search';\nimport {getSplitter, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport async function getDistances(col: DG.Column, seq: string): Promise<Array<number>> {\n const stringArray = col.toList();\n const distances = new Array(stringArray.length).fill(0);\n const distanceMethod: (x: string, y: string) => number =\n AvailableMetrics[AvailableMetricsTypes.String][StringMetricsNames.Levenshtein];\n for (let i = 0; i < stringArray.length; ++i) {\n const distance = stringArray[i] ? distanceMethod(stringArray[i], seq) : null;\n distances[i] = distance ? distance / Math.max((stringArray[i] as string).length, seq.length) : null;\n }\n return distances;\n}\n\nexport async function getSimilaritiesMatrix(\n dim: number, seqCol: DG.Column, df: DG.DataFrame, colName: string, simArr: DG.Column[]\n): Promise<DG.Column[]> {\n const distances = new Array(simArr.length).fill(null);\n for (let i = 0; i != dim - 1; ++i) {\n const seq: string = seqCol.get(i);\n df.rows.removeAt(0, 1, false);\n distances[i] = (await getDistances(df.col(colName)!, seq))!;\n }\n\n for (let i = 0; i < distances.length; i++) {\n for (let j = 0; j < distances[i].length; j++)\n distances[i][j] = getSimilarityFromDistance(distances[i][j]);\n\n simArr[i] = DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'distances', distances[i]);\n }\n return simArr;\n}\n\nexport async function getChemSimilaritiesMatrix(dim: number, seqCol: DG.Column,\n df: DG.DataFrame, colName: string, simArr: DG.Column[])\n : Promise<DG.Column[]> {\n if (seqCol.version !== seqCol.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION])\n await invalidateMols(seqCol, false);\n const fpDf = DG.DataFrame.create(seqCol.length);\n fpDf.columns.addNewString(colName).init((i) => seqCol.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS].get(i));\n const res = await grok.functions.call('Chem:getChemSimilaritiesMatrix', {\n dim: dim,\n col: seqCol.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS],\n df: fpDf,\n colName: colName,\n simArr: simArr\n });\n return res;\n}\n\nexport function createTooltipElement(params: ITooltipAndPanelParams): HTMLDivElement {\n const tooltipElement = ui.divH([]);\n const columnNames = ui.divV([\n ui.divText(params.seqCol.name),\n ui.divText(params.activityCol.name),\n ]);\n columnNames.style.fontWeight = 'bold';\n columnNames.style.display = 'flex';\n columnNames.style.justifyContent = 'space-between';\n tooltipElement.append(columnNames);\n params.line.mols.forEach((molIdx: number, idx: number) => {\n const activity = ui.divText(params.activityCol.get(molIdx).toFixed(2));\n activity.style.display = 'flex';\n activity.style.justifyContent = 'left';\n activity.style.paddingLeft = '30px';\n tooltipElement.append(ui.divV([\n ui.divText(params.seqCol.get(molIdx)),\n activity,\n ]));\n });\n return tooltipElement;\n}\n\nfunction moleculeInfo(df: DG.DataFrame, idx: number, seqColName: string): HTMLElement {\n const dict: { [key: string]: string } = {};\n for (const col of df.columns) {\n if (col.name !== seqColName)\n dict[col.name] = df.get(col.name, idx);\n }\n return ui.tableFromMap(dict);\n}\n\n\nexport function createPropPanelElement(params: ITooltipAndPanelParams): HTMLDivElement {\n const propPanel = ui.div();\n\n propPanel.append(ui.divText(params.seqCol.name, {style: {fontWeight: 'bold'}}));\n\n const sequencesArray = new Array<string>(2);\n const activitiesArray = new Array<number>(2);\n params.line.mols.forEach((molIdx, idx) => {\n sequencesArray[idx] = params.seqCol.get(molIdx);\n activitiesArray[idx] = params.activityCol.get(molIdx);\n });\n\n const molDifferences: { [key: number]: HTMLCanvasElement } = {};\n const units = params.seqCol.getTag(DG.TAGS.UNITS);\n const separator = params.seqCol.getTag(bioTAGS.separator);\n const splitter = getSplitter(units, separator);\n const subParts1 = splitter(sequencesArray[0]);\n const subParts2 = splitter(sequencesArray[1]);\n const canvas = createDifferenceCanvas(subParts1, subParts2, units, molDifferences);\n propPanel.append(ui.div(canvas, {style: {width: '300px', overflow: 'scroll'}}));\n\n propPanel.append(createDifferencesWithPositions(molDifferences));\n\n propPanel.append(createPropPanelField('Activity delta', Math.abs(activitiesArray[0] - activitiesArray[1])));\n propPanel.append(createPropPanelField('Cliff', params.sali!));\n\n return propPanel;\n}\n\nfunction createPropPanelField(name: string, value: number): HTMLDivElement {\n return ui.divH([\n ui.divText(`${name}: `, {style: {fontWeight: 'bold', paddingRight: '5px'}}),\n ui.divText(value.toFixed(2))\n ], {style: {paddingTop: '10px'}});\n}\n\nexport function createDifferenceCanvas(\n subParts1: string[],\n subParts2: string[],\n units: string,\n molDifferences: { [key: number]: HTMLCanvasElement }): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.height = 30;\n drawMoleculeDifferenceOnCanvas(context!, 0, 0, 0, 30, subParts1, subParts2, units, true, molDifferences);\n return canvas;\n}\n\nexport function createDifferencesWithPositions(\n molDifferences: { [key: number]: HTMLCanvasElement }): HTMLDivElement {\n const div = ui.div();\n if (Object.keys(molDifferences).length > 0) {\n const diffsPanel = ui.divV([]);\n diffsPanel.append(ui.divH([\n ui.divText('Pos', {style: {fontWeight: 'bold', width: '30px', borderBottom: '1px solid'}}),\n ui.divText('Difference', {style: {fontWeight: 'bold', borderBottom: '1px solid'}})\n ]));\n for (const key of Object.keys(molDifferences)) {\n molDifferences[key as any].style.borderBottom = '1px solid lightgray';\n diffsPanel.append(ui.divH([\n ui.divText((parseInt(key) + 1).toString(), {style: {width: '30px', borderBottom: '1px solid lightgray'}}),\n molDifferences[key as any]\n ]));\n }\n div.append(diffsPanel);\n }\n return div;\n}\n\nexport function createLinesGrid(df: DG.DataFrame, colNames: string[]): DG.Grid {\n const seqDiffCol = DG.Column.string('seq_diff', df.rowCount)\n .init((i) => `${df.get(colNames[0], i)}#${df.get(colNames[1], i)}`);\n seqDiffCol.semType = 'MacromoleculeDifference';\n seqDiffCol.setTag(DG.TAGS.UNITS, df.col(colNames[0])!.getTag(DG.TAGS.UNITS));\n seqDiffCol.setTag(bioTAGS.separator, df.col(colNames[0])!.getTag(bioTAGS.separator));\n df.columns.add(seqDiffCol);\n const grid = df.plot.grid();\n grid.col(colNames[0])!.visible = false;\n grid.col(colNames[1])!.visible = false;\n return grid;\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 {CHEM_SIMILARITY_METRICS} from '@datagrok-libraries/ml/src/distance-metrics-methods';\nimport {TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport * as C from '../utils/constants';\n\nexport class SequenceSearchBaseViewer extends DG.JsViewer {\n name: string = '';\n distanceMetric: string;\n limit: number;\n fingerprint: string;\n metricsProperties = ['distanceMetric', 'fingerprint'];\n fingerprintChoices = ['Morgan', 'Pattern'];\n moleculeColumn?: DG.Column|null;\n moleculeColumnName: string;\n initialized: boolean = false;\n tags = [DG.TAGS.UNITS, bioTAGS.aligned, bioTAGS.separator, bioTAGS.alphabet];\n\n constructor(name: string) {\n super();\n this.fingerprint = this.string('fingerprint', this.fingerprintChoices[0], {choices: this.fingerprintChoices});\n this.limit = this.int('limit', 10);\n this.distanceMetric = this.string('distanceMetric', CHEM_SIMILARITY_METRICS[0], {choices: CHEM_SIMILARITY_METRICS});\n this.moleculeColumnName = this.string('moleculeColumnName');\n this.name = name;\n }\n\n init(): void {\n this.initialized = true;\n }\n\n detach(): void {\n this.subs.forEach((sub) => sub.unsubscribe());\n }\n\n async onTableAttached(): Promise<void> {\n this.init();\n\n if (this.dataFrame) {\n this.subs.push(DG.debounce(this.dataFrame.onRowsRemoved, 50).subscribe(async (_: any) => await this.render()));\n const compute = this.name !== 'diversity';\n this.subs.push(DG.debounce(this.dataFrame.onCurrentRowChanged, 50)\n .subscribe(async (_: any) => await this.render(compute)));\n this.subs.push(DG.debounce(this.dataFrame.selection.onChanged, 50)\n .subscribe(async (_: any) => await this.render(false)));\n this.subs.push(DG.debounce(ui.onSizeChanged(this.root), 50)\n .subscribe(async (_: any) => await this.render(false)));\n this.moleculeColumn = this.dataFrame.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n this.moleculeColumnName = this.moleculeColumn?.name!;\n this.getProperty('limit')!.fromOptions({min: 1, max: this.dataFrame.rowCount});\n }\n await this.render();\n }\n\n onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n if (!this.initialized)\n return;\n if (property.name === 'moleculeColumnName') {\n const col = this.dataFrame.col(property.get(this))!;\n if (col.semType === DG.SEMTYPE.MACROMOLECULE)\n this.moleculeColumn = col;\n }\n this.render();\n }\n\n async render(computeData = true) {\n\n }\n\n beforeRender() {\n if (!this.initialized)\n return false;\n if (this.dataFrame && this.moleculeColumnName &&\n this.dataFrame.col(this.moleculeColumnName)!.semType !== DG.SEMTYPE.MACROMOLECULE) {\n grok.shell.error(`${this.moleculeColumnName} is not Macromolecule type`);\n return false;\n }\n return true;\n }\n}\n","import { calculateEuclideanDistance, calcDistanceMatrix, fillRandomMatrix, vectorAdd, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { randomInt } from '@datagrok-libraries/utils/src/random';\n/**\n * Implements stochastic proximity embedding.\n *\n * @export\n * @class SPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class SPEBase {\n /**\n * Creates an instance of SPEBase.\n * @param {Options} [options] Options to pass to the constructor.\n * @memberof SPEBase\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.steps = (_a = options === null || options === void 0 ? void 0 : options.steps) !== null && _a !== void 0 ? _a : 0;\n this.cycles = (_b = options === null || options === void 0 ? void 0 : options.cycles) !== null && _b !== void 0 ? _b : 1e6;\n // Select a cutoff distance {cutoff} and ...\n this.cutoff = (_c = options === null || options === void 0 ? void 0 : options.cutoff) !== null && _c !== void 0 ? _c : 0;\n // ... an initial learning rate {lambda} > 0\n this.lambda = (_d = options === null || options === void 0 ? void 0 : options.lambda) !== null && _d !== void 0 ? _d : 2.0;\n this.dlambda = (_e = options === null || options === void 0 ? void 0 : options.dlambda) !== null && _e !== void 0 ? _e : 0.01;\n this.lambda2 = this.lambda / 2.;\n this.dlambda2 = this.dlambda / 2.;\n this.epsilon = (_f = options === null || options === void 0 ? void 0 : options.epsilon) !== null && _f !== void 0 ? _f : 1e-10;\n // eslint-disable-next-line brace-style\n this.distanceFunction = (_g = options === null || options === void 0 ? void 0 : options.distance) !== null && _g !== void 0 ? _g : calculateEuclideanDistance;\n this.distance = [];\n }\n /**\n * Initializes distance matrix.\n *\n * @param {Vectors} vectors Input vectors to calculate distance between.\n * @memberof SPEBase\n */\n initDistance(vectors) {\n this.distance = calcDistanceMatrix(vectors, this.distanceFunction);\n }\n /**\n * Calculates distance between the two vectors given.\n *\n * @param {Vectors} vectors Set of vectors to calculate distances between.\n * @param {number} index1 Index of the first vector of the pair.\n * @param {number} index2 Index of the second vector of the pair.\n * @return {number} Distance between these two vectors.\n */\n calcDistance(vectors, index1, index2) {\n return this.distance[index1][index2];\n }\n /**\n * Embeds the vectors given into a two-dimensional space.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);\n let lambda2 = this.lambda2;\n if (this.steps == 0) {\n this.steps = vectors.length - 1;\n }\n this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // ... compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda2 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda2 -= this.dlambda2;\n if (lambda2 <= 0.) {\n break;\n }\n }\n return coordinates;\n }\n}\nSPEBase.dimension = 2;\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class PSPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class PSPEBase extends SPEBase {\n /**\n * Embeds the vectors given into a two-dimensional space using a modified update rule.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);\n let lambda = this.lambda;\n this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n // Select a point, i, at random (pivot).\n const i = randomInt(nItems);\n const rowi = coordinates[i];\n // For every point j != i ...\n for (let j = 0; j < nItems; ++j) {\n if (i == j)\n continue;\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) its proximity to i in the input space, rij ...\n const r = this.calcDistance(vectors, i, j);\n // ... and compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda * (r - d) / (d + this.epsilon);\n const diffIJ = vectorAdd(rowi, rowj, -1);\n // ... update the coordinates xj.\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda -= this.dlambda;\n if (lambda <= 0.) {\n break;\n }\n }\n return coordinates;\n }\n}\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class OriginalSPE\n * @link doi:10.1002/jcc.10234\n */\nexport class OriginalSPE extends SPEBase {\n constructor(options) {\n var _a, _b, _c, _d, _e;\n super(options);\n this.cycles = (_a = options === null || options === void 0 ? void 0 : options.cycles) !== null && _a !== void 0 ? _a : 1e3;\n this.steps = (_b = options === null || options === void 0 ? void 0 : options.steps) !== null && _b !== void 0 ? _b : 100000;\n this.radiusPercent = (_c = options === null || options === void 0 ? void 0 : options.radiusPercent) !== null && _c !== void 0 ? _c : 1.0;\n this.maxDistance = (_d = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _d !== void 0 ? _d : null;\n this.maxDistanceSteps = (_e = options === null || options === void 0 ? void 0 : options.maxDistanceSteps) !== null && _e !== void 0 ? _e : null;\n }\n embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, OriginalSPE.dimension, areaWidth);\n this.initDistance(vectors);\n if (this.maxDistanceSteps == null) {\n this.maxDistanceSteps = nItems * Math.floor((nItems - 1) / 2);\n }\n if (this.maxDistance == null) {\n this.maxDistance = -1e37;\n for (let n = 0; n < this.maxDistanceSteps; n++) {\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const d = this.calcDistance(vectors, i, j);\n if (d > this.maxDistance) {\n this.maxDistance = d;\n }\n }\n }\n let lambda = this.lambda;\n const radius = (this.radiusPercent == 0.0) ? this.maxDistance : this.maxDistance * this.radiusPercent;\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n if ((r <= radius) || (d < r)) {\n const multiplier = lambda * 0.5 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n lambda -= ((this.lambda - this.dlambda) / (this.cycles - 1.0));\n ;\n if (lambda < this.dlambda) {\n break;\n }\n }\n return coordinates;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFFL0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFhbEI7Ozs7T0FJRztJQUNILFlBQVksT0FBaUI7O1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsS0FBSyxtQ0FBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLG1DQUFJLEdBQUcsQ0FBQztRQUNyQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLG1DQUFJLENBQUMsQ0FBQztRQUNuQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLG1DQUFJLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sbUNBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBQyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8s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bnRlbnQiOlsiaW1wb3J0IHtPcHRpb25zLCBDb29yZGluYXRlcywgVmVjdG9ycywgRGlzdGFuY2VNZXRyaWN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlLFxuICBjYWxjRGlzdGFuY2VNYXRyaXgsXG4gIGZpbGxSYW5kb21NYXRyaXgsXG4gIHZlY3RvckFkZCxcbn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtyYW5kb21JbnR9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3JhbmRvbSc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgU1BFQmFzZSB7XG4gIHByb3RlY3RlZCBzdGF0aWMgZGltZW5zaW9uID0gMjtcbiAgcHJvdGVjdGVkIHN0ZXBzOiBudW1iZXI7XG4gIHByb3RlY3RlZCBjeWNsZXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN1dG9mZjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhMjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZXBzaWxvbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGdW5jdGlvbjogRGlzdGFuY2VNZXRyaWM7XG4gIGRpc3RhbmNlOiBDb29yZGluYXRlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTUEVCYXNlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucz8uc3RlcHMgPz8gMDtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTY7XG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cbiAgICB0aGlzLmN1dG9mZiA9IG9wdGlvbnM/LmN1dG9mZiA/PyAwO1xuICAgIC8vIC4uLiBhbiBpbml0aWFsIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gPiAwXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xuICAgIHRoaXMuZGxhbWJkYSA9IG9wdGlvbnM/LmRsYW1iZGEgPz8gMC4wMTtcbiAgICB0aGlzLmxhbWJkYTIgPSB0aGlzLmxhbWJkYS8yLjtcbiAgICB0aGlzLmRsYW1iZGEyID0gdGhpcy5kbGFtYmRhLzIuO1xuICAgIHRoaXMuZXBzaWxvbiA9IG9wdGlvbnM/LmVwc2lsb24gPz8gMWUtMTA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJyYWNlLXN0eWxlXG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uID0gb3B0aW9ucz8uZGlzdGFuY2UgPz8gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2U7XG4gICAgdGhpcy5kaXN0YW5jZSA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGRpc3RhbmNlIG1hdHJpeC5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4uXG4gICAqIEBtZW1iZXJvZiBTUEVCYXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdERpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMpIHtcbiAgICB0aGlzLmRpc3RhbmNlID0gY2FsY0Rpc3RhbmNlTWF0cml4KHZlY3RvcnMsIHRoaXMuZGlzdGFuY2VGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIFNldCBvZiB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MSBJbmRleCBvZiB0aGUgZmlyc3QgdmVjdG9yIG9mIHRoZSBwYWlyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgyIEluZGV4IG9mIHRoZSBzZWNvbmQgdmVjdG9yIG9mIHRoZSBwYWlyLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIGJldHdlZW4gdGhlc2UgdHdvIHZlY3RvcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY0Rpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMsIGluZGV4MTogbnVtYmVyLCBpbmRleDI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VbaW5kZXgxXVtpbmRleDJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBsZXQgbGFtYmRhMiA9IHRoaXMubGFtYmRhMjtcblxuICAgIGlmICh0aGlzLnN0ZXBzID09IDApIHtcbiAgICAgIHRoaXMuc3RlcHMgPSB2ZWN0b3JzLmxlbmd0aC0xO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgdGhlaXIgcHJveGltaXR5IGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIGFuZCAuLi5cbiAgICAgICAgY29uc3QgciA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICAvLyAuLi4gY29tcHV0ZSB0aGVpciBFdWNsaWRlYW4gZGlzdGFuY2Ugb24gdGhlIEQtZGltZW5zaW9uYWwgbWFwLCBkaWouXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcblxuICAgICAgICAvLyBJZiByaWogPD0gcmMsIG9yIGlmIHJpaiA+IHJjIGFuZCBkaWogPCByaWogLi4uXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcbiAgICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gbGFtYmRhMioociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlY3JlYXNlIHRoZSBsZWFybmluZyByYXRlIHtsYW1iZGF9IGJ5IGEgcHJlc2NyaWJlZCB7ZGxhbWJkYX0uXG4gICAgICBsYW1iZGEyIC09IHRoaXMuZGxhbWJkYTI7XG4gICAgICBpZiAobGFtYmRhMiA8PSAwLikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFBTUEVCYXNlXG4gKiBAbGluayBkb2k6MTAuMTAxNi9TMTA5My0zMjYzKDAzKTAwMTU1LTRcbiAqL1xuZXhwb3J0IGNsYXNzIFBTUEVCYXNlIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZmlsbFJhbmRvbU1hdHJpeChuSXRlbXMsIFBTUEVCYXNlLmRpbWVuc2lvbiwgYXJlYVdpZHRoKTtcbiAgICBsZXQgbGFtYmRhID0gdGhpcy5sYW1iZGE7XG5cbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGZvciAobGV0IGN5Y2xlID0gMDsgY3ljbGUgPCB0aGlzLmN5Y2xlczsgKytjeWNsZSkge1xuICAgICAgLy8gU2VsZWN0IGEgcG9pbnQsIGksIGF0IHJhbmRvbSAocGl2b3QpLlxuICAgICAgY29uc3QgaTogbnVtYmVyID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XG5cbiAgICAgIC8vIEZvciBldmVyeSBwb2ludCBqICE9IGkgLi4uXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICAgIGlmIChpID09IGopIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG4gICAgICAgIC8vIC4uLiByZXRyaWV2ZSAob3IgZXZhbHVhdGUpIGl0cyBwcm94aW1pdHkgdG8gaSBpbiB0aGUgaW5wdXQgc3BhY2UsIHJpaiAuLi5cbiAgICAgICAgY29uc3QgciA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICAvLyAuLi4gYW5kIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIGNvbnN0IGRpZmZJSiA9IHZlY3RvckFkZChyb3dpLCByb3dqLCAtMSk7XG4gICAgICAgICAgLy8gLi4uIHVwZGF0ZSB0aGUgY29vcmRpbmF0ZXMgeGouXG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlY3JlYXNlIHRoZSBsZWFybmluZyByYXRlIHtsYW1iZGF9IGJ5IGEgcHJlc2NyaWJlZCB7ZGxhbWJkYX0uXG4gICAgICBsYW1iZGEgLT0gdGhpcy5kbGFtYmRhO1xuICAgICAgaWYgKGxhbWJkYSA8PSAwLikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE9yaWdpbmFsU1BFXG4gKiBAbGluayBkb2k6MTAuMTAwMi9qY2MuMTAyMzRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpbmFsU1BFIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJhZGl1c1BlcmNlbnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG1heERpc3RhbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEaXN0YW5jZVN0ZXBzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTM7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDEwMDAwMDtcbiAgICB0aGlzLnJhZGl1c1BlcmNlbnQgPSBvcHRpb25zPy5yYWRpdXNQZXJjZW50ID8/IDEuMDtcbiAgICB0aGlzLm1heERpc3RhbmNlID0gb3B0aW9ucz8ubWF4RGlzdGFuY2UgPz8gbnVsbDtcbiAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBvcHRpb25zPy5tYXhEaXN0YW5jZVN0ZXBzID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IENvb3JkaW5hdGVzIHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBPcmlnaW5hbFNQRS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGlmICh0aGlzLm1heERpc3RhbmNlU3RlcHMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZVN0ZXBzID0gbkl0ZW1zICogTWF0aC5mbG9vcigobkl0ZW1zIC0gMSkgLyAyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGlzdGFuY2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IC0xZTM3O1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0aGlzLm1heERpc3RhbmNlU3RlcHM7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7IGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCBkID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIGlmIChkID4gdGhpcy5tYXhEaXN0YW5jZSkge1xuICAgICAgICAgIHRoaXMubWF4RGlzdGFuY2UgPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuICAgIGNvbnN0IHJhZGl1cyA9ICh0aGlzLnJhZGl1c1BlcmNlbnQgPT0gMC4wKSA/IHRoaXMubWF4RGlzdGFuY2UgOiB0aGlzLm1heERpc3RhbmNlICogdGhpcy5yYWRpdXNQZXJjZW50O1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG5cbiAgICAgICAgaWYgKChyIDw9IHJhZGl1cykgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAwLjUgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhbWJkYSAtPSAoKHRoaXMubGFtYmRhIC0gdGhpcy5kbGFtYmRhKSAvICh0aGlzLmN5Y2xlcyAtIDEuMCkpOyA7XG4gICAgICBpZiAobGFtYmRhIDwgdGhpcy5kbGFtYmRhKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cbiJdfQ==","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport { TSNEOptions, T_SNE, UMAP, UMAPOptions } from '../reduce-dimensionality';\nexport const SEQ_COL_NAMES = {\n [DG.SEMTYPE.MOLECULE]: 'Molecule',\n [DG.SEMTYPE.MACROMOLECULE]: 'Sequence'\n};\nexport class SequenceSpaceBaseFuncEditor {\n constructor(semtype) {\n this.methodSettingsDiv = ui.form([]);\n this.moleculesColDiv = ui.div();\n this.methodsParams = {\n [UMAP]: new UMAPOptions(),\n [T_SNE]: new TSNEOptions()\n };\n this.tableInput = ui.tableInput('Table', grok.shell.tv.dataFrame, undefined, () => {\n this.onTableInputChanged(semtype);\n });\n this.molColInput = ui.columnInput(SEQ_COL_NAMES[semtype], this.tableInput.value, this.tableInput.value.columns.bySemType(semtype));\n this.molColInput.root.style.width = '332px';\n this.moleculesColDiv.append(this.molColInput.root);\n this.methodInput = ui.choiceInput('Method Name', UMAP, [UMAP, T_SNE], () => {\n if (settingsOpened) {\n this.createAlgorithmSettingsDiv(this.methodSettingsDiv, this.methodsParams[this.methodInput.value]);\n }\n });\n this.methodInput.input.style.width = '185px';\n this.methodInput.captionLabel.style.width = '122px';\n this.methodSettingsIcon = ui.icons.settings(() => {\n settingsOpened = !settingsOpened;\n if (!settingsOpened)\n ui.empty(this.methodSettingsDiv);\n else\n this.createAlgorithmSettingsDiv(this.methodSettingsDiv, this.methodsParams[this.methodInput.value]);\n }, 'Modify methods parameters');\n this.methodSettingsIcon.style.lineHeight = '1.7';\n this.methodSettingsIcon.style.fontSize = '18px';\n this.methodSettingsDiv = ui.form([]);\n let settingsOpened = false;\n }\n get algorithmOptions() {\n const algorithmParams = this.methodsParams[this.methodInput.value];\n const options = {};\n Object.keys(algorithmParams).forEach((key) => {\n if (algorithmParams[key].value != null)\n options[key] = algorithmParams[key].value;\n });\n return options;\n }\n createAlgorithmSettingsDiv(paramsForm, params) {\n ui.empty(paramsForm);\n Object.keys(params).forEach((it) => {\n const param = params[it];\n const input = ui.floatInput(param.uiName, param.value, () => {\n param.value = input.value;\n });\n ui.tooltip.bind(input.root, param.tooltip);\n paramsForm.append(input.root);\n });\n return paramsForm;\n }\n onTableInputChanged(semtype) {\n ui.empty(this.moleculesColDiv);\n this.molColInput = ui.columnInput(SEQ_COL_NAMES[semtype], this.tableInput.value, this.tableInput.value.columns.bySemType(semtype));\n this.molColInput.root.style.width = '335px';\n this.moleculesColDiv.append(this.molColInput.root);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXNwYWNlLWJhc2UtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXNwYWNlLWJhc2UtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBa0QsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakksTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQ3pCLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVO0lBQ2pDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxVQUFVO0NBQ3pDLENBQUE7QUFFRCxNQUFNLE9BQU8sMkJBQTJCO0lBc0JwQyxZQUFZLE9BQW1CO1FBakIvQixzQkFBaUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLG9CQUFlLEdBQW1CLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQyxrQkFBYSxHQUErQztZQUMxRCxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksV0FBVyxFQUFFO1lBQ3pCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxXQUFXLEVBQUU7U0FDM0IsQ0FBQztRQWFBLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDaEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdB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QUssR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQzFELEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQW1CO1FBQ25DLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3JJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IElEaW1SZWR1Y3Rpb25QYXJhbSwgSVRTTkVPcHRpb25zLCBJVU1BUE9wdGlvbnMsIFRTTkVPcHRpb25zLCBUX1NORSwgVU1BUCwgVU1BUE9wdGlvbnMgfSBmcm9tICcuLi9yZWR1Y2UtZGltZW5zaW9uYWxpdHknO1xuXG5leHBvcnQgY29uc3QgU0VRX0NPTF9OQU1FUyA9IHtcbiAgICBbREcuU0VNVFlQRS5NT0xFQ1VMRV06ICdNb2xlY3VsZScsXG4gICAgW0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRV06ICdTZXF1ZW5jZSdcbn1cblxuZXhwb3J0IGNsYXNzIFNlcXVlbmNlU3BhY2VCYXNlRnVuY0VkaXRvciB7XG4gICAgdGFibGVJbnB1dDogREcuSW5wdXRCYXNlO1xuICAgIG1vbENvbElucHV0OiBERy5JbnB1dEJhc2U7XG4gICAgbWV0aG9kSW5wdXQ6IERHLklucHV0QmFzZTtcbiAgICBtZXRob2RTZXR0aW5nc0ljb246IEhUTUxFbGVtZW50O1xuICAgIG1ldGhvZFNldHRpbmdzRGl2ID0gdWkuZm9ybShbXSk7XG4gICAgbW9sZWN1bGVzQ29sRGl2OiBIVE1MRGl2RWxlbWVudCA9IHVpLmRpdigpO1xuICAgIG1ldGhvZHNQYXJhbXM6IHtba2V5OiBzdHJpbmddOiBVTUFQT3B0aW9ucyB8IFRTTkVPcHRpb25zfSA9IHtcbiAgICAgIFtVTUFQXTogbmV3IFVNQVBPcHRpb25zKCksXG4gICAgICBbVF9TTkVdOiBuZXcgVFNORU9wdGlvbnMoKVxuICAgIH07XG4gIFxuICAgIGdldCBhbGdvcml0aG1PcHRpb25zKCk6IElVTUFQT3B0aW9ucyB8IElUU05FT3B0aW9ucyB7XG4gICAgICBjb25zdCBhbGdvcml0aG1QYXJhbXM6IFVNQVBPcHRpb25zIHwgVFNORU9wdGlvbnMgPSB0aGlzLm1ldGhvZHNQYXJhbXNbdGhpcy5tZXRob2RJbnB1dC52YWx1ZSFdO1xuICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhbGdvcml0aG1QYXJhbXMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgoYWxnb3JpdGhtUGFyYW1zIGFzIGFueSlba2V5XS52YWx1ZSAhPSBudWxsKSBcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSAoYWxnb3JpdGhtUGFyYW1zIGFzIGFueSlba2V5XS52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICBcbiAgICBjb25zdHJ1Y3RvcihzZW10eXBlOiBERy5TZW1UeXBlKXtcbiAgICAgIHRoaXMudGFibGVJbnB1dCA9IHVpLnRhYmxlSW5wdXQoJ1RhYmxlJywgZ3Jvay5zaGVsbC50di5kYXRhRnJhbWUsIHVuZGVmaW5lZCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uVGFibGVJbnB1dENoYW5nZWQoc2VtdHlwZSk7XG4gICAgICB9KTtcbiAgXG4gICAgICB0aGlzLm1vbENvbElucHV0ID0gdWkuY29sdW1uSW5wdXQoU0VRX0NPTF9OQU1FU1tzZW10eXBlXSwgdGhpcy50YWJsZUlucHV0LnZhbHVlISwgdGhpcy50YWJsZUlucHV0LnZhbHVlIS5jb2x1bW5zLmJ5U2VtVHlwZShzZW10eXBlKSk7XG4gICAgICB0aGlzLm1vbENvbElucHV0LnJvb3Quc3R5bGUud2lkdGggPSAnMzMycHgnO1xuICAgICAgdGhpcy5tb2xlY3VsZXNDb2xEaXYuYXBwZW5kKHRoaXMubW9sQ29sSW5wdXQucm9vdCk7XG4gIFxuICAgICAgdGhpcy5tZXRob2RJbnB1dCA9IHVpLmNob2ljZUlucHV0KCdNZXRob2QgTmFtZScsIFVNQVAsIFtVTUFQLCBUX1NORV0sICgpID0+IHtcbiAgICAgICAgaWYoc2V0dGluZ3NPcGVuZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYodGhpcy5tZXRob2RTZXR0aW5nc0RpdiwgdGhpcy5tZXRob2RzUGFyYW1zW3RoaXMubWV0aG9kSW5wdXQudmFsdWUhXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5tZXRob2RJbnB1dC5pbnB1dC5zdHlsZS53aWR0aCA9ICcxODVweCc7XG4gICAgICB0aGlzLm1ldGhvZElucHV0LmNhcHRpb25MYWJlbC5zdHlsZS53aWR0aCA9ICcxMjJweCc7XG4gIFxuICAgICAgdGhpcy5tZXRob2RTZXR0aW5nc0ljb24gPSB1aS5pY29ucy5zZXR0aW5ncygoKT0+IHtcbiAgICAgICAgc2V0dGluZ3NPcGVuZWQgPSAhc2V0dGluZ3NPcGVuZWQ7XG4gICAgICAgIGlmICghc2V0dGluZ3NPcGVuZWQpXG4gICAgICAgICAgdWkuZW1wdHkodGhpcy5tZXRob2RTZXR0aW5nc0Rpdik7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgdGhpcy5jcmVhdGVBbGdvcml0aG1TZXR0aW5nc0Rpdih0aGlzLm1ldGhvZFNldHRpbmdzRGl2LCB0aGlzLm1ldGhvZHNQYXJhbXNbdGhpcy5tZXRob2RJbnB1dC52YWx1ZSFdKTtcbiAgICAgIH0sICdNb2RpZnkgbWV0aG9kcyBwYXJhbWV0ZXJzJyk7XG4gICAgICB0aGlzLm1ldGhvZFNldHRpbmdzSWNvbi5zdHlsZS5saW5lSGVpZ2h0ID0gJzEuNyc7XG4gICAgICB0aGlzLm1ldGhvZFNldHRpbmdzSWNvbi5zdHlsZS5mb250U2l6ZSA9ICcxOHB4JztcbiAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NEaXYgPSB1aS5mb3JtKFtdKTtcbiAgICAgIGxldCBzZXR0aW5nc09wZW5lZCA9IGZhbHNlO1xuICAgIH1cbiAgXG4gICAgY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYocGFyYW1zRm9ybTogSFRNTERpdkVsZW1lbnQsIHBhcmFtczogVU1BUE9wdGlvbnMgfCBUU05FT3B0aW9ucykge1xuICAgICAgdWkuZW1wdHkocGFyYW1zRm9ybSk7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGl0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW06IElEaW1SZWR1Y3Rpb25QYXJhbSA9IChwYXJhbXMgYXMgYW55KVtpdF07XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdWkuZmxvYXRJbnB1dChwYXJhbS51aU5hbWUsIHBhcmFtLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgcGFyYW0udmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVpLnRvb2x0aXAuYmluZChpbnB1dC5yb290LCBwYXJhbS50b29sdGlwKTtcbiAgICAgICAgcGFyYW1zRm9ybS5hcHBlbmQoaW5wdXQucm9vdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJhbXNGb3JtO1xuICAgIH1cblxuICAgIG9uVGFibGVJbnB1dENoYW5nZWQoc2VtdHlwZTogREcuU2VtVHlwZSkge1xuICAgICAgICB1aS5lbXB0eSh0aGlzLm1vbGVjdWxlc0NvbERpdik7XG4gICAgICAgIHRoaXMubW9sQ29sSW5wdXQgPSB1aS5jb2x1bW5JbnB1dChTRVFfQ09MX05BTUVTW3NlbXR5cGVdLCB0aGlzLnRhYmxlSW5wdXQudmFsdWUhLCB0aGlzLnRhYmxlSW5wdXQudmFsdWUhLmNvbHVtbnMuYnlTZW1UeXBlKHNlbXR5cGUpKTtcbiAgICAgICAgdGhpcy5tb2xDb2xJbnB1dC5yb290LnN0eWxlLndpZHRoID0gJzMzNXB4JztcbiAgICAgICAgdGhpcy5tb2xlY3VsZXNDb2xEaXYuYXBwZW5kKHRoaXMubW9sQ29sSW5wdXQucm9vdCk7XG4gICAgfVxuICB9Il19","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport const _package = new DG.Package();\n\nimport {MacromoleculeDifferenceCellRenderer, MonomerCellRenderer} from './utils/cell-renderer';\nimport {VdRegionsViewer} from './viewers/vd-regions-viewer';\nimport {runKalign} from './utils/multiple-sequence-alignment';\nimport {SequenceAlignment} from './seq_align';\nimport {getEmbeddingColsNames, sequenceSpaceByFingerprints} from './analysis/sequence-space';\nimport {getActivityCliffs} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';\nimport {\n createLinesGrid, createPropPanelElement, createTooltipElement, getChemSimilaritiesMatrix,\n} from './analysis/sequence-activity-cliffs';\nimport {HELM_CORE_LIB_FILENAME} from '@datagrok-libraries/bio/src/utils/const';\nimport {MacromoleculeSequenceCellRenderer} from './utils/cell-renderer';\nimport {convert} from './utils/convert';\nimport {getMacroMolColumnPropertyPanel, representationsWidget} from './widgets/representations';\nimport {_toAtomicLevel} from '@datagrok-libraries/bio/src/monomer-works/to-atomic-level';\nimport {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';\nimport {removeEmptyStringRows} from '@datagrok-libraries/utils/src/dataframe-utils';\n\nimport {splitAlignedSequences} from '@datagrok-libraries/bio/src/utils/splitter';\nimport * as C from './utils/constants';\nimport {SequenceSimilarityViewer} from './analysis/sequence-similarity-viewer';\nimport {SequenceDiversityViewer} from './analysis/sequence-diversity-viewer';\nimport {substructureSearchDialog} from './substructure-search/substructure-search';\nimport {saveAsFastaUI} from './utils/save-as-fasta';\nimport {BioSubstructureFilter} from './widgets/bio-substructure-filter';\nimport {delay} from '@datagrok-libraries/utils/src/test';\nimport {\n getStats,\n NOTATION,\n splitterAsHelm,\n TAGS as bioTAGS,\n ALPHABET\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {pepseaMethods, runPepsea} from './utils/pepsea';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\nimport {WebLogoViewer} from './viewers/web-logo-viewer';\nimport {createJsonMonomerLibFromSdf, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {LIB_PATH, LIB_STORAGE_NAME, MonomerLibHelper} from './utils/monomer-lib';\nimport {getMacromoleculeColumn} from './utils/ui-utils';\nimport {IUMAPOptions, ITSNEOptions} from '@datagrok-libraries/ml/src/reduce-dimensionality';\nimport {SequenceSpaceFunctionEditor} from '@datagrok-libraries/ml/src/functionEditors/seq-space-editor';\nimport {ActivityCliffsFunctionEditor} from '@datagrok-libraries/ml/src/functionEditors/activity-cliffs-editor';\n\n// /** Avoid reassinging {@link monomerLib} because consumers subscribe to {@link IMonomerLib.onChanged} event */\n// let monomerLib: MonomerLib | null = null;\n\n//name: getMonomerLibHelper\n//description:\n//output: object result\nexport function getMonomerLibHelper(): IMonomerLibHelper {\n return MonomerLibHelper.instance;\n}\n\nexport let hydrophobPalette: SeqPaletteCustom | null = null;\n\nexport class SeqPaletteCustom implements SeqPalette {\n private readonly _palette: { [m: string]: string };\n\n constructor(palette: { [m: string]: string }) {\n this._palette = palette;\n }\n\n public get(m: string): string {\n return this._palette[m];\n }\n}\n\n// let loadLibrariesPromise: Promise<void> = Promise.resolve();\n\n//tags: init\nexport async function initBio() {\n // loadLibrariesPromise = loadLibrariesPromise.then(() => {\n await MonomerLibHelper.instance.loadLibraries(); // from initBio()\n // });\n // await loadLibrariesPromise;\n const monomerLib = MonomerLibHelper.instance.getBioLib();\n const monomers: string[] = [];\n const logPs: number[] = [];\n const module = await grok.functions.call('Chem:getRdKitModule');\n\n const series = monomerLib!.getMonomerMolsByType('PEPTIDE')!;\n Object.keys(series).forEach((symbol) => {\n monomers.push(symbol);\n const block = series[symbol].replaceAll('#R', 'O ');\n const mol = module.get_mol(block);\n const logP = JSON.parse(mol.get_descriptors()).CrippenClogP;\n logPs.push(logP);\n mol?.delete();\n });\n\n const sum = logPs.reduce((a, b) => a + b, 0);\n const avg = (sum / logPs.length) || 0;\n\n const palette: { [monomer: string]: string } = {};\n for (let i = 0; i < monomers.length; i++)\n palette[monomers[i]] = logPs[i] < avg ? '#4682B4' : '#DC143C';\n\n hydrophobPalette = new SeqPaletteCustom(palette);\n}\n\n//name: sequenceTooltip\n//tags: tooltip\n//input: column col {semType: Macromolecule}\n//output: widget result\nexport async function sequenceTooltip(col: DG.Column): Promise<DG.Widget<any>> {\n const tv = grok.shell.tv;\n const viewer = await tv.dataFrame.plot.fromType('WebLogo', {\n sequenceColumnName: col.name,\n backgroundColor: 0xFFfdffe5,\n fitArea: false,\n positionHeight: 'Entropy',\n fixWidth: true\n });\n viewer.root.style.height = '50px';\n return viewer;\n}\n\n//name: getBioLib\n//output: object monomerLib\nexport function getBioLib(): IMonomerLib {\n return MonomerLibHelper.instance.getBioLib();\n}\n\n//name: manageFiles\nexport async function manageFiles() {\n const a = ui.dialog({title: 'Manage files'})\n //@ts-ignore\n .add(ui.fileBrowser({path: 'System:AppData/Bio/libraries'}).root)\n .addButton('OK', () => a.close())\n .show();\n}\n\n//name: Manage Libraries\n//input: column seqColumn {semType: Macromolecule}\n//tags: panel, exclude-actions-panel\n//output: widget result\nexport async function libraryPanel(seqColumn: DG.Column): Promise<DG.Widget> {\n //@ts-ignore\n const filesButton: HTMLButtonElement = ui.button('Manage', manageFiles);\n const divInputs: HTMLDivElement = ui.div();\n const libFileNameList: string[] = (await grok.dapi.files.list(`${LIB_PATH}`, false, ''))\n .map((it) => it.fileName);\n const librariesUserSettingsSet: Set<string> = new Set<string>(Object.keys(\n await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true)));\n\n let userStoragePromise: Promise<void> = Promise.resolve();\n for (const libFileName of libFileNameList) {\n const libInput: DG.InputBase<boolean | null> = ui.boolInput(libFileName, librariesUserSettingsSet.has(libFileName),\n () => {\n userStoragePromise = userStoragePromise.then(async () => {\n if (libInput.value == true) {\n // Save checked library to user settings 'Libraries'\n await grok.dapi.userDataStorage.postValue(LIB_STORAGE_NAME, libFileName, libFileName, true);\n await MonomerLibHelper.instance.loadLibraries(); // from libraryPanel()\n } else {\n // Remove unchecked library from user settings 'Libraries'\n await grok.dapi.userDataStorage.remove(LIB_STORAGE_NAME, libFileName, true);\n await MonomerLibHelper.instance.loadLibraries(true); // from libraryPanel()\n }\n grok.shell.info('Monomer library user settings saved.');\n });\n });\n divInputs.append(libInput.root);\n }\n\n return new DG.Widget(ui.splitV([\n divInputs,\n ui.divV([filesButton])\n ]));\n}\n\n//name: fastaSequenceCellRenderer\n//tags: cellRenderer\n//meta.cellType: sequence\n//meta.columnTags: quality=Macromolecule, units=fasta\n//output: grid_cell_renderer result\nexport function fastaSequenceCellRenderer(): MacromoleculeSequenceCellRenderer {\n return new MacromoleculeSequenceCellRenderer();\n}\n\n//name: Sequence Renderer\n//input: column molColumn {semType: Macromolecule}\n//tags: panel\n//output: widget result\nexport function macroMolColumnPropertyPanel(molColumn: DG.Column): DG.Widget {\n return getMacroMolColumnPropertyPanel(molColumn);\n}\n\n//name: separatorSequenceCellRenderer\n//tags: cellRenderer\n//meta.cellType: sequence\n//meta.columnTags: quality=Macromolecule, units=separator\n//output: grid_cell_renderer result\nexport function separatorSequenceCellRenderer(): MacromoleculeSequenceCellRenderer {\n return new MacromoleculeSequenceCellRenderer();\n}\n\n//name: MacromoleculeDifferenceCellRenderer\n//tags: cellRenderer\n//meta.cellType: MacromoleculeDifference\n//meta.columnTags: quality=MacromoleculeDifference\n//output: grid_cell_renderer result\nexport function macromoleculeDifferenceCellRenderer(): MacromoleculeDifferenceCellRenderer {\n return new MacromoleculeDifferenceCellRenderer();\n}\n\n\nfunction checkInputColumnUi(col: DG.Column, name: string, allowedNotations: string[] = [],\n allowedAlphabets: string[] = [], notify: boolean = true): boolean {\n const [res, msg]: [boolean, string] = checkInputColumn(col, name, allowedNotations, allowedAlphabets);\n if (notify && !res)\n grok.shell.warning(msg);\n return res;\n}\n\nexport function checkInputColumn(\n col: DG.Column, name: string, allowedNotations: string[] = [], allowedAlphabets: string[] = []\n): [boolean, string] {\n let res: boolean = true;\n let msg: string = '';\n\n const uh = new UnitsHandler(col);\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE) {\n grok.shell.warning(name + ' analysis is allowed for Macromolecules semantic type');\n res = false;\n } else {\n const notation: string = uh.notation;\n if (allowedNotations.length > 0 &&\n !allowedNotations.some((n) => notation.toUpperCase() == (n.toUpperCase()))\n ) {\n const notationAdd = allowedNotations.length == 0 ? 'any notation' :\n (`notation${allowedNotations.length > 1 ? 's' : ''} ${allowedNotations.map((n) => `\"${n}\"`).join(', ')} `);\n msg = `${name} + ' analysis is allowed for Macromolecules with notation ${notationAdd}.`;\n res = false;\n } else if (!uh.isHelm()) {\n // alphabet is not specified for 'helm' notation\n const alphabet: string = uh.alphabet;\n if (\n allowedAlphabets.length > 0 &&\n !allowedAlphabets.some((a) => alphabet.toUpperCase() == (a.toUpperCase()))\n ) {\n const alphabetAdd = allowedAlphabets.length == 0 ? 'any alphabet' :\n (`alphabet${allowedAlphabets.length > 1 ? 's' : ''} ${allowedAlphabets.map((a) => `\"${a}\"`).join(', ')}.`);\n msg = `${name} + ' analysis is allowed for Macromolecules with alphabet ${alphabetAdd}.`;\n res = false;\n }\n }\n }\n\n return [res, msg];\n}\n\n//name: sequenceAlignment\n//input: string alignType {choices: ['Local alignment', 'Global alignment']}\n// eslint-disable-next-line max-len\n//input: string alignTable {choices: ['AUTO', 'NUCLEOTIDES', 'BLOSUM45', 'BLOSUM50','BLOSUM62','BLOSUM80','BLOSUM90','PAM30','PAM70','PAM250','SCHNEIDER','TRANS']}\n//input: double gap\n//input: string seq1\n//input: string seq2\n//output: object res\nexport function sequenceAlignment(alignType: string, alignTable: string, gap: number, seq1: string, seq2: string) {\n const toAlign = new SequenceAlignment(seq1, seq2, gap, alignTable);\n const res = alignType == 'Local alignment' ? toAlign.smithWaterman() : toAlign.needlemanWunch();\n return res;\n}\n\n//name: WebLogo\n//description: WebLogo\n//tags: viewer, panel\n//output: viewer result\n//meta.icon: files/icons/weblogo-viewer.svg\nexport function webLogoViewer() {\n return new WebLogoViewer();\n}\n\n//name: VdRegions\n//description: V-Domain regions viewer\n//tags: viewer, panel\n//meta.icon: files/icons/vdregions-viewer.svg\n//output: viewer result\nexport function vdRegionViewer() {\n return new VdRegionsViewer();\n}\n\n//name: SeqActivityCliffsEditor\n//tags: editor\n//input: funccall call\nexport function SeqActivityCliffsEditor(call: DG.FuncCall) {\n const funcEditor = new ActivityCliffsFunctionEditor(DG.SEMTYPE.MACROMOLECULE);\n ui.dialog({title: 'Activity Cliffs'})\n .add(funcEditor.paramsUI)\n .onOK(async () => {\n call.func.prepare(funcEditor.funcParams).call(true);\n })\n .show();\n}\n\n//top-menu: Bio | Sequence Activity Cliffs...\n//name: Sequence Activity Cliffs\n//description: detect activity cliffs\n//input: dataframe table [Input data table]\n//input: column molecules {semType: Macromolecule}\n//input: column activities\n//input: double similarity = 80 [Similarity cutoff]\n//input: string methodName { choices:[\"UMAP\", \"t-SNE\"] }\n//input: object options {optional: true}\n//output: viewer result\n//editor: Bio:SeqActivityCliffsEditor\nexport async function activityCliffs(df: DG.DataFrame, macroMolecule: DG.Column, activities: DG.Column,\n similarity: number, methodName: string, options?: IUMAPOptions | ITSNEOptions\n): Promise<DG.Viewer | undefined> {\n if (!checkInputColumnUi(macroMolecule, 'Activity Cliffs'))\n return;\n const axesNames = getEmbeddingColsNames(df);\n const tags = {\n 'units': macroMolecule.getTag(DG.TAGS.UNITS),\n 'aligned': macroMolecule.getTag(bioTAGS.aligned),\n 'separator': macroMolecule.getTag(bioTAGS.separator),\n 'alphabet': macroMolecule.getTag(bioTAGS.alphabet),\n };\n const sp = await getActivityCliffs(\n df,\n macroMolecule,\n null,\n axesNames,\n 'Activity cliffs',\n activities,\n similarity,\n 'Tanimoto',\n methodName,\n DG.SEMTYPE.MACROMOLECULE,\n tags,\n sequenceSpaceByFingerprints,\n getChemSimilaritiesMatrix,\n createTooltipElement,\n createPropPanelElement,\n createLinesGrid,\n options);\n return sp;\n}\n\n//name: SequenceSpaceEditor\n//tags: editor\n//input: funccall call\nexport function SequenceSpaceEditor(call: DG.FuncCall) {\n const funcEditor = new SequenceSpaceFunctionEditor(DG.SEMTYPE.MACROMOLECULE);\n ui.dialog({title: 'Sequence Space'})\n .add(funcEditor.paramsUI)\n .onOK(async () => {\n call.func.prepare(funcEditor.funcParams).call(true);\n })\n .show();\n}\n\n//top-menu: Bio | Sequence Space...\n//name: Sequence Space\n//input: dataframe table\n//input: column molecules { semType: Macromolecule }\n//input: string methodName { choices:[\"UMAP\", \"t-SNE\"] }\n//input: string similarityMetric { choices:[\"Tanimoto\", \"Asymmetric\", \"Cosine\", \"Sokal\"] }\n//input: bool plotEmbeddings = true\n//input: object options {optional: true}\n//editor: Bio:SequenceSpaceEditor\nexport async function sequenceSpaceTopMenu(table: DG.DataFrame, macroMolecule: DG.Column, methodName: string,\n similarityMetric: string = 'Tanimoto', plotEmbeddings: boolean, options?: IUMAPOptions | ITSNEOptions): Promise<DG.Viewer | undefined> {\n // Delay is required for initial function dialog to close before starting invalidating of molfiles.\n // Otherwise, dialog is freezing\n await delay(10);\n if (!checkInputColumnUi(macroMolecule, 'Sequence space'))\n return;\n\n const embedColsNames = getEmbeddingColsNames(table);\n const withoutEmptyValues = DG.DataFrame.fromColumns([macroMolecule]).clone();\n const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, macroMolecule);\n\n const chemSpaceParams = {\n seqCol: withoutEmptyValues.col(macroMolecule.name)!,\n methodName: methodName,\n similarityMetric: similarityMetric,\n embedAxesNames: embedColsNames,\n options: options\n };\n const sequenceSpaceRes = await sequenceSpaceByFingerprints(chemSpaceParams);\n const embeddings = sequenceSpaceRes.coordinates;\n for (const col of embeddings) {\n const listValues = col.toList();\n emptyValsIdxs.forEach((ind: number) => listValues.splice(ind, 0, null));\n table.columns.add(DG.Column.float(col.name, table.rowCount).init((i) => listValues[i]));\n }\n if (plotEmbeddings) {\n return grok.shell\n .tableView(table.name)\n .scatterPlot({x: embedColsNames[0], y: embedColsNames[1], title: 'Sequence space'});\n }\n\n /* const encodedCol = encodeMonomers(macroMolecule);\n if (!encodedCol)\n return;\n const embedColsNames = getEmbeddingColsNames(table);\n const withoutEmptyValues = DG.DataFrame.fromColumns([encodedCol]).clone();\n const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, encodedCol);\n\n const chemSpaceParams = {\n seqCol: withoutEmptyValues.col(encodedCol.name)!,\n methodName: methodName,\n similarityMetric: similarityMetric,\n embedAxesNames: embedColsNames\n };\n const sequenceSpaceRes = await sequenceSpace(chemSpaceParams);\n const embeddings = sequenceSpaceRes.coordinates;\n for (const col of embeddings) {\n const listValues = col.toList();\n emptyValsIdxs.forEach((ind: number) => listValues.splice(ind, 0, null));\n table.columns.add(DG.Column.fromList('double', col.name, listValues));\n }\n let sp;\n if (plotEmbeddings) {\n for (const v of grok.shell.views) {\n if (v.name === table.name)\n sp = (v as DG.TableView).scatterPlot({x: embedColsNames[0], y: embedColsNames[1], title: 'Sequence space'});\n }\n } */\n};\n\n//top-menu: Bio | To Atomic Level...\n//name: To Atomic Level\n//description: returns molfiles for each monomer from HELM library\n//input: dataframe df [Input data table]\n//input: column macroMolecule {semType: Macromolecule}\nexport async function toAtomicLevel(df: DG.DataFrame, macroMolecule: DG.Column): Promise<void> {\n if (DG.Func.find({package: 'Chem', name: 'getRdKitModule'}).length === 0) {\n grok.shell.warning('Transformation to atomic level requires package \"Chem\" installed.');\n return;\n }\n if (!checkInputColumnUi(macroMolecule, 'To Atomic Level'))\n return;\n const monomersLibFile = await _package.files.readAsText(HELM_CORE_LIB_FILENAME);\n const monomersLibObject: any[] = JSON.parse(monomersLibFile);\n await _toAtomicLevel(df, macroMolecule, monomersLibObject);\n}\n\n//top-menu: Bio | MSA...\n//name: MSA...\n//tags: bio, panel\nexport function multipleSequenceAlignmentAny(col: DG.Column<string> | null = null): void {\n const table = col?.dataFrame ?? grok.shell.t;\n const seqCol = col ?? table.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n if (seqCol == null) {\n grok.shell.warning(`MSAError: dataset doesn't conain any Macromolecule column`);\n return;\n }\n\n let performAlignment: () => Promise<DG.Column<string> | null> = async () => null;\n const methodInput = ui.choiceInput('Method', pepseaMethods[0], pepseaMethods);\n methodInput.setTooltip('Alignment method');\n const gapOpenInput = ui.floatInput('Gap open', 1.53);\n gapOpenInput.setTooltip('Gap opening penalty at group-to-group alignment');\n const gapExtendInput = ui.floatInput('Gap extend', 0);\n gapExtendInput.setTooltip('Gap extension penalty to skip the alignment');\n const inputRootStyles = [methodInput.root.style, gapOpenInput.root.style, gapExtendInput.root.style];\n\n const colInput = ui.columnInput('Sequence', table, seqCol, () => {\n const potentialCol = colInput.value;\n const unusedName = table.columns.getUnusedName(`msa(${potentialCol.name})`);\n\n if (checkInputColumnUi(\n potentialCol, potentialCol.name, [NOTATION.FASTA], [ALPHABET.DNA, ALPHABET.RNA, ALPHABET.PT], false)) {\n for (const inputRootStyle of inputRootStyles)\n inputRootStyle.display = 'none';\n\n performAlignment = () => runKalign(potentialCol, false, unusedName, clustersColInput.value);\n } else if (checkInputColumnUi(potentialCol, potentialCol.name, [NOTATION.HELM], [], false)) {\n for (const inputRootStyle of inputRootStyles)\n inputRootStyle.display = 'initial';\n\n performAlignment = () => runPepsea(potentialCol, unusedName, methodInput.value!, gapOpenInput.value!,\n gapExtendInput.value!, clustersColInput.value);\n } else {\n for (const inputRootStyle of inputRootStyles)\n inputRootStyle.display = 'none';\n\n performAlignment = async () => null;\n }\n }) as DG.InputBase<DG.Column<string>>;\n colInput.setTooltip('Sequences column to use for alignment');\n colInput.fireChanged();\n\n const clustersColInput = ui.columnInput('Clusters', table, null);\n clustersColInput.nullable = true;\n\n let msaCol: DG.Column<string> | null = null;\n ui.dialog('MSA')\n .add(colInput)\n .add(clustersColInput)\n .add(methodInput)\n .add(gapOpenInput)\n .add(gapExtendInput)\n .onOK(async () => {\n colInput.fireChanged();\n msaCol = await performAlignment();\n if (msaCol == null)\n return grok.shell.warning('Wrong column format');\n\n table.columns.add(msaCol);\n await grok.data.detectSemanticTypes(table);\n })\n .show();\n}\n\n//name: Composition Analysis\n//top-menu: Bio | Composition Analysis\n//meta.icon: files/icons/composition-analysis.svg\n//output: viewer result\nexport async function compositionAnalysis(): Promise<void> {\n // Higher priority for columns with MSA data to show with WebLogo.\n const tv = grok.shell.tv;\n const df = tv.dataFrame;\n //@ts-ignore\n const colList: DG.Column[] = df.columns.toList().filter((col) => {\n if (col.semType != DG.SEMTYPE.MACROMOLECULE)\n return false;\n\n const colUH = new UnitsHandler(col);\n // TODO: prevent for cyclic, branched or multiple chains in Helm\n return true;\n });\n\n const handler = async (col: DG.Column) => {\n if (!checkInputColumnUi(col, 'Composition'))\n return;\n\n const wlViewer = tv.addViewer('WebLogo', {sequenceColumnName: col.name});\n grok.shell.tv.dockManager.dock(wlViewer, DG.DOCK_TYPE.DOWN, null, 'Composition analysis', 0.25);\n };\n\n let col: DG.Column | null = null;\n if (colList.length == 0) {\n grok.shell.error('Current table does not contain sequences');\n return;\n } else if (colList.length > 1) {\n const colListNames: string [] = colList.map((col) => col.name);\n const selectedCol = colList.find((c) => { return (new UnitsHandler(c)).isMsa(); });\n const colInput: DG.InputBase = ui.choiceInput(\n 'Column', selectedCol ? selectedCol.name : colListNames[0], colListNames);\n ui.dialog({\n title: 'Composition Analysis',\n helpUrl: '/help/domains/bio/macromolecules.md#composition-analysis'\n })\n .add(ui.div([\n colInput,\n ]))\n .onOK(async () => {\n const col: DG.Column | null = colList.find((col) => col.name == colInput.value) ?? null;\n\n if (col)\n await handler(col);\n })\n .show();\n } else {\n col = colList[0];\n }\n\n if (!col)\n return;\n\n await handler(col);\n}\n\n//top-menu: Bio | SDF to JSON lib...\n//name: SDF to JSON Lib\n//input: dataframe table\nexport async function sdfToJsonLib(table: DG.DataFrame) {\n const jsonMonomerLibrary = createJsonMonomerLibFromSdf(table);\n}\n\n//name: Representations\n//tags: panel, widgets\n//input: cell macroMolecule {semType: Macromolecule}\n//output: widget result\nexport async function peptideMolecule(macroMolecule: DG.Cell): Promise<DG.Widget> {\n const monomersLibFile = await _package.files.readAsText(HELM_CORE_LIB_FILENAME);\n const monomersLibObject: any[] = JSON.parse(monomersLibFile);\n\n return representationsWidget(macroMolecule, monomersLibObject);\n}\n\n//name: importFasta\n//description: Opens FASTA file\n//tags: file-handler\n//meta.ext: fasta, fna, ffn, faa, frn, fa, fst\n//input: string fileContent\n//output: list tables\nexport function importFasta(fileContent: string): DG.DataFrame [] {\n const ffh = new FastaFileHandler(fileContent);\n return ffh.importFasta();\n}\n\n//top-menu: Bio | Convert...\n//name: convertDialog\nexport function convertDialog() {\n const col = getMacromoleculeColumn();\n convert(col);\n}\n\n//name: monomerCellRenderer\n//tags: cellRenderer\n//meta.cellType: Monomer\n//output: grid_cell_renderer result\nexport function monomerCellRenderer(): MonomerCellRenderer {\n return new MonomerCellRenderer();\n}\n\n//name: testDetectMacromolecule\n//input: string path {choices: ['Demo:Files/', 'System:AppData/']}\n//output: dataframe result\nexport async function testDetectMacromolecule(path: string): Promise<DG.DataFrame> {\n const pi = DG.TaskBarProgressIndicator.create('Test detectMacromolecule...');\n\n const fileList = await grok.dapi.files.list(path, true, '');\n //@ts-ignore\n const fileListToTest = fileList.filter((fi) => fi.fileName.endsWith('.csv'));\n\n let readyCount = 0;\n const res = [];\n\n for (const fileInfo of fileListToTest) {\n try {\n const csv = await grok.dapi.files.readAsText(path + fileInfo.fullPath);\n const df = DG.DataFrame.fromCsv(csv);\n\n for (const col of df.columns) {\n const semType = await grok.functions.call('Bio:detectMacromolecule', {col: col});\n if (semType === DG.SEMTYPE.MACROMOLECULE) {\n //console.warn(`file: ${fileInfo.path}, column: ${col.name}, ` +\n // `semType: ${semType}, units: ${col.getTag(DG.TAGS.UNITS)}`);\n // console.warn('file: \"' + fileInfo.path + '\", semType: \"' + semType + '\", ' +\n // 'units: \"' + col.getTag(DG.TAGS.UNITS) + '\"');\n\n res.push({\n file: fileInfo.path, result: 'detected', column: col.name,\n message: `units: ${col.getTag(DG.TAGS.UNITS)}`\n });\n }\n }\n } catch (err: unknown) {\n // console.error('file: ' + fileInfo.path + ', error: ' + ex.toString());\n res.push({\n file: fileInfo.path, result: 'error', column: null,\n message: err instanceof Error ? err.message : (err as Object).toString(),\n });\n } finally {\n readyCount += 1;\n pi.update(100 * readyCount / fileListToTest.length, `Test ${fileInfo.fileName}`);\n }\n }\n\n grok.shell.info('Test Demo:Files for detectMacromolecule finished.');\n pi.close();\n const resDf = DG.DataFrame.fromObjects(res)!;\n resDf.name = `datasets_detectMacromolecule_${path}`;\n return resDf;\n}\n\n//top-menu: Bio | Split to monomers\n//name: splitToMonomers\nexport function splitToMonomers(): void {\n const col = getMacromoleculeColumn();\n const tempDf = splitAlignedSequences(col);\n const originalDf = col.dataFrame;\n for (const tempCol of tempDf.columns) {\n const newCol = originalDf.columns.add(tempCol);\n newCol.semType = C.SEM_TYPES.MONOMER;\n newCol.setTag(DG.TAGS.CELL_RENDERER, C.SEM_TYPES.MONOMER);\n newCol.setTag(bioTAGS.alphabet, col.getTag(bioTAGS.alphabet));\n }\n grok.shell.tv.grid.invalidate();\n}\n\n//name: Bio: getHelmMonomers\n//input: column sequence {semType: Macromolecule}\nexport function getHelmMonomers(sequence: DG.Column<string>): string[] {\n const stats = getStats(sequence, 1, splitterAsHelm);\n return Object.keys(stats.freq);\n}\n\n\n//name: Sequence Similarity Search\n//tags: viewer\n//meta.icon: files/icons/sequence-similarity-viewer.svg\n//output: viewer result\nexport function similaritySearchViewer(): SequenceSimilarityViewer {\n return new SequenceSimilarityViewer();\n}\n\n//top-menu: Bio | Search | Similarity Search\n//name: similaritySearch\n//description: finds the most similar sequence\n//output: viewer result\nexport function similaritySearchTopMenu(): void {\n const view = (grok.shell.v as DG.TableView);\n const viewer = view.addViewer('Sequence Similarity Search');\n view.dockManager.dock(viewer, 'down');\n}\n\n//name: Sequence Diversity Search\n//tags: viewer\n//meta.icon: files/icons/sequence-diversity-viewer.svg\n//output: viewer result\nexport function diversitySearchViewer(): SequenceDiversityViewer {\n return new SequenceDiversityViewer();\n}\n\n//top-menu: Bio | Search | Diversity Search\n//name: diversitySearch\n//description: finds the most diverse molecules\n//output: viewer result\nexport function diversitySearchTopMenu() {\n const view = (grok.shell.v as DG.TableView);\n const viewer = view.addViewer('Sequence Diversity Search');\n view.dockManager.dock(viewer, 'down');\n}\n\n//top-menu: Bio | Substructure Search ...\n//name: bioSubstructureSearch\nexport function bioSubstructureSearch(): void {\n const col = getMacromoleculeColumn();\n substructureSearchDialog(col);\n}\n\n//name: saveAsFasta\n//description: As FASTA...\n//tags: fileExporter\nexport function saveAsFasta() {\n saveAsFastaUI();\n}\n\n//name: BioSubstructureFilter\n//description: Substructure filter for macromolecules\n//tags: filter\n//output: filter result\n//meta.semType: Macromolecule\nexport function bioSubstructureFilter(): BioSubstructureFilter {\n return new BioSubstructureFilter();\n}\n","import * as DG from 'datagrok-api/dg';\nimport { getSplitterForColumn } from './macromolecule';\nexport function splitAlignedSequences(sequenceColumn) {\n const splitter = getSplitterForColumn(sequenceColumn);\n const getCol = (index) => { var _a; return (_a = columnList[index]) !== null && _a !== void 0 ? _a : null; };\n const createCol = (index) => {\n const positionCol = resultDf.columns.addNewString((index + 1).toString());\n columnList.push(positionCol);\n return positionCol;\n };\n const columnList = [];\n const rowCount = sequenceColumn.length;\n const resultDf = DG.DataFrame.create(rowCount);\n for (let rowIndex = 0; rowIndex < rowCount; ++rowIndex) {\n const sequence = sequenceColumn.get(rowIndex);\n if (sequence == null)\n continue;\n const currentMonomerList = splitter(sequence);\n currentMonomerList.forEach((monomer, positionIndex) => {\n const col = getCol(positionIndex) || createCol(positionIndex);\n col.set(rowIndex, monomer || '-', false);\n });\n }\n return resultDf;\n}\n//# sourceMappingURL=splitter.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 {getMonomericMols} from '../calculations/monomerLevelMols';\nimport {updateDivInnerHTML} from '../utils/ui-utils';\nimport {delay} from '@datagrok-libraries/utils/src/test';\nimport {TAGS as bioTAGS, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const MONOMER_MOLS_COL = 'monomeric-mols';\n\nexport const enum MONOMERIC_COL_TAGS {\n MONOMERIC_MOLS = 'monomeric-mols',\n LAST_INVALIDATED_VERSION = 'last-invalidated-version',\n MONOMERS_DICT = 'monomers-dict'\n}\n\nconst SUBSTR_HELM_COL_NAME = 'substr_helm';\n\n/**\n * Searches substructure in each row of Macromolecule column\n *\n * @param {DG.column} col Column with 'Macromolecule' semantic type\n */\nexport function substructureSearchDialog(col: DG.Column<string>): void {\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(bioTAGS.separator);\n // const notations = [NOTATION.FASTA, NOTATION.SEPARATOR, NOTATION.HELM];\n\n const substructureInput = ui.textInput('Substructure', '');\n\n const editHelmLink = ui.link('Edit helm', async () => {\n updateDivInnerHTML(inputsDiv, grid.root);\n await ui.tools.waitForElementInDom(grid.root);\n setTimeout(() => {\n grid.cell(SUBSTR_HELM_COL_NAME, 0).element.children[0].dispatchEvent(\n new KeyboardEvent('keydown', {key: 'Enter'}));\n }, 100);\n });\n\n const df = DG.DataFrame.create(1);\n df.columns.addNewString(SUBSTR_HELM_COL_NAME).init((i) => '');\n df.col(SUBSTR_HELM_COL_NAME)!.semType = col.semType;\n df.col(SUBSTR_HELM_COL_NAME)!.setTag(DG.TAGS.UNITS, NOTATION.HELM);\n const grid = df.plot.grid();\n const separatorInput = ui.textInput('Separator', separator);\n\n const inputsDiv = ui.div();\n\n const inputs = units === NOTATION.HELM ? ui.divV([editHelmLink]) :\n units === NOTATION.SEPARATOR ? ui.inputs([substructureInput, separatorInput]) :\n ui.inputs([substructureInput]);\n\n updateDivInnerHTML(inputsDiv, inputs);\n\n ui.dialog('Substructure Search')\n .add(ui.divV([\n ui.divText(`Notation: ${units}`),\n inputsDiv\n ]))\n .onOK(async () => {\n let substructure = units === NOTATION.HELM ? df.get(SUBSTR_HELM_COL_NAME, 0) : substructureInput.value;\n if (units === NOTATION.SEPARATOR && separatorInput.value !== separator && separatorInput.value !== '')\n substructure = substructure.replaceAll(separatorInput.value, separator);\n const matchesColName = `Matches: ${substructure}`;\n const colExists = col.dataFrame.columns.names()\n .filter((it) => it.toLocaleLowerCase() === matchesColName.toLocaleLowerCase()).length > 0;\n if (!colExists) {\n let matches: DG.BitSet;\n if (units === NOTATION.HELM)\n matches = await helmSubstructureSearch(substructure, col);\n else\n matches = linearSubstructureSearch(substructure, col);\n col.dataFrame.columns.add(DG.Column.fromBitSet(matchesColName, matches));\n } else { grok.shell.warning(`Search ${substructure} is already performed`); }\n })\n .show();\n}\n\nexport function linearSubstructureSearch(substructure: string, col: DG.Column<string>, separator?: string): DG.BitSet {\n const re = separator ? prepareSubstructureRegex(substructure, separator) : substructure;\n const resultArray = DG.BitSet.create(col.length);\n for (let i = 0; i < col.length; i++) {\n const macromolecule: string = col.get(i)!;\n if (macromolecule.match(re) || macromolecule === substructure)\n resultArray.set(i, true, false);\n }\n return resultArray;\n}\n\nfunction prepareSubstructureRegex(substructure: string, separator: string) {\n const char = `${separator}`.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n const startsWithSep = substructure.charAt(0) === separator;\n const endsWithSep = substructure.charAt(substructure.length - 1) === separator;\n const substrWithoutSep = substructure.replace(new RegExp(`^${char}|${char}$`, 'g'), '');\n const re = startsWithSep ?\n endsWithSep ? `${char}${substrWithoutSep}${char}` :\n `${char}${substrWithoutSep}${char}|${char}${substrWithoutSep}$` :\n endsWithSep ? `^${substrWithoutSep}${char}|${char}${substrWithoutSep}${char}` :\n `^${substrWithoutSep}${char}|${char}${substrWithoutSep}${char}|${char}${substrWithoutSep}$`;\n return re;\n}\n\nexport async function helmSubstructureSearch(substructure: string, col: DG.Column<string>): Promise<DG.BitSet> {\n if (col.version !== col.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION])\n await invalidateMols(col, true);\n const substructureCol: DG.Column<string> = DG.Column.string('helm', 1).init((i) => substructure);\n substructureCol.setTag(DG.TAGS.UNITS, NOTATION.HELM);\n const substructureMolsCol =\n await getMonomericMols(substructureCol, true, col.temp[MONOMERIC_COL_TAGS.MONOMERS_DICT]);\n const matchesCol = await grok.functions.call('Chem:searchSubstructure', {\n molStringsColumn: col.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS],\n molString: substructureMolsCol.get(0),\n molBlockFailover: '',\n });\n return matchesCol.get(0);\n}\n\nexport async function invalidateMols(col: DG.Column<string>, pattern: boolean) {\n const progressBar = DG.TaskBarProgressIndicator.create(`Invalidating molfiles for ${col.name}`);\n await delay(10);\n const monomersDict = new Map();\n const monomericMolsCol = await getMonomericMols(col, pattern, monomersDict);\n col.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS] = monomericMolsCol;\n col.temp[MONOMERIC_COL_TAGS.MONOMERS_DICT] = monomersDict;\n col.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION] = col.version;\n progressBar.close();\n}\n","export enum COLUMNS_NAMES {\n SPLIT_COL = '~split',\n ACTIVITY = '~activity',\n ACTIVITY_SCALED = 'activity_scaled',\n ALIGNED_SEQUENCE = '~aligned_sequence',\n AMINO_ACID_RESIDUE = 'AAR',\n POSITION = 'Pos',\n P_VALUE = 'pValue',\n MEAN_DIFFERENCE = 'Mean difference',\n}\n\nexport enum TAGS {\n AAR = 'AAR',\n POSITION = 'Pos',\n SELECTION = 'selection',\n}\n\nexport enum SEM_TYPES {\n MONOMER = 'Monomer',\n MACROMOLECULE_DIFFERENCE = 'MacromoleculeDifference',\n ACTIVITY = 'activity',\n ACTIVITY_SCALED = 'activityScaled'\n}\n\nexport const MSA = 'MSA';\n\nexport const STATS = 'stats';\n\nexport const EMBEDDING_STATUS = 'embeddingStatus';\n\nexport const PEPTIDES_ANALYSIS = 'isPeptidesAnalysis';\n\nexport enum FLAGS {\n CELL_CHANGING = 'isCellChanging',\n}\n\nexport const aarGroups = {\n 'R': 'PC', 'H': 'PC', 'K': 'PC',\n 'D': 'NC', 'E': 'NC',\n 'S': 'U', 'T': 'U', 'N': 'U', 'Q': 'U',\n 'C': 'SC', 'U': 'SC', 'G': 'SC', 'P': 'SC',\n 'A': 'H', 'V': 'H', 'I': 'H', 'L': 'H', 'M': 'H', 'F': 'H', 'Y': 'H', 'W': 'H',\n '-': '-',\n};\n\nexport const groupDescription: { [key: string]: { 'description': string, aminoAcids: string[] } } = {\n 'PC': {'description': 'Positive Amino Acids, with Electrically Charged Side Chains', 'aminoAcids': ['R', 'H', 'K']},\n 'NC': {'description': 'Negative Amino Acids, with Electrically Charged Side Chains', 'aminoAcids': ['D', 'E']},\n 'U': {'description': 'Amino Acids with Polar Uncharged Side Chains', 'aminoAcids': ['S', 'T', 'N', 'Q']},\n 'SC': {'description': 'Special Cases', 'aminoAcids': ['C', 'U', 'G', 'P']},\n 'H': {\n 'description': 'Amino Acids with Hydrophobic Side Chain',\n 'aminoAcids': ['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'],\n },\n '-': {'description': 'Unknown Amino Acid', 'aminoAcids': ['-']},\n};\n\nexport namespace PEPSEA {\n export const SEPARATOR = '.';\n}\n\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nimport $ from 'cash-dom';\nimport {Subscription} from 'rxjs';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\n\n\nlet convertDialog: DG.Dialog | null = null;\nlet convertDialogSubs: Subscription[] = [];\n\n/**\n * Converts notations of a Macromolecule column\n *\n * @param {DG.column} col Column with 'Macromolecule' semantic type\n */\nexport function convert(col: DG.Column): void {\n const converter = new NotationConverter(col);\n const currentNotation: NOTATION = converter.notation;\n //TODO: read all notations\n const notations = [\n NOTATION.FASTA,\n NOTATION.SEPARATOR,\n NOTATION.HELM\n ];\n const separatorArray = ['-', '.', '/'];\n const filteredNotations = notations.filter((e) => e !== currentNotation);\n const targetNotationInput = ui.choiceInput('Convert to', filteredNotations[0], filteredNotations);\n\n const separatorInput = ui.choiceInput('Separator', separatorArray[0], separatorArray);\n\n // hide the separator input for non-SEPARATOR target notations\n const toggleSeparator = () => {\n if (targetNotationInput.value !== NOTATION.SEPARATOR)\n $(separatorInput.root).hide();\n else\n $(separatorInput.root).show();\n };\n\n // set correct visibility on init\n toggleSeparator();\n\n targetNotationInput.onChanged(() => {\n toggleSeparator();\n });\n\n if (convertDialog == null) {\n convertDialog = ui.dialog('Convert Sequence Notation')\n .add(ui.div([\n ui.divText(\n 'Current notation: ' + currentNotation,\n {\n style: {\n 'text-align': 'center',\n 'font-weight': 'bold',\n 'font-size': '14px',\n 'padding': '5px',\n }\n }\n ),\n targetNotationInput.root,\n separatorInput.root\n ]))\n .onOK(async () => {\n const targetNotation = targetNotationInput.value as NOTATION;\n const separator: string | null = separatorInput.value;\n\n await convertDo(col, targetNotation, separator);\n })\n .show({x: 350, y: 100});\n\n convertDialogSubs.push(convertDialog.onClose.subscribe((value) => {\n convertDialogSubs.forEach((s) => { s.unsubscribe(); });\n convertDialogSubs = [];\n convertDialog = null;\n }));\n }\n}\n\n/** Creates a new column with converted sequences and detects its semantic type */\nexport async function convertDo(\n srcCol: DG.Column, targetNotation: NOTATION, separator: string | null\n): Promise<DG.Column> {\n const converter = new NotationConverter(srcCol);\n const newColumn = converter.convert(targetNotation, separator);\n srcCol.dataFrame.columns.add(newColumn);\n\n // Call detector directly to escape some error on detectSemanticTypes\n const semType = await grok.functions.call('Bio:detectMacromolecule', {col: newColumn});\n if (semType)\n newColumn.semType = semType;\n\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(srcCol.dataFrame);\n\n return newColumn;\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 {Observable, Subject} from 'rxjs';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types/index';\nimport {\n createJsonMonomerLibFromSdf,\n expectedMonomerData,\n IMonomerLibHelper\n} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\n\n// -- Monomer libraries --\nexport const LIB_STORAGE_NAME = 'Libraries';\nexport const LIB_PATH = 'System:AppData/Bio/libraries/';\nexport const LIB_DEFAULT: { [fileName: string]: string } = {'HELMCoreLibrary.json': 'HELMCoreLibrary.json'};\n\nexport class MonomerLib implements IMonomerLib {\n private _monomers: { [type: string]: { [name: string]: Monomer } } = {};\n private _onChanged = new Subject<any>();\n\n constructor(monomers: { [type: string]: { [name: string]: Monomer } }) {\n this._monomers = monomers;\n }\n\n getMonomer(monomerType: string, monomerName: string): Monomer | null {\n if (monomerType in this._monomers! && monomerName in this._monomers![monomerType])\n return this._monomers![monomerType][monomerName];\n else\n return null;\n }\n\n getTypes(): string[] {\n return Object.keys(this._monomers);\n }\n\n getMonomerMolsByType(type: string): { [symbol: string]: string } {\n const res: { [symbol: string]: string } = {};\n\n Object.keys(this._monomers[type]).forEach((monomerSymbol) => {\n res[monomerSymbol] = this._monomers[type][monomerSymbol].molfile;\n });\n\n return res;\n }\n\n getMonomerNamesByType(type: string): string[] {\n return Object.keys(this._monomers[type]);\n }\n\n get onChanged(): Observable<any> {\n return this._onChanged;\n }\n\n private _updateInt(lib: IMonomerLib): void {\n const typesNew = lib.getTypes();\n const types = this.getTypes();\n\n typesNew.forEach((type) => {\n //could possibly rewrite -> TODO: check duplicated monomer symbol\n\n if (!types.includes(type))\n this._monomers![type] = {};\n\n const monomers = lib.getMonomerNamesByType(type);\n monomers.forEach((monomerName) => {\n this._monomers[type][monomerName] = lib.getMonomer(type, monomerName)!;\n });\n });\n }\n\n public update(lib: IMonomerLib): void {\n this._updateInt(lib);\n this._onChanged.next();\n }\n\n public updateLibs(libList: IMonomerLib[], reload: boolean = false): void {\n if (reload) this._monomers = {};\n for (const lib of libList) this._updateInt(lib);\n this._onChanged.next();\n }\n\n public clear(): void {\n this._monomers = {};\n this._onChanged.next();\n }\n}\n\nexport class MonomerLibHelper implements IMonomerLibHelper {\n private readonly _monomerLib: MonomerLib = new MonomerLib({});\n\n /** Protect constructor to prevent multiple instantiation. */\n protected constructor() {}\n\n /** Singleton monomer library */\n getBioLib(): IMonomerLib {\n return this._monomerLib;\n }\n\n private loadLibrariesPromise: Promise<void> = Promise.resolve();\n\n /** Loads libraries based on settings in user storage {@link LIB_STORAGE_NAME}\n * @param {boolean} reload Clean {@link monomerLib} before load libraries [false]\n */\n async loadLibraries(reload: boolean = false): Promise<void> {\n return this.loadLibrariesPromise = this.loadLibrariesPromise.then(async () => {\n const userLibrariesSettings: string[] = Object.keys(await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true));\n const libs: IMonomerLib[] = await Promise.all(userLibrariesSettings.map((libFileName) => {\n //TODO handle whether files are in place\n return this.readLibrary(LIB_PATH, libFileName);\n }));\n this._monomerLib.updateLibs(libs, reload);\n });\n }\n\n /** Reads library from file shares, handles .json and .sdf */\n async readLibrary(path: string, fileName: string): Promise<IMonomerLib> {\n let data: any[] = [];\n let file;\n let dfSdf;\n const fileSource = new DG.FileSource(path);\n if (fileName.endsWith('.sdf')) {\n const funcList: DG.Func[] = DG.Func.find({package: 'Chem', name: 'importSdf'});\n if (funcList.length === 1) {\n file = await fileSource.readAsBytes(fileName);\n dfSdf = await grok.functions.call('Chem:importSdf', {bytes: file});\n data = createJsonMonomerLibFromSdf(dfSdf[0]);\n } else {\n grok.shell.warning('Chem package is not installed');\n }\n } else {\n const file = await fileSource.readAsText(fileName);\n data = JSON.parse(file);\n }\n\n const monomers: { [type: string]: { [name: string]: Monomer } } = {};\n const types: string[] = [];\n //group monomers by their type\n data.forEach((monomer) => {\n const monomerAdd: Monomer = {\n 'symbol': monomer['symbol'],\n 'name': monomer['name'],\n 'naturalAnalog': monomer['naturalAnalog'],\n 'molfile': monomer['molfile'],\n 'rgroups': monomer['rgroups'],\n 'polymerType': monomer['polymerType'],\n 'monomerType': monomer['monomerType'],\n 'data': {}\n };\n\n Object.keys(monomer).forEach((prop) => {\n if (!expectedMonomerData.includes(prop))\n monomerAdd.data[prop] = monomer[prop];\n });\n\n if (!types.includes(monomer['polymerType'])) {\n monomers[monomer['polymerType']] = {};\n types.push(monomer['polymerType']);\n }\n\n monomers[monomer['polymerType']][monomer['symbol']] = monomerAdd;\n });\n\n return new MonomerLib(monomers);\n }\n\n // -- Instance singleton --\n private static _instance: MonomerLibHelper | null = null;\n\n public static get instance(): MonomerLibHelper {\n if (!MonomerLibHelper._instance) MonomerLibHelper._instance = new MonomerLibHelper();\n return MonomerLibHelper._instance;\n }\n}\n","const r = Symbol(\"Comlink.proxy\"), H = Symbol(\"Comlink.endpoint\"), C = Symbol(\"Comlink.releaseProxy\"), y = Symbol(\"Comlink.thrown\"), Y = (l) => typeof l == \"object\" && l !== null || typeof l == \"function\", k = {\n canHandle: (l) => Y(l) && l[r],\n serialize(l) {\n const { port1: c, port2: b } = new MessageChannel();\n return R(l, c), [b, [b]];\n },\n deserialize(l) {\n return l.start(), K(l);\n }\n}, I = {\n canHandle: (l) => Y(l) && y in l,\n serialize({ value: l }) {\n let c;\n return l instanceof Error ? c = {\n isError: !0,\n value: {\n message: l.message,\n name: l.name,\n stack: l.stack\n }\n } : c = { isError: !1, value: l }, [c, []];\n },\n deserialize(l) {\n throw l.isError ? Object.assign(new Error(l.value.message), l.value) : l.value;\n }\n}, S = /* @__PURE__ */ new Map([\n [\"proxy\", k],\n [\"throw\", I]\n]);\nfunction R(l, c = self) {\n c.addEventListener(\"message\", function b(t) {\n if (!t || !t.data)\n return;\n const { id: i, type: e, path: Z } = Object.assign({ path: [] }, t.data), d = (t.data.argumentList || []).map(u);\n let m;\n try {\n const n = Z.slice(0, -1).reduce((s, p) => s[p], l), a = Z.reduce((s, p) => s[p], l);\n switch (e) {\n case \"GET\":\n m = a;\n break;\n case \"SET\":\n n[Z.slice(-1)[0]] = u(t.data.value), m = !0;\n break;\n case \"APPLY\":\n m = a.apply(n, d);\n break;\n case \"CONSTRUCT\":\n {\n const s = new a(...d);\n m = z(s);\n }\n break;\n case \"ENDPOINT\":\n {\n const { port1: s, port2: p } = new MessageChannel();\n R(l, p), m = U(s, [s]);\n }\n break;\n case \"RELEASE\":\n m = void 0;\n break;\n default:\n return;\n }\n } catch (n) {\n m = { value: n, [y]: 0 };\n }\n Promise.resolve(m).catch((n) => ({ value: n, [y]: 0 })).then((n) => {\n const [a, s] = o(n);\n c.postMessage(Object.assign(Object.assign({}, a), { id: i }), s), e === \"RELEASE\" && (c.removeEventListener(\"message\", b), V(c));\n });\n }), c.start && c.start();\n}\nfunction N(l) {\n return l.constructor.name === \"MessagePort\";\n}\nfunction V(l) {\n N(l) && l.close();\n}\nfunction K(l, c) {\n return X(l, [], c);\n}\nfunction h(l) {\n if (l)\n throw new Error(\"Proxy has been released and is not useable\");\n}\nfunction X(l, c = [], b = function() {\n}) {\n let t = !1;\n const i = new Proxy(b, {\n get(e, Z) {\n if (h(t), Z === C)\n return () => G(l, {\n type: \"RELEASE\",\n path: c.map((d) => d.toString())\n }).then(() => {\n V(l), t = !0;\n });\n if (Z === \"then\") {\n if (c.length === 0)\n return { then: () => i };\n const d = G(l, {\n type: \"GET\",\n path: c.map((m) => m.toString())\n }).then(u);\n return d.then.bind(d);\n }\n return X(l, [...c, Z]);\n },\n set(e, Z, d) {\n h(t);\n const [m, n] = o(d);\n return G(l, {\n type: \"SET\",\n path: [...c, Z].map((a) => a.toString()),\n value: m\n }, n).then(u);\n },\n apply(e, Z, d) {\n h(t);\n const m = c[c.length - 1];\n if (m === H)\n return G(l, {\n type: \"ENDPOINT\"\n }).then(u);\n if (m === \"bind\")\n return X(l, c.slice(0, -1));\n const [n, a] = W(d);\n return G(l, {\n type: \"APPLY\",\n path: c.map((s) => s.toString()),\n argumentList: n\n }, a).then(u);\n },\n construct(e, Z) {\n h(t);\n const [d, m] = W(Z);\n return G(l, {\n type: \"CONSTRUCT\",\n path: c.map((n) => n.toString()),\n argumentList: d\n }, m).then(u);\n }\n });\n return i;\n}\nfunction J(l) {\n return Array.prototype.concat.apply([], l);\n}\nfunction W(l) {\n const c = l.map(o);\n return [c.map((b) => b[0]), J(c.map((b) => b[1]))];\n}\nconst g = /* @__PURE__ */ new WeakMap();\nfunction U(l, c) {\n return g.set(l, c), l;\n}\nfunction z(l) {\n return Object.assign(l, { [r]: !0 });\n}\nfunction o(l) {\n for (const [c, b] of S)\n if (b.canHandle(l)) {\n const [t, i] = b.serialize(l);\n return [\n {\n type: \"HANDLER\",\n name: c,\n value: t\n },\n i\n ];\n }\n return [\n {\n type: \"RAW\",\n value: l\n },\n g.get(l) || []\n ];\n}\nfunction u(l) {\n switch (l.type) {\n case \"HANDLER\":\n return S.get(l.name).deserialize(l.value);\n case \"RAW\":\n return l.value;\n }\n}\nfunction G(l, c, b) {\n return new Promise((t) => {\n const i = T();\n l.addEventListener(\"message\", function e(Z) {\n !Z.data || !Z.data.id || Z.data.id !== i || (l.removeEventListener(\"message\", e), t(Z.data));\n }), l.start && l.start(), l.postMessage(Object.assign({ id: i }, c), b);\n });\n}\nfunction T() {\n return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join(\"-\");\n}\nconst x = \"KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0ICQ9U3ltYm9sKCJDb21saW5rLnByb3h5IiksQT1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxSPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSx5PVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxfPWU9PnR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGx8fHR5cGVvZiBlPT0iZnVuY3Rpb24iLEw9e2NhbkhhbmRsZTplPT5fKGUpJiZlWyRdLHNlcmlhbGl6ZShlKXtjb25zdHtwb3J0MTpyLHBvcnQyOml9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gdyhlLHIpLFtpLFtpXV19LGRlc2VyaWFsaXplKGUpe3JldHVybiBlLnN0YXJ0KCksQyhlKX19LE89e2NhbkhhbmRsZTplPT5fKGUpJiZ5IGluIGUsc2VyaWFsaXplKHt2YWx1ZTplfSl7bGV0IHI7cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj9yPXtpc0Vycm9yOiEwLHZhbHVlOnttZXNzYWdlOmUubWVzc2FnZSxuYW1lOmUubmFtZSxzdGFjazplLnN0YWNrfX06cj17aXNFcnJvcjohMSx2YWx1ZTplfSxbcixbXV19LGRlc2VyaWFsaXplKGUpe3Rocm93IGUuaXNFcnJvcj9PYmplY3QuYXNzaWduKG5ldyBFcnJvcihlLnZhbHVlLm1lc3NhZ2UpLGUudmFsdWUpOmUudmFsdWV9fSxFPW5ldyBNYXAoW1sicHJveHkiLExdLFsidGhyb3ciLE9dXSk7ZnVuY3Rpb24gdyhlLHI9c2VsZil7ci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBpKHMpe2lmKCFzfHwhcy5kYXRhKXJldHVybjtjb25zdHtpZDpvLHR5cGU6YSxwYXRoOm59PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LHMuZGF0YSksdT0ocy5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChtKTtsZXQgbDt0cnl7Y29uc3QgYz1uLnNsaWNlKDAsLTEpLnJlZHVjZSgoZCxoKT0+ZFtoXSxlKSxmPW4ucmVkdWNlKChkLGgpPT5kW2hdLGUpO3N3aXRjaChhKXtjYXNlIkdFVCI6bD1mO2JyZWFrO2Nhc2UiU0VUIjpjW24uc2xpY2UoLTEpWzBdXT1tKHMuZGF0YS52YWx1ZSksbD0hMDticmVhaztjYXNlIkFQUExZIjpsPWYuYXBwbHkoYyx1KTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2NvbnN0IGQ9bmV3IGYoLi4udSk7bD16KGQpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntjb25zdHtwb3J0MTpkLHBvcnQyOmh9PW5ldyBNZXNzYWdlQ2hhbm5lbDt3KGUsaCksbD1OKGQsW2RdKX1icmVhaztjYXNlIlJFTEVBU0UiOmw9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChjKXtsPXt2YWx1ZTpjLFt5XTowfX1Qcm9taXNlLnJlc29sdmUobCkuY2F0Y2goYz0+KHt2YWx1ZTpjLFt5XTowfSkpLnRoZW4oYz0+e2NvbnN0W2YsZF09UyhjKTtyLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxmKSx7aWQ6b30pLGQpLGE9PT0iUkVMRUFTRSImJihyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLEYocikpfSl9KSxyLnN0YXJ0JiZyLnN0YXJ0KCl9ZnVuY3Rpb24gVChlKXtyZXR1cm4gZS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBGKGUpe1QoZSkmJmUuY2xvc2UoKX1mdW5jdGlvbiBDKGUscil7cmV0dXJuIGIoZSxbXSxyKX1mdW5jdGlvbiBwKGUpe2lmKGUpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBiKGUscj1bXSxpPWZ1bmN0aW9uKCl7fSl7bGV0IHM9ITE7Y29uc3Qgbz1uZXcgUHJveHkoaSx7Z2V0KGEsbil7aWYocChzKSxuPT09UilyZXR1cm4oKT0+ZyhlLHt0eXBlOiJSRUxFQVNFIixwYXRoOnIubWFwKHU9PnUudG9TdHJpbmcoKSl9KS50aGVuKCgpPT57RihlKSxzPSEwfSk7aWYobj09PSJ0aGVuIil7aWYoci5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5vfTtjb25zdCB1PWcoZSx7dHlwZToiR0VUIixwYXRoOnIubWFwKGw9PmwudG9TdHJpbmcoKSl9KS50aGVuKG0pO3JldHVybiB1LnRoZW4uYmluZCh1KX1yZXR1cm4gYihlLFsuLi5yLG5dKX0sc2V0KGEsbix1KXtwKHMpO2NvbnN0W2wsY109Uyh1KTtyZXR1cm4gZyhlLHt0eXBlOiJTRVQiLHBhdGg6Wy4uLnIsbl0ubWFwKGY9PmYudG9TdHJpbmcoKSksdmFsdWU6bH0sYykudGhlbihtKX0sYXBwbHkoYSxuLHUpe3Aocyk7Y29uc3QgbD1yW3IubGVuZ3RoLTFdO2lmKGw9PT1BKXJldHVybiBnKGUse3R5cGU6IkVORFBPSU5UIn0pLnRoZW4obSk7aWYobD09PSJiaW5kIilyZXR1cm4gYihlLHIuc2xpY2UoMCwtMSkpO2NvbnN0W2MsZl09TSh1KTtyZXR1cm4gZyhlLHt0eXBlOiJBUFBMWSIscGF0aDpyLm1hcChkPT5kLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpjfSxmKS50aGVuKG0pfSxjb25zdHJ1Y3QoYSxuKXtwKHMpO2NvbnN0W3UsbF09TShuKTtyZXR1cm4gZyhlLHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ci5tYXAoYz0+Yy50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6dX0sbCkudGhlbihtKX19KTtyZXR1cm4gb31mdW5jdGlvbiBEKGUpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpfWZ1bmN0aW9uIE0oZSl7Y29uc3Qgcj1lLm1hcChTKTtyZXR1cm5bci5tYXAoaT0+aVswXSksRChyLm1hcChpPT5pWzFdKSldfWNvbnN0IFA9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gTihlLHIpe3JldHVybiBQLnNldChlLHIpLGV9ZnVuY3Rpb24geihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHtbJF06ITB9KX1mdW5jdGlvbiBTKGUpe2Zvcihjb25zdFtyLGldb2YgRSlpZihpLmNhbkhhbmRsZShlKSl7Y29uc3RbcyxvXT1pLnNlcmlhbGl6ZShlKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6cix2YWx1ZTpzfSxvXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6ZX0sUC5nZXQoZSl8fFtdXX1mdW5jdGlvbiBtKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiSEFORExFUiI6cmV0dXJuIEUuZ2V0KGUubmFtZSkuZGVzZXJpYWxpemUoZS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBlLnZhbHVlfX1mdW5jdGlvbiBnKGUscixpKXtyZXR1cm4gbmV3IFByb21pc2Uocz0+e2NvbnN0IG89VSgpO2UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gYShuKXshbi5kYXRhfHwhbi5kYXRhLmlkfHxuLmRhdGEuaWQhPT1vfHwoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixhKSxzKG4uZGF0YSkpfSksZS5zdGFydCYmZS5zdGFydCgpLGUucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7aWQ6b30sciksaSl9KX1mdW5jdGlvbiBVKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1jb25zdCBXPWFzeW5jKCk9PldlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDUsMSw5NiwwLDEsMTIzLDMsMiwxLDAsMTAsMTAsMSw4LDAsNjUsMCwyNTMsMTUsMjUzLDk4LDExXSkpLHg9ImVhZ2VyIixrPSJsYXp5IixqPXtzc3c6WyJzaW1kIl0sbWluaW1hcDI6WyJzaW1kIl19LHQ9e3Rvb2xzOltdLGNvbmZpZzp7fSxmaWxlczpbXSxiYXNlOnt9LGZzOnt9LGFzeW5jIGluaXQoKXtpZih0LnRvb2xzLmxlbmd0aD09PTApdGhyb3ciRXhwZWN0aW5nIGF0IGxlYXN0IDEgdG9vbC4iO2lmKG5ldyBTZXQodC50b29scy5tYXAocj0+YCR7ci50b29sfS8ke3IucHJvZ3JhbXx8ci50b29sfWApKS5zaXplIT09dC50b29scy5sZW5ndGgpdGhyb3ciRm91bmQgZHVwbGljYXRlIHRvb2xzOyBjYW4gb25seSBoYXZlIGVhY2ggdG9vbC9wcm9ncmFtIGNvbWJpbmF0aW9uIGF0IG1vc3Qgb25jZS4iO2lmKHQuYmFzZT10LnRvb2xzLmZpbmQocj0+ci5yZWluaXQhPT0hMCksIXQuYmFzZSl0aHJvdyJDb3VsZCBub3QgZmluZCBhIHRvb2wgd2l0aCBgcmVpbml0OiBmYWxzZWAgdG8gdXNlIGFzIHRoZSBiYXNlIG1vZHVsZS4gVG8gZml4IHRoaXMgaXNzdWUsIGluY2x1ZGUgdGhlIHRvb2wgYGJhc2UvMS4wLjBgIHdoZW4gaW5pdGlhbGl6aW5nIEFpb2xpLiI7cmV0dXJuIHQuYmFzZS5pc0Jhc2VNb2R1bGU9ITAsYXdhaXQgdGhpcy5fc2V0dXAodC5iYXNlKSxhd2FpdCB0aGlzLl9pbml0TW9kdWxlcygpLHQuX2xvZygiUmVhZHkiKSwhMH0sYXN5bmMgX2luaXRNb2R1bGVzKCl7YXdhaXQgUHJvbWlzZS5hbGwodC50b29scy5tYXAodGhpcy5fc2V0dXApKSxhd2FpdCB0aGlzLl9zZXR1cEZTKCl9LG1vdW50KGU9W10pe2NvbnN0IHI9YCR7dC5jb25maWcuZGlyU2hhcmVkfSR7dC5jb25maWcuZGlyRGF0YX1gLGk9YCR7dC5jb25maWcuZGlyU2hhcmVkfSR7dC5jb25maWcuZGlyTW91bnRlZH1gO2xldCBzPVtdLG89W10sYT1bXTshQXJyYXkuaXNBcnJheShlKSYmIShlIGluc3RhbmNlb2YgRmlsZUxpc3QpJiYoZT1bZV0pLHQuX2xvZyhgTW91bnRpbmcgJHtlLmxlbmd0aH0gZmlsZXNgKTtmb3IobGV0IG4gb2YgZSl7aWYobiBpbnN0YW5jZW9mIEZpbGV8fChuPT1udWxsP3ZvaWQgMDpuLmRhdGEpaW5zdGFuY2VvZiBCbG9iJiZuLm5hbWV8fHR5cGVvZihuPT1udWxsP3ZvaWQgMDpuLmRhdGEpPT0ic3RyaW5nIiYmbi5uYW1lKXR5cGVvZihuPT1udWxsP3ZvaWQgMDpuLmRhdGEpPT0ic3RyaW5nIiYmKG4uZGF0YT1uZXcgQmxvYihbbi5kYXRhXSx7dHlwZToidGV4dC9wbGFpbiJ9KSkscy5wdXNoKG4pO2Vsc2UgaWYobi5uYW1lJiZuLnVybClvLnB1c2gobik7ZWxzZSBpZih0eXBlb2Ygbj09InN0cmluZyImJm4uc3RhcnRzV2l0aCgiaHR0cCIpKW49e3VybDpuLG5hbWU6bi5zcGxpdCgiLy8iKS5wb3AoKS5yZXBsYWNlKC9cLy9nLCItIil9LG8ucHVzaChuKTtlbHNlIHRocm93J0Nhbm5vdCBtb3VudCBmaWxlKHMpIHNwZWNpZmllZC4gTXVzdCBiZSBhIEZpbGUsIEJsb2IsIGEgVVJMIHN0cmluZywgb3IgeyBuYW1lOiAiZmlsZS50eHQiLCBkYXRhOiAic3RyaW5nIiB9Lic7YS5wdXNoKG4ubmFtZSl9dHJ5e3QuZnMudW5tb3VudChpKX1jYXRjaHt9Zm9yKGxldCBuIG9mIG8pdC5mcy5jcmVhdGVMYXp5RmlsZShyLG4ubmFtZSxuLnVybCwhMCwhMCk7cmV0dXJuIHQuZmlsZXM9dC5maWxlcy5jb25jYXQocyksdC5iYXNlLm1vZHVsZS5GUy5tb3VudCh0LmJhc2UubW9kdWxlLldPUktFUkZTLHtmaWxlczp0LmZpbGVzLmZpbHRlcihuPT5uIGluc3RhbmNlb2YgRmlsZSksYmxvYnM6dC5maWxlcy5maWx0ZXIobj0+KG49PW51bGw/dm9pZCAwOm4uZGF0YSlpbnN0YW5jZW9mIEJsb2IpfSxpKSxzLm1hcChuPT57Y29uc3QgdT1gJHtpfS8ke24ubmFtZX1gLGw9YCR7cn0vJHtuLm5hbWV9YDt0cnl7dC5mcy51bmxpbmsobCl9Y2F0Y2h7fXQuX2xvZyhgQ3JlYXRpbmcgc3ltbGluazogJHtsfSAtLT4gJHt1fWApLHQuZnMuc3ltbGluayh1LGwpfSksYS5tYXAobj0+YCR7cn0vJHtufWApfSxhc3luYyBleGVjKGUscj1udWxsKXtpZih0Ll9sb2coYEV4ZWN1dGluZyAlYyR7ZX0lYyBhcmdzPSR7cn1gLCJjb2xvcjpkYXJrYmx1ZTsgZm9udC13ZWlnaHQ6Ym9sZCIsIiIpLCFlKXRocm93IkV4cGVjdGluZyBhIGNvbW1hbmQiO2xldCBpPWU7cj09bnVsbCYmKHI9ZS5zcGxpdCgiICIpLGk9ci5zaGlmdCgpKTtjb25zdCBzPXQudG9vbHMuZmluZChhPT57dmFyIHU7bGV0IG49aTtyZXR1cm4oKHU9YT09bnVsbD92b2lkIDA6YS5mZWF0dXJlcyk9PW51bGw/dm9pZCAwOnUuc2ltZCk9PT0hMCYmKG49YCR7bn0tc2ltZGApLGEucHJvZ3JhbT09bn0pO2lmKHM9PW51bGwpdGhyb3dgUHJvZ3JhbSAke2l9IG5vdCBmb3VuZC5gO3Muc3Rkb3V0PSIiLHMuc3RkZXJyPSIiLHMubG9hZGluZz09ayYmKHMubG9hZGluZz14LGF3YWl0IHRoaXMuX2luaXRNb2R1bGVzKCkpO3RyeXtzLm1vZHVsZS5jYWxsTWFpbihyKX1jYXRjaChhKXtjb25zb2xlLmVycm9yKGEpfXRyeXtzLm1vZHVsZS5GUy5jbG9zZShzLm1vZHVsZS5GUy5zdHJlYW1zWzFdKSxzLm1vZHVsZS5GUy5jbG9zZShzLm1vZHVsZS5GUy5zdHJlYW1zWzJdKX1jYXRjaHt9cy5tb2R1bGUuRlMuc3RyZWFtc1sxXT1zLm1vZHVsZS5GUy5vcGVuKCIvZGV2L3N0ZG91dCIsInciKSxzLm1vZHVsZS5GUy5zdHJlYW1zWzJdPXMubW9kdWxlLkZTLm9wZW4oIi9kZXYvc3RkZXJyIiwidyIpO2xldCBvPXtzdGRvdXQ6cy5zdGRvdXQsc3RkZXJyOnMuc3RkZXJyfTtpZih0LmNvbmZpZy5wcmludEludGVybGVhdmVkJiYobz1zLnN0ZG91dCkscy5yZWluaXQ9PT0hMCl7Y29uc3QgYT10LmJhc2UubW9kdWxlLkZTLmN3ZCgpO09iamVjdC5hc3NpZ24ocyxzLmNvbmZpZykscy5yZWFkeT0hMSxhd2FpdCB0aGlzLmluaXQoKSxzLmlzQmFzZU1vZHVsZSYmdGhpcy5tb3VudCgpLHRoaXMuY2QoYSl9cmV0dXJuIG99LGNhdChlKXtyZXR1cm4gdC5fZmlsZW9wKCJjYXQiLGUpfSxscyhlKXtyZXR1cm4gdC5fZmlsZW9wKCJscyIsZSl9LGRvd25sb2FkKGUpe3JldHVybiB0Ll9maWxlb3AoImRvd25sb2FkIixlKX0scHdkKCl7cmV0dXJuIHQuZnMuY3dkKCl9LGNkKGUpe2ZvcihsZXQgciBvZiB0LnRvb2xzKSFyLm1vZHVsZXx8ci5tb2R1bGUuRlMuY2hkaXIoZSl9LG1rZGlyKGUpe3JldHVybiB0LmZzLm1rZGlyKGUpLCEwfSxyZWFkKHtwYXRoOmUsbGVuZ3RoOnIsZmxhZzppPSJyIixvZmZzZXQ6cz0wLHBvc2l0aW9uOm89MH0pe2NvbnN0IGE9dC5mcy5vcGVuKGUsaSksbj1uZXcgVWludDhBcnJheShyKTtyZXR1cm4gdC5mcy5yZWFkKGEsbixzLHIsbyksdC5mcy5jbG9zZShhKSxufSx3cml0ZSh7cGF0aDplLGJ1ZmZlcjpyLGZsYWc6aT0idysiLG9mZnNldDpzPTAscG9zaXRpb246bz0wfSl7Y29uc3QgYT10LmZzLm9wZW4oZSxpKTt0LmZzLndyaXRlKGEscixzLHIubGVuZ3RoLG8pLHQuZnMuY2xvc2UoYSl9LF9zdGRpblR4dDoiIixfc3RkaW5QdHI6MCxnZXQgc3RkaW4oKXtyZXR1cm4gdC5fc3RkaW5UeHR9LHNldCBzdGRpbihlPSIiKXt0Ll9sb2coYFNldHRpbmcgc3RkaW4gdG8gJWMke2V9JWNgLCJjb2xvcjpkYXJrYmx1ZSIsIiIpLHQuX3N0ZGluVHh0PWUsdC5fc3RkaW5QdHI9MH0sYXN5bmMgX3NldHVwKGUpe2lmKGUucmVhZHkpcmV0dXJuO2lmKHQuX2xvZyhgU2V0dGluZyB1cCAke2UudG9vbH0gKGJhc2UgPSAke2UuaXNCYXNlTW9kdWxlPT09ITB9KS4uLmApLGUuY29uZmlnPU9iamVjdC5hc3NpZ24oe30sZSksZS51cmxQcmVmaXh8fChlLnVybFByZWZpeD1gJHt0LmNvbmZpZy51cmxDRE59LyR7ZS50b29sfS8ke2UudmVyc2lvbn1gKSxlLnByb2dyYW18fChlLnByb2dyYW09ZS50b29sKSxlLmZlYXR1cmVzfHwoZS5mZWF0dXJlcz17fSwoaltlLnByb2dyYW1dfHxbXSkuaW5jbHVkZXMoInNpbWQiKSYmKGF3YWl0IFcoKT8oZS5wcm9ncmFtKz0iLXNpbWQiLGUuZmVhdHVyZXMuc2ltZD0hMCk6dC5fbG9nKGBXZWJBc3NlbWJseSBTSU1EIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyOyB3aWxsIGxvYWQgbm9uLVNJTUQgdmVyc2lvbiBvZiAke2UucHJvZ3JhbX0uYCkpKSxlLmlzQmFzZU1vZHVsZSYmKGUubG9hZGluZz14KSxlLmxvYWRpbmc9PT1rKXt0Ll9sb2coYFdpbGwgbGF6eS1sb2FkICR7ZS50b29sfTsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb24uYCk7cmV0dXJufXNlbGYuaW1wb3J0U2NyaXB0cyhgJHtlLnVybFByZWZpeH0vJHtlLnByb2dyYW19LmpzYCksZS5tb2R1bGU9YXdhaXQgTW9kdWxlKHt0aGlzUHJvZ3JhbTplLnByb2dyYW0sbG9jYXRlRmlsZTooaSxzKT0+YCR7ZS51cmxQcmVmaXh9LyR7aX1gLHN0ZGluOigpPT50Ll9zdGRpblB0cjx0LnN0ZGluLmxlbmd0aD90LnN0ZGluLmNoYXJDb2RlQXQodC5fc3RkaW5QdHIrKyk6KHQuc3RkaW49IiIsbnVsbCkscHJpbnQ6aT0+ZS5zdGRvdXQrPWAke2l9CmAscHJpbnRFcnI6dC5jb25maWcucHJpbnRJbnRlcmxlYXZlZD9pPT5lLnN0ZG91dCs9YCR7aX0KYDppPT5lLnN0ZGVycis9YCR7aX0KYH0pO2NvbnN0IHI9ZS5tb2R1bGUuRlM7ZS5pc0Jhc2VNb2R1bGU/KHQuX2xvZyhgU2V0dGluZyB1cCAke2UudG9vbH0gd2l0aCBiYXNlIG1vZHVsZSBmaWxlc3lzdGVtLi4uYCksci5ta2Rpcih0LmNvbmZpZy5kaXJTaGFyZWQsNTExKSxyLm1rZGlyKGAke3QuY29uZmlnLmRpclNoYXJlZH0vJHt0LmNvbmZpZy5kaXJEYXRhfWAsNTExKSxyLm1rZGlyKGAke3QuY29uZmlnLmRpclNoYXJlZH0vJHt0LmNvbmZpZy5kaXJNb3VudGVkfWAsNTExKSxyLmNoZGlyKGAke3QuY29uZmlnLmRpclNoYXJlZH0vJHt0LmNvbmZpZy5kaXJEYXRhfWApLHQuZnM9cik6KHQuX2xvZyhgU2V0dGluZyB1cCAke2UudG9vbH0gd2l0aCBmaWxlc3lzdGVtLi4uYCksci5ta2Rpcih0LmNvbmZpZy5kaXJTaGFyZWQpLHIubW91bnQoZS5tb2R1bGUuUFJPWFlGUyx7cm9vdDp0LmNvbmZpZy5kaXJTaGFyZWQsZnM6dC5mc30sdC5jb25maWcuZGlyU2hhcmVkKSxyLmNoZGlyKHQuZnMuY3dkKCkpKSxlLnN0ZG91dD0iIixlLnN0ZGVycj0iIixlLnJlYWR5PSEwfSxhc3luYyBfc2V0dXBGUygpe2NvbnN0IGU9dC5mcztmb3IobGV0IHIgb2YgdC50b29scyl7aWYoIXIucmVhZHkpY29udGludWU7Y29uc3QgaT1yLm1vZHVsZS5GUyxzPWAvJHtyLnRvb2x9YCxvPWAke3QuY29uZmlnLmRpclNoYXJlZH0ke3N9YDshaS5hbmFseXplUGF0aChzKS5leGlzdHN8fGUuYW5hbHl6ZVBhdGgobykuZXhpc3RzfHwodC5fbG9nKGBNb3VudGluZyAke3N9IG9udG8gJHt0LmJhc2UudG9vbH0gZmlsZXN5c3RlbSBhdCAke299YCksZS5ta2RpcihvKSxlLm1vdW50KHQuYmFzZS5tb2R1bGUuUFJPWFlGUyx7cm9vdDpzLGZzOml9LG8pKX19LF9maWxlb3AoZSxyKXt0Ll9sb2coYFJ1bm5pbmcgJHtlfSAke3J9YCk7Y29uc3QgaT10LmZzLmFuYWx5emVQYXRoKHIpO2lmKCFpLmV4aXN0cylyZXR1cm4gdC5fbG9nKGBGaWxlICR7cn0gbm90IGZvdW5kLmApLCExO3N3aXRjaChlKXtjYXNlImNhdCI6cmV0dXJuIHQuZnMucmVhZEZpbGUocix7ZW5jb2Rpbmc6InV0ZjgifSk7Y2FzZSJscyI6cmV0dXJuIHQuZnMuaXNGaWxlKGkub2JqZWN0Lm1vZGUpP3QuZnMuc3RhdChyKTp0LmZzLnJlYWRkaXIocik7Y2FzZSJkb3dubG9hZCI6Y29uc3Qgcz1uZXcgQmxvYihbdGhpcy5jYXQocildKTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChzKX1yZXR1cm4hMX0sX2xvZyhlKXtpZighdC5jb25maWcuZGVidWcpcmV0dXJuO2xldCByPVsuLi5hcmd1bWVudHNdO3Iuc2hpZnQoKSxjb25zb2xlLmxvZyhgJWNbV2ViV29ya2VyXSVjICR7ZX1gLCJmb250LXdlaWdodDpib2xkIiwiIiwuLi5yKX19O3codCl9KSgpOwo=\", L = typeof window < \"u\" && window.Blob && new Blob([atob(x)], { type: \"text/javascript;charset=utf-8\" });\nfunction v() {\n const l = L && (window.URL || window.webkitURL).createObjectURL(L);\n try {\n return l ? new Worker(l) : new Worker(\"data:application/javascript;base64,\" + x);\n } finally {\n l && (window.URL || window.webkitURL).revokeObjectURL(l);\n }\n}\nconst f = \"https://biowasm.com/cdn/v3\", F = \"https://stg.biowasm.com/cdn/v3\", w = {\n urlCDN: f,\n urlCDNStg: F,\n dirShared: \"/shared\",\n dirMounted: \"/mnt\",\n dirData: \"/data\",\n printInterleaved: !0,\n callback: null,\n debug: !1,\n env: \"prd\"\n};\nclass B {\n constructor(c, b = {}) {\n if (c == null)\n throw \"Expecting array of tools as input to Aioli constructor.\";\n return Array.isArray(c) || (c = [c]), b = Object.assign({}, w, b), c = c.map(this._parseTool), b.env === \"stg\" && (b.urlCDN = b.urlCDNStg), this.tools = c, this.config = b, this.config.callback != null && (this.callback = this.config.callback), delete this.config.callback, this.init();\n }\n async init() {\n const c = new v();\n this.callback && (c.onmessage = (t) => {\n t.data.type === \"biowasm\" && this.callback(t.data.value);\n });\n const b = K(c);\n return b.tools = this.tools, b.config = this.config, await b.init(), b;\n }\n _parseTool(c) {\n if (typeof c != \"string\")\n return c;\n const b = c.split(\"/\");\n if (b.length != 2 && b.length != 3)\n throw \"Expecting '<tool>/<version>' or '<tool>/<program>/<version>'\";\n return {\n tool: b[0],\n program: b.length == 3 ? b[1] : b[0],\n version: b[b.length - 1]\n };\n }\n}\nexport {\n B as default\n};\n","import { assert } from '@datagrok-libraries/utils/src/vector-operations';\nclass SideChainScales {\n static getAvailableScales() {\n return Object.entries(this.scales).map(([k, _]) => k);\n }\n static getScale(name) {\n assert(!(this.scales[name] === undefined), `Scale '${name}' was not found.`);\n return this.scales[name];\n }\n}\nSideChainScales.scales = {\n // Wimley-White interfacial hydrophobicity scale\n 'WimleyWhite': {\n '-': 0,\n 'A': 0.17,\n 'C': -0.24,\n 'D': -0.07,\n 'E': -0.01,\n 'F': -1.13,\n 'G': 0.01,\n 'H': 0.17,\n 'I': -0.31,\n 'K': 0.99,\n 'L': -0.56,\n 'M': -0.23,\n 'N': 0.42,\n 'P': 0.45,\n 'Q': 0.58,\n 'R': 0.81,\n 'S': 0.13,\n 'T': 0.14,\n 'V': 0.07,\n 'W': -1.85,\n 'Y': -0.94,\n },\n 'categorial': {\n '-': 0,\n 'A': 1,\n 'C': 2,\n 'D': 3,\n 'E': 4,\n 'F': 5,\n 'G': 6,\n 'H': 7,\n 'I': 8,\n 'K': 9,\n 'L': 10,\n 'M': 11,\n 'N': 12,\n 'P': 13,\n 'Q': 14,\n 'R': 15,\n 'S': 16,\n 'T': 17,\n 'V': 18,\n 'W': 19,\n 'Y': 20,\n },\n};\n/**\n * Class to categorial encode/decode aligned amino acid residues sequence.\n *\n * @export\n * @class AlignedSequenceEncoder\n */\nexport class AlignedSequenceEncoder {\n constructor(scale = 'categorial') {\n this.aa2num = SideChainScales.getScale(scale);\n this.num2aa = {};\n Object.entries(this.aa2num).forEach(([k, v]) => (this.num2aa[v] = k));\n }\n /**\n * Truncate NH2 and -COOH terminals of the given sequence.\n *\n * @static\n * @param {string} seq The sequence provided.\n * @return {string} Truncated sequence.\n * @memberof AlignedSequenceEncoder\n */\n static _truncateSequence(seq) {\n let start = 0;\n let end = seq.length;\n const termina = ['NH2', 'COOH'];\n if (seq.startsWith(termina[0])) {\n const l = termina[0].length; // Cut only 'NH2' without following '-'.\n assert(seq[l] == '-', `Wrong sequence format: ${termina[0]} without following '-' in '${seq}'.`);\n start = l;\n }\n if (seq.endsWith(termina[1])) {\n const l = termina[1].length + 1; // Cut both 'COOH' and precending '-'.\n assert(seq[end - l] == '-', `Wrong sequence format: ${termina[1]} without '-' precending in '${seq}'.`);\n end -= l;\n }\n return seq.substring(start, end);\n }\n /**\n * Cuts auxiliary defises before a residue.\n *\n * @static\n * @param {string} seq The sequence to process.\n * @return {string} Processed sequence.\n * @memberof AlignedSequenceEncoder\n */\n static _dropDefises(seq) {\n return seq.replace(/(-)([^-]+)/g, '$2');\n }\n /**\n * Performs truncation and cutting auxiliary defises.\n *\n * @static\n * @param {string} sequence The sequence work under process.\n * @return {string} Result of cleaning.\n * @memberof AlignedSequenceEncoder\n */\n static clean(sequence) {\n return AlignedSequenceEncoder._dropDefises(AlignedSequenceEncoder._truncateSequence(sequence));\n }\n /**\n * Categorial encode of the sequence provided.\n *\n * @param {string} sequence The sequence.\n * @return {number[]} Encoded vector.\n * @memberof AlignedSequenceEncoder\n */\n encode(sequence) {\n const nItems = sequence.length;\n const values = new Array(nItems).fill(0);\n for (let i = 0; i < nItems; ++i) {\n const char = sequence[i];\n assert(char in this.aa2num, `Unknown char '${char}' found in sequence '${sequence}'`);\n values[i] = this.encodeLettter(char);\n }\n return values;\n }\n encodeLettter(letter) {\n return this.aa2num[letter];\n }\n /**\n * Decode the encoded vector into the sequence back.\n *\n * @param {number[]} value The vector encoded.\n * @return {string} Decoded sequence.\n * @memberof AlignedSequenceEncoder\n */\n decode(value) {\n let s = '';\n for (let i = 0; i < value.length; ++i) {\n const code = value[i];\n assert(code in this.num2aa, `Unknown code '${code}' found in vector '${value}'`);\n s += this.num2aa[code];\n }\n return s;\n }\n}\n//# sourceMappingURL=sequence-encoder.js.map","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as DG from 'datagrok-api/dg';\n\nimport {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';\nimport {TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\n//@ts-ignore: there are no types for this library\nimport Aioli from '@biowasm/aioli';\n\nimport {AlignedSequenceEncoder} from '@datagrok-libraries/bio/src/sequence-encoder';\nconst fastaInputFilename = 'input.fa';\nconst fastaOutputFilename = 'result.fasta';\n\n/**\n * Converts array of sequences into simple fasta string.\n *\n * @param {string[]} sequences Input list of sequences.\n * @return {string} Fasta-formatted string.\n */\nfunction _stringsToFasta(sequences: string[]): string {\n return sequences.reduce((a, v, i) => a + `>sample${i + 1}\\n${v}\\n`, '');\n}\n\n/**\n * Runs Aioli environment with kalign tool.\n *\n * @param {DG.Column} srcCol Column with sequences.\n * @param {boolean} isAligned Whether the column is aligned.\n * @param {string} unUsedName\n * @return {Promise<DG.Column>} Aligned sequences.\n */\nexport async function runKalign(srcCol: DG.Column<string>, isAligned: boolean = false, unUsedName: string = '',\n clustersCol: DG.Column | null = null): Promise<DG.Column> {\n let sequences: string[] = srcCol.toList();\n\n if (isAligned)\n sequences = sequences.map((v: string) => AlignedSequenceEncoder.clean(v).replace(/\\-/g, ''));\n\n const sequencesLength = srcCol.length;\n clustersCol ??= DG.Column.string('Clusters', sequencesLength).init('0');\n if (clustersCol.type != DG.COLUMN_TYPE.STRING)\n clustersCol = clustersCol.convertTo(DG.TYPE.STRING);\n clustersCol.compact();\n \n //TODO: use fixed-size inner arrays, but first need to expose the method to get each category count\n const clustersColCategories = clustersCol.categories;\n const clustersColData = clustersCol.getRawData();\n const fastaSequences: string[][] = new Array(clustersColCategories.length);\n const clusterIndexes: number[][] = new Array(clustersColCategories.length);\n for (let rowIdx = 0; rowIdx < sequencesLength; ++rowIdx) {\n const clusterCategoryIdx = clustersColData[rowIdx];\n (fastaSequences[clusterCategoryIdx] ??= []).push(sequences[rowIdx]);\n (clusterIndexes[clusterCategoryIdx] ??= []).push(rowIdx);\n }\n\n const CLI = await new Aioli([\n 'base/1.0.0',\n {tool: 'kalign', version: '3.3.1', reinit: true}\n ]);\n const tgtCol = DG.Column.string(unUsedName, sequencesLength);\n\n for (let clusterIdx = 0; clusterIdx < clustersColCategories.length; ++clusterIdx) {\n const clusterSequences = fastaSequences[clusterIdx];\n const fasta = _stringsToFasta(clusterSequences);\n \n console.log(['fasta.length =', fasta.length]);\n\n await CLI.fs.writeFile(fastaInputFilename, fasta);\n const output = await CLI.exec(`kalign ${fastaInputFilename} -f fasta -o ${fastaOutputFilename}`);\n console.warn(output);\n\n const buf = await CLI.cat(fastaOutputFilename);\n if (!buf)\n throw new Error(`kalign output no result`);\n\n const ffh = new FastaFileHandler(buf);\n const aligned = ffh.sequencesArray; // array of sequences extracted from FASTA\n const clusterRowIds = clusterIndexes[clusterIdx];\n for (let clusterRowIdIdx = 0; clusterRowIdIdx < aligned.length; ++clusterRowIdIdx)\n tgtCol.set(clusterRowIds[clusterRowIdIdx], aligned[clusterRowIdIdx]);\n }\n\n // units\n const srcUnits = srcCol.getTag(DG.TAGS.UNITS);\n //aligned\n const srcAligned = srcCol.getTag(bioTAGS.aligned);\n const tgtAligned = srcAligned + '.MSA';\n //alphabet\n const srcAlphabet = srcCol.getTag(bioTAGS.alphabet);\n\n tgtCol.setTag(DG.TAGS.UNITS, srcUnits);\n tgtCol.setTag(bioTAGS.aligned, tgtAligned);\n tgtCol.setTag(bioTAGS.alphabet, srcAlphabet);\n tgtCol.semType = DG.SEMTYPE.MACROMOLECULE;\n return tgtCol;\n}\n\nexport async function testMSAEnoughMemory(col: DG.Column<string>): Promise<void> {\n const sequencesCount = col.length;\n const delta = sequencesCount / 100;\n\n for (let i = delta; i < sequencesCount; i += delta) {\n try {\n await runKalign(DG.Column.fromStrings(col.name, col.toList().slice(0, Math.round(i))));\n console.log(`runKalign succeeded on ${i}`);\n } catch (error) {\n console.log(`runKalign failed on ${i} with '${error}'`);\n }\n }\n}\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {NOTATION, TAGS as bioTAGS, ALIGNMENT, ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport * as C from './constants';\n\nexport const pepseaMethods = ['mafft --auto', 'mafft', 'linsi', 'ginsi', 'einsi', 'fftns', 'fftnsi', 'nwns', 'nwnsi'];\nconst alignmentObjectMetaKeys = ['AlignedSeq', 'AlignedSubpeptide', 'HELM', 'ID', 'PolymerID'];\ntype PepseaRepsonse = {\n Alignment: {\n PolymerID: string, AlignedSubpeptide: string, HELM: string, ID: string, AlignedSeq: string, [key: string]: string,\n }[],\n AlignmentScore: {[key: string]: number | null},\n};\ntype PepseaBodyUnit = {ID: string, HELM: string};\n\nexport async function runPepsea(srcCol: DG.Column<string>, unUsedName: string,\n method: typeof pepseaMethods[number] = 'ginsi', gapOpen: number = 1.53, gapExtend: number = 0.0,\n clustersCol: DG.Column<string | number> | null = null,\n ): Promise<DG.Column<string>> {\n const peptideCount = srcCol.length;\n clustersCol ??= DG.Column.int('Clusters', peptideCount).init(0);\n if (clustersCol.type != DG.COLUMN_TYPE.STRING)\n clustersCol = clustersCol.convertTo(DG.TYPE.STRING);\n\n const clusters = clustersCol.categories;\n const bodies: PepseaBodyUnit[][] = new Array(clusters.length);\n\n // Grouping data by clusters\n for (let rowIndex = 0; rowIndex < peptideCount; ++rowIndex) {\n const cluster = clustersCol.get(rowIndex) as string;\n if (cluster === '')\n continue;\n\n const clusterId = clusters.indexOf(cluster);\n const helmSeq = srcCol.get(rowIndex);\n if (helmSeq)\n (bodies[clusterId] ??= []).push({ID: rowIndex.toString(), HELM: helmSeq});\n }\n\n //@ts-ignore: this is a temporary workaround for the issue with docker containers. This will be fixed in 1.14.0\n const pepseaContainer = await (grok.dapi.docker !== undefined ? grok.dapi.docker.dockerContainers : grok.dapi.dockerfiles).filter('bio').first();\n const alignedSequences: string[] = new Array(peptideCount);\n for (const body of bodies) { // getting aligned sequences for each cluster\n const alignedObject = await requestAlignedObjects(pepseaContainer.id, body, method, gapOpen, gapExtend);\n const alignments = alignedObject.Alignment;\n\n for (const alignment of alignments) { // filling alignedSequencesCol\n alignedSequences[parseInt(alignment.ID)] = Object.entries(alignment)\n .filter((v) => !alignmentObjectMetaKeys.includes(v[0]))\n .map((v) => v[1] !== '-' ? v[1] : '')\n .join(C.PEPSEA.SEPARATOR);\n }\n }\n\n const alignedSequencesCol: DG.Column<string> = DG.Column.fromStrings(unUsedName, alignedSequences);\n alignedSequencesCol.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);\n alignedSequencesCol.setTag(bioTAGS.separator, C.PEPSEA.SEPARATOR);\n alignedSequencesCol.setTag(bioTAGS.aligned, ALIGNMENT.SEQ_MSA);\n alignedSequencesCol.setTag(bioTAGS.alphabet, ALPHABET.UN);\n alignedSequencesCol.semType = DG.SEMTYPE.MACROMOLECULE;\n\n return alignedSequencesCol;\n}\n\nasync function requestAlignedObjects(dockerfileId: string, body: PepseaBodyUnit[], method: string, gapOpen: number,\n gapExtend: number): Promise<PepseaRepsonse> {\n const params = {\n method: 'POST',\n headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},\n body: JSON.stringify(body),\n };\n const path = `/align?method=${method}&gap_open=${gapOpen}&gap_extend=${gapExtend}`;\n //@ts-ignore: this is a temporary workaround for the issue with docker containers\n const response = await (grok.dapi.docker !== undefined ? grok.dapi.docker.dockerContainers : grok.dapi.dockerfiles)\n .request(dockerfileId, path, params);\n return JSON.parse(response ?? '{}');\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nimport wu from 'wu';\nimport {splitterAsFasta, SplitterFunc} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\nconst FASTA_LINE_WIDTH = 60;\n\n/** Shows dialog to select id columns list and seq column, builds and downloads FASTA content */\nexport function saveAsFastaUI() {\n // Use grid for column order adjusted by user\n const grid: DG.Grid = grok.shell.tv.grid;\n\n const idGColList: DG.GridColumn[] = wu.count(0).take(grid.columns.length)\n .map((colI: number) => grid.columns.byIndex(colI)!)\n .filter((gcol: DG.GridColumn) => gcol.column ? gcol.column.semType !== DG.SEMTYPE.MACROMOLECULE : false).toArray();\n const defaultIdGCol: DG.GridColumn | undefined = idGColList\n .find((gcol: DG.GridColumn) => gcol.name.toLowerCase().indexOf('id') !== -1);\n const idDefaultValue = defaultIdGCol ? [defaultIdGCol.name] : [];\n\n const idGColListInput = ui.multiChoiceInput('Seq id columns', idDefaultValue,\n idGColList.map((gcol: DG.GridColumn) => gcol.name));\n\n const seqGColList: DG.GridColumn[] = wu.count(0).take(grid.columns.length)/* range rom 0 to grid.columns.length */\n .map((colI: number) => grid.columns.byIndex(colI)!)\n .filter((gc: DG.GridColumn) => {\n const col: DG.Column | null = gc.column;\n if (col && col.semType === DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(col);\n return uh.isFasta();\n }\n return false;\n }).toArray();\n\n const seqDefaultValue = seqGColList.length > 0 ? seqGColList[0].name : [];\n const seqColInput = ui.choiceInput('Seq column', seqDefaultValue,\n seqGColList.map((gCol: DG.GridColumn) => gCol.name));\n\n const lineWidthInput = ui.intInput('FASTA line width', FASTA_LINE_WIDTH);\n\n ui.dialog({title: 'Save as FASTA'})\n .add(ui.inputs([\n idGColListInput,\n seqColInput,\n lineWidthInput\n ]))\n .onOK(() => {\n const valueIdColList: DG.Column[] = idGColListInput.value ?\n idGColListInput.value.map((colName: string) => grid.columns.byName(colName)!.column!) : [];\n const valueSeqCol: DG.Column | null = seqColInput.value ?\n grid.columns.byName(seqColInput.value as string)!.column : null;\n const valueLineWidth = lineWidthInput.value ?? FASTA_LINE_WIDTH;\n\n if (!valueSeqCol)\n grok.shell.warning(`Seq column is mandatory to save as FASTA.`);\n\n const resFastaTxt: string = saveAsFastaDo(valueIdColList, valueSeqCol!, valueLineWidth);\n\n const aEl: HTMLAnchorElement = document.createElement('a');\n aEl.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(resFastaTxt)}`);\n aEl.setAttribute('download', `${grid.dataFrame.name}.fasta`);\n aEl.click();\n })\n .show();\n}\n\n/** */\nexport function saveAsFastaDo(\n idColList: DG.Column[], seqCol: DG.Column, lineWidth: number = FASTA_LINE_WIDTH, lineSeparator: string = '\\n'\n): string {\n const splitter: SplitterFunc = splitterAsFasta;\n\n const fastaLines: string[] = [];\n\n for (let rowI: number = 0; rowI < seqCol.length; rowI++) {\n // multiple identifiers separated by vertical bars\n // https://en.wikipedia.org/wiki/FASTA_format\n\n const seqId: string = idColList.map((col) => col.get(rowI).toString()).join('|');\n const seq: string = seqCol.get(rowI);\n const seqLineList: string[] = wrapSequence(seq, splitter, lineWidth);\n\n fastaLines.push(`>${seqId}${lineSeparator}`);\n for (const line of seqLineList)\n fastaLines.push(`${line}${lineSeparator}`);\n }\n\n //return fastaLines.join(lineSeparator);\n return ''.concat(...fastaLines);\n}\n\n/* split sequence for monomers to prevent wrapping monomer partially */\nexport function wrapSequence(seq: string, splitter: SplitterFunc, lineWidth: number = FASTA_LINE_WIDTH): string[] {\n const seqMonomerList = splitter(seq);\n let seqPos: number = 0;\n const seqLength: number = seqMonomerList.length;\n\n const seqLineList: string[] = [];\n while (seqPos < seqLength) {\n /* join sliced monomer into line */\n const seqLine: string[] = seqMonomerList.slice(seqPos, seqPos + lineWidth);\n const seqLineTxt: string = seqLine.map((m) => m.length > 1 ? `[${m}]` : m).join('');\n seqLineList.push(seqLineTxt);\n seqPos += seqLine.length;\n }\n\n return seqLineList;\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nexport function getMacromoleculeColumn(): DG.Column | any {\n const col = grok.shell.t.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n if (col === null) {\n grok.shell.error('Current table does not contain macromolecules');\n return;\n }\n return col;\n}\n\nexport function updateDivInnerHTML(div: HTMLElement, content: string | Node): void {\n div.innerHTML = '';\n div.append(content);\n}","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport wu from 'wu';\nimport * as rxjs from 'rxjs';\n\nimport {SliderOptions} from 'datagrok-api/dg';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {\n getSplitter, monomerToShort, pickUpPalette, pickUpSeqCol, SplitterFunc,\n TAGS as bioTAGS\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {\n WebLogoPropsDefault, WebLogoProps, IWebLogoViewer,\n PositionHeight,\n positionSeparator,\n} from '@datagrok-libraries/bio/src/viewers/web-logo';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {TAGS as wlTAGS} from '@datagrok-libraries/bio/src/viewers/web-logo';\n\ndeclare global {\n interface HTMLCanvasElement {\n getCursorPosition(event: MouseEvent, r: number): DG.Point;\n }\n}\n\n/**@param {MouseEvent} event\n * @param {number} r devicePixelRation\n * @return {DG.Point} canvas related cursor position\n */\nHTMLCanvasElement.prototype.getCursorPosition = function(event: MouseEvent, r: number): DG.Point {\n const rect = this.getBoundingClientRect();\n return new DG.Point((event.clientX - rect.left) * r, (event.clientY - rect.top) * r);\n};\n\nDG.Rect.prototype.contains = function(x: number, y: number): boolean {\n return this.left <= x && x <= this.right && this.top <= y && y <= this.bottom;\n};\n\nexport class PositionMonomerInfo {\n /** Sequences count with monomer in position */\n count: number;\n\n /** Remember screen coords rect */\n bounds: DG.Rect;\n\n constructor(count: number = 0, bounds: DG.Rect = new DG.Rect(0, 0, 0, 0)) {\n this.count = count;\n this.bounds = bounds;\n }\n}\n\nexport class PositionInfo {\n /** Position in sequence */\n public readonly pos: number;\n\n /** Position name from column tag*/\n public readonly name: string;\n\n freq: { [m: string]: PositionMonomerInfo };\n rowCount: number;\n sumForHeightCalc: number;\n\n /** freq = {}, rowCount = 0\n * @param {string} name Name of position ('111A', '111.1', etc)\n * @param {number} sumForHeightCalc Sum of all monomer counts for height calculation\n * @param {number} rowCount Count of elements in column\n * @param {string[]} freq frequency of monomers in position\n */\n constructor(pos: number, name: string,\n freq: { [m: string]: PositionMonomerInfo } = {}, rowCount: number = 0, sumForHeightCalc: number = 0\n ) {\n this.pos = pos;\n this.name = name;\n this.freq = freq;\n this.rowCount = rowCount;\n this.sumForHeightCalc = sumForHeightCalc;\n }\n}\n\nexport enum VerticalAlignments {\n TOP = 'top',\n MIDDLE = 'middle',\n BOTTOM = 'bottom',\n}\n\nexport enum HorizontalAlignments {\n LEFT = 'left',\n CENTER = 'center',\n RIGHT = 'right',\n}\n\nexport enum PositionMarginStates {\n AUTO = 'auto',\n ON = 'on',\n OFF = 'off',\n}\n\nexport enum FilterSources {\n Filtered = 'Filtered',\n Selected = 'Selected',\n}\n\nexport enum PROPS_CATS {\n STYLE = 'Style',\n BEHAVIOR = 'Behavior',\n LAYOUT = 'Layout',\n DATA = 'Data',\n}\n\nexport enum PROPS {\n // -- Data --\n sequenceColumnName = 'sequenceColumnName',\n startPositionName = 'startPositionName',\n endPositionName = 'endPositionName',\n skipEmptySequences = 'skipEmptySequences',\n skipEmptyPositions = 'skipEmptyPositions',\n shrinkEmptyTail = 'shrinkEmptyTail',\n\n // -- Style --\n backgroundColor = 'backgroundColor',\n positionHeight = 'positionHeight',\n positionWidth = 'positionWidth',\n\n // -- Layout --\n verticalAlignment = 'verticalAlignment',\n horizontalAlignment = 'horizontalAlignment',\n fixWidth = 'fixWidth',\n fitArea = 'fitArea',\n minHeight = 'minHeight',\n maxHeight = 'maxHeight',\n positionMarginState = 'positionMarginState',\n positionMargin = 'positionMargin',\n\n // -- Behavior --\n filterSource = 'filterSource',\n}\n\nexport class WebLogoViewer extends DG.JsViewer {\n public static residuesSet = 'nucleotides';\n private static viewerCount: number = -1;\n\n private readonly viewerId: number = -1;\n private unitsHandler: UnitsHandler | null;\n private initialized: boolean = false;\n\n // private readonly colorScheme: ColorScheme = ColorSchemes[NucleotidesWebLogo.residuesSet];\n protected cp: SeqPalette | null = null;\n\n private host?: HTMLDivElement;\n private msgHost?: HTMLElement;\n private canvas: HTMLCanvasElement;\n private slider: DG.RangeSlider;\n private readonly textBaseline: CanvasTextBaseline;\n\n private axisHeight: number = 12;\n\n private seqCol: DG.Column<string> | null = null;\n private splitter: SplitterFunc | null = null;\n // private maxLength: number = 100;\n private positions: PositionInfo[] = [];\n\n private rowsMasked: number = 0;\n private rowsNull: number = 0;\n private visibleSlider: boolean = false;\n private allowResize: boolean = true;\n private turnOfResizeForOneSetValue: boolean = false;\n\n // Viewer's properties (likely they should be public so that they can be set outside)\n // -- Data --\n public sequenceColumnName: string | null;\n public skipEmptySequences: boolean;\n public skipEmptyPositions: boolean;\n\n // -- Style --\n private _positionWidth: number;\n public positionWidth: number;\n public minHeight: number;\n public backgroundColor: number = 0xFFFFFFFF;\n public maxHeight: number;\n public positionMarginState: string;\n public positionMargin: number = 0;\n public startPositionName: string | null;\n public endPositionName: string | null;\n public fixWidth: boolean;\n public verticalAlignment: string | null;\n public horizontalAlignment: string | null;\n public fitArea: boolean;\n public shrinkEmptyTail: boolean;\n public positionHeight: string;\n\n // -- Behavior --\n public filterSource: FilterSources;\n\n private positionNames: string[] = [];\n private startPosition: number = -1;\n private endPosition: number = -1;\n\n private get filter(): DG.BitSet {\n let res: DG.BitSet;\n switch (this.filterSource) {\n case FilterSources.Filtered:\n res = this.dataFrame.filter;\n break;\n case FilterSources.Selected:\n res = this.dataFrame.selection;\n break;\n }\n return res;\n }\n\n /** For startPosition equals to endPosition Length is 1 */\n private get Length(): number {\n if (this.skipEmptyPositions) {\n return this.positions.length;\n }\n return this.startPosition <= this.endPosition ? this.endPosition - this.startPosition + 1 : 0;\n }\n\n /** Calculate new position data basic on {@link positionMarginState} and {@link positionMargin} */\n private get positionWidthWithMargin() {\n return this._positionWidth + this.positionMarginValue;\n }\n\n private get positionMarginValue() {\n if ((this.positionMarginState === 'auto') && (this.unitsHandler?.getAlphabetIsMultichar() === true)) {\n return this.positionMargin;\n }\n if (this.positionMarginState === 'enable') {\n return this.positionMargin;\n }\n\n return 0;\n }\n\n /** Count of position rendered for calculations countOfRenderPositions */\n private get countOfRenderPositions() {\n if (this.host == null) {\n return 0;\n }\n const r = window.devicePixelRatio;\n if (r > 1) {\n return this.canvasWidthWithRatio / this.positionWidthWithMargin;\n } else {\n return this.canvas.width / (this.positionWidthWithMargin * r);\n }\n }\n\n private get canvasWidthWithRatio() {\n return this.canvas.width * window.devicePixelRatio;\n }\n\n\n /** Position of start rendering */\n private get firstVisibleIndex(): number {\n return (this.visibleSlider) ? Math.floor(this.slider.min) : 0;\n }\n\n private viewSubs: rxjs.Unsubscribable[] = [];\n\n constructor() {\n super();\n\n this.viewerId = WebLogoViewer.viewerCount;\n WebLogoViewer.viewerCount += 1;\n\n this.textBaseline = 'top';\n this.unitsHandler = null;\n\n // -- Data --\n this.sequenceColumnName = this.string(PROPS.sequenceColumnName, null,\n {category: PROPS_CATS.DATA});\n this.startPositionName = this.string(PROPS.startPositionName, null,\n {category: PROPS_CATS.DATA});\n this.endPositionName = this.string(PROPS.endPositionName, null,\n {category: PROPS_CATS.DATA});\n this.skipEmptySequences = this.bool(PROPS.skipEmptySequences, true,\n {category: PROPS_CATS.DATA});\n this.skipEmptyPositions = this.bool(PROPS.skipEmptyPositions, false,\n {category: PROPS_CATS.DATA});\n this.shrinkEmptyTail = this.bool(PROPS.shrinkEmptyTail, true,\n {category: PROPS_CATS.DATA});\n\n\n // -- Style --\n this.backgroundColor = this.int(PROPS.backgroundColor, 0xFFFFFFFF,\n {category: PROPS_CATS.STYLE});\n this.positionHeight = this.string(PROPS.positionHeight, PositionHeight.full,\n {category: PROPS_CATS.STYLE, choices: Object.values(PositionHeight)});\n this._positionWidth = this.positionWidth = this.float(PROPS.positionWidth, 16,\n {category: PROPS_CATS.STYLE/* editor: 'slider', min: 4, max: 64, postfix: 'px' */});\n\n\n // -- Layout --\n this.verticalAlignment = this.string(PROPS.verticalAlignment, VerticalAlignments.MIDDLE,\n {category: PROPS_CATS.LAYOUT, choices: Object.values(VerticalAlignments)});\n this.horizontalAlignment = this.string(PROPS.horizontalAlignment, HorizontalAlignments.CENTER,\n {category: PROPS_CATS.LAYOUT, choices: Object.values(HorizontalAlignments)});\n this.fixWidth = this.bool(PROPS.fixWidth, false,\n {category: PROPS_CATS.LAYOUT});\n this.fitArea = this.bool(PROPS.fitArea, true,\n {category: PROPS_CATS.LAYOUT});\n this.minHeight = this.float(PROPS.minHeight, 50,\n {category: PROPS_CATS.LAYOUT/*, editor: 'slider', min: 25, max: 250, postfix: 'px'*/});\n this.maxHeight = this.float(PROPS.maxHeight, 100,\n {category: PROPS_CATS.LAYOUT/*, editor: 'slider', min: 25, max: 500, postfix: 'px'*/});\n this.positionMarginState = this.string(PROPS.positionMarginState, PositionMarginStates.AUTO,\n {category: PROPS_CATS.LAYOUT, choices: Object.values(PositionMarginStates)});\n let defaultValueForPositionMargin = 0;\n if (this.positionMarginState === 'auto') defaultValueForPositionMargin = 4;\n this.positionMargin = this.int(PROPS.positionMargin, defaultValueForPositionMargin,\n {category: PROPS_CATS.LAYOUT, min: 0, max: 16});\n\n // -- Behavior --\n this.filterSource = this.string(PROPS.filterSource, FilterSources.Filtered,\n {category: PROPS_CATS.BEHAVIOR, choices: Object.values(FilterSources)}) as FilterSources;\n\n const style: SliderOptions = {style: 'barbell'};\n this.slider = ui.rangeSlider(0, 100, 0, 20, false, style);\n this.canvas = ui.canvas();\n this.canvas.style.width = '100%';\n }\n\n private init(): void {\n if (this.initialized) {\n console.error('Bio: WebLogoViewer.init() second initialization!');\n return;\n }\n\n this.initialized = true;\n this.helpUrl = '/help/visualize/viewers/web-logo.md';\n\n this.msgHost = ui.div('No message');\n this.msgHost.style.display = 'none';\n\n this.canvas = ui.canvas();\n this.canvas.style.width = '100%';\n\n //this.slider.setShowHandles(false);\n this.slider.root.style.position = 'absolute';\n this.slider.root.style.zIndex = '999';\n this.slider.root.style.display = 'none';\n this.slider.root.style.height = '0.7em';\n\n this.visibleSlider = false;\n\n this.subs.push(this.slider.onValuesChanged.subscribe(this.sliderOnValuesChanged.bind(this)));\n\n this.host = ui.div([this.msgHost, this.canvas]);\n\n this.host.style.justifyContent = 'center';\n this.host.style.alignItems = 'center';\n this.host.style.position = 'relative';\n this.host.style.setProperty('overflow', 'hidden', 'important');\n\n this.subs.push(\n rxjs.fromEvent<MouseEvent>(this.canvas, 'mousemove').subscribe(this.canvasOnMouseMove.bind(this)));\n this.subs.push(\n rxjs.fromEvent<MouseEvent>(this.canvas, 'mousedown').subscribe(this.canvasOnMouseDown.bind(this)));\n\n this.subs.push(rxjs.fromEvent<WheelEvent>(this.canvas, 'wheel').subscribe(this.canvasOnWheel.bind(this)));\n\n this.subs.push(ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this)));\n\n this.root.append(this.host);\n this.root.append(this.slider.root);\n\n this._calculate(window.devicePixelRatio);\n this.updateSlider();\n this.render(true);\n }\n\n /** Handler of changing size WebLogo */\n private rootOnSizeChanged(): void {\n this._calculate(window.devicePixelRatio);\n this.updateSlider();\n this.render(true);\n }\n\n /** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().\n */\n private updateSeqCol(): void {\n if (this.dataFrame) {\n this.seqCol = this.sequenceColumnName ? this.dataFrame.col(this.sequenceColumnName) : null;\n if (this.seqCol == null) {\n this.seqCol = pickUpSeqCol(this.dataFrame);\n this.sequenceColumnName = this.seqCol ? this.seqCol.name : null;\n }\n if (this.seqCol) {\n const units: string = this.seqCol!.getTag(DG.TAGS.UNITS);\n const separator: string = this.seqCol!.getTag(bioTAGS.separator);\n this.splitter = getSplitter(units, separator);\n this.unitsHandler = new UnitsHandler(this.seqCol);\n\n this.updatePositions();\n this.cp = pickUpPalette(this.seqCol);\n } else {\n this.splitter = null;\n this.positionNames = [];\n this.startPosition = -1;\n this.endPosition = -1;\n this.cp = null;\n }\n }\n this.render();\n }\n\n /** Updates {@link positionNames} and calculates {@link startPosition} and {@link endPosition}.\n */\n private updatePositions(): void {\n if (!this.seqCol)\n return;\n\n let categories: (string | null) [];\n if (this.shrinkEmptyTail) {\n const indices: Int32Array = this.dataFrame.filter.getSelectedIndexes();\n categories = Array.from(new Set(\n Array.from(Array(indices.length).keys()).map((i: number) => this.seqCol!.get(indices[i]))));\n } else {\n categories = this.seqCol.categories;\n }\n const maxLength = categories.length > 0 ? Math.max(...categories.map(\n (s) => s !== null ? this.splitter!(s).length : 0)) : 0;\n\n // Get position names from data column tag 'positionNames'\n const positionNamesTxt = this.seqCol.getTag(wlTAGS.positionNames);\n // Fallback if 'positionNames' tag is not provided\n this.positionNames = positionNamesTxt ? positionNamesTxt.split(positionSeparator).map((n) => n.trim()) :\n [...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);\n\n this.startPosition = (this.startPositionName && this.positionNames &&\n this.positionNames.includes(this.startPositionName)) ?\n this.positionNames.indexOf(this.startPositionName) : 0;\n this.endPosition = (this.endPositionName && this.positionNames &&\n this.positionNames.includes(this.endPositionName)) ?\n this.positionNames.indexOf(this.endPositionName) : (maxLength - 1);\n }\n\n private get widthArea() {\n return this.Length * this.positionWidth / window.devicePixelRatio;\n }\n\n private get heightArea() {\n return Math.min(this.maxHeight, Math.max(this.minHeight, this.root.clientHeight));\n }\n\n private get xScale() {\n return this.widthArea > 0 ? (this.root.clientWidth - this.Length * this.positionMarginValue) / this.widthArea : 0;\n }\n\n private get yScale() {\n return this.root.clientHeight / this.heightArea;\n }\n\n private checkIsHideSlider(): boolean {\n let showSliderWithFitArea = true;\n const minScale = Math.min(this.xScale, this.yScale);\n\n if (((minScale == this.xScale) || (minScale <= 1)) && (this.fitArea)) {\n showSliderWithFitArea = false;\n }\n return ((this.fixWidth || Math.ceil(this.canvas.width / this.positionWidthWithMargin) >= this.Length) || (showSliderWithFitArea));\n }\n\n setSliderVisibility(visible: boolean): void {\n if (visible) {\n this.slider.root.style.display = 'inherit';\n this.visibleSlider = true;\n } else {\n this.slider.root.style.display = 'none';\n this.visibleSlider = false;\n }\n }\n\n /** Updates {@link slider}, needed to set slider options and to update slider position. */\n private updateSlider(): void {\n if (this.checkIsHideSlider()) {\n this.setSliderVisibility(false);\n } else {\n this.setSliderVisibility(true);\n }\n if ((this.slider != null) && (this.canvas != null)) {\n const diffEndScrollAndSliderMin = Math.max(0,\n Math.floor(this.slider.min + this.canvas.width / this.positionWidthWithMargin) - this.Length);\n let newMin = Math.floor(this.slider.min - diffEndScrollAndSliderMin);\n let newMax = Math.floor(this.slider.min - diffEndScrollAndSliderMin) + Math.floor(this.canvas.width / this.positionWidthWithMargin);\n if (this.checkIsHideSlider()) {\n newMin = 0;\n newMax = Math.max(newMin, this.Length - 1);\n }\n this.turnOfResizeForOneSetValue = true;\n this.slider.setValues(0, this.Length,\n newMin, newMax);\n }\n }\n\n /** Handler of property change events. */\n public override onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n\n switch (property.name) {\n case PROPS.sequenceColumnName:\n case PROPS.startPositionName:\n case PROPS.endPositionName:\n case PROPS.filterSource:\n this.updateSeqCol();\n break;\n case PROPS.positionWidth:\n this._positionWidth = this.positionWidth;\n this.updateSlider();\n break;\n case PROPS.fixWidth:\n case PROPS.fitArea:\n case PROPS.positionMargin:\n this.updateSlider();\n break;\n case PROPS.shrinkEmptyTail:\n case PROPS.skipEmptyPositions:\n this.updatePositions();\n break;\n }\n\n this.render(true);\n }\n\n /** Add filter handlers when table is a attached */\n public override onTableAttached() {\n super.onTableAttached();\n\n const dataFrameTxt: string = this.dataFrame ? 'data' : 'null';\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached( dataFrame = ${dataFrameTxt} ) start`);\n\n this.updateSeqCol();\n\n if (this.dataFrame !== undefined) {\n this.viewSubs.push(this.dataFrame.filter.onChanged.subscribe(this.dataFrameFilterOnChanged.bind(this)));\n this.viewSubs.push(this.dataFrame.selection.onChanged.subscribe(this.dataFrameSelectionOnChanged.bind(this)));\n }\n\n this.init();\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached() end`);\n }\n\n /** Remove all handlers when table is a detach */\n public override async detach() {\n const dataFrameTxt = `${this.dataFrame ? 'data' : 'null'}`;\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached( dataFrame = ${dataFrameTxt} ) start`);\n super.detach();\n\n this.viewSubs.forEach((sub) => sub.unsubscribe());\n this.host!.remove();\n this.msgHost = undefined;\n this.host = undefined;\n\n this.initialized = false;\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached() end`);\n }\n\n // -- Routines --\n\n getMonomer(p: DG.Point): [number, string | null, PositionMonomerInfo | null] {\n const calculatedX = p.x + this.firstVisibleIndex * this.positionWidthWithMargin;\n const jPos = Math.floor(p.x / this.positionWidthWithMargin + this.firstVisibleIndex);\n const position = this.positions[jPos];\n\n if (position == undefined)\n return [jPos, null, null];\n\n const monomer: string | undefined = Object.keys(position.freq)\n .find((m) => position.freq[m].bounds.contains(calculatedX, p.y));\n if (monomer === undefined)\n return [jPos, null, null];\n\n return [jPos, monomer, position.freq[monomer]];\n };\n\n /** Helper function for rendering */\n protected _nullSequence(fillerResidue = 'X'): string {\n if (!this.skipEmptySequences)\n return new Array(this.Length).fill(fillerResidue).join('');\n\n return '';\n }\n\n /** Helper function for remove empty positions */\n // TODO: use this function in from core\n protected removeWhere(array: Array<any>, predicate: (T: any) => boolean): Array<any> {\n const length = array.length;\n let updateIterator = 0;\n for (let deleteIterator = 0; deleteIterator < length; deleteIterator++) {\n if (!predicate(array[deleteIterator])) {\n array[updateIterator] = array[deleteIterator];\n updateIterator++;\n }\n }\n array.length = updateIterator;\n return array;\n }\n\n /** Function for removing empty positions */\n protected _removeEmptyPositions() {\n if (this.skipEmptyPositions) {\n this.removeWhere(this.positions, (item) => item?.freq['-']?.count === item.rowCount);\n }\n }\n\n protected _calculate(r: number) {\n if (!this.host || !this.seqCol || !this.dataFrame)\n return;\n this.unitsHandler = new UnitsHandler(this.seqCol);\n\n this.calcSize();\n\n const posCount: number = this.startPosition <= this.endPosition ? this.endPosition - this.startPosition + 1 : 0;\n this.positions = new Array(posCount);\n for (let jPos = 0; jPos < this.Length; jPos++) {\n const posName: string = this.positionNames[this.startPosition + jPos];\n this.positions[jPos] = new PositionInfo(this.startPosition + jPos, posName);\n }\n\n // 2022-05-05 askalkin instructed to show WebLogo based on filter (not selection)\n const indices = this.filter.getSelectedIndexes();\n // const indices = this.dataFrame.selection.trueCount > 0 ? this.dataFrame.selection.getSelectedIndexes() :\n // this.dataFrame.filter.getSelectedIndexes();\n\n this.rowsMasked = indices.length;\n this.rowsNull = 0;\n\n for (const i of indices) {\n let s: string = <string>(this.seqCol.get(i));\n\n if (!s) {\n s = this._nullSequence();\n ++this.rowsNull;\n }\n\n const seqM: string[] = this.splitter!(s);\n for (let jPos = 0; jPos < this.Length; jPos++) {\n const pmInfo = this.positions[jPos].freq;\n const m: string = seqM[this.startPosition + jPos] || '-';\n if (!(m in pmInfo))\n pmInfo[m] = new PositionMonomerInfo();\n pmInfo[m].count++;\n }\n }\n\n //#region Polish freq counts\n for (let jPos = 0; jPos < this.Length; jPos++) {\n // delete this.positions[jPos].freq['-'];\n\n this.positions[jPos].rowCount = 0;\n for (const m in this.positions[jPos].freq)\n this.positions[jPos].rowCount += this.positions[jPos].freq[m].count;\n if (this.positionHeight == PositionHeight.Entropy) {\n this.positions[jPos].sumForHeightCalc = 0;\n for (const m in this.positions[jPos].freq) {\n const pn = this.positions[jPos].freq[m].count / this.positions[jPos].rowCount;\n this.positions[jPos].sumForHeightCalc += -pn * Math.log2(pn);\n }\n }\n }\n //#endregion\n this._removeEmptyPositions();\n\n const absoluteMaxHeight = this.canvas.height - this.axisHeight * r;\n\n //#region Calculate screen\n for (let jPos = 0; jPos < this.Length; jPos++) {\n const freq: { [c: string]: PositionMonomerInfo } = this.positions[jPos].freq;\n const rowCount = this.positions[jPos].rowCount;\n const alphabetSize = this.getAlphabetSize();\n if ((this.positionHeight == PositionHeight.Entropy) && (alphabetSize == null)) {\n grok.shell.error('WebLogo: alphabet is undefined.');\n }\n\n const alphabetSizeLog = Math.log2(alphabetSize);\n const maxHeight = (this.positionHeight == PositionHeight.Entropy) ?\n (absoluteMaxHeight * (alphabetSizeLog - (this.positions[jPos].sumForHeightCalc)) / alphabetSizeLog) :\n absoluteMaxHeight;\n\n let y: number = this.axisHeight * r + (absoluteMaxHeight - maxHeight - 1);\n\n const entries = Object.entries(freq).sort((a, b) => {\n if (a[0] !== '-' && b[0] !== '-')\n return b[1].count - a[1].count;\n else if (a[0] === '-' && b[0] === '-')\n return 0;\n else if (a[0] === '-')\n return -1;\n else /* (b[0] === '-') */\n return +1;\n });\n for (const entry of entries) {\n const pmInfo: PositionMonomerInfo = entry[1];\n // const m: string = entry[0];\n const h: number = maxHeight * pmInfo.count / rowCount;\n\n pmInfo.bounds = new DG.Rect(jPos * this.positionWidthWithMargin, y, this._positionWidth, h);\n y += h;\n }\n }\n //#endregion\n }\n\n /** Render WebLogo sensitive to changes in params of rendering\n *@param {boolean} recalc - indicates that need to recalculate data for rendering\n */\n render(recalc = true) {\n if (this.msgHost) {\n if (this.seqCol && !this.cp) {\n this.msgHost!.innerText = `Unknown palette (column semType: '${this.seqCol.semType}').`;\n this.msgHost!.style.display = '';\n } else {\n this.msgHost!.style.display = 'none';\n }\n }\n\n if (!this.seqCol || !this.dataFrame || !this.cp || this.startPosition === -1 || this.endPosition === -1 || this.host == null || this.slider == null)\n return;\n\n const g = this.canvas.getContext('2d');\n if (!g) return;\n\n this.slider.root.style.width = `${this.host.clientWidth}px`;\n\n const r = window.devicePixelRatio;\n\n if (recalc)\n this._calculate(r);\n\n g.resetTransform();\n g.fillStyle = DG.Color.toHtml(this.backgroundColor);\n g.fillRect(0, 0, this.canvas.width, this.canvas.height);\n g.textBaseline = this.textBaseline;\n\n const maxCountOfRowsRendered = this.countOfRenderPositions + 1;\n const firstVisibleIndex = (this.visibleSlider) ? Math.floor(this.slider.min) : 0;\n const lastVisibleIndex = Math.min(this.Length, firstVisibleIndex + maxCountOfRowsRendered);\n\n //#region Plot positionNames\n const positionFontSize = 10 * r;\n g.resetTransform();\n g.fillStyle = 'black';\n g.textAlign = 'center';\n g.font = `${positionFontSize.toFixed(1)}px Roboto, Roboto Local, sans-serif`;\n const posNameMaxWidth = Math.max(...this.positions.map((pos) => g.measureText(pos.name).width));\n const hScale = posNameMaxWidth < (this._positionWidth - 2) ? 1 : (this._positionWidth - 2) / posNameMaxWidth;\n\n for (let jPos = this.firstVisibleIndex; jPos < lastVisibleIndex; jPos++) {\n const pos: PositionInfo = this.positions[jPos];\n g.resetTransform();\n g.setTransform(\n hScale, 0, 0, 1,\n jPos * this.positionWidthWithMargin + this._positionWidth / 2 - this.positionWidthWithMargin * firstVisibleIndex, 0);\n g.fillText(pos.name, 0, 0);\n }\n //#endregion Plot positionNames\n const fontStyle = '16px Roboto, Roboto Local, sans-serif';\n // Hacks to scale uppercase characters to target rectangle\n const uppercaseLetterAscent = 0.25;\n const uppercaseLetterHeight = 12.2;\n for (let jPos = this.firstVisibleIndex; jPos < lastVisibleIndex; jPos++) {\n for (const [monomer, pmInfo] of Object.entries(this.positions[jPos].freq)) {\n if (monomer !== '-') {\n const monomerTxt = monomerToShort(monomer, 5);\n const b = pmInfo.bounds;\n const left = b.left - this.positionWidthWithMargin * this.firstVisibleIndex;\n\n g.resetTransform();\n g.strokeStyle = 'lightgray';\n g.lineWidth = 1;\n g.rect(left, b.top, b.width, b.height);\n g.fillStyle = this.cp.get(monomer) ?? this.cp.get('other');\n g.textAlign = 'left';\n g.font = fontStyle;\n //g.fillRect(b.left, b.top, b.width, b.height);\n const mTm: TextMetrics = g.measureText(monomerTxt);\n\n g.setTransform(\n b.width / mTm.width, 0, 0, b.height / uppercaseLetterHeight,\n left, b.top);\n g.fillText(monomerTxt, 0, -uppercaseLetterAscent);\n }\n }\n }\n }\n\n /** Calculate canvas size an positionWidth and updates properties */\n private calcSize() {\n if (!this.host)\n return;\n\n const r: number = window.devicePixelRatio;\n\n let width: number = this.widthArea;\n let height = this.heightArea;\n\n if ((this.fitArea) && (!this.visibleSlider)) {\n const scale = Math.max(1, Math.min(this.xScale, this.yScale));\n width = width * scale;\n height = height * scale;\n this._positionWidth = this.positionWidth * scale;\n }\n\n width = this.Length * this.positionWidthWithMargin / r;\n\n this.canvas.width = this.root.clientWidth * r;\n this.canvas.style.width = `${this.root.clientWidth}px`;\n\n // const canvasHeight: number = width > this.root.clientWidth ? height - 8 : height;\n this.host.style.setProperty('height', `${height}px`);\n const canvasHeight: number = this.host.clientHeight;\n this.canvas.height = canvasHeight * r;\n\n // Adjust host and root width\n if (this.fixWidth) {\n // full width for canvas host and root\n this.root.style.width = this.host.style.width = `${width}px`;\n this.root.style.height = `${height}px`;\n this.root.style.overflow = 'hidden';\n this.host.style.setProperty('overflow-y', 'hidden', 'important');\n } else {\n // allow scroll canvas in root\n this.root.style.width = this.host.style.width = '100%';\n this.host.style.overflowX = 'auto!important';\n this.host.style.setProperty('text-align', this.horizontalAlignment);\n\n const sliderHeight = this.visibleSlider ? 10 : 0;\n\n // vertical alignment\n let hostTopMargin = 0;\n switch (this.verticalAlignment) {\n case 'top':\n hostTopMargin = 0;\n break;\n case 'middle':\n hostTopMargin = Math.max(0, (this.root.clientHeight - height) / 2);\n break;\n case 'bottom':\n hostTopMargin = Math.max(0, this.root.clientHeight - height - sliderHeight);\n break;\n }\n // horizontal alignment\n let hostLeftMargin = 0;\n switch (this.horizontalAlignment) {\n case 'left':\n hostLeftMargin = 0;\n break;\n case 'center':\n hostLeftMargin = Math.max(0, (this.root.clientWidth - width) / 2);\n break;\n case 'right':\n hostLeftMargin = Math.max(0, this.root.clientWidth - width);\n break;\n }\n this.host.style.setProperty('margin-top', `${hostTopMargin}px`, 'important');\n this.host.style.setProperty('margin-left', `${hostLeftMargin}px`, 'important');\n if (this.slider != null) {\n this.slider.root.style.setProperty('margin-top', `${hostTopMargin + canvasHeight}px`, 'important');\n }\n\n if (this.root.clientHeight <= height) {\n this.host.style.setProperty('height', `${this.root.clientHeight}px`);\n this.host.style.setProperty('overflow-y', null);\n } else {\n this.host.style.setProperty('overflow-y', 'hidden', 'important');\n }\n }\n }\n\n public getAlphabetSize(): number {\n return this.unitsHandler?.getAlphabetSize() ?? 0;\n }\n\n // -- Handle events --\n\n private sliderOnValuesChanged(value: any): void {\n if ((this.host == null)) return;\n\n try {\n /* Resize slider if we can resize do that */\n if ((this.allowResize) && (!this.turnOfResizeForOneSetValue) &&\n (this.visibleSlider)) {\n const countOfPositions = Math.ceil(this.slider.max - this.slider.min);\n const calculatedWidth = (this.canvas.width / countOfPositions) - this.positionMarginValue;\n // saving positionWidth value global (even if slider is not visible)\n this.positionWidth = calculatedWidth;\n this._positionWidth = calculatedWidth;\n }\n this.turnOfResizeForOneSetValue = false;\n this.render(true);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.sliderOnValuesChanged() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private dataFrameFilterOnChanged(value: any): void {\n console.debug('Bio: WebLogoViewer.dataFrameFilterChanged()');\n try {\n this.updatePositions();\n this.render();\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.dataFrameFilterOnChanged() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private dataFrameSelectionOnChanged(value: any): void {\n console.debug('Bio: WebLogoViewer.dataFrameSelectionOnChanged()');\n try {\n this.render();\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.dataFrameSelectionOnChanged() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private canvasOnMouseMove(e: MouseEvent) {\n try {\n const args = e as MouseEvent;\n\n const dpr: number = window.devicePixelRatio;\n const cursorP: DG.Point = this.canvas.getCursorPosition(args, dpr);\n const [jPos, monomer] = this.getMonomer(cursorP);\n // if (jPos != undefined && monomer == undefined) {\n // const preEl = ui.element('pre');\n // preEl.innerHTML = jPos < this.positions.length ?\n // JSON.stringify(this.positions[jPos].freq, undefined, 2) : 'NO jPos';\n // const tooltipEl = ui.div([ui.div(`pos: ${jPos}`), preEl]);\n // ui.tooltip.show(tooltipEl, args.x + 16, args.y + 16);\n // } else\n if (this.dataFrame && this.seqCol && this.splitter && monomer) {\n const atPI: PositionInfo = this.positions[jPos];\n const monomerAtPosSeqCount = countForMonomerAtPosition(\n this.dataFrame, this.seqCol, this.filter, this.splitter, monomer, atPI);\n\n const tooltipEl = ui.div([\n // ui.div(`pos ${jPos}`),\n ui.div(`${monomer}`),\n ui.div(`${monomerAtPosSeqCount} rows`)]);\n ui.tooltip.show(tooltipEl, args.x + 16, args.y + 16);\n } else {\n ui.tooltip.hide();\n }\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.canvasOnMouseMove() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private canvasOnMouseDown(e: MouseEvent): void {\n try {\n const args = e as MouseEvent;\n const r: number = window.devicePixelRatio;\n const [jPos, monomer] = this.getMonomer(this.canvas.getCursorPosition(args, r));\n\n // prevents deselect all rows if we miss monomer bounds\n if (this.dataFrame && this.seqCol && this.splitter && monomer) {\n const atPI: PositionInfo = this.positions[jPos];\n\n // this.dataFrame.selection.init((rowI: number) => {\n // return checkSeqForMonomerAtPos(\n // this.dataFrame, this.seqCol!, this.filter, rowI, this.splitter!, monomer, atPI);\n // });\n // Calculate a new BitSet object for selection to prevent interfering with existing\n const selBS: DG.BitSet = DG.BitSet.create(this.dataFrame.selection.length, (rowI: number) => {\n return checkSeqForMonomerAtPos(\n this.dataFrame, this.seqCol!, this.filter, rowI, this.splitter!, monomer, atPI);\n });\n this.dataFrame.selection.init((i) => selBS.get(i));\n }\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.canvasOnMouseDown() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private canvasOnWheel(e: WheelEvent) {\n try {\n if (!this.visibleSlider)\n return;\n const countOfScrollPositions = (e.deltaY / 100) * Math.max(Math.floor((this.countOfRenderPositions) / 2), 1);\n this.slider.scrollBy(this.slider.min + countOfScrollPositions);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.canvasOnWheel() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n}\n\nexport function checkSeqForMonomerAtPos(\n df: DG.DataFrame, seqCol: DG.Column, filter: DG.BitSet, rowI: number,\n splitter: SplitterFunc, monomer: string, at: PositionInfo\n): boolean {\n // if (!filter.get(rowI)) return false;\n // TODO: Use BitSet.get(idx)\n if (!filter.getSelectedIndexes().includes(rowI)) return false;\n\n const seq = seqCol!.get(rowI);\n const seqM = seq ? splitter!(seq)[at.pos] : null;\n return ((seqM === monomer) || (seqM === '' && monomer === '-'));\n}\n\nexport function countForMonomerAtPosition(\n df: DG.DataFrame, seqCol: DG.Column, filter: DG.BitSet,\n splitter: SplitterFunc, monomer: string, at: PositionInfo\n): number {\n const posMList: (string | null)[] = wu.count(0).take(df.rowCount)\n .filter((rowI) => filter.get(rowI))\n .map((rowI) => {\n const seq: string | null = seqCol!.get(rowI);\n const seqMList: string[] = seq ? splitter!(seq) : [];\n const seqMPos: number = at.pos;\n const seqM: string | null = seqMPos < seqMList.length ? seqMList[seqMPos] : null;\n return seqM;\n }).toArray();\n // wu.count().take(this.dataFrame.rowCount).filter(function(iRow) {\n // return correctMonomerFilter(iRow, monomer, jPos);\n // }).reduce<number>((count, iRow) => count + 1, 0);\n const monomerAtPosRowCount = posMList.filter((m) => m == monomer).reduce((count, m) => count + 1, 0);\n return monomerAtPosRowCount;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs.operators;","/**\n * Macromolecules substructure filter that uses Datagrok's collaborative filtering.\n * 1. On onRowsFiltering event, only FILTER OUT rows that do not satisfy this filter's criteria\n * 2. Call dataFrame.rows.requestFilter when filtering criteria changes.\n * */\n\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as grok from 'datagrok-api/grok';\nimport wu from 'wu';\nimport {helmSubstructureSearch, linearSubstructureSearch} from '../substructure-search/substructure-search';\nimport {Subject, Subscription} from 'rxjs';\nimport * as C from '../utils/constants';\nimport {updateDivInnerHTML} from '../utils/ui-utils';\nimport {TAGS as bioTAGS, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {delay} from '@datagrok-libraries/utils/src/test';\nimport {debounceTime} from 'rxjs/operators';\n\nexport class BioSubstructureFilter extends DG.Filter {\n bioFilter: FastaFilter | SeparatorFilter | HelmFilter | null = null;\n bitset: DG.BitSet | null = null;\n loader: HTMLDivElement = ui.loader();\n onBioFilterChangedSubs?: Subscription;\n notation: string | undefined = undefined;\n\n get calculating(): boolean { return this.loader.style.display == 'initial'; }\n\n set calculating(value: boolean) { this.loader.style.display = value ? 'initial' : 'none'; }\n\n get filterSummary(): string {\n return this.bioFilter!.substructure;\n }\n\n get isFiltering(): boolean {\n return super.isFiltering && this.bioFilter!.substructure !== '';\n }\n\n get isReadyToApplyFilter(): boolean {\n return !this.calculating && this.bitset != null;\n }\n\n get _debounceTime(): number {\n if (this.column == null)\n return 1000;\n const length = this.column.length;\n const minLength = 500;\n const maxLength = 10000;\n const msecMax = 1000;\n if (length < minLength) return 0;\n if (length > maxLength) return msecMax;\n return Math.floor(msecMax * ((length - minLength) / (maxLength - minLength)));\n }\n\n //column name setter overload\n\n constructor() {\n super();\n this.root = ui.divV([]);\n this.calculating = false;\n }\n\n attach(dataFrame: DG.DataFrame): void {\n super.attach(dataFrame);\n this.column = dataFrame.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n this.columnName ??= this.column?.name;\n this.notation ??= this.column?.getTag(DG.TAGS.UNITS);\n this.bioFilter = this.notation === NOTATION.FASTA ?\n new FastaFilter() : this.notation === NOTATION.SEPARATOR ?\n new SeparatorFilter(this.column!.getTag(bioTAGS.separator)) : new HelmFilter();\n this.root.appendChild(this.bioFilter!.filterPanel);\n this.root.appendChild(this.loader);\n\n this.onBioFilterChangedSubs?.unsubscribe();\n\n let onChangedEvent: any = this.bioFilter.onChanged;\n onChangedEvent = onChangedEvent.pipe(debounceTime(this._debounceTime));\n this.onBioFilterChangedSubs = onChangedEvent.subscribe(async (_: any) => await this._onInputChanged());\n }\n\n detach() {\n super.detach();\n }\n\n applyFilter(): void {\n if (this.bitset && !this.isDetached)\n this.dataFrame?.filter.and(this.bitset);\n }\n\n /** Override to save filter state. */\n saveState(): any {\n const state = super.saveState();\n state.bioSubstructure = this.bioFilter?.substructure;\n return state;\n }\n\n /** Override to load filter state. */\n applyState(state: any): void {\n super.applyState(state); //column, columnName\n if (state.bioSubstructure)\n this.bioFilter!.substructure = state.bioSubstructure;\n\n const that = this;\n if (state.bioSubstructure)\n setTimeout(function() { that._onInputChanged(); }, 1000);\n }\n\n /**\n * Performs the actual filtering\n * When the results are ready, triggers `rows.requestFilter`, which in turn triggers `applyFilter`\n * that would simply apply the bitset synchronously.\n */\n async _onInputChanged(): Promise<void> {\n if (!this.isFiltering) {\n this.bitset = null;\n this.dataFrame?.rows.requestFilter();\n } else if (wu(this.dataFrame!.rows.filters).has(`${this.columnName}: ${this.filterSummary}`)) {\n // some other filter is already filtering for the exact same thing\n return;\n } else {\n this.calculating = true;\n try {\n this.bitset = await this.bioFilter?.substrucrureSearch(this.column!)!;\n this.calculating = false;\n this.dataFrame?.rows.requestFilter();\n } finally {\n this.calculating = false;\n }\n }\n }\n}\n\nabstract class BioFilterBase {\n onChanged: Subject<any> = new Subject<any>();\n\n get filterPanel() {\n return new HTMLElement();\n }\n\n get substructure() {\n return '';\n }\n\n set substructure(s: string) {\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n return null;\n }\n}\n\nclass FastaFilter extends BioFilterBase {\n readonly substructureInput: DG.InputBase<string>;\n\n constructor() {\n super();\n\n this.substructureInput = ui.stringInput('', '', () => {\n this.onChanged.next();\n }, {placeholder: 'Substructure'});\n }\n\n get filterPanel() {\n return this.substructureInput.root;\n }\n\n get substructure() {\n return this.substructureInput.value;\n }\n\n set substructure(s: string) {\n this.substructureInput.value = s;\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n return await linearSubstructureSearch(this.substructure, column);\n }\n}\n\nexport class SeparatorFilter extends FastaFilter {\n readonly separatorInput: DG.InputBase<string>;\n colSeparator = '';\n\n constructor(separator: string) {\n super();\n\n this.separatorInput = ui.stringInput('', '', () => {\n this.onChanged.next();\n }, {placeholder: 'Separator'});\n this.colSeparator = separator;\n this.separatorInput.value = separator;\n }\n\n get filterPanel() {\n return ui.divV([\n this.substructureInput.root,\n this.separatorInput.root\n ]);\n }\n\n get substructure() {\n return this.separatorInput.value && this.separatorInput.value !== this.colSeparator ?\n this.substructureInput.value.replaceAll(this.separatorInput.value, this.colSeparator) :\n this.substructureInput.value;\n }\n\n set substructure(s: string) {\n this.substructureInput.value = s;\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n return await linearSubstructureSearch(this.substructure, column, this.colSeparator);\n }\n}\n\nexport class HelmFilter extends BioFilterBase {\n helmEditor: any;\n _filterPanel = ui.div('', {style: {cursor: 'pointer'}});\n helmSubstructure = '';\n\n constructor() {\n super();\n this.init();\n }\n\n async init() {\n this.helmEditor = await grok.functions.call('HELM:helmWebEditor');\n await ui.tools.waitForElementInDom(this._filterPanel);\n this.updateFilterPanel();\n this._filterPanel.addEventListener('click', (event: MouseEvent) => {\n const {editorDiv, webEditor} = this.helmEditor.createWebEditor(this.helmSubstructure);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(editorDiv)\n .onOK(() => {\n const helmString = webEditor.canvas.getHelm(true)\n .replace(/<\\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');\n this.helmSubstructure = helmString;\n this.updateFilterPanel(this.substructure);\n setTimeout(() => { this.onChanged.next(); }, 10);\n }).show({modal: true, fullScreen: true});\n });\n ui.onSizeChanged(this._filterPanel).subscribe((_) => {\n const helmString = this.helmEditor\n .webEditor.canvas.getHelm(true).replace(/<\\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');\n this.updateFilterPanel(helmString);\n });\n }\n\n get filterPanel() {\n return this._filterPanel;\n }\n\n get substructure() {\n return this.helmSubstructure;\n }\n\n set substructure(s: string) {\n this.helmEditor.editor.setHelm(s);\n }\n\n updateFilterPanel(helmString?: string) {\n const width = this._filterPanel.parentElement!.clientWidth < 100 ? 100 :\n this._filterPanel.parentElement!.clientWidth;\n const height = width / 2;\n if (!helmString) {\n const editDiv = ui.divText('Click to edit', 'helm-substructure-filter');\n updateDivInnerHTML(this._filterPanel, editDiv);\n } else {\n updateDivInnerHTML(this._filterPanel, this.helmEditor.host);\n this.helmEditor.editor.setHelm(helmString);\n this.helmEditor.resizeEditor(width, height);\n }\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n ui.setUpdateIndicator(this._filterPanel, true);\n await delay(10);\n const res = await helmSubstructureSearch(this.substructure, column);\n ui.setUpdateIndicator(this._filterPanel, false);\n return res;\n }\n}\n","\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nfunction makeHeap(nPoints, size) {\n var makeArrays = function (fillValue) {\n return utils.empty(nPoints).map(function () {\n return utils.filled(size, fillValue);\n });\n };\n var heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\nexports.makeHeap = makeHeap;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = utils.zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n var j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n var broken = false;\n for (var k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n }\n result[i] = j;\n }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n for (var i = 0; i < indices.length; i++) {\n if (index === indices[i]) {\n return 0;\n }\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\nexports.heapPush = heapPush;\nfunction uncheckedHeapPush(heap, row, weight, index, flag) {\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n var i = 0;\n var iSwap = 0;\n while (true) {\n var ic1 = 2 * i + 1;\n var ic2 = ic1 + 1;\n var heapShape2 = heap[0][0].length;\n if (ic1 >= heapShape2) {\n break;\n }\n else if (ic2 >= heapShape2) {\n if (weights[ic1] > weight) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1]) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else {\n if (weight < weights[ic2]) {\n iSwap = ic2;\n }\n else {\n break;\n }\n }\n weights[i] = weights[iSwap];\n indices[i] = indices[iSwap];\n isNew[i] = isNew[iSwap];\n i = iSwap;\n }\n weights[i] = weight;\n indices[i] = index;\n isNew[i] = flag;\n return 1;\n}\nexports.uncheckedHeapPush = uncheckedHeapPush;\nfunction buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n var candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0) {\n continue;\n }\n var idx = currentGraph[0][i][j];\n var isn = currentGraph[2][i][j];\n var d = utils.tauRand(random);\n heapPush(candidateNeighbors, i, d, idx, isn);\n heapPush(candidateNeighbors, idx, d, i, isn);\n currentGraph[2][i][j] = 0;\n }\n }\n return candidateNeighbors;\n}\nexports.buildCandidates = buildCandidates;\nfunction deheapSort(heap) {\n var indices = heap[0];\n var weights = heap[1];\n for (var i = 0; i < indices.length; i++) {\n var indHeap = indices[i];\n var distHeap = weights[i];\n for (var j = 0; j < indHeap.length - 1; j++) {\n var indHeapIndex = indHeap.length - j - 1;\n var distHeapIndex = distHeap.length - j - 1;\n var temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n var temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices: indices, weights: weights };\n}\nexports.deheapSort = deheapSort;\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n var leftChild = elt * 2 + 1;\n var rightChild = leftChild + 1;\n var swap = elt;\n if (heap1[swap] < heap1[leftChild]) {\n swap = leftChild;\n }\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {\n swap = rightChild;\n }\n if (swap === elt) {\n break;\n }\n else {\n var temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n var temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\nfunction smallestFlagged(heap, row) {\n var ind = heap[0][row];\n var dist = heap[1][row];\n var flag = heap[2][row];\n var minDist = Infinity;\n var resultIndex = -1;\n for (var i = 0; i > ind.length; i++) {\n if (flag[i] === 1 && dist[i] < minDist) {\n minDist = dist[i];\n resultIndex = i;\n }\n }\n if (resultIndex >= 0) {\n flag[resultIndex] = 0;\n return Math.floor(ind[resultIndex]);\n }\n else {\n return -1;\n }\n}\nexports.smallestFlagged = smallestFlagged;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar umap_1 = require(\"./umap\");\nexports.UMAP = umap_1.UMAP;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _a;\nvar utils = __importStar(require(\"./utils\"));\nvar SparseMatrix = (function () {\n function SparseMatrix(rows, cols, values, dims) {\n this.entries = new Map();\n this.nRows = 0;\n this.nCols = 0;\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n this.nRows = dims[0];\n this.nCols = dims[1];\n for (var i = 0; i < values.length; i++) {\n var row = rows[i];\n var col = cols[i];\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row: row, col: col });\n }\n }\n SparseMatrix.prototype.makeKey = function (row, col) {\n return row + \":\" + col;\n };\n SparseMatrix.prototype.checkDims = function (row, col) {\n var withinBounds = row < this.nRows && col < this.nCols;\n if (!withinBounds) {\n throw new Error('row and/or col specified outside of matrix dimensions');\n }\n };\n SparseMatrix.prototype.set = function (row, col, value) {\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (!this.entries.has(key)) {\n this.entries.set(key, { value: value, row: row, col: col });\n }\n else {\n this.entries.get(key).value = value;\n }\n };\n SparseMatrix.prototype.get = function (row, col, defaultValue) {\n if (defaultValue === void 0) { defaultValue = 0; }\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (this.entries.has(key)) {\n return this.entries.get(key).value;\n }\n else {\n return defaultValue;\n }\n };\n SparseMatrix.prototype.getAll = function (ordered) {\n if (ordered === void 0) { ordered = true; }\n var rowColValues = [];\n this.entries.forEach(function (value) {\n rowColValues.push(value);\n });\n if (ordered) {\n rowColValues.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n }\n return rowColValues;\n };\n SparseMatrix.prototype.getDims = function () {\n return [this.nRows, this.nCols];\n };\n SparseMatrix.prototype.getRows = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.row;\n });\n };\n SparseMatrix.prototype.getCols = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.col;\n });\n };\n SparseMatrix.prototype.getValues = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.value;\n });\n };\n SparseMatrix.prototype.forEach = function (fn) {\n this.entries.forEach(function (value) { return fn(value.value, value.row, value.col); });\n };\n SparseMatrix.prototype.map = function (fn) {\n var vals = [];\n this.entries.forEach(function (value) {\n vals.push(fn(value.value, value.row, value.col));\n });\n var dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n };\n SparseMatrix.prototype.toArray = function () {\n var _this = this;\n var rows = utils.empty(this.nRows);\n var output = rows.map(function () {\n return utils.zeros(_this.nCols);\n });\n this.entries.forEach(function (value) {\n output[value.row][value.col] = value.value;\n });\n return output;\n };\n return SparseMatrix;\n}());\nexports.SparseMatrix = SparseMatrix;\nfunction transpose(matrix) {\n var cols = [];\n var rows = [];\n var vals = [];\n matrix.forEach(function (value, row, col) {\n cols.push(row);\n rows.push(col);\n vals.push(value);\n });\n var dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nexports.transpose = transpose;\nfunction identity(size) {\n var _a = __read(size, 1), rows = _a[0];\n var matrix = new SparseMatrix([], [], [], size);\n for (var i = 0; i < rows; i++) {\n matrix.set(i, i, 1);\n }\n return matrix;\n}\nexports.identity = identity;\nfunction pairwiseMultiply(a, b) {\n return elementWise(a, b, function (x, y) { return x * y; });\n}\nexports.pairwiseMultiply = pairwiseMultiply;\nfunction add(a, b) {\n return elementWise(a, b, function (x, y) { return x + y; });\n}\nexports.add = add;\nfunction subtract(a, b) {\n return elementWise(a, b, function (x, y) { return x - y; });\n}\nexports.subtract = subtract;\nfunction maximum(a, b) {\n return elementWise(a, b, function (x, y) { return (x > y ? x : y); });\n}\nexports.maximum = maximum;\nfunction multiplyScalar(a, scalar) {\n return a.map(function (value) {\n return value * scalar;\n });\n}\nexports.multiplyScalar = multiplyScalar;\nfunction eliminateZeros(m) {\n var zeroIndices = new Set();\n var values = m.getValues();\n var rows = m.getRows();\n var cols = m.getCols();\n for (var i = 0; i < values.length; i++) {\n if (values[i] === 0) {\n zeroIndices.add(i);\n }\n }\n var removeByZeroIndex = function (_, index) { return !zeroIndices.has(index); };\n var nextValues = values.filter(removeByZeroIndex);\n var nextRows = rows.filter(removeByZeroIndex);\n var nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\nexports.eliminateZeros = eliminateZeros;\nfunction normalize(m, normType) {\n if (normType === void 0) { normType = \"l2\"; }\n var e_1, _a;\n var normFn = normFns[normType];\n var colsByRow = new Map();\n m.forEach(function (_, row, col) {\n var cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n var nextMatrix = new SparseMatrix([], [], [], m.getDims());\n var _loop_1 = function (row) {\n var cols = colsByRow.get(row).sort();\n var vals = cols.map(function (col) { return m.get(row, col); });\n var norm = normFn(vals);\n for (var i = 0; i < norm.length; i++) {\n nextMatrix.set(row, cols[i], norm[i]);\n }\n };\n try {\n for (var _b = __values(colsByRow.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var row = _c.value;\n _loop_1(row);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return nextMatrix;\n}\nexports.normalize = normalize;\nvar normFns = (_a = {},\n _a[\"max\"] = function (xs) {\n var max = -Infinity;\n for (var i = 0; i < xs.length; i++) {\n max = xs[i] > max ? xs[i] : max;\n }\n return xs.map(function (x) { return x / max; });\n },\n _a[\"l1\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += xs[i];\n }\n return xs.map(function (x) { return x / sum; });\n },\n _a[\"l2\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += Math.pow(xs[i], 2);\n }\n return xs.map(function (x) { return Math.sqrt(Math.pow(x, 2) / sum); });\n },\n _a);\nfunction elementWise(a, b, op) {\n var visited = new Set();\n var rows = [];\n var cols = [];\n var vals = [];\n var operate = function (row, col) {\n rows.push(row);\n cols.push(col);\n var nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n var valuesA = a.getValues();\n var rowsA = a.getRows();\n var colsA = a.getCols();\n for (var i = 0; i < valuesA.length; i++) {\n var row = rowsA[i];\n var col = colsA[i];\n var key = row + \":\" + col;\n visited.add(key);\n operate(row, col);\n }\n var valuesB = b.getValues();\n var rowsB = b.getRows();\n var colsB = b.getCols();\n for (var i = 0; i < valuesB.length; i++) {\n var row = rowsB[i];\n var col = colsB[i];\n var key = row + \":\" + col;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n var dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nfunction getCSR(x) {\n var entries = [];\n x.forEach(function (value, row, col) {\n entries.push({ value: value, row: row, col: col });\n });\n entries.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n var indices = [];\n var values = [];\n var indptr = [];\n var currentRow = -1;\n for (var i = 0; i < entries.length; i++) {\n var _a = entries[i], row = _a.row, col = _a.col, value = _a.value;\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices: indices, values: values, indptr: indptr };\n}\nexports.getCSR = getCSR;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nfunction makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters, maxCandidates, delta, rho, rpTreeInit) {\n if (nIters === void 0) { nIters = 10; }\n if (maxCandidates === void 0) { maxCandidates = 50; }\n if (delta === void 0) { delta = 0.001; }\n if (rho === void 0) { rho = 0.5; }\n if (rpTreeInit === void 0) { rpTreeInit = true; }\n var nVertices = data.length;\n var currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (var i = 0; i < data.length; i++) {\n var indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n var d = distanceFn(data[i], data[indices[j]]);\n heap.heapPush(currentGraph, i, d, indices[j], 1);\n heap.heapPush(currentGraph, indices[j], d, i, 1);\n }\n }\n if (rpTreeInit) {\n for (var n = 0; n < leafArray.length; n++) {\n for (var i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0) {\n break;\n }\n for (var j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0) {\n break;\n }\n var d = distanceFn(data[leafArray[n][i]], data[leafArray[n][j]]);\n heap.heapPush(currentGraph, leafArray[n][i], d, leafArray[n][j], 1);\n heap.heapPush(currentGraph, leafArray[n][j], d, leafArray[n][i], 1);\n }\n }\n }\n }\n for (var n = 0; n < nIters; n++) {\n var candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n var c = 0;\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < maxCandidates; j++) {\n var p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho) {\n continue;\n }\n for (var k = 0; k < maxCandidates; k++) {\n var q = Math.floor(candidateNeighbors[0][i][k]);\n var cj = candidateNeighbors[2][i][j];\n var ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck)) {\n continue;\n }\n var d = distanceFn(data[p], data[q]);\n c += heap.heapPush(currentGraph, p, d, q, 1);\n c += heap.heapPush(currentGraph, q, d, p, 1);\n }\n }\n }\n if (c <= delta * nNeighbors * data.length) {\n break;\n }\n }\n var sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexports.makeNNDescent = makeNNDescent;\nfunction makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n continue;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n }\n function initFromTree(_tree, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n return;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom: initFromRandom, initFromTree: initFromTree };\n}\nexports.makeInitializations = makeInitializations;\nfunction makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n var e_1, _a;\n var _b = matrix.getCSR(graph), indices = _b.indices, indptr = _b.indptr;\n for (var i = 0; i < queryPoints.length; i++) {\n var tried = new Set(initialization[0][i]);\n while (true) {\n var vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1) {\n break;\n }\n var candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n try {\n for (var candidates_1 = __values(candidates), candidates_1_1 = candidates_1.next(); !candidates_1_1.done; candidates_1_1 = candidates_1.next()) {\n var candidate = candidates_1_1.value;\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate)) {\n continue;\n }\n var d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (candidates_1_1 && !candidates_1_1.done && (_a = candidates_1.return)) _a.call(candidates_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n return initialization;\n };\n}\nexports.makeInitializedNNSearch = makeInitializedNNSearch;\nfunction initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n var e_2, _a;\n var results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n try {\n for (var forest_1 = __values(forest), forest_1_1 = forest_1.next(); !forest_1_1.done; forest_1_1 = forest_1.next()) {\n var tree_1 = forest_1_1.value;\n initFromTree(tree_1, data, queryPoints, results, random);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (forest_1_1 && !forest_1_1.done && (_a = forest_1.return)) _a.call(forest_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n return results;\n}\nexports.initializeSearch = initializeSearch;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nvar FlatTree = (function () {\n function FlatTree(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n return FlatTree;\n}());\nexports.FlatTree = FlatTree;\nfunction makeForest(data, nNeighbors, nTrees, random) {\n var leafSize = Math.max(10, nNeighbors);\n var trees = utils\n .range(nTrees)\n .map(function (_, i) { return makeTree(data, leafSize, i, random); });\n var forest = trees.map(function (tree) { return flattenTree(tree, leafSize); });\n return forest;\n}\nexports.makeForest = makeForest;\nfunction makeTree(data, leafSize, n, random) {\n if (leafSize === void 0) { leafSize = 30; }\n var indices = utils.range(data.length);\n var tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize, q, random) {\n if (leafSize === void 0) { leafSize = 30; }\n if (indices.length > leafSize) {\n var splitResults = euclideanRandomProjectionSplit(data, indices, random);\n var indicesLeft = splitResults.indicesLeft, indicesRight = splitResults.indicesRight, hyperplane = splitResults.hyperplane, offset = splitResults.offset;\n var leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n var rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n var node = { leftChild: leftChild, rightChild: rightChild, isLeaf: false, hyperplane: hyperplane, offset: offset };\n return node;\n }\n else {\n var node = { indices: indices, isLeaf: true };\n return node;\n }\n}\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n var dim = data[0].length;\n var leftIndex = utils.tauRandInt(indices.length, random);\n var rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n var left = indices[leftIndex];\n var right = indices[rightIndex];\n var hyperplaneOffset = 0;\n var hyperplaneVector = utils.zeros(dim);\n for (var i = 0; i < hyperplaneVector.length; i++) {\n hyperplaneVector[i] = data[left][i] - data[right][i];\n hyperplaneOffset -=\n (hyperplaneVector[i] * (data[left][i] + data[right][i])) / 2.0;\n }\n var nLeft = 0;\n var nRight = 0;\n var side = utils.zeros(indices.length);\n for (var i = 0; i < indices.length; i++) {\n var margin = hyperplaneOffset;\n for (var d = 0; d < dim; d++) {\n margin += hyperplaneVector[d] * data[indices[i]][d];\n }\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0) {\n nLeft += 1;\n }\n else {\n nRight += 1;\n }\n }\n else if (margin > 0) {\n side[i] = 0;\n nLeft += 1;\n }\n else {\n side[i] = 1;\n nRight += 1;\n }\n }\n var indicesLeft = utils.zeros(nLeft);\n var indicesRight = utils.zeros(nRight);\n nLeft = 0;\n nRight = 0;\n for (var i = 0; i < side.length; i++) {\n if (side[i] === 0) {\n indicesLeft[nLeft] = indices[i];\n nLeft += 1;\n }\n else {\n indicesRight[nRight] = indices[i];\n nRight += 1;\n }\n }\n return {\n indicesLeft: indicesLeft,\n indicesRight: indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n var nNodes = numNodes(tree);\n var nLeaves = numLeaves(tree);\n var hyperplanes = utils\n .range(nNodes)\n .map(function () { return utils.zeros(tree.hyperplane ? tree.hyperplane.length : 0); });\n var offsets = utils.zeros(nNodes);\n var children = utils.range(nNodes).map(function () { return [-1, -1]; });\n var indices = utils\n .range(nLeaves)\n .map(function () { return utils.range(leafSize).map(function () { return -1; }); });\n recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);\n return new FlatTree(hyperplanes, offsets, children, indices);\n}\nfunction recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {\n var _a;\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n (_a = indices[leafNum]).splice.apply(_a, __spread([0, tree.indices.length], tree.indices));\n leafNum += 1;\n return { nodeNum: nodeNum, leafNum: leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n var oldNodeNum = nodeNum;\n var res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n nodeNum = res.nodeNum;\n leafNum = res.leafNum;\n children[oldNodeNum][1] = nodeNum + 1;\n res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n return { nodeNum: res.nodeNum, leafNum: res.leafNum };\n }\n}\nfunction numNodes(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n }\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n }\n}\nfunction makeLeafArray(rpForest) {\n var e_1, _a;\n if (rpForest.length > 0) {\n var output = [];\n try {\n for (var rpForest_1 = __values(rpForest), rpForest_1_1 = rpForest_1.next(); !rpForest_1_1.done; rpForest_1_1 = rpForest_1.next()) {\n var tree = rpForest_1_1.value;\n output.push.apply(output, __spread(tree.indices));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (rpForest_1_1 && !rpForest_1_1.done && (_a = rpForest_1.return)) _a.call(rpForest_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return output;\n }\n else {\n return [[-1]];\n }\n}\nexports.makeLeafArray = makeLeafArray;\nfunction selectSide(hyperplane, offset, point, random) {\n var margin = offset;\n for (var d = 0; d < point.length; d++) {\n margin += hyperplane[d] * point[d];\n }\n if (margin === 0) {\n var side = utils.tauRandInt(2, random);\n return side;\n }\n else if (margin > 0) {\n return 0;\n }\n else {\n return 1;\n }\n}\nfunction searchFlatTree(point, tree, random) {\n var node = 0;\n while (tree.children[node][0] > 0) {\n var side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0) {\n node = tree.children[node][0];\n }\n else {\n node = tree.children[node][1];\n }\n }\n var index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\nexports.searchFlatTree = searchFlatTree;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar nnDescent = __importStar(require(\"./nn_descent\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nvar ml_levenberg_marquardt_1 = __importDefault(require(\"ml-levenberg-marquardt\"));\nvar SMOOTH_K_TOLERANCE = 1e-5;\nvar MIN_K_DIST_SCALE = 1e-3;\nvar UMAP = (function () {\n function UMAP(params) {\n if (params === void 0) { params = {}; }\n var _this = this;\n this.learningRate = 1.0;\n this.localConnectivity = 1.0;\n this.minDist = 0.1;\n this.nComponents = 2;\n this.nEpochs = 0;\n this.nNeighbors = 15;\n this.negativeSampleRate = 5;\n this.random = Math.random;\n this.repulsionStrength = 1.0;\n this.setOpMixRatio = 1.0;\n this.spread = 1.0;\n this.transformQueueSize = 4.0;\n this.targetMetric = \"categorical\";\n this.targetWeight = 0.5;\n this.targetNNeighbors = this.nNeighbors;\n this.distanceFn = euclidean;\n this.isInitialized = false;\n this.rpForest = [];\n this.embedding = [];\n this.optimizationState = new OptimizationState();\n var setParam = function (key) {\n if (params[key] !== undefined)\n _this[key] = params[key];\n };\n setParam('distanceFn');\n setParam('learningRate');\n setParam('localConnectivity');\n setParam('minDist');\n setParam('nComponents');\n setParam('nEpochs');\n setParam('nNeighbors');\n setParam('negativeSampleRate');\n setParam('random');\n setParam('repulsionStrength');\n setParam('setOpMixRatio');\n setParam('spread');\n setParam('transformQueueSize');\n }\n UMAP.prototype.fit = function (X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n };\n UMAP.prototype.fitAsync = function (X, callback) {\n if (callback === void 0) { callback = function () { return true; }; }\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.initializeFit(X);\n return [4, this.optimizeLayoutAsync(callback)];\n case 1:\n _a.sent();\n return [2, this.embedding];\n }\n });\n });\n };\n UMAP.prototype.setSupervisedProjection = function (Y, params) {\n if (params === void 0) { params = {}; }\n this.Y = Y;\n this.targetMetric = params.targetMetric || this.targetMetric;\n this.targetWeight = params.targetWeight || this.targetWeight;\n this.targetNNeighbors = params.targetNNeighbors || this.targetNNeighbors;\n };\n UMAP.prototype.setPrecomputedKNN = function (knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n };\n UMAP.prototype.initializeFit = function (X) {\n if (X.length <= this.nNeighbors) {\n throw new Error(\"Not enough data points (\" + X.length + \") to create nNeighbors: \" + this.nNeighbors + \". Add more data points or adjust the configuration.\");\n }\n if (this.X === X && this.isInitialized) {\n return this.getNEpochs();\n }\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n var knnResults = this.nearestNeighbors(X);\n this.knnIndices = knnResults.knnIndices;\n this.knnDistances = knnResults.knnDistances;\n }\n this.graph = this.fuzzySimplicialSet(X, this.nNeighbors, this.setOpMixRatio);\n this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n this.processGraphForSupervisedProjection();\n var _a = this.initializeSimplicialSetEmbedding(), head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n };\n UMAP.prototype.makeSearchFns = function () {\n var _a = nnDescent.makeInitializations(this.distanceFn), initFromTree = _a.initFromTree, initFromRandom = _a.initFromRandom;\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n };\n UMAP.prototype.makeSearchGraph = function (X) {\n var knnIndices = this.knnIndices;\n var knnDistances = this.knnDistances;\n var dims = [X.length, X.length];\n var searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (var i = 0; i < knnIndices.length; i++) {\n var knn = knnIndices[i];\n var distances = knnDistances[i];\n for (var j = 0; j < knn.length; j++) {\n var neighbor = knn[j];\n var distance = distances[j];\n if (distance > 0) {\n searchGraph.set(i, neighbor, distance);\n }\n }\n }\n var transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n };\n UMAP.prototype.transform = function (toTransform) {\n var _this = this;\n var rawData = this.X;\n if (rawData === undefined || rawData.length === 0) {\n throw new Error('No data has been fit.');\n }\n var nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n var init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n var result = this.search(rawData, this.searchGraph, init, toTransform);\n var _a = heap.deheapSort(result), indices = _a.indices, distances = _a.weights;\n indices = indices.map(function (x) { return x.slice(0, _this.nNeighbors); });\n distances = distances.map(function (x) { return x.slice(0, _this.nNeighbors); });\n var adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n var _b = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity), sigmas = _b.sigmas, rhos = _b.rhos;\n var _c = this.computeMembershipStrengths(indices, distances, sigmas, rhos), rows = _c.rows, cols = _c.cols, vals = _c.vals;\n var size = [toTransform.length, rawData.length];\n var graph = new matrix.SparseMatrix(rows, cols, vals, size);\n var normed = matrix.normalize(graph, \"l1\");\n var csrMatrix = matrix.getCSR(normed);\n var nPoints = toTransform.length;\n var eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n var eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n var embedding = initTransform(eIndices, eWeights, this.embedding);\n var nEpochs = this.nEpochs\n ? this.nEpochs / 3\n : graph.nRows <= 10000\n ? 100\n : 30;\n var graphMax = graph\n .getValues()\n .reduce(function (max, val) { return (val > max ? val : max); }, 0);\n graph = graph.map(function (value) { return (value < graphMax / nEpochs ? 0 : value); });\n graph = matrix.eliminateZeros(graph);\n var epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n var head = graph.getRows();\n var tail = graph.getCols();\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head: head,\n tail: tail,\n currentEpoch: 0,\n nEpochs: nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample: epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n };\n UMAP.prototype.processGraphForSupervisedProjection = function () {\n var _a = this, Y = _a.Y, X = _a.X;\n if (Y) {\n if (Y.length !== X.length) {\n throw new Error('Length of X and y must be equal');\n }\n if (this.targetMetric === \"categorical\") {\n var lt = this.targetWeight < 1.0;\n var farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n }\n };\n UMAP.prototype.step = function () {\n var currentEpoch = this.optimizationState.currentEpoch;\n if (currentEpoch < this.getNEpochs()) {\n this.optimizeLayoutStep(currentEpoch);\n }\n return this.optimizationState.currentEpoch;\n };\n UMAP.prototype.getEmbedding = function () {\n return this.embedding;\n };\n UMAP.prototype.nearestNeighbors = function (X) {\n var _a = this, distanceFn = _a.distanceFn, nNeighbors = _a.nNeighbors;\n var log2 = function (n) { return Math.log(n) / Math.log(2); };\n var metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n var round = function (n) {\n return n === 0.5 ? 0 : Math.round(n);\n };\n var nTrees = 5 + Math.floor(round(Math.pow(X.length, 0.5) / 20.0));\n var nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n var leafArray = tree.makeLeafArray(this.rpForest);\n var _b = metricNNDescent(X, leafArray, nNeighbors, nIters), indices = _b.indices, weights = _b.weights;\n return { knnIndices: indices, knnDistances: weights };\n };\n UMAP.prototype.fuzzySimplicialSet = function (X, nNeighbors, setOpMixRatio) {\n if (setOpMixRatio === void 0) { setOpMixRatio = 1.0; }\n var _a = this, _b = _a.knnIndices, knnIndices = _b === void 0 ? [] : _b, _c = _a.knnDistances, knnDistances = _c === void 0 ? [] : _c, localConnectivity = _a.localConnectivity;\n var _d = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity), sigmas = _d.sigmas, rhos = _d.rhos;\n var _e = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos), rows = _e.rows, cols = _e.cols, vals = _e.vals;\n var size = [X.length, X.length];\n var sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n var transpose = matrix.transpose(sparseMatrix);\n var prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n var a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n var b = matrix.multiplyScalar(a, setOpMixRatio);\n var c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n var result = matrix.add(b, c);\n return result;\n };\n UMAP.prototype.categoricalSimplicialSetIntersection = function (simplicialSet, target, farDist, unknownDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n var intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n };\n UMAP.prototype.smoothKNNDistance = function (distances, k, localConnectivity, nIter, bandwidth) {\n if (localConnectivity === void 0) { localConnectivity = 1.0; }\n if (nIter === void 0) { nIter = 64; }\n if (bandwidth === void 0) { bandwidth = 1.0; }\n var target = (Math.log(k) / Math.log(2)) * bandwidth;\n var rho = utils.zeros(distances.length);\n var result = utils.zeros(distances.length);\n for (var i = 0; i < distances.length; i++) {\n var lo = 0.0;\n var hi = Infinity;\n var mid = 1.0;\n var ithDistances = distances[i];\n var nonZeroDists = ithDistances.filter(function (d) { return d > 0.0; });\n if (nonZeroDists.length >= localConnectivity) {\n var index = Math.floor(localConnectivity);\n var interpolation = localConnectivity - index;\n if (index > 0) {\n rho[i] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rho[i] +=\n interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rho[i] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDists.length > 0) {\n rho[i] = utils.max(nonZeroDists);\n }\n for (var n = 0; n < nIter; n++) {\n var psum = 0.0;\n for (var j = 1; j < distances[i].length; j++) {\n var d = distances[i][j] - rho[i];\n if (d > 0) {\n psum += Math.exp(-(d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n break;\n }\n if (psum > target) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi === Infinity) {\n mid *= 2;\n }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n result[i] = mid;\n if (rho[i] > 0.0) {\n var meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances) {\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n var meanDistances = utils.mean(distances.map(utils.mean));\n if (result[i] < MIN_K_DIST_SCALE * meanDistances) {\n result[i] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n }\n return { sigmas: result, rhos: rho };\n };\n UMAP.prototype.computeMembershipStrengths = function (knnIndices, knnDistances, sigmas, rhos) {\n var nSamples = knnIndices.length;\n var nNeighbors = knnIndices[0].length;\n var rows = utils.zeros(nSamples * nNeighbors);\n var cols = utils.zeros(nSamples * nNeighbors);\n var vals = utils.zeros(nSamples * nNeighbors);\n for (var i = 0; i < nSamples; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n var val = 0;\n if (knnIndices[i][j] === -1) {\n continue;\n }\n if (knnIndices[i][j] === i) {\n val = 0.0;\n }\n else if (knnDistances[i][j] - rhos[i] <= 0.0) {\n val = 1.0;\n }\n else {\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n }\n rows[i * nNeighbors + j] = i;\n cols[i * nNeighbors + j] = knnIndices[i][j];\n vals[i * nNeighbors + j] = val;\n }\n }\n return { rows: rows, cols: cols, vals: vals };\n };\n UMAP.prototype.initializeSimplicialSetEmbedding = function () {\n var _this = this;\n var nEpochs = this.getNEpochs();\n var nComponents = this.nComponents;\n var graphValues = this.graph.getValues();\n var graphMax = 0;\n for (var i = 0; i < graphValues.length; i++) {\n var value = graphValues[i];\n if (graphMax < graphValues[i]) {\n graphMax = value;\n }\n }\n var graph = this.graph.map(function (value) {\n if (value < graphMax / nEpochs) {\n return 0;\n }\n else {\n return value;\n }\n });\n this.embedding = utils.zeros(graph.nRows).map(function () {\n return utils.zeros(nComponents).map(function () {\n return utils.tauRand(_this.random) * 20 + -10;\n });\n });\n var weights = [];\n var head = [];\n var tail = [];\n var rowColValues = graph.getAll();\n for (var i = 0; i < rowColValues.length; i++) {\n var entry = rowColValues[i];\n if (entry.value) {\n weights.push(entry.value);\n tail.push(entry.row);\n head.push(entry.col);\n }\n }\n var epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head: head, tail: tail, epochsPerSample: epochsPerSample };\n };\n UMAP.prototype.makeEpochsPerSample = function (weights, nEpochs) {\n var result = utils.filled(weights.length, -1.0);\n var max = utils.max(weights);\n var nSamples = weights.map(function (w) { return (w / max) * nEpochs; });\n nSamples.forEach(function (n, i) {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n };\n UMAP.prototype.assignOptimizationStateParameters = function (state) {\n Object.assign(this.optimizationState, state);\n };\n UMAP.prototype.prepareForOptimizationLoop = function () {\n var _a = this, repulsionStrength = _a.repulsionStrength, learningRate = _a.learningRate, negativeSampleRate = _a.negativeSampleRate;\n var _b = this.optimizationState, epochsPerSample = _b.epochsPerSample, headEmbedding = _b.headEmbedding, tailEmbedding = _b.tailEmbedding;\n var dim = headEmbedding[0].length;\n var moveOther = headEmbedding.length === tailEmbedding.length;\n var epochsPerNegativeSample = epochsPerSample.map(function (e) { return e / negativeSampleRate; });\n var epochOfNextNegativeSample = __spread(epochsPerNegativeSample);\n var epochOfNextSample = __spread(epochsPerSample);\n this.assignOptimizationStateParameters({\n epochOfNextSample: epochOfNextSample,\n epochOfNextNegativeSample: epochOfNextNegativeSample,\n epochsPerNegativeSample: epochsPerNegativeSample,\n moveOther: moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim: dim,\n });\n };\n UMAP.prototype.initializeOptimization = function () {\n var headEmbedding = this.embedding;\n var tailEmbedding = this.embedding;\n var _a = this.optimizationState, head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n var nEpochs = this.getNEpochs();\n var nVertices = this.graph.nCols;\n var _b = findABParams(this.spread, this.minDist), a = _b.a, b = _b.b;\n this.assignOptimizationStateParameters({\n headEmbedding: headEmbedding,\n tailEmbedding: tailEmbedding,\n head: head,\n tail: tail,\n epochsPerSample: epochsPerSample,\n a: a,\n b: b,\n nEpochs: nEpochs,\n nVertices: nVertices,\n });\n };\n UMAP.prototype.optimizeLayoutStep = function (n) {\n var optimizationState = this.optimizationState;\n var head = optimizationState.head, tail = optimizationState.tail, headEmbedding = optimizationState.headEmbedding, tailEmbedding = optimizationState.tailEmbedding, epochsPerSample = optimizationState.epochsPerSample, epochOfNextSample = optimizationState.epochOfNextSample, epochOfNextNegativeSample = optimizationState.epochOfNextNegativeSample, epochsPerNegativeSample = optimizationState.epochsPerNegativeSample, moveOther = optimizationState.moveOther, initialAlpha = optimizationState.initialAlpha, alpha = optimizationState.alpha, gamma = optimizationState.gamma, a = optimizationState.a, b = optimizationState.b, dim = optimizationState.dim, nEpochs = optimizationState.nEpochs, nVertices = optimizationState.nVertices;\n var clipValue = 4.0;\n for (var i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n) {\n continue;\n }\n var j = head[i];\n var k = tail[i];\n var current = headEmbedding[j];\n var other = tailEmbedding[k];\n var distSquared = rDist(current, other);\n var gradCoeff = 0;\n if (distSquared > 0) {\n gradCoeff = -2.0 * a * b * Math.pow(distSquared, b - 1.0);\n gradCoeff /= a * Math.pow(distSquared, b) + 1.0;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther) {\n other[d] += -gradD * alpha;\n }\n }\n epochOfNextSample[i] += epochsPerSample[i];\n var nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (var p = 0; p < nNegSamples; p++) {\n var k_1 = utils.tauRandInt(nVertices, this.random);\n var other_1 = tailEmbedding[k_1];\n var distSquared_1 = rDist(current, other_1);\n var gradCoeff_1 = 0.0;\n if (distSquared_1 > 0.0) {\n gradCoeff_1 = 2.0 * gamma * b;\n gradCoeff_1 /=\n (0.001 + distSquared_1) * (a * Math.pow(distSquared_1, b) + 1);\n }\n else if (j === k_1) {\n continue;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = 4.0;\n if (gradCoeff_1 > 0.0) {\n gradD = clip(gradCoeff_1 * (current[d] - other_1[d]), clipValue);\n }\n current[d] += gradD * alpha;\n }\n }\n epochOfNextNegativeSample[i] += nNegSamples * epochsPerNegativeSample[i];\n }\n optimizationState.alpha = initialAlpha * (1.0 - n / nEpochs);\n optimizationState.currentEpoch += 1;\n return headEmbedding;\n };\n UMAP.prototype.optimizeLayoutAsync = function (epochCallback) {\n var _this = this;\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n return new Promise(function (resolve, reject) {\n var step = function () { return __awaiter(_this, void 0, void 0, function () {\n var _a, nEpochs, currentEpoch, epochCompleted, shouldStop, isFinished;\n return __generator(this, function (_b) {\n try {\n _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n epochCompleted = this.optimizationState.currentEpoch;\n shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished) {\n setTimeout(function () { return step(); }, 0);\n }\n else {\n return [2, resolve(isFinished)];\n }\n }\n catch (err) {\n reject(err);\n }\n return [2];\n });\n }); };\n setTimeout(function () { return step(); }, 0);\n });\n };\n UMAP.prototype.optimizeLayout = function (epochCallback) {\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n var isFinished = false;\n var embedding = [];\n while (!isFinished) {\n var _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n embedding = this.optimizeLayoutStep(currentEpoch);\n var epochCompleted = this.optimizationState.currentEpoch;\n var shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n };\n UMAP.prototype.getNEpochs = function () {\n var graph = this.graph;\n if (this.nEpochs > 0) {\n return this.nEpochs;\n }\n var length = graph.nRows;\n if (length <= 2500) {\n return 500;\n }\n else if (length <= 5000) {\n return 400;\n }\n else if (length <= 7500) {\n return 300;\n }\n else {\n return 200;\n }\n };\n return UMAP;\n}());\nexports.UMAP = UMAP;\nfunction euclidean(x, y) {\n var result = 0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow((x[i] - y[i]), 2);\n }\n return Math.sqrt(result);\n}\nexports.euclidean = euclidean;\nfunction cosine(x, y) {\n var result = 0.0;\n var normX = 0.0;\n var normY = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += Math.pow(x[i], 2);\n normY += Math.pow(y[i], 2);\n }\n if (normX === 0 && normY === 0) {\n return 0;\n }\n else if (normX === 0 || normY === 0) {\n return 1.0;\n }\n else {\n return 1.0 - result / Math.sqrt(normX * normY);\n }\n}\nexports.cosine = cosine;\nvar OptimizationState = (function () {\n function OptimizationState() {\n this.currentEpoch = 0;\n this.headEmbedding = [];\n this.tailEmbedding = [];\n this.head = [];\n this.tail = [];\n this.epochsPerSample = [];\n this.epochOfNextSample = [];\n this.epochOfNextNegativeSample = [];\n this.epochsPerNegativeSample = [];\n this.moveOther = true;\n this.initialAlpha = 1.0;\n this.alpha = 1.0;\n this.gamma = 1.0;\n this.a = 1.5769434603113077;\n this.b = 0.8950608779109733;\n this.dim = 2;\n this.nEpochs = 500;\n this.nVertices = 0;\n }\n return OptimizationState;\n}());\nfunction clip(x, clipValue) {\n if (x > clipValue)\n return clipValue;\n else if (x < -clipValue)\n return -clipValue;\n else\n return x;\n}\nfunction rDist(x, y) {\n var result = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow(x[i] - y[i], 2);\n }\n return result;\n}\nfunction findABParams(spread, minDist) {\n var curve = function (_a) {\n var _b = __read(_a, 2), a = _b[0], b = _b[1];\n return function (x) {\n return 1.0 / (1.0 + a * Math.pow(x, (2 * b)));\n };\n };\n var xv = utils\n .linear(0, spread * 3, 300)\n .map(function (val) { return (val < minDist ? 1.0 : val); });\n var yv = utils.zeros(xv.length).map(function (val, index) {\n var gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n var initialValues = [0.5, 0.5];\n var data = { x: xv, y: yv };\n var options = {\n damping: 1.5,\n initialValues: initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n var parameterValues = ml_levenberg_marquardt_1.default(data, curve, options).parameterValues;\n var _a = __read(parameterValues, 2), a = _a[0], b = _a[1];\n return { a: a, b: b };\n}\nexports.findABParams = findABParams;\nfunction fastIntersection(graph, target, unknownDist, farDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n if (farDist === void 0) { farDist = 5.0; }\n return graph.map(function (value, row, col) {\n if (target[row] === -1 || target[col] === -1) {\n return value * Math.exp(-unknownDist);\n }\n else if (target[row] !== target[col]) {\n return value * Math.exp(-farDist);\n }\n else {\n return value;\n }\n });\n}\nexports.fastIntersection = fastIntersection;\nfunction resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\");\n var transpose = matrix.transpose(simplicialSet);\n var prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\nexports.resetLocalConnectivity = resetLocalConnectivity;\nfunction initTransform(indices, weights, embedding) {\n var result = utils\n .zeros(indices.length)\n .map(function (z) { return utils.zeros(embedding[0].length); });\n for (var i = 0; i < indices.length; i++) {\n for (var j = 0; j < indices[0].length; j++) {\n for (var d = 0; d < embedding[0].length; d++) {\n var a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\nexports.initTransform = initTransform;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\nexports.tauRandInt = tauRandInt;\nfunction tauRand(random) {\n return random();\n}\nexports.tauRand = tauRand;\nfunction norm(vec) {\n var e_1, _a;\n var result = 0;\n try {\n for (var vec_1 = __values(vec), vec_1_1 = vec_1.next(); !vec_1_1.done; vec_1_1 = vec_1.next()) {\n var item = vec_1_1.value;\n result += Math.pow(item, 2);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (vec_1_1 && !vec_1_1.done && (_a = vec_1.return)) _a.call(vec_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return Math.sqrt(result);\n}\nexports.norm = norm;\nfunction empty(n) {\n var output = [];\n for (var i = 0; i < n; i++) {\n output.push(undefined);\n }\n return output;\n}\nexports.empty = empty;\nfunction range(n) {\n return empty(n).map(function (_, i) { return i; });\n}\nexports.range = range;\nfunction filled(n, v) {\n return empty(n).map(function () { return v; });\n}\nexports.filled = filled;\nfunction zeros(n) {\n return filled(n, 0);\n}\nexports.zeros = zeros;\nfunction ones(n) {\n return filled(n, 1);\n}\nexports.ones = ones;\nfunction linear(a, b, len) {\n return empty(len).map(function (_, i) {\n return a + i * ((b - a) / (len - 1));\n });\n}\nexports.linear = linear;\nfunction sum(input) {\n return input.reduce(function (sum, val) { return sum + val; });\n}\nexports.sum = sum;\nfunction mean(input) {\n return sum(input) / input.length;\n}\nexports.mean = mean;\nfunction max(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n max = input[i] > max ? input[i] : max;\n }\n return max;\n}\nexports.max = max;\nfunction max2d(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n for (var j = 0; j < input[i].length; j++) {\n max = input[i][j] > max ? input[i][j] : max;\n }\n }\n return max;\n}\nexports.max2d = max2d;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n while (rejectSample) {\n var j = tauRandInt(poolSize, random);\n var broken = false;\n for (var k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken) {\n rejectSample = false;\n }\n result[i] = j;\n }\n }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction reshape2d(x, a, b) {\n var rows = [];\n var count = 0;\n var index = 0;\n if (x.length !== a * b) {\n throw new Error('Array dimensions must match input length.');\n }\n for (var i = 0; i < a; i++) {\n var col = [];\n for (var j = 0; j < b; j++) {\n col.push(x[index]);\n index += 1;\n }\n rows.push(col);\n count += 1;\n }\n return rows;\n}\nexports.reshape2d = reshape2d;\n","module.exports = DG;","module.exports = grok;","module.exports = rxjs;","module.exports = ui;","module.exports = wu;","// 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\tid: moduleId,\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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","__webpack_require__.nc = undefined;","import * as DG from 'datagrok-api/dg';\n\nimport {category, expect, test} from '@datagrok-libraries/utils/src/test';\n\ncategory('_first', () => {\n /** The first test of the package to evaluate problems with imports. */\n test('_first', async () => {\n });\n});\n","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 { expect } from '@datagrok-libraries/utils/src/test';\nimport { AminoacidsPalettes } from '../aminoacids';\nimport { SeqPaletteBase } from '../seq-palettes';\nimport { NucleotidesPalettes } from '../nucleotides';\nexport function _testPaletteN() {\n return __awaiter(this, void 0, void 0, function* () {\n const cpChromatogram = NucleotidesPalettes.Chromatogram;\n // TODO: Check palettes implement SeqPalette interface\n // expect(cpChromatogram instanceof SeqPalette, true);\n expect(cpChromatogram instanceof SeqPaletteBase, true);\n expect(cpChromatogram instanceof NucleotidesPalettes, true);\n });\n}\nexport function _testPaletteAA() {\n return __awaiter(this, void 0, void 0, function* () {\n const cpLest = AminoacidsPalettes.Lesk;\n const cpRasMol = AminoacidsPalettes.RasMol;\n const cpGrokGroups = AminoacidsPalettes.GrokGroups;\n // TODO: Check palettes implement SeqPalette interface\n // expect(cpLest instanceof SeqPalette, true);\n // expect(cpRasMol instanceof SeqPalette, true);\n // expect(cpGrokGroups instanceof SeqPalette, true);\n expect(cpLest instanceof SeqPaletteBase, true);\n expect(cpRasMol instanceof SeqPaletteBase, true);\n expect(cpGrokGroups instanceof SeqPaletteBase, true);\n expect(cpLest instanceof AminoacidsPalettes, true);\n expect(cpRasMol instanceof AminoacidsPalettes, true);\n expect(cpGrokGroups instanceof AminoacidsPalettes, true);\n });\n}\n//# sourceMappingURL=palettes-tests.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, test, expect, expectObject} from '@datagrok-libraries/utils/src/test';\n\nimport {_testPaletteN, _testPaletteAA} from '@datagrok-libraries/bio/src/tests/palettes-tests';\nimport {AminoacidsPalettes} from '@datagrok-libraries/bio/src/aminoacids';\n\ncategory('Palettes', () => {\n test('testPaletteN', async () => { await _testPaletteN(); });\n test('testPaletteAA', async () => { await _testPaletteAA(); });\n\n test('testPalettePtMe', async () => {\n const colorMeNle = AminoacidsPalettes.GrokGroups.get('MeNle');\n const colorMeA = AminoacidsPalettes.GrokGroups.get('MeA');\n const colorMeG = AminoacidsPalettes.GrokGroups.get('MeG');\n const colorMeF = AminoacidsPalettes.GrokGroups.get('MeF');\n\n const colorL = AminoacidsPalettes.GrokGroups.get('L');\n const colorA = AminoacidsPalettes.GrokGroups.get('A');\n const colorG = AminoacidsPalettes.GrokGroups.get('G');\n const colorF = AminoacidsPalettes.GrokGroups.get('F');\n\n expect(colorMeNle, colorL);\n expect(colorMeA, colorA);\n expect(colorMeG, colorG);\n expect(colorMeF, colorF);\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 {after, before, category, test, expect, expectObject} from '@datagrok-libraries/utils/src/test';\n\nimport {importFasta} from '../package';\nimport {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\n/*\n// snippet to list df columns of semType='Macromolecule' (false positive)\nconst df = grok.shell.tableByName('SPGI');\nfor (let i = 0; i < df.columns.length; i++) {\n const col = df.columns.byIndex(i);\n if (col.semType == 'Macromolecule') {\n console.log( i + ' - ' + col.name + ' - ' + col.semType);\n }\n}\n */\n\ntype DfReaderFunc = () => Promise<DG.DataFrame>;\n\ncategory('detectors', () => {\n const enum csvTests {\n negEmpty = 'negEmpty',\n neg1 = 'neg1',\n neg2 = 'neg2',\n neg3 = 'neg3',\n negSmiles = 'negSmiles',\n fastaDna1 = 'csvFastaDna1',\n fastaRna1 = 'fastaRna1',\n fastaPt1 = 'fastaPt1',\n fastaUn = 'fastaUn',\n sepDna = 'sepDna',\n sepRna = 'sepRna',\n sepPt = 'sepPt',\n sepUn1 = 'sepUn1',\n sepUn2 = 'sepUn2',\n sepMsaDna1 = 'sepMsaDna1',\n fastaMsaDna1 = 'fastaMsaDna1',\n fastaMsaPt1 = 'fastaMsaPt1',\n }\n\n const csvData = new class {\n [csvTests.negEmpty]: string = `id,col1\n1,\n2,\n3,\n4,\n5,`;\n [csvTests.neg1]: string = `col1\n1\n2\n3`;\n [csvTests.neg2]: string = `col1\n4\n5\n6\n7`;\n [csvTests.neg3]: string = `col1\n8\n9\n10\n11\n12`;\n [csvTests.negSmiles]: string = `col1\nCCCCN1C(=O)CN=C(c2cc(F)ccc12)C3CCCCC3\nC1CCCCC1\nCCCCCC\n`;\n [csvTests.fastaDna1]: string = `seq\nACGTC\nCAGTGT\nTTCAAC\n`;\n [csvTests.fastaRna1]: string = `seq\nACGUC\nCAGUGU\nUUCAAC\n`;\n /** Pure amino acids sequence */\n [csvTests.fastaPt1]: string = `seq\nFWPHEY\nYNRQWYV\nMKPSEYV\n`;\n [csvTests.fastaUn]: string = `seq\n[meI][hHis][Aca]NT[dE][Thr_PO3H2][Aca]D\n[meI][hHis][Aca][Cys_SEt]T[dK][Thr_PO3H2][Aca][Tyr_PO3H2]\n[Lys_Boc][hHis][Aca][Cys_SEt]T[dK][Thr_PO3H2][Aca][Tyr_PO3H2]\n`;\n [csvTests.sepDna]: string = `seq\nA*C*G*T*C\nC*A*G*T*G*T\nT*T*C*A*A*C\n`;\n [csvTests.sepRna]: string = `seq\nA*C*G*U*C\nC*A*G*U*G*U\nU*U*C*A*A*C\n`;\n [csvTests.sepPt]: string = `seq\nF-W-P-H-E-Y\nY-N-R-Q-W-Y-V\nM-K-P-S-E-Y-V\n`;\n [csvTests.sepUn1]: string = `seq\nabc-dfgg-abc1-cfr3-rty-wert\nrut12-her2-rty-wert-abc-abc1-dfgg\nrut12-rty-her2-abc-cfr3-wert-rut12\n`;\n [csvTests.sepUn2]: string = `seq\nabc/dfgg/abc1/cfr3/rty/wert\nrut12/her2/rty/wert//abc/abc1/dfgg\nrut12/rty/her2/abc/cfr3//wert/rut12\n`;\n [csvTests.sepMsaDna1]: string = `seq\nA-C--G-T--C-T\nC-A-C--T--G-T\nA-C-C-G-T-A-C-T\n`;\n [csvTests.fastaMsaDna1]: string = `seq\nAC-GT-CT\nCAC-T-GT\nACCGTACT\n`;\n [csvTests.fastaMsaPt1]: string = `seq\nFWR-WYV-KHP\nYNR-WYV-KHP\nMWRSWY-CKHP\n`;\n }();\n\n const enum Samples {\n peptidesComplex = 'peptidesComplex',\n peptidesSimple = 'peptidesSimple',\n fastaCsv = 'fastaCsv',\n fastaFasta = 'fastaFasta',\n fastaPtCsv = 'fastaPtCsv',\n msaComplex = 'msaComplex',\n helmCsv = 'helmCsv',\n testDemogCsv = 'testDemogCsv',\n testHelmCsv = 'testHelmCsv',\n testIdCsv = 'testIdCsv',\n testSmilesCsv = 'testSmilesCsv',\n testSmiles2Csv = 'testSmiles2Csv',\n testSmilesShort = 'testSmilesShort',\n testCerealCsv = 'testCerealCsv',\n testActivityCliffsCsv = 'testActivityCliffsCsv',\n testUnichemSources = 'testUnichemSources',\n testDmvOffices = 'testDmvOffices',\n testAlertCollection = 'testAlertCollection',\n testSpgi = 'testSpgi',\n testSpgi100 = 'testSpgi100',\n testUrl = 'testUrl',\n }\n\n const samples: { [key: string]: string } = {\n [Samples.fastaFasta]: 'System:AppData/Bio/data/sample_FASTA.fasta',\n [Samples.fastaPtCsv]: 'System:AppData/Bio/data/sample_FASTA_PT.csv',\n [Samples.msaComplex]: 'System:AppData/Bio/samples/sample_MSA.csv',\n [Samples.fastaCsv]: 'System:AppData/Bio/samples/sample_FASTA.csv',\n [Samples.helmCsv]: 'System:AppData/Bio/samples/sample_HELM.csv',\n [Samples.peptidesComplex]: 'System:AppData/Bio/tests/peptides_complex_msa.csv',\n [Samples.peptidesSimple]: 'System:AppData/Bio/tests/peptides_simple_msa.csv',\n [Samples.testDemogCsv]: 'System:AppData/Bio/tests/testDemog.csv',\n [Samples.testHelmCsv]: 'System:AppData/Bio/tests/testHelm.csv',\n [Samples.testIdCsv]: 'System:AppData/Bio/tests/testId.csv',\n [Samples.testSmilesCsv]: 'System:AppData/Bio/tests/testSmiles.csv',\n [Samples.testSmiles2Csv]: 'System:AppData/Bio/tests/testSmiles2.csv',\n [Samples.testSmilesShort]: 'System:AppData/Bio/tests/testSmilesShort.csv',\n [Samples.testActivityCliffsCsv]: 'System:AppData/Bio/tests/testActivityCliffs.csv', // smiles\n [Samples.testCerealCsv]: 'System:AppData/Bio/tests/testCereal.csv',\n [Samples.testUnichemSources]: 'System:AppData/Bio/tests/testUnichemSources.csv',\n [Samples.testDmvOffices]: 'System:AppData/Bio/tests/testDmvOffices.csv',\n [Samples.testAlertCollection]: 'System:AppData/Bio/tests/testAlertCollection.csv',\n [Samples.testSpgi100]: 'System:AppData/Bio/tests/testSpgi100.csv',\n [Samples.testSpgi]: 'System:AppData/Bio/tests/SPGI-derived.csv',\n [Samples.testUrl]: 'System:AppData/Bio/tests/testUrl.csv',\n };\n\n const _samplesDfs: { [key: string]: Promise<DG.DataFrame> } = {};\n\n function readSamples(key: string, readFile: (file: string) => Promise<DG.DataFrame> = readFileCsv): DfReaderFunc {\n return async () => {\n if (!(key in _samplesDfs)) {\n _samplesDfs[key] = (async (): Promise<DG.DataFrame> => {\n const df: DG.DataFrame = await readFile(samples[key]);\n // await grok.data.detectSemanticTypes(df);\n return df;\n })();\n }\n return _samplesDfs[key];\n };\n };\n\n async function readFileCsv(file: string): Promise<DG.DataFrame> {\n const csv: string = await grok.dapi.files.readAsText(file);\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n return df;\n }\n\n async function readFileFasta(file: string): Promise<DG.DataFrame> {\n const txt: string = await grok.dapi.files.readAsText(file);\n const df: DG.DataFrame = importFasta(txt)[0];\n return df;\n }\n\n const readCsv: (key: csvTests) => DfReaderFunc = (key: keyof typeof csvData) => {\n return async () => {\n // Always recreate test data frame from CSV for reproducible detector behavior in tests.\n const csv: string = csvData[key];\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n await grok.data.detectSemanticTypes(df);\n return df;\n };\n };\n\n\n test('NegativeEmpty', async () => { await _testNeg(readCsv(csvTests.negEmpty), 'col1'); });\n test('Negative1', async () => { await _testNeg(readCsv(csvTests.neg1), 'col1'); });\n test('Negative2', async () => { await _testNeg(readCsv(csvTests.neg2), 'col1'); });\n test('Negative3', async () => { await _testNeg(readCsv(csvTests.neg3), 'col1'); });\n test('NegativeSmiles', async () => { await _testNeg(readCsv(csvTests.negSmiles), 'col1'); });\n\n test('FastaDna1', async () => {\n await _testPos(readCsv(csvTests.fastaDna1), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.DNA, 4, false);\n });\n test('FastaRna1', async () => {\n await _testPos(readCsv(csvTests.fastaRna1), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.RNA, 4, false);\n });\n test('FastaPt1', async () => {\n await _testPos(readCsv(csvTests.fastaPt1), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.PT, 20, false);\n });\n test('FastaUn', async () => {\n await _testPos(readCsv(csvTests.fastaUn), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.UN, 12, true);\n });\n test('FastaMsaDna1', async () => {\n await _testPos(readCsv(csvTests.fastaMsaDna1), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.DNA, 4, false);\n });\n\n test('FastaMsaPt1', async () => {\n await _testPos(readCsv(csvTests.fastaMsaPt1), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.PT, 20, false);\n });\n\n test('SepDna', async () => {\n await _testPos(readCsv(csvTests.sepDna), 'seq',\n NOTATION.SEPARATOR, ALIGNMENT.SEQ, ALPHABET.DNA, 4, false, '*');\n });\n test('SepRna', async () => {\n await _testPos(readCsv(csvTests.sepRna), 'seq',\n NOTATION.SEPARATOR, ALIGNMENT.SEQ, ALPHABET.RNA, 4, false, '*');\n });\n test('SepPt', async () => {\n await _testPos(readCsv(csvTests.sepPt), 'seq',\n NOTATION.SEPARATOR, ALIGNMENT.SEQ, ALPHABET.PT, 20, false, '-');\n });\n test('SepUn1', async () => {\n await _testPos(readCsv(csvTests.sepUn1), 'seq',\n NOTATION.SEPARATOR, ALIGNMENT.SEQ, ALPHABET.UN, 8, true, '-');\n });\n test('SepUn2', async () => {\n await _testPos(readCsv(csvTests.sepUn2), 'seq',\n NOTATION.SEPARATOR, ALIGNMENT.SEQ, ALPHABET.UN, 9, true, '/');\n });\n\n test('SepMsaN1', async () => {\n await _testPos(readCsv(csvTests.sepMsaDna1), 'seq',\n NOTATION.SEPARATOR, ALIGNMENT.SEQ_MSA, ALPHABET.DNA, 4, false, '-');\n });\n\n test('samplesFastaCsv', async () => {\n await _testDf(readSamples(Samples.fastaCsv), {\n 'Sequence': new PosCol(NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.PT, 20, false),\n });\n });\n\n test('samplesFastaFasta', async () => {\n await _testDf(readSamples(Samples.fastaFasta), {\n 'sequence': new PosCol(NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.PT, 20, false),\n });\n });\n\n // peptidesComplex contains monomers with spaces in AlignedSequence columns, which are forbidden\n // test('samplesPeptidesComplexPositiveAlignedSequence', async () => {\n // await _testPos(readSamples(Samples.peptidesComplex), 'AlignedSequence', 'separator:SEQ:UN', '-');\n // });\n test('samplesPeptidesComplex', async () => {\n await _testDf(readSamples(Samples.peptidesComplex), {} /* no positive */);\n });\n\n test('samplesMsaComplex', async () => {\n await _testDf(readSamples(Samples.msaComplex), {\n 'MSA': new PosCol(NOTATION.SEPARATOR, ALIGNMENT.SEQ_MSA, ALPHABET.UN, 161, true, '/'),\n });\n });\n\n test('samplesIdCsv', async () => {\n await _testDf(readSamples(Samples.testIdCsv), {} /* no positive */);\n });\n\n test('samplesSarSmallCsv', async () => {\n await _testDf(readSamples(Samples.testSmilesCsv), {} /* nopositive */);\n });\n\n test('samplesHelmCsv', async () => {\n await _testDf(readSamples(Samples.helmCsv), {\n 'HELM': new PosCol(NOTATION.HELM, null, null, 160, true),\n });\n });\n\n // sample_testHelm.csv\n // columns: ID,Test type,HELM string,Valid?,Mol Weight,Mol Formula,SMILES\n test('samplesTestHelmCsv', async () => {\n await _testDf(readSamples(Samples.testHelmCsv), {\n 'HELM string': new PosCol(NOTATION.HELM, null, null, 9, true),\n });\n });\n\n test('samplesTestDemogCsv', async () => {\n await _testDf(readSamples(Samples.testDemogCsv), {} /* no positive */);\n });\n\n test('samplesTestSmiles2Csv', async () => {\n await _testDf(readSamples(Samples.testSmiles2Csv), {} /* no positive */);\n });\n\n test('samplesTestSmilesShort', async () => {\n await _testDf(readSamples(Samples.testSmilesShort), {} /* no positive */);\n });\n\n test('samplesTestActivityCliffsNegativeSmiles', async () => {\n await _testDf(readSamples(Samples.testActivityCliffsCsv), {} /* no positive */);\n });\n\n test('samplesFastaPtCsv', async () => {\n await _testDf(readSamples(Samples.fastaPtCsv), {\n 'sequence': new PosCol(NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.PT, 20, false),\n });\n });\n\n test('samplesTestCerealCsv', async () => {\n await _testDf(readSamples(Samples.testCerealCsv), {} /* no positive */);\n });\n\n test('samplesTestUnichemSources', async () => {\n await _testDf(readSamples(Samples.testUnichemSources), {} /* no positive */);\n });\n\n test('samplesTestDmvOffices', async () => {\n await _testDf(readSamples(Samples.testDmvOffices), {} /* no positive */);\n });\n\n test('samplesTestAlertCollection', async () => {\n await _testDf(readSamples(Samples.testAlertCollection), {} /* no positive */);\n });\n\n test('samplesTestSpgi', async () => {\n await _testDf(readSamples(Samples.testSpgi), {} /* no positive */);\n });\n\n test('samplesTestSpgi100', async () => {\n await _testDf(readSamples(Samples.testSpgi100), {} /* no positive */);\n });\n\n test('samplesTestUrl', async () => {\n await _testDf(readSamples(Samples.testUrl), {} /* no positive */);\n });\n});\n\nexport async function _testNeg(readDf: DfReaderFunc, colName: string) {\n const df: DG.DataFrame = await readDf();\n const col: DG.Column = df.getCol(colName)!;\n const semType: string = await grok.functions\n .call('Bio:detectMacromolecule', {col: col}) as unknown as string;\n if (semType)\n col.semType = semType;\n\n if (col.semType === DG.SEMTYPE.MACROMOLECULE) {\n const msg = `Negative test detected semType='${col.semType}', units='${col.getTag(DG.TAGS.UNITS)}'.`;\n throw new Error(msg);\n // col.semType = '';\n // col.setTag(DG.TAGS.UNITS, '');\n // col.setTag(NOTATION.SEPARATOR, '');\n }\n}\n\nexport async function _testPos(\n readDf: DfReaderFunc, colName: string, units: string,\n aligned: string | null, alphabet: string | null, alphabetSize: number, alphabetIsMultichar: boolean,\n separator: string | null = null\n) {\n const df: DG.DataFrame = await readDf();\n const col: DG.Column = df.col(colName)!;\n const semType: string = await grok.functions\n .call('Bio:detectMacromolecule', {col: col}) as unknown as string;\n if (semType)\n col.semType = semType;\n\n expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n expect(col.getTag(DG.TAGS.UNITS), units);\n expect(col.getTag(bioTAGS.aligned), aligned);\n expect(col.getTag(bioTAGS.alphabet), alphabet);\n if (separator)\n expect(col.getTag(bioTAGS.separator), separator);\n\n const uh = new UnitsHandler(col);\n expect(uh.getAlphabetSize(), alphabetSize);\n expect(uh.getAlphabetIsMultichar(), alphabetIsMultichar);\n if (!uh.isHelm()) {\n expect(uh.aligned, aligned);\n expect(uh.alphabet, alphabet);\n }\n}\n\nclass PosCol {\n constructor(\n public readonly units: string,\n public readonly aligned: string | null,\n public readonly alphabet: string | null,\n public readonly alphabetSize: number,\n public readonly alphabetIsMultichar: boolean,\n public readonly separator?: string\n ) { };\n};\n\nexport async function _testDf(readDf: DfReaderFunc, posCols: { [colName: string]: PosCol }): Promise<void> {\n const df: DG.DataFrame = await readDf();\n const errList: string[] = [];\n for (const colName of df.columns.names()) {\n if (colName in posCols) {\n const p = posCols[colName];\n try {\n await _testPos(readDf, colName, p.units, p.aligned, p.alphabet,\n p.alphabetSize, p.alphabetIsMultichar, p.separator);\n } catch (err: any) {\n const errMsg: string = err.toString();\n errList.push(`Positive col '${colName}' failed: ${errMsg}`);\n }\n } else {\n try {\n await _testNeg(readDf, colName);\n } catch (err: any) {\n const errMsg: string = err.toString();\n errList.push(`Negative col '${colName}' failed: ${errMsg}`);\n }\n }\n }\n\n if (errList.length > 0)\n throw new Error(errList.join('\\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 {after, before, category, test, expect, expectObject} from '@datagrok-libraries/utils/src/test';\nimport {ALIGNMENT, ALPHABET, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {_testNeg, _testPos} from './detectors-tests';\nimport {DfReaderFunc} from './types';\n\n\ncategory('detectors:weak-and-likely', () => {\n const enum csvTests {\n fastaDnaWeak1 = 'fastaDnaWeak1',\n fastaDnaWeak1LikelyName = 'fastaDnaWeak1LikelyName',\n\n fastaRnaWeak1 = 'fastaRnaWeak1',\n fastaRnaWeak1LikelyName = 'fastaRnaWeak1LikelyName',\n\n fastaPtWeak1 = 'fastaPtWeak1',\n fastaPtWeak1LikelyName = 'fastaPtWeak1LikelyName',\n\n fastaUn1 = 'fastaUn1',\n fastaUn1LikelyName = 'fastaUn1LikelyName',\n fastaUnMsa1LikelyName = 'fastaUnMsa1LikelyName',\n }\n\n const csvData: { [name: string]: string } = {\n [csvTests.fastaDnaWeak1]: `id,colName\n1,TTTTT\n2,TTTTT\n3,TTTTT\n4,TTTTT\n`,\n [csvTests.fastaDnaWeak1LikelyName]: `id,seq\n1,TTTTT\n2,TTTTT\n3,TTTTT\n4,TTTTT\n`,\n [csvTests.fastaRnaWeak1]: `id,colName\n1,UUUUU\n2,UUUUU\n3,UUUUU\n4,UUUUU\n`,\n [csvTests.fastaRnaWeak1LikelyName]: `id,seq\n1,UUUUU\n2,UUUUU\n3,UUUUU\n4,UUUUU\n`,\n [csvTests.fastaPtWeak1]: `id,colName\n1,SLSLSPGK\n2,SLSLSPGK\n3,SLSLSPGK\n4,SLSLSPGK\n`,\n [csvTests.fastaPtWeak1LikelyName]: `id,seq\n1,SLSLSPGK\n2,SLSLSPGK\n3,SLSLSPGK\n4,SLSLSPGK\n`,\n [csvTests.fastaUn1]: `id,colName\n1,word\n2,other\n3,some\n4,another\n`,\n [csvTests.fastaUn1LikelyName]: `id,seq\n1,word\n2,other\n3,some\n4,another\n`,\n [csvTests.fastaUnMsa1LikelyName]: `id,seq\n1,word\n2,male\n3,bare\n4,core\n`,\n };\n\n const readCsv: (key: csvTests) => DfReaderFunc = (key: keyof typeof csvData) => {\n return async () => {\n // Always recreate test data frame from CSV for reproducible detector behavior in tests.\n const csv: string = csvData[key];\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n await grok.data.detectSemanticTypes(df);\n return df;\n };\n };\n\n test(csvTests.fastaDnaWeak1, async () => {\n await _testNeg(readCsv(csvTests.fastaDnaWeak1), 'colName');\n });\n test(csvTests.fastaDnaWeak1LikelyName, async () => {\n await _testPos(readCsv(csvTests.fastaDnaWeak1LikelyName), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.DNA, 4, false);\n });\n\n test(csvTests.fastaRnaWeak1, async () => {\n await _testNeg(readCsv(csvTests.fastaRnaWeak1), 'colName');\n });\n test(csvTests.fastaRnaWeak1LikelyName, async () => {\n await _testPos(readCsv(csvTests.fastaRnaWeak1LikelyName), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.RNA, 4, false);\n });\n\n test(csvTests.fastaPtWeak1, async () => {\n await _testNeg(readCsv(csvTests.fastaPtWeak1), 'colName');\n });\n test(csvTests.fastaPtWeak1LikelyName, async () => {\n await _testPos(readCsv(csvTests.fastaPtWeak1LikelyName), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.PT, 20, false);\n });\n\n test(csvTests.fastaUn1, async () => {\n await _testNeg(readCsv(csvTests.fastaUn1), 'colName');\n });\n test(csvTests.fastaUn1LikelyName, async () => {\n await _testPos(readCsv(csvTests.fastaUn1LikelyName), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ, ALPHABET.UN, 11, false);\n });\n test(csvTests.fastaUnMsa1LikelyName, async () => {\n await _testPos(readCsv(csvTests.fastaUnMsa1LikelyName), 'seq',\n NOTATION.FASTA, ALIGNMENT.SEQ_MSA, ALPHABET.UN, 10, false);\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 {after, before, category, test, expect, expectObject} from '@datagrok-libraries/utils/src/test';\nimport {ALPHABET, getAlphabet, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {Column} from 'datagrok-api/dg';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\ncategory('detectorsBenchmark', () => {\n\n let detectFunc: DG.Func;\n\n before(async () => {\n const funcList: DG.Func[] = DG.Func.find({package: 'Bio', name: 'detectMacromolecule'});\n detectFunc = funcList[0];\n\n // warm up the detector function\n const col: DG.Column = DG.Column.fromStrings('seq', ['ACGT', 'ACGT', 'ACGT']);\n await detectFunc.prepare({col: col}).call();\n });\n\n // -- fasta --\n\n test('fastaDnaShorts50Few50', async () => {\n const et: number = await detectMacromoleculeBenchmark(10, NOTATION.FASTA, ALPHABET.DNA, 50, 50);\n },\n {skipReason: '#1192'});\n\n test('fastaDnaShorts50Many1E6', async () => {\n const et: number = await detectMacromoleculeBenchmark(10, NOTATION.FASTA, ALPHABET.DNA, 50, 1E6);\n },\n {skipReason: '#1192'});\n\n test('fastaDnaLong1e6Few50', async () => {\n const et: number = await detectMacromoleculeBenchmark(10, NOTATION.FASTA, ALPHABET.DNA, 1E6, 50);\n },\n {skipReason: '#1192'});\n\n // -- separator --\n\n test('separatorDnaShorts50Few50', async () => {\n const et: number = await detectMacromoleculeBenchmark(10, NOTATION.SEPARATOR, ALPHABET.DNA, 50, 50, '/');\n }, {skipReason: '#1192'});\n\n test('separatorDnaShorts50Many1E6', async () => {\n const et: number = await detectMacromoleculeBenchmark(10, NOTATION.SEPARATOR, ALPHABET.DNA, 50, 1E6, '/');\n },\n { /* skipReason: 'slow transmit large dataset to detector' */});\n\n test('separatorDnaLong1e6Few50', async () => {\n const et: number = await detectMacromoleculeBenchmark(10, NOTATION.SEPARATOR, ALPHABET.DNA, 1E6, 50, '/');\n },\n {skipReason: '#1192'});\n\n async function detectMacromoleculeBenchmark(\n maxET: number, notation: NOTATION, alphabet: ALPHABET, length: number, count: number, separator?: string\n ): Promise<number> {\n return await benchmark<DG.FuncCall, DG.Column>(10,\n (): DG.FuncCall => {\n const col: DG.Column = generate(notation, [...getAlphabet(alphabet)], length, count, separator);\n const funcCall: DG.FuncCall = detectFunc.prepare({col: col});\n return funcCall;\n },\n async (funcCall: DG.FuncCall): Promise<DG.Column> => {\n return testDetector(funcCall);\n },\n (col: DG.Column) => {\n checkDetectorRes(col, {\n semType: DG.SEMTYPE.MACROMOLECULE,\n notation: notation,\n alphabet: alphabet,\n separator: separator\n });\n });\n }\n\n function generate(\n notation: NOTATION, alphabet: string[], length: number, count: number, separator?: string\n ): DG.Column {\n let seqMerger: (seqMList: string[], separator?: string) => string;\n\n switch (notation) {\n case NOTATION.FASTA:\n seqMerger = (seqMList: string[]): string => {\n let res: string = '';\n for (let j = 0; j < seqMList.length; j++) {\n const m = seqMList[j];\n res += m.length == 1 ? m : `[${m}]`;\n }\n return res;\n };\n break;\n case NOTATION.SEPARATOR:\n seqMerger = (seqMList: string[], separator?: string): string => {\n return seqMList.join(separator);\n };\n break;\n default:\n throw new Error(`Not supported notation '${notation}'.`);\n }\n\n const buildSeq = (alphabet: string[], length: number): string => {\n const seqMList = new Array<string>(length);\n for (let j = 0; j < length; j++) {\n seqMList[j] = alphabet[Math.floor(Math.random() * alphabet.length)];\n }\n return seqMerger(seqMList, separator);\n };\n\n const seqList: string[] = Array(count);\n for (let i = 0; i < count; i++) {\n seqList[i] = buildSeq(alphabet, length);\n }\n\n return DG.Column.fromStrings('seq', seqList);\n }\n\n type TgtType = { semType: string, notation: NOTATION, alphabet: ALPHABET, separator?: string };\n\n function testDetector(funcCall: DG.FuncCall): DG.Column {\n //const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: col});\n funcCall.callSync();\n const semType = funcCall.getOutputParamValue();\n\n const col: DG.Column = funcCall.inputs.col;\n if (semType) col.semType = semType;\n return col;\n }\n\n function checkDetectorRes(col: DG.Column, tgt: TgtType): void {\n const uh = new UnitsHandler(col);\n expect(col.semType, tgt.semType);\n expect(uh.notation, tgt.notation);\n expect(uh.alphabet, tgt.alphabet);\n expect(uh.separator, tgt.separator);\n }\n});\n\n\n/** Returns ET [ms] of test() */\nasync function benchmark<TData, TRes>(\n maxET: number, prepare: () => TData, test: (data: TData) => Promise<TRes>, check: (res: TRes) => void\n): Promise<number> {\n const data: TData = prepare();\n\n const t1: number = Date.now();\n // console.profile();\n const res: TRes = await test(data);\n //console.profileEnd();\n const t2: number = Date.now();\n\n check(res);\n\n const resET: number = t2 - t1;\n if (resET > maxET) {\n const errMsg = `ET ${resET} ms is more than max allowed ${maxET} ms.`;\n console.error(errMsg);\n throw new Error(errMsg);\n } else {\n console.log(`ET ${resET} ms is OK.`);\n }\n\n return resET;\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 {category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';\n\nimport {runKalign} from '../utils/multiple-sequence-alignment';\n//import * as grok from 'datagrok-api/grok';\n\nexport const _package = new DG.Package();\n\n\ncategory('MSA', async () => {\n //table = await grok.data.files.openTable('Demo:Files/bio/peptides.csv');\n const fromCsv = `seq\nFWRWYVKHP\nYNRWYVKHP\nMWRSWYCKHP`;\n const toCsv = `seq\nFWR-WYVKHP\nYNR-WYVKHP\nMWRSWYCKHP`;\n\n const longFromCsv = `seq\nFWRWYVKHPFWRWYVKHPFWRWYVKHPFWRWYVKHPFWRWYVKHPFWRWYVKHPFWRWYVKHPFWRWYVKHP\nYNRWYVKHPYNRWYVKHPYNRWYVKHPYNRWYVKHPYNRWYVKHPYNRWYVKHPYNRWYVKHPYNRWYVKHP\nMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHP`;\n\n const longToCsv = `seq\nFWR-WYVKHPFWR-WYVKHPFWR-WYVKHPFWR-WYVKHPFWR-WYVKHPFWR-WYVKHPFWR-WYVKHPFWR-WYVKHP\nYNR-WYVKHPYNR-WYVKHPYNR-WYVKHPYNR-WYVKHPYNR-WYVKHPYNR-WYVKHPYNR-WYVKHPYNR-WYVKHP\nMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHP`;\n\n // test('test_table.is_not_empty', async () => {\n // await _testTableIsNotEmpty(table);\n // });\n\n test('isCorrect', async () => {\n await _testMsaIsCorrect(fromCsv, toCsv);\n });\n\n test('isCorrectLong', async () => {\n await _testMsaIsCorrect(longFromCsv, longToCsv);\n });\n});\n\nasync function _testMsaIsCorrect(srcCsv: string, tgtCsv: string): Promise<void> {\n const srcDf: DG.DataFrame = DG.DataFrame.fromCsv(srcCsv);\n const tgtDf: DG.DataFrame = DG.DataFrame.fromCsv(tgtCsv);\n\n const srcCol: DG.Column = srcDf.getCol('seq')!;\n const semType: string = await grok.functions\n .call('Bio:detectMacromolecule', {col: srcCol}) as unknown as string;\n if (semType)\n srcCol.semType = semType;\n\n const tgtCol: DG.Column = tgtDf.getCol('seq')!;\n const msaCol: DG.Column = await runKalign(srcCol, true);\n expectArray(msaCol.toList(), tgtCol.toList());\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 {after, before, category, test, expect, expectArray, expectObject} from '@datagrok-libraries/utils/src/test';\nimport * as C from '../utils/constants';\nimport {splitToMonomers, _package, getHelmMonomers} from '../package';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {TAGS as bioTAGS, splitterAsFasta, splitterAsHelm} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\n\ncategory('splitters', () => {\n let tvList: DG.TableView[];\n let dfList: DG.DataFrame[];\n\n before(async () => {\n tvList = [];\n dfList = [];\n });\n\n after(async () => {\n dfList.forEach((df: DG.DataFrame) => { grok.shell.closeTable(df); });\n tvList.forEach((tv: DG.TableView) => tv.close());\n });\n\n const helm1 = 'PEPTIDE1{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\n const helm2 = 'PEPTIDE1{meI.hHis.Hcy.Q.T.W.Q.Phe_4NH2.D-Tyr_Et.Tyr_ab-dehydroMe.dV.E.N.N.meK}$$$';\n\n const data: { [key: string]: [string, string[]] } = {\n fastaMulti: [\n 'M[MeI]YKETLL[MeF]PKTDFPMRGGL[MeA]',\n ['M', 'MeI', 'Y', 'K', 'E', 'T', 'L', 'L', 'MeF', 'P',\n 'K', 'T', 'D', 'F', 'P', 'M', 'R', 'G', 'G', 'L', 'MeA']\n ],\n helm1: [\n 'PEPTIDE1{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 ['meI', 'hHis', 'Aca', 'N', 'T', 'dE', 'Thr_PO3H2', 'Aca', 'D-Tyr_Et',\n 'Tyr_ab-dehydroMe', 'dV', 'E', 'N', 'D-Orn', 'D-aThr', 'Phe_4Me']\n ],\n helm2: [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.D-Dap.dV.E.N.pnG.Phe_4Me}$$$',\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'Aca',\n 'D-Tyr_Et', 'D-Dap', 'dV', 'E', 'N', 'pnG', 'Phe_4Me']\n ],\n // HELM editor dialog returns HELM string with multichar monomer names in square brackets\n helm3: [\n 'PEPTIDE1{[meI].[hHis].[Aca].N.T.[dK].[Thr_PO3H2].[Aca].[D-Tyr_Et].[D-Dap].[dV].E.N.[pnG].[Phe_4Me]}$$$',\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'Aca',\n 'D-Tyr_Et', 'D-Dap', 'dV', 'E', 'N', 'pnG', 'Phe_4Me']\n ],\n\n testHelm1: [\n 'RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$',\n ['R(U)P', 'R(T)P', 'R(G)P', 'R(C)P', 'R(A)']\n ],\n\n testHelm2: [\n 'RNA1{P.R(U)P.R(T)}$$$$',\n ['P', 'R(U)P', 'R(T)']\n ],\n testHelm3: [\n 'RNA1{P.R(U).P.R(T)}$$$$',\n ['P', 'R(U)', 'P', 'R(T)']\n ],\n };\n\n test('fastaMulti', async () => { await _testFastaSplitter(data.fastaMulti[0], data.fastaMulti[1]); });\n\n test('helm1', async () => { await _testHelmSplitter(data.helm1[0], data.helm1[1]); });\n test('helm2', async () => { await _testHelmSplitter(data.helm2[0], data.helm2[1]); });\n test('helm3-multichar', async () => { await _testHelmSplitter(data.helm3[0], data.helm3[1]); });\n\n // examples from Helm/tests/test.csv file\n test('testHelm1', async () => { await _testHelmSplitter(data.testHelm1[0], data.testHelm1[1]); });\n test('testHelm2', async () => { await _testHelmSplitter(data.testHelm2[0], data.testHelm2[1]); });\n test('testHelm3', async () => { await _testHelmSplitter(data.testHelm3[0], data.testHelm3[1]); });\n\n test('splitToMonomers', async () => {\n const df: DG.DataFrame = await grok.dapi.files.readCsv('System:AppData/Bio/samples/sample_MSA.csv');\n\n const seqCol = df.getCol('MSA');\n const semType = await grok.functions.call('Bio:detectMacromolecule', {col: seqCol});\n if (semType)\n seqCol.semType = semType;\n seqCol.setTag(bioTAGS.aligned, C.MSA);\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(df);\n\n dfList.push(df);\n tvList.push(tv);\n\n splitToMonomers();\n expect(df.columns.names().includes('17'), true);\n }, {skipReason: 'GROK-12766'});\n\n test('getHelmMonomers', async () => {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(\n `HELM,Activity\nPEPTIDE1{hHis.N.T}$$$,5.30751\nPEPTIDE1{hHis.Aca.Cys_SEt}$$$,5.72388\n`);\n const expectedMonomerList = ['hHis', 'Aca', 'Cys_SEt', 'N', 'T'];\n\n const helmCol: DG.Column = df.getCol('HELM');\n const res = getHelmMonomers(helmCol);\n\n const missed = expectedMonomerList.filter((m) => !res.includes(m));\n const unexpected = res.filter((m) => !expectedMonomerList.includes(m));\n if (missed.length > 0 || unexpected.length) {\n const msgs = [];\n if (missed.length > 0)\n msgs.push(`Missed monomers ${JSON.stringify(missed)}.`);\n if (unexpected.length > 0)\n msgs.push(`Unexpected monomers ${JSON.stringify(unexpected)}.`);\n\n throw new Error(msgs.join(' '));\n }\n });\n});\n\nexport async function _testFastaSplitter(src: string, tgt: string[]) {\n const res: string[] = splitterAsFasta(src);\n console.debug(`Bio: tests: splitters: src=${JSON.stringify(src)}, res=${JSON.stringify(res)} .`);\n expectArray(res, tgt);\n}\n\nexport async function _testHelmSplitter(src: string, tgt: string[]) {\n const res: string[] = splitterAsHelm(src);\n console.debug(`Bio: tests: splitters: src=${JSON.stringify(src)}, res=${JSON.stringify(res)} .`);\n expectArray(res, tgt);\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\n\nimport {test, after, before, category, expect} from '@datagrok-libraries/utils/src/test';\n\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {LIB_STORAGE_NAME} from '../utils/monomer-lib';\n\n\ncategory('monomerLibraries', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibrariesSettings: any = null;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibrariesSettings = await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true);\n });\n\n after(async () => {\n await grok.dapi.userDataStorage.put(LIB_STORAGE_NAME, userLibrariesSettings, true);\n });\n\n test('default', async () => {\n // Clear settings to test default\n await grok.dapi.userDataStorage.put(LIB_STORAGE_NAME, {}, true);\n await monomerLibHelper.loadLibraries(true); // test defaultLib\n\n // Currently default monomer lib is empty\n const currentMonomerLib = monomerLibHelper.getBioLib();\n expect(currentMonomerLib.getTypes().length, 0);\n });\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\n\nexport function generateManySequences(): DG.Column[] {\n const columns: DG.Column[] = [];\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('string', 'Activity', new Array(10 ** 6).fill('5.30751')));\n return columns;\n}\n\nexport function generateLongSequence(): DG.Column[] {\n const columns: DG.Column[] = [];\n const longSequence = `meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr`.repeat(10 ** 5);\n columns.push(DG.Column.fromList('string', 'MSA', new Array(10 ** 2).fill(longSequence)));\n columns.push(DG.Column.fromList('string', 'Activity', new Array(10 ** 2).fill('7.30751')));\n return columns;\n}\n\nexport function setTagsMacromolecule(col: DG.Column) {\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);\n col.setTag(bioTAGS.aligned, ALIGNMENT.SEQ_MSA);\n col.setTag(bioTAGS.alphabet, ALPHABET.UN);\n col.setTag(bioTAGS.separator, '/');\n return col;\n}\n\nexport function performanceTest(generateFunc: () => DG.Column[], testName: string) {\n const columns = generateFunc();\n const df: DG.DataFrame = DG.DataFrame.fromColumns(columns);\n const startTime: number = Date.now();\n const col: DG.Column = df.columns.byName('MSA');\n setTagsMacromolecule(col);\n grok.shell.addTableView(df);\n\n const endTime: number = Date.now();\n const elapsedTime: number = endTime - startTime;\n console.log(`Performance test: ${testName}: ${elapsedTime}ms`);\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test} from '@datagrok-libraries/utils/src/test';\n\nimport {importFasta, multipleSequenceAlignmentAny} from '../package';\nimport {convertDo} from '../utils/convert';\nimport * as C from '../utils/constants';\nimport {generateLongSequence, generateManySequences, performanceTest} from './utils/sequences-generators';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\ncategory('renderers', () => {\n let tvList: DG.TableView[];\n let dfList: DG.DataFrame[];\n\n before(async () => {\n tvList = [];\n dfList = [];\n });\n\n after(async () => {\n // Closing viewes and data frames leads to exception\n // dfList.forEach((df: DG.DataFrame) => { grok.shell.closeTable(df); });\n // tvList.forEach((tv: DG.TableView) => tv.close());\n });\n\n test('long sequence performance ', async () => {\n performanceTest(generateLongSequence, 'Long sequences');\n });\n\n test('many sequence performance', async () => {\n performanceTest(generateManySequences, 'Many sequences');\n });\n\n test('rendererMacromoleculeFasta', async () => {\n await _rendererMacromoleculeFasta();\n });\n\n test('rendererMacromoleculeSeparator', async () => {\n await _rendererMacromoleculeSeparator();\n });\n\n test('rendererMacromoleculeDifference', async () => {\n await _rendererMacromoleculeDifference();\n });\n\n test('afterMsa', async () => {\n await _testAfterMsa();\n });\n\n test('afterConvert', async () => {\n await _testAfterConvert();\n }, {skipReason: 'GROK-12765'});\n\n test('selectRendererBySemType', async () => {\n await _selectRendererBySemType();\n });\n\n test('setRendererManually', async () => {\n await _setRendererManually();\n }, {skipReason: 'GROK-11212'});\n\n async function _rendererMacromoleculeFasta() {\n const csv: string = await grok.dapi.files.readAsText('System:AppData/Bio/samples/sample_FASTA.csv');\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n\n const seqCol = df.getCol('Sequence');\n const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: seqCol});\n if (semType)\n seqCol.semType = semType;\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(df);\n\n dfList.push(df);\n tvList.push(tv);\n\n const resCellRenderer = seqCol.getTag(DG.TAGS.CELL_RENDERER);\n expect(resCellRenderer, 'sequence');\n }\n\n async function _rendererMacromoleculeSeparator() {\n const csv: string = await grok.dapi.files.readAsText('System:AppData/Bio/data/sample_SEPARATOR_PT.csv');\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n\n const seqCol = df.getCol('sequence');\n const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: seqCol});\n if (semType)\n seqCol.semType = semType;\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(df);\n\n dfList.push(df);\n tvList.push(tv);\n\n const resCellRenderer = seqCol.getTag(DG.TAGS.CELL_RENDERER);\n expect(resCellRenderer, 'sequence');\n }\n\n async function _rendererMacromoleculeDifference() {\n const seqDiffCol: DG.Column = DG.Column.fromStrings('SequencesDiff',\n ['meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca#D-Tyr_Et/Tyr_ab-dehydroMe/meN/E/N/dV']);\n seqDiffCol.tags[DG.TAGS.UNITS] = NOTATION.SEPARATOR;\n seqDiffCol.tags[bioTAGS.separator] = '/';\n seqDiffCol.semType = C.SEM_TYPES.MACROMOLECULE_DIFFERENCE;\n const df = DG.DataFrame.fromColumns([seqDiffCol]);\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(df);\n\n dfList.push(df);\n tvList.push(tv);\n\n const resCellRenderer = seqDiffCol.getTag(DG.TAGS.CELL_RENDERER);\n expect(resCellRenderer, C.SEM_TYPES.MACROMOLECULE_DIFFERENCE);\n }\n\n async function _testAfterMsa() {\n const fastaTxt: string = await grok.dapi.files.readAsText('System:AppData/Bio/data/sample_FASTA.fasta');\n const df: DG.DataFrame = importFasta(fastaTxt)[0];\n\n const srcSeqCol: DG.Column = df.getCol('sequence');\n const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: srcSeqCol});\n if (semType)\n srcSeqCol.semType = semType;\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(df);\n\n console.log('Bio: tests/renderers/afterMsa, table view');\n\n console.log('Bio: tests/renderers/afterMsa, src before test ' +\n `semType=\"${srcSeqCol!.semType}\", units=\"${srcSeqCol!.getTag(DG.TAGS.UNITS)}\", ` +\n `cell.renderer=\"${srcSeqCol!.getTag(DG.TAGS.CELL_RENDERER)}\"`);\n expect(srcSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);\n expect(srcSeqCol.getTag(DG.TAGS.UNITS), NOTATION.FASTA);\n expect(srcSeqCol.getTag(bioTAGS.aligned), ALIGNMENT.SEQ);\n expect(srcSeqCol.getTag(bioTAGS.alphabet), ALPHABET.PT);\n expect(srcSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');\n\n const msaSeqCol = multipleSequenceAlignmentAny(srcSeqCol);\n tv.grid.invalidate();\n\n // expect(msaSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);\n // expect(msaSeqCol.getTag(DG.TAGS.UNITS), NOTATION.FASTA);\n // expect(msaSeqCol.getTag(bioTAGS.aligned), ALIGNMENT.SEQ_MSA);\n // expect(msaSeqCol.getTag(bioTAGS.alphabet), ALPHABET.PT);\n // expect(msaSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');\n\n // check newColumn with UnitsHandler constructor\n // const uh: UnitsHandler = new UnitsHandler(msaSeqCol);\n\n dfList.push(df);\n tvList.push(tv);\n }\n\n async function _testAfterConvert() {\n const csv: string = await grok.dapi.files.readAsText('System:AppData/Bio/data/sample_FASTA_PT.csv');\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n\n const srcCol: DG.Column = df.col('sequence')!;\n const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: srcCol});\n if (semType)\n srcCol.semType = semType;\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(df);\n\n tvList.push(tv);\n dfList.push(df);\n\n const tgtCol: DG.Column = await convertDo(srcCol, NOTATION.SEPARATOR, '/');\n\n const resCellRenderer = tgtCol.getTag(DG.TAGS.CELL_RENDERER);\n expect(resCellRenderer, 'sequence');\n\n // check tgtCol with UnitsHandler constructor\n const uh: UnitsHandler = new UnitsHandler(tgtCol);\n }\n\n async function _selectRendererBySemType() {\n /* There are renderers for semType Macromolecule and MacromoleculeDifference.\n Misbehavior was by selecting Macromolecule renderers for MacromoleculeDifference semType column\n /**/\n const seqDiffCol: DG.Column = DG.Column.fromStrings('SequencesDiff',\n ['meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca#D-Tyr_Et/Tyr_ab-dehydroMe/meN/E/N/dV']);\n seqDiffCol.tags[DG.TAGS.UNITS] = NOTATION.SEPARATOR;\n seqDiffCol.tags[bioTAGS.separator] = '/';\n seqDiffCol.semType = C.SEM_TYPES.MACROMOLECULE_DIFFERENCE;\n const df = DG.DataFrame.fromColumns([seqDiffCol]);\n const tv = grok.shell.addTableView(df);\n dfList.push(df);\n tvList.push(tv);\n\n await delay(100);\n const renderer = seqDiffCol.getTag(DG.TAGS.CELL_RENDERER);\n if (renderer !== 'MacromoleculeDifference') { // this is value of MacromoleculeDifferenceCR.cellType\n throw new Error(`Units 'separator', separator '/' and semType 'MacromoleculeDifference' ` +\n `have been manually set on column but after df was added as table, ` +\n `view renderer has set to '${renderer}' instead of correct 'MacromoleculeDifference'.`);\n }\n }\n\n /** GROK-11212 Do not overwrite / recalculate 'cell.renderer' tag that has been set programmatically\n * https://reddata.atlassian.net/browse/GROK-11212 */\n async function _setRendererManually() {\n const seqDiffCol: DG.Column = DG.Column.fromStrings('SequencesDiff',\n ['meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca#D-Tyr_Et/Tyr_ab-dehydroMe/meN/E/N/dV']);\n seqDiffCol.tags[DG.TAGS.UNITS] = NOTATION.SEPARATOR;\n seqDiffCol.tags[bioTAGS.separator] = '/';\n seqDiffCol.semType = DG.SEMTYPE.MACROMOLECULE;\n const tgtCellRenderer = 'MacromoleculeDifference';\n seqDiffCol.setTag(DG.TAGS.CELL_RENDERER, tgtCellRenderer);\n const df = DG.DataFrame.fromColumns([seqDiffCol]);\n await grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n dfList.push(df);\n tvList.push(tv);\n\n await delay(100);\n const resCellRenderer = seqDiffCol.getTag(DG.TAGS.CELL_RENDERER);\n if (resCellRenderer !== tgtCellRenderer) { // this is value of MacromoleculeDifferenceCR.cellType\n throw new Error(`Tag 'cell.renderer' has been manually set to '${tgtCellRenderer}' for column ` +\n `but after df was added as table, tag 'cell.renderer' has reset to '${resCellRenderer}' ` +\n `instead of manual '${tgtCellRenderer}'.`);\n }\n }\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';\n\nimport {ConverterFunc} from './types';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\n// import {mmSemType} from '../const';\n// import {importFasta} from '../package';\n\ncategory('converters', () => {\n enum Samples {\n fastaPt = 'fastaPt',\n separatorPt = 'separatorPt',\n helmPt = 'helmPt',\n\n fastaDna = 'fastaDna',\n separatorDna = 'separatorDna',\n helmDna = 'helmDna',\n\n fastaRna = 'fastaRna',\n separatorRna = 'separatorRna',\n helmRna = 'helmRna',\n\n fastaGaps = 'fastaGaps',\n separatorGaps = 'separatorGaps',\n helmGaps = 'helmGaps',\n\n fastaUn = 'fastaUn',\n separatorUn = 'separatorUn',\n helmUn = 'helmUn',\n\n helmLoneDeoxyribose = 'helmLoneDeoxyribose',\n helmLoneRibose = 'helmLoneRibose',\n helmLonePhosphorus = 'helmLonePhosphorus',\n fastaLoneDeoxyribose = 'fastaLoneDeoxyribose',\n fastaLoneRibose = 'fastaLoneRibose',\n fastaLonePhosphorus = 'fastaLonePhosphorus',\n }\n\n const _csvTxts: { [key: string]: string } = {\n fastaPt: `seq\nFWPHEY\nYNRQWYV\nMKPSEYV\n`,\n separatorPt: `seq\nF-W-P-H-E-Y\nY-N-R-Q-W-Y-V\nM-K-P-S-E-Y-V\n`,\n helmPt: `seq\nPEPTIDE1{F.W.P.H.E.Y}$$$\nPEPTIDE1{Y.N.R.Q.W.Y.V}$$$\nPEPTIDE1{M.K.P.S.E.Y.V}$$$\n`,\n fastaDna: `seq\nACGTC\nCAGTGT\nTTCAAC\n`,\n separatorDna: `seq\nA/C/G/T/C\nC/A/G/T/G/T\nT/T/C/A/A/C\n`,\n helmDna: `seq\nDNA1{D(A)P.D(C)P.D(G)P.D(T)P.D(C)P}$$$\nDNA1{D(C)P.D(A)P.D(G)P.D(T)P.D(G)P.D(T)P}$$$\nDNA1{D(T)P.D(T)P.D(C)P.D(A)P.D(A)P.D(C)P}$$$\n`,\n fastaRna: `seq\nACGUC\nCAGUGU\nUUCAAC\n`,\n separatorRna: `seq\nA*C*G*U*C\nC*A*G*U*G*U\nU*U*C*A*A*C\n`,\n helmRna: `seq\nRNA1{R(A)P.R(C)P.R(G)P.R(U)P.R(C)P}$$$\nRNA1{R(C)P.R(A)P.R(G)P.R(U)P.R(G)P.R(U)P}$$$\nRNA1{R(U)P.R(U)P.R(C)P.R(A)P.R(A)P.R(C)P}$$$\n`,\n fastaGaps: `seq\nFW-PH-EYY\nFYNRQWYV-\nFKP-Q-SEYV\n`,\n separatorGaps: `seq\nF/W//P/H//E/Y/Y\nF/Y/N/R/Q/W/Y/V/\nF/K/P//Q//S/E/Y/V\n`,\n helmGaps: `seq\nPEPTIDE1{F.W.*.P.H.*.E.Y.Y}$$$\nPEPTIDE1{F.Y.N.R.Q.W.Y.V.*}$$$\nPEPTIDE1{F.K.P.*.Q.*.S.E.Y.V}$$$\n`,\n\n fastaUn: `seq\n[meI][hHis][Aca]NT[dE][Thr_PO3H2][Aca]D\n[meI][hHis][Aca][Cys_SEt]T[dK][Thr_PO3H2][Aca][Tyr_PO3H2]\n[Lys_Boc][hHis][Aca][Cys_SEt]T[dK][Thr_PO3H2][Aca][Tyr_PO3H2]\n`,\n separatorUn: `seq\nmeI-hHis-Aca-N-T-dE-Thr_PO3H2-Aca-D\nmeI-hHis-Aca-Cys_SEt-T-dK-Thr_PO3H2-Aca-Tyr_PO3H2\nLys_Boc-hHis-Aca-Cys_SEt-T-dK-Thr_PO3H2-Aca-Tyr_PO3H2\n`,\n helmUn: `seq\nPEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D}$$$\nPEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2}$$$\nPEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2}$$$\n`,\n helmLoneDeoxyribose: `seq\nDNA1{D(A).D(C).D(G).D(T).D(C)}$$$\nDNA1{D(C).D(A).D(G).D(T).D(G).D(T)P}$$$\nDNA1{D(T).D(T).D(C).D(A).D(A).D(C)P}$$$\n`,\n helmLoneRibose: `seq\nRNA1{R(A).R(C).R(G).R(U).R(C)}$$$\nRNA1{R(C).R(A).R(G).R(U).R(G).R(U)P}$$$\nRNA1{R(U).R(U).R(C).R(A).R(A).R(C)P}$$$\n`,\n helmLonePhosphorus: `seq\nRNA1{P.P.R(A)P.R(C)P.R(G)P.R(U)P.R(C)P}$$$\nRNA1{P.P.R(C)P.R(A)P.P.R(G)P.R(U)P.R(G)P.R(U)P}$$$\nRNA1{P.R(U)P.R(U)P.R(C)P.R(A)P.R(A)P.R(C)P.P.P}$$$\n`,\n };\n\n /** Also detects semantic types\n * @param {string} key\n * @return {Promise<DG.DataFrame>}\n */\n async function readCsv(key: string): Promise<DG.DataFrame> {\n // Always recreate test data frame from CSV for reproducible detector behavior in tests.\n const csv: string = _csvTxts[key];\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n await grok.data.detectSemanticTypes(df);\n return df;\n }\n\n function converter(tgtNotation: NOTATION, tgtSeparator: string | null = null): ConverterFunc {\n if (tgtNotation === NOTATION.SEPARATOR && !tgtSeparator)\n throw new Error(`Argument 'separator' is missed for notation '${tgtNotation.toString()}'.`);\n\n return function(srcCol: DG.Column): DG.Column {\n const converter = new NotationConverter(srcCol);\n const resCol = converter.convert(tgtNotation, tgtSeparator);\n expect(resCol.getTag('units'), tgtNotation);\n return resCol;\n };\n }\n\n async function _testConvert(srcKey: Samples, converter: ConverterFunc, tgtKey: Samples) {\n const srcDf: DG.DataFrame = await readCsv(srcKey);\n const srcCol: DG.Column = srcDf.getCol('seq');\n\n // conversion results\n const resCol: DG.Column = converter(srcCol);\n\n // The correct reference data to compare conversion results with.\n const tgtDf: DG.DataFrame = await readCsv(tgtKey);\n const tgtCol: DG.Column = tgtDf.getCol('seq');\n\n expectArray(resCol.toList(), tgtCol.toList());\n const uh: UnitsHandler = new UnitsHandler(resCol);\n }\n\n // FASTA tests\n // fasta -> separator\n test('testFastaPtToSeparator', async () => {\n await _testConvert(Samples.fastaPt, converter(NOTATION.SEPARATOR, '-'), Samples.separatorPt);\n });\n test('testFastaDnaToSeparator', async () => {\n await _testConvert(Samples.fastaDna, converter(NOTATION.SEPARATOR, '/'), Samples.separatorDna);\n });\n test('testFastaRnaToSeparator', async () => {\n await _testConvert(Samples.fastaRna, converter(NOTATION.SEPARATOR, '*'), Samples.separatorRna);\n });\n test('testFastaGapsToSeparator', async () => {\n await _testConvert(Samples.fastaGaps, converter(NOTATION.SEPARATOR, '/'), Samples.separatorGaps);\n });\n test('testFastaUnToSeparator', async () => {\n await _testConvert(Samples.fastaUn, converter(NOTATION.SEPARATOR, '-'), Samples.separatorUn);\n });\n\n // fasta -> helm\n test('testFastaPtToHelm', async () => {\n await _testConvert(Samples.fastaPt, converter(NOTATION.HELM), Samples.helmPt);\n });\n test('testFastaDnaToHelm', async () => {\n await _testConvert(Samples.fastaDna, converter(NOTATION.HELM), Samples.helmDna);\n });\n test('testFastaRnaToHelm', async () => {\n await _testConvert(Samples.fastaRna, converter(NOTATION.HELM), Samples.helmRna);\n });\n test('testFastaGapsToHelm', async () => {\n await _testConvert(Samples.fastaGaps, converter(NOTATION.HELM), Samples.helmGaps);\n });\n // TODO: testFastaUnToHelm\n // test('testFastaUnToHelm', async () => {\n // await _testConvert(Samples.fastaUn, converter(NOTATION.HELM), Samples.helmUn);\n // });\n\n\n // SEPARATOR tests\n // separator -> fasta\n test('testSeparatorPtToFasta', async () => {\n await _testConvert(Samples.separatorPt, converter(NOTATION.FASTA), Samples.fastaPt);\n });\n test('testSeparatorDnaToFasta', async () => {\n await _testConvert(Samples.separatorDna, converter(NOTATION.FASTA), Samples.fastaDna);\n });\n test('testSeparatorRnaToFasta', async () => {\n await _testConvert(Samples.separatorRna, converter(NOTATION.FASTA), Samples.fastaRna);\n });\n test('testSeparatorGapsToFasta', async () => {\n await _testConvert(Samples.separatorGaps, converter(NOTATION.FASTA), Samples.fastaGaps);\n });\n test('testSeparatorUnToFasta', async () => {\n await _testConvert(Samples.separatorUn, converter(NOTATION.FASTA), Samples.fastaUn);\n });\n\n // separator -> helm\n test('testSeparatorPtToHelm', async () => {\n await _testConvert(Samples.separatorPt, converter(NOTATION.HELM), Samples.helmPt);\n });\n test('testSeparatorDnaToHelm', async () => {\n await _testConvert(Samples.separatorDna, converter(NOTATION.HELM), Samples.helmDna);\n });\n test('testSeparatorRnaToHelm', async () => {\n await _testConvert(Samples.separatorRna, converter(NOTATION.HELM), Samples.helmRna);\n });\n test('testSeparatorGapsToHelm', async () => {\n await _testConvert(Samples.separatorGaps, converter(NOTATION.HELM), Samples.helmGaps);\n });\n // TODO: testSeparatorUnToHelm\n // test('testSeparatorUnToHelm', async () => {\n // await _testConvert(Samples.separatorUn, converter(NOTATION.HELM), Samples.helmUn);\n // });\n\n\n // HELM tests\n // helm -> fasta\n test('testHelmDnaToFasta', async () => {\n await _testConvert(Samples.helmDna, converter(NOTATION.FASTA), Samples.fastaDna);\n });\n test('testHelmRnaToFasta', async () => {\n await _testConvert(Samples.helmRna, converter(NOTATION.FASTA), Samples.fastaRna);\n });\n test('testHelmPtToFasta', async () => {\n await _testConvert(Samples.helmPt, converter(NOTATION.FASTA), Samples.fastaPt);\n });\n test('testHelmUnToFasta', async () => {\n await _testConvert(Samples.helmUn, converter(NOTATION.FASTA), Samples.fastaUn);\n });\n\n // helm -> separator\n test('testHelmDnaToSeparator', async () => {\n await _testConvert(Samples.helmDna, converter(NOTATION.SEPARATOR, '/'), Samples.separatorDna);\n });\n test('testHelmRnaToSeparator', async () => {\n await _testConvert(Samples.helmRna, converter(NOTATION.SEPARATOR, '*'), Samples.separatorRna);\n });\n test('testHelmPtToSeparator', async () => {\n await _testConvert(Samples.helmPt, converter(NOTATION.SEPARATOR, '-'), Samples.separatorPt);\n });\n test('testHelmUnToSeparator', async () => {\n await _testConvert(Samples.helmUn, converter(NOTATION.SEPARATOR, '-'), Samples.separatorUn);\n });\n\n // helm miscellaneous\n test('testHelmLoneRibose', async () => {\n await _testConvert(Samples.helmLoneRibose, converter(NOTATION.FASTA), Samples.fastaRna);\n });\n test('testHelmLoneDeoxyribose', async () => {\n await _testConvert(Samples.helmLoneDeoxyribose, converter(NOTATION.SEPARATOR, '/'), Samples.separatorDna);\n });\n test('testHelmLonePhosphorus', async () => {\n await _testConvert(Samples.helmLonePhosphorus, converter(NOTATION.FASTA), Samples.fastaRna);\n });\n});\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {category, expectArray, test} from '@datagrok-libraries/utils/src/test';\nimport {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\n\ncategory('fastaFileHandler', () => {\n const fastaNormalFormatting = `>description:1\nMDYKETLLMPKTDFPMRGGLPNKEPQIQEKW\n\n>description:2\nMIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL\n\n>description:3\nMMELVLKTIIGPIVVGVVLRIVDKWLNKDK\n\n>description:4\nMDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN\n`;\n\n const fastaExtraSpaces = `>description:1\n MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW\n\n>description:2\nMI EVF LFGIVLGLI PITLAGLFVTAY LQYRRGDQLDL\n\n>description:3\nM MELVLKTI IGPI VVGVVLR IVDKWLNKDK\n\n>description:4\nMDR TDEVSNHTHDKP TLTWFEEIFEEYHSPFHN\n `;\n\n const fastaExtraNewlines = `>description:1\n\nMDYKETLLMPKTDFPMRGGLPNKEPQIQEKW\n\n>description:2\nMIEVF\nLFGIVLGLI\nPITLAGLFVTA\nYLQYRRGDQLDL\n\n>description:3\nM\nME\n\nLVLKTIIG\n\nPIVVGVVLRI\nVDKWLNKDK\n\n\n>description:4\n\nMDRT\n\nDEVSNHTHDKP\n\nTLTWFEEIFEE\n\n\n\nYHSPFHN\n`;\n // a \"broken\" fasta file\n // const fastaBroken = `\n \n // >description:1\n// MDYKETLLM\n// PKTDFPMRGGLPN\n// KEPQIQEKW\n\n\n\n // >description:2\n// MIEVFL FGIVLGLIPI TLAGLFVTAYLQYRRGDQLDL\n\n// >description:3\n\n// M\n // MELVLKTIIGP\n // IVVGVVLR\n// IVDKWLNKD\n\n// K\n\n // >description:4\n // MDRTDEV\n\n // SNHTHDKP\n// TLTWFEEI\n// FEE\n\n// YHSPFHN\n\n\n // `;\n\n const descriptionsArray = [\n 'description:1', 'description:2', 'description:3', 'description:4',\n ];\n const descriptionCol = DG.Column.fromStrings('description', descriptionsArray);\n\n const sequencesArray = [\n 'MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW',\n 'MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL',\n 'MMELVLKTIIGPIVVGVVLRIVDKWLNKDK',\n 'MDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN',\n ];\n const sequencesCol = DG.Column.fromStrings('sequence', sequencesArray);\n sequencesCol.semType = DG.SEMTYPE.MACROMOLECULE;\n UnitsHandler.setUnitsToFastaColumn(sequencesCol);\n\n const fastaDf = DG.DataFrame.fromColumns([descriptionCol, sequencesCol]);\n\n function _testColumnsParser(inputFasta: string) {\n const ffh = new FastaFileHandler(inputFasta);\n const parsedDescriptionsArray = ffh.descriptionsArray;\n const parsedSequencesArray = ffh.sequencesArray;\n expectArray(\n [parsedDescriptionsArray, parsedSequencesArray],\n [descriptionsArray, sequencesArray]\n );\n }\n\n // test parser\n test('testNormalFormatting', async () => {\n _testColumnsParser(fastaNormalFormatting);\n });\n test('testExtraSpaces', async () => {\n _testColumnsParser(fastaExtraSpaces);\n });\n test('testExtraNewlines', async () => {\n _testColumnsParser(fastaExtraNewlines);\n });\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nimport {category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';\nimport {saveAsFastaDo, wrapSequence} from '../utils/save-as-fasta';\nimport {splitterAsFasta} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\ntype SaveAsFastaTestArgs = { srcCsv: string, idCols: string [], seqCol: string, lineWidth: number, tgtFasta: string };\n\ncategory('fastaExport', () => {\n enum WrapDataTest {\n single = 'single',\n multi = 'multi'\n }\n\n const wrapData: { [key: string]: { src: string, tgt: string[] } } = {\n [WrapDataTest.single]: {\n src: 'MDYKETLLMPKTDFPMRGGLP',\n tgt: ['MDYKETLLMP', 'KTDFPMRGGL', 'P'],\n },\n [WrapDataTest.multi]: {\n src: 'M[MeI]YKETLL[MeF]PKTDFPMRGGL[MeA]',\n tgt: ['M[MeI]YKETLL[MeF]P', 'KTDFPMRGGL', '[MeA]'],\n },\n };\n\n enum SaveAsFastaTests {\n test1 = 'test1',\n test2 = 'test2'\n }\n\n const saveAsFastaData: {\n [key: string]: SaveAsFastaTestArgs\n } = {\n [SaveAsFastaTests.test1]: {\n srcCsv: `id,seq\n1,MDYKETLLMP\n2,KTDFPMRGGL\n3,P`,\n idCols: ['id'],\n seqCol: 'seq',\n lineWidth: 10,\n tgtFasta: `>1\nMDYKETLLMP\n>2\nKTDFPMRGGL\n>3\nP\n`\n },\n [SaveAsFastaTests.test2]: {\n srcCsv: `id,id2,seq\n1,seqA,M[MeI]YKETLL[MeF]P\n2,seqB,KTDFPMRGGL\n3,seqC,[MeA]\n`,\n idCols: ['id2', 'id'],\n seqCol: 'seq',\n lineWidth: 5,\n tgtFasta: `>seqA|1\nM[MeI]YKE\nTLL[MeF]P\n>seqB|2\nKTDFP\nMRGGL\n>seqC|3\n[MeA]\n`\n }\n };\n\n test('wrapSequenceSingle', async () => {\n _testWrapSequence(WrapDataTest.single, 10);\n });\n\n test('wrapSequenceMulti', async () => {\n _testWrapSequence(WrapDataTest.multi, 10);\n });\n\n test('saveAsFastaTest1', async () => {\n _testSaveAsFasta(saveAsFastaData[SaveAsFastaTests.test1]);\n });\n\n test('saveAsFastaTest2', async () => {\n _testSaveAsFasta(saveAsFastaData[SaveAsFastaTests.test2]);\n });\n\n function _testWrapSequence(testKey: string, lineWidth: number = 10) {\n const splitter = splitterAsFasta;\n\n const srcSeq: string = wrapData[testKey].src;\n const wrapRes: string[] = wrapSequence(srcSeq, splitter, lineWidth);\n const wrapTgt: string[] = wrapData[testKey].tgt;\n\n expectArray(wrapRes, wrapTgt);\n }\n\n async function _testSaveAsFasta(args: SaveAsFastaTestArgs) {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(args.srcCsv);\n\n const seqCol: DG.Column = df.getCol(args.seqCol);\n const idCols: DG.Column[] = args.idCols.map((colName) => df.getCol(colName));\n\n const fastaRes: string = saveAsFastaDo(idCols, seqCol, args.lineWidth);\n expect(fastaRes, args.tgtFasta);\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 {after, before, category, test, expect, expectObject} from '@datagrok-libraries/utils/src/test';\nimport {\n getAlphabetSimilarity,\n getStats,\n monomerToShort,\n pickUpPalette,\n splitterAsFasta,\n splitterAsHelm,\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {Nucleotides, NucleotidesPalettes} from '@datagrok-libraries/bio/src/nucleotides';\nimport {AminoacidsPalettes} from '@datagrok-libraries/bio/src/aminoacids';\nimport {UnknownSeqPalette} from '@datagrok-libraries/bio/src/unknown';\n\ncategory('bio', () => {\n const csvDfN1: string = `seq\nACGTCT\nCAGTGT\nTTCAAC\n`;\n\n /** 2 - is an error monomer\n * This sequence set should be classified as nucleotides sequences.\n * Small error, not similar to amino acids.\n */\n const csvDfN1e: string = `seq\nACGTAT\nCAGTTG\nTTCG2C\n`;\n\n /** Pure amino acids sequence */\n const csvDfAA1: string = `seq\nFWPHEYV\nYNRQWYV\nMKPSEYV\n`;\n\n /** A - alanine, G - glycine, T -= threonine, C - cysteine, W - tryptophan\n * This sequence set should be detected as amino acids more than nucleotides.\n */\n const csvDfAA2: string = `seq\nAGTCAT\nAGTCGC\nAGTCATW\n`;\n\n /** This sequence set should be recognized as unknown. */\n const csvDfX: string = `seq\nXZJ{}2\n5Z4733\n3Z6></\n675687\n`;\n\n // anonymous functions specified in test() registering must return Promise<any>\n test('testGetStatsHelm1', async () => {\n const csv = `seq\nPEPTIDE1{meI}$$$$\n`;\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n const seqCol: DG.Column = df.getCol('seq')!;\n const stats = getStats(seqCol, 1, splitterAsHelm);\n\n expectObject(stats.freq, {\n 'meI': 1\n });\n expect(stats.sameLength, true);\n });\n\n test('testGetStatsN1', async () => { await _testGetStats(csvDfN1); });\n test('testGetAlphabetSimilarity', async () => { await _testGetAlphabetSimilarity(); });\n\n test('testPickupPaletteN1', async () => { await _testPickupPaletteN1(csvDfN1); });\n test('testPickupPaletteN1e', async () => { await _testPickupPaletteN1e(csvDfN1e); });\n test('testPickupPaletteAA1', async () => { await _testPickupPaletteAA1(csvDfAA1); });\n test('testPickupPaletteX', async () => { await _testPickupPaletteX(csvDfX); });\n});\n\ncategory('WebLogo.monomerToShort', () => {\n test('longMonomerSingle', async () => {\n await expect(monomerToShort('S', 5), 'S');\n });\n test('longMonomerShort', async () => {\n await expect(monomerToShort('Short', 5), 'Short');\n });\n test('longMonomerLong56', async () => {\n await expect(monomerToShort('Long56', 5), 'Long5…');\n });\n test('longMonomerComplexFirstPartShort', async () => {\n await expect(monomerToShort('Long-long', 5), 'Long…');\n });\n test('longMonomerComplexFirstPartLong56', async () => {\n await expect(monomerToShort('Long56-long', 5), 'Long5…');\n });\n});\n\n\nexport async function _testGetStats(csvDfN1: string) {\n const dfN1: DG.DataFrame = DG.DataFrame.fromCsv(csvDfN1);\n const seqCol: DG.Column = dfN1.col('seq')!;\n const stats = getStats(seqCol, 5, splitterAsFasta);\n\n expectObject(stats.freq, {\n 'A': 4,\n 'C': 5,\n 'G': 3,\n 'T': 6\n });\n expect(stats.sameLength, true);\n}\n\nexport async function _testGetAlphabetSimilarity() {\n const freq: { [m: string]: number } = {\n 'A': 2041,\n 'C': 3015,\n 'G': 3015,\n 'T': 2048,\n '-': 1000\n };\n const alphabet: Set<string> = new Set(Object.keys(Nucleotides.Names));\n const res = getAlphabetSimilarity(freq, alphabet);\n\n expect(res > 0.6, true);\n}\n\nexport async function _testPickupPaletteN1(csvDfN1: string) {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDfN1);\n const col: DG.Column = df.col('seq')!;\n const cp = pickUpPalette(col);\n\n expect(cp instanceof NucleotidesPalettes, true);\n}\n\nexport async function _testPickupPaletteN1e(csvDfN1e: string) {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDfN1e);\n const col: DG.Column = df.col('seq')!;\n const cp = pickUpPalette(col);\n\n expect(cp instanceof NucleotidesPalettes, true);\n}\n\nexport async function _testPickupPaletteAA1(csvDfAA1: string) {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDfAA1);\n const col: DG.Column = df.col('seq')!;\n const cp = pickUpPalette(col);\n\n expect(cp instanceof AminoacidsPalettes, true);\n}\n\nexport async function _testPickupPaletteX(csvDfX: string) {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDfX);\n const col: DG.Column = df.col('seq')!;\n const cp = pickUpPalette(col);\n\n expect(cp instanceof UnknownSeqPalette, true);\n}\n\nexport async function _testPickupPaletteAA2(dfAA2: DG.DataFrame) {\n const seqCol: DG.Column = dfAA2.col('seq')!;\n const cp = pickUpPalette(seqCol);\n\n expect(cp instanceof AminoacidsPalettes, true);\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';\nimport {ALPHABET, NOTATION, SplitterFunc, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {\n countForMonomerAtPosition,\n FilterSources,\n PositionInfo as PI,\n PositionMonomerInfo as PMI,\n WebLogoViewer\n} from '../viewers/web-logo-viewer';\n\ncategory('WebLogo-positions', () => {\n let tvList: DG.TableView[];\n let dfList: DG.DataFrame[];\n let currentView: DG.ViewBase;\n\n const csvDf1 = `seq\nATC-G-TTGC--\nATC-G-TTGC--\n-TC-G-TTGC--\n-TC-GCTTGC--\n-TC-GCTTGC--`;\n\n\n before(async () => {\n tvList = [];\n dfList = [];\n // currentView = grok.shell.v;\n });\n\n after(async () => {\n // Closing opened views causes the error 'Cannot read properties of null (reading 'f')'\n // dfList.forEach((df: DG.DataFrame) => { grok.shell.closeTable(df); });\n // tvList.forEach((tv: DG.TableView) => tv.close());\n // grok.shell.v = currentView;\n });\n\n test('allPositions', async () => {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDf1);\n const tv: DG.TableView = grok.shell.addTableView(df);\n\n const seqCol: DG.Column = df.getCol('seq');\n seqCol.semType = DG.SEMTYPE.MACROMOLECULE;\n seqCol.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n seqCol.setTag(bioTAGS.alphabet, ALPHABET.DNA);\n seqCol.setTag(bioTAGS.aligned, 'SEQ.MSA');\n\n const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo')) as WebLogoViewer;\n tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);\n\n tvList.push(tv);\n dfList.push(df);\n\n const positions: PI[] = wlViewer['positions'];\n\n const resAllDf1: PI[] = [\n new PI(0, '1', {'A': new PMI(2), '-': new PMI(3)}),\n new PI(1, '2', {'T': new PMI(5)}),\n new PI(2, '3', {'C': new PMI(5)}),\n new PI(3, '4', {'-': new PMI(5)}),\n new PI(4, '5', {'G': new PMI(5)}),\n new PI(5, '6', {'-': new PMI(3), 'C': new PMI(2)}),\n new PI(6, '7', {'T': new PMI(5)}),\n new PI(7, '8', {'T': new PMI(5)}),\n new PI(8, '9', {'G': new PMI(5)}),\n new PI(9, '10', {'C': new PMI(5)}),\n new PI(10, '11', {'-': new PMI(5)}),\n new PI(11, '12', {'-': new PMI(5)}),\n ];\n\n expect(positions.length, resAllDf1.length);\n\n for (let i = 0; i < positions.length; i++) {\n expect(positions[i].name, resAllDf1[i].name);\n for (const key in positions[i].freq) {\n expect(positions[i].freq[key].count, resAllDf1[i].freq[key].count);\n }\n }\n });\n\n test('positions with shrinkEmptyTail option true (filtered)', async () => {\n const csvDf2 = `seq \n-TC-G-TTGC--\n-TC-GCTTGC--\n-T--C-GT-\n-T--C-GT-\n-T--C-GT-\n-T--CCGT-`;\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDf2);\n const tv: DG.TableView = grok.shell.addTableView(df);\n\n const seqCol: DG.Column = df.getCol('seq');\n seqCol.semType = DG.SEMTYPE.MACROMOLECULE;\n seqCol.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n seqCol.setTag(bioTAGS.alphabet, ALPHABET.DNA);\n seqCol.setTag(bioTAGS.aligned, 'SEQ');\n\n df.filter.init((i) => {\n return i > 2;\n });\n df.filter.fireChanged();\n const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo',\n {'shrinkEmptyTail': true})) as WebLogoViewer;\n tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);\n\n tvList.push(tv);\n dfList.push(df);\n\n const positions: PI[] = wlViewer['positions'];\n\n const resAllDf1: PI[] = [\n new PI(0, '1', {'-': new PMI(3)}),\n new PI(1, '2', {'T': new PMI(3)}),\n new PI(2, '3', {'-': new PMI(3)}),\n new PI(3, '4', {'-': new PMI(3)}),\n new PI(4, '5', {'C': new PMI(3)}),\n new PI(5, '6', {'-': new PMI(2), 'C': new PMI(1)}),\n new PI(6, '7', {'G': new PMI(3)}),\n new PI(7, '8', {'T': new PMI(3)}),\n new PI(8, '9', {'-': new PMI(3)}),\n ];\n\n expect(positions.length, resAllDf1.length);\n\n for (let i = 0; i < positions.length; i++) {\n expect(positions[i].name, resAllDf1[i].name);\n for (const key in positions[i].freq) {\n expect(positions[i].freq[key].count, resAllDf1[i].freq[key].count);\n }\n }\n });\n\n test('positions with skipEmptyPositions option', async () => {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csvDf1);\n const tv: DG.TableView = grok.shell.addTableView(df);\n\n const seqCol: DG.Column = df.getCol('seq');\n seqCol.semType = DG.SEMTYPE.MACROMOLECULE;\n seqCol.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n seqCol.setTag(bioTAGS.alphabet, ALPHABET.DNA);\n seqCol.setTag(bioTAGS.aligned, 'SEQ.MSA');\n\n const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo',\n {'skipEmptyPositions': true})) as WebLogoViewer;\n tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);\n\n tvList.push(tv);\n dfList.push(df);\n\n const resPosList: PI[] = wlViewer['positions'];\n\n const tgtPosList: PI[] = [\n new PI(0, '1', {'A': new PMI(2), '-': new PMI(3)}),\n new PI(1, '2', {'T': new PMI(5)}),\n new PI(2, '3', {'C': new PMI(5)}),\n new PI(4, '5', {'G': new PMI(5)}),\n new PI(5, '6', {'-': new PMI(3), 'C': new PMI(2)}),\n new PI(6, '7', {'T': new PMI(5)}),\n new PI(7, '8', {'T': new PMI(5)}),\n new PI(8, '9', {'G': new PMI(5)}),\n new PI(9, '10', {'C': new PMI(5)})\n ];\n\n expect(resPosList.length, tgtPosList.length);\n for (let posI = 0; posI < resPosList.length; posI++) {\n const resPos = resPosList[posI];\n const tgtPos = tgtPosList[posI];\n expectPositionInfo(resPos, tgtPos);\n }\n });\n\n test('count sequences for monomer at position', async () => {\n const df: DG.DataFrame = buildDfWithSeqCol(csvDf1, NOTATION.FASTA, ALPHABET.DNA, 'SEQ.MSA');\n const seqCol: DG.Column = df.getCol('seq');\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n\n const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo', {\n startPositionName: '3',\n endPositionName: '7',\n skipEmptyPositions: true\n })) as WebLogoViewer;\n tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);\n\n tvList.push(tv);\n dfList.push(df);\n\n const resPosList: PI[] = wlViewer['positions'];\n const tgtPosList: PI[] = [\n new PI(2, '3', {'C': new PMI(5)}),\n new PI(4, '5', {'G': new PMI(5)}),\n new PI(5, '6', {'-': new PMI(3), 'C': new PMI(2)}),\n new PI(6, '7', {'T': new PMI(5)}),\n ];\n\n expect(resPosList.length, tgtPosList.length);\n for (let posI = 0; posI < resPosList.length; posI++) {\n const resPos = resPosList[posI];\n const tgtPos = tgtPosList[posI];\n expectPositionInfo(resPos, tgtPos);\n }\n\n const splitter: SplitterFunc = wlViewer['splitter']!;\n const atPI1: PI = resPosList[1];\n const countAt1 = countForMonomerAtPosition(df, seqCol, df.filter, splitter, 'G', atPI1);\n expect(countAt1, 5);\n });\n});\n\nfunction expectPositionInfo(actualPos: PI, expectedPos: PI): void {\n expect(actualPos.name, expectedPos.name);\n expectArray(Object.keys(actualPos.freq), Object.keys(expectedPos.freq));\n for (const key in actualPos.freq) {\n //\n expect(actualPos.freq[key].count, expectedPos.freq[key].count);\n }\n}\n\nfunction buildDfWithSeqCol(csv: string, notation: NOTATION, alphabet: ALPHABET, aligned: string): DG.DataFrame {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n\n const seqCol: DG.Column = df.getCol('seq');\n seqCol.semType = DG.SEMTYPE.MACROMOLECULE;\n seqCol.setTag(DG.TAGS.UNITS, notation);\n seqCol.setTag(bioTAGS.alphabet, alphabet);\n seqCol.setTag(bioTAGS.aligned, aligned);\n\n return df;\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, test, expect, expectArray} from '@datagrok-libraries/utils/src/test';\n\nimport {checkInputColumn, multipleSequenceAlignmentAny} from '../package';\nimport {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\ncategory('checkInputColumn', () => {\n const csv = `seq\nseq1,\nseq2,\nseq3,\nseq4`;\n\n test('testMsaPos', async () => {\n const func: DG.Func = DG.Func.find({package: 'Bio', name: 'multipleSequenceAlignmentAny'})[0];\n const funcInputColumnProperty: DG.Property = func.inputs.find((i) => i.name == 'sequence')!;\n\n const k = 11;\n\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n const col: DG.Column = df.getCol('seq');\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n col.setTag(bioTAGS.alphabet, ALPHABET.DNA);\n col.setTag(bioTAGS.aligned, 'SEQ');\n\n const [res, msg]: [boolean, string] = checkInputColumn(\n col, 'Test', [NOTATION.FASTA],\n [ALPHABET.DNA, ALPHABET.RNA, ALPHABET.PT]);\n\n expect(res, true);\n });\n\n test('testMsaNegHelm', async () => {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n const col: DG.Column = df.getCol('seq');\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag(DG.TAGS.UNITS, NOTATION.HELM);\n // col.setTag(bio.TAGS.alphabetSize, '11');\n col.setTag(bioTAGS.alphabetIsMultichar, 'true');\n\n const [res, msg]: [boolean, string] = checkInputColumn(\n col, 'Test', [NOTATION.FASTA],\n [ALPHABET.DNA, ALPHABET.RNA, ALPHABET.PT]);\n\n expect(res, false);\n });\n\n test('testMsaNegUN', async () => {\n const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);\n const col: DG.Column = df.getCol('seq');\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n col.setTag(bioTAGS.alphabet, 'UN');\n col.setTag(bioTAGS.alphabetSize, '11');\n col.setTag(bioTAGS.alphabetIsMultichar, 'true');\n col.setTag(bioTAGS.aligned, 'SEQ');\n\n const [res, msg]: [boolean, string] = checkInputColumn(\n col, 'Test', [NOTATION.FASTA],\n [ALPHABET.DNA, ALPHABET.RNA, ALPHABET.PT]);\n\n expect(res, false);\n });\n\n test('testGetActionFunctionMeta', async () => {\n const func: DG.Func = DG.Func.find({package: 'Bio', name: 'multipleSequenceAlignmentAny'})[0];\n const sequenceInput: DG.Property = func.inputs.find((i) => i.name == 'sequence')!;\n const k = 11;\n });\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {_package} from '../package-test';\nimport {expect} from '@datagrok-libraries/utils/src/test';\nimport {runKalign} from '../utils/multiple-sequence-alignment';\n\nexport async function loadFileAsText(name: string): Promise<string> {\n return await _package.files.readAsText(name);\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 createTableView(tableName: string): Promise<DG.TableView> {\n const df = await readDataframe(tableName);\n df.name = tableName.replace('.csv', '');\n const view = grok.shell.addTableView(df);\n return view;\n}\n\n\n/**\n * Tests if a table has non zero rows and columns.\n *\n * @param {DG.DataFrame} table Target table.\n */\nexport function _testTableIsNotEmpty(table: DG.DataFrame): void {\n expect(table.columns.length > 0 && table.rowCount > 0, true);\n}\n","import {after, before, category, test, expect, delay} from '@datagrok-libraries/utils/src/test';\nimport * as DG from 'datagrok-api/dg';\nimport {createTableView, readDataframe} from './utils';\nimport * as grok from 'datagrok-api/grok';\nimport {SequenceSimilarityViewer} from '../analysis/sequence-similarity-viewer';\n\nlet viewList: DG.ViewBase[];\nlet dfList: DG.DataFrame[];\n\n\ncategory('similarity/diversity', async () => {\n\n before(async () => {\n viewList = [];\n dfList = [];\n });\n\n after(async () => {\n for (const view of viewList) view.close();\n for (const df of dfList) grok.shell.closeTable(df);\n });\n\n\n test('similaritySearchViewer', async () => {\n await _testSimilaritySearchViewer();\n });\n test('diversitySearchViewer', async () => {\n await _testDiversitySearchViewer();\n });\n});\n\nasync function _testSimilaritySearchViewer() {\n const molecules = await createTableView('tests/sample_MSA_data.csv');\n const viewer = molecules.addViewer('Sequence Similarity Search');\n await delay(100);\n const similaritySearchViewer = getSearchViewer(viewer, 'Sequence Similarity Search');\n viewList.push(similaritySearchViewer);\n viewList.push(molecules);\n if (!similaritySearchViewer.molCol)\n await waitForCompute(similaritySearchViewer);\n expect(similaritySearchViewer.fingerprint, 'Morgan');\n expect(similaritySearchViewer.distanceMetric, 'Tanimoto');\n expect(similaritySearchViewer.scores!.get(0), DG.FLOAT_NULL);\n expect(similaritySearchViewer.idxs!.get(0), 0);\n expect(similaritySearchViewer.molCol!.get(0),\n 'D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me');\n expect(similaritySearchViewer.scores!.get(1), 0.4722222089767456);\n expect(similaritySearchViewer.idxs!.get(1), 11);\n expect(similaritySearchViewer.molCol!.get(1),\n 'meI/hHis//Aca/meM/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me');\n const waiter = waitForCompute(similaritySearchViewer); /* subscribe for computeCompleted event before start compute */\n molecules.dataFrame.currentRowIdx = 1;\n await waiter;\n expect(similaritySearchViewer.targetMoleculeIdx, 1);\n expect(similaritySearchViewer.molCol!.get(0),\n 'meI/hHis/Aca/Cys_SEt/T/dK/Thr_PO3H2/Aca/Tyr_PO3H2/D-Chg/dV/Phe_ab-dehydro/N/D-Orn/D-aThr//Phe_4Me');\n}\n\n\nasync function _testDiversitySearchViewer() {\n const molecules = await createTableView('tests/sample_MSA_data.csv');\n const viewer = molecules.addViewer('Sequence Diversity Search');\n await delay(10);\n const diversitySearchviewer = getSearchViewer(viewer, 'Sequence Diversity Search');\n viewList.push(diversitySearchviewer);\n viewList.push(molecules);\n if (!diversitySearchviewer.renderMolIds)\n await waitForCompute(diversitySearchviewer);\n expect(diversitySearchviewer.fingerprint, 'Morgan');\n expect(diversitySearchviewer.distanceMetric, 'Tanimoto');\n expect(diversitySearchviewer.initialized, true);\n expect(diversitySearchviewer.renderMolIds.length > 0, true);\n}\n\nfunction getSearchViewer(viewer: DG.Viewer, name: string) {\n for (const v of viewer.view.viewers) {\n if (v.type === name)\n return v;\n }\n}\n\nasync function waitForCompute(viewer: SequenceSimilarityViewer) {\n const t = new Promise((resolve, reject) => {\n viewer.computeCompleted.subscribe(async (_: any) => {\n try {\n resolve(true);\n } catch (error) {\n reject(error);\n }\n });\n });\n await t;\n}\n","import {after, before, category, test, expect, delay} from '@datagrok-libraries/utils/src/test';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {readDataframe} from './utils';\nimport {BioSubstructureFilter, HelmFilter, SeparatorFilter} from '../widgets/bio-substructure-filter';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {LIB_DEFAULT, LIB_STORAGE_NAME} from '../utils/monomer-lib';\n\n\ncategory('substructureFilters', async () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibrariesSettings: {};\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibrariesSettings = await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true);\n\n // Test 'helm' requires default monomer library loaded\n await grok.dapi.userDataStorage.post(LIB_STORAGE_NAME, LIB_DEFAULT, true);\n await monomerLibHelper.loadLibraries(true); // load default libraries\n });\n\n after(async () => {\n // UserDataStorage.put() replaces existing data\n await grok.dapi.userDataStorage.put(LIB_STORAGE_NAME, userLibrariesSettings, true);\n await monomerLibHelper.loadLibraries(true); // load user settings libraries\n });\n\n test('fasta', async () => {\n const fasta = await readDataframe('tests/filter_FASTA.csv');\n const filter = new BioSubstructureFilter();\n await grok.data.detectSemanticTypes(fasta);\n filter.attach(fasta);\n filter.bioFilter!.substructure = 'MD';\n await delay(100);\n expect(filter.dataFrame!.filter.trueCount, 3);\n expect(filter.dataFrame!.filter.get(0), true);\n expect(filter.dataFrame!.filter.get(3), true);\n expect(filter.dataFrame!.filter.get(8), true);\n expect(filter.dataFrame!.filter.get(1), false);\n });\n\n test('separator', async () => {\n const msa = await readDataframe('tests/filter_MSA.csv');\n const filter = new BioSubstructureFilter();\n await grok.data.detectSemanticTypes(msa);\n filter.attach(msa);\n filter.bioFilter!.substructure = 'meI';\n await delay(100);\n expect(filter.dataFrame!.filter.trueCount, 7);\n expect(filter.dataFrame!.filter.get(2), false);\n filter.bioFilter!.substructure = '/meI';\n await delay(100);\n expect(filter.dataFrame!.filter.trueCount, 0);\n filter.bioFilter!.substructure = 'meI-hHis';\n (filter.bioFilter! as SeparatorFilter).separatorInput.value = '-';\n await delay(100);\n expect(filter.dataFrame!.filter.trueCount, 7);\n expect(filter.dataFrame!.filter.get(2), false);\n });\n\n test('helm', async () => {\n const helm = await readDataframe('tests/filter_HELM.csv');\n const helmTableView = grok.shell.addTableView(helm);\n const filter = new BioSubstructureFilter();\n await grok.data.detectSemanticTypes(helm);\n filter.attach(helm);\n\n const helmFilterChanged = new Promise((resolve, reject) => {\n helm.onFilterChanged.subscribe(async (_: any) => {\n try {\n resolve(true);\n } catch (error) {\n reject(error);\n }\n });\n });\n (filter.bioFilter! as HelmFilter).helmSubstructure = 'PEPTIDE1{C}$$$$V2.0';\n filter.bioFilter!.onChanged.next();\n await helmFilterChanged;\n\n //await delay(3000);\n expect(filter.dataFrame!.filter.trueCount, 2);\n expect(filter.dataFrame!.filter.get(0), true);\n expect(filter.dataFrame!.filter.get(3), true);\n (filter.bioFilter! as HelmFilter).helmSubstructure = 'PEPTIDE1{A.C}$$$$V2.0';\n filter.bioFilter!.onChanged.next();\n await delay(100);\n expect(filter.dataFrame!.filter.trueCount, 1);\n expect(filter.dataFrame!.filter.get(3), true);\n helmTableView.close();\n }, {skipReason: 'GROK-12779'});\n});\n","import * as DG from 'datagrok-api/dg';\n\nimport {category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {runPepsea} from '../utils/pepsea';\n\ncategory('PepSeA', () => {\n const testCsv = `HELM,MSA\n \"PEPTIDE1{F.L.R.G.W.[MeF].Y.S.N.N.C}$$$$\",\"F.L.R.G.W.MeF.Y..S.N.N.C\"\n \"PEPTIDE1{F.L.R.G.Y.[MeF].Y.W.N.C}$$$$\",\"F.L.R.G.Y.MeF.Y.W...N.C\"\n \"PEPTIDE1{F.G.Y.[MeF].Y.W.S.D.N.C}$$$$\",\"F...G.Y.MeF.Y.W.S.D.N.C\"\n \"PEPTIDE1{F.L.R.G.Y.[MeF].Y.W.S.N.D.C}$$$$\",\"F.L.R.G.Y.MeF.Y.W.S.N.D.C\"\n \"PEPTIDE1{F.V.R.G.Y.[MeF].Y.W.S.N.C}$$$$\",\"F.V.R.G.Y.MeF.Y.W.S..N.C\"`;\n\n test('Basic alignment', async () => {\n const table = DG.DataFrame.fromCsv(testCsv);\n const alignedCol = await runPepsea(table.getCol('HELM'), 'msa(HELM)');\n const alignedTestCol = table.getCol('MSA');\n for (let i = 0; i < alignedCol.length; ++i)\n expect(alignedCol.get(i) == alignedTestCol.get(i), true);\n }, {skipReason: 'GROK-12764'});\n});\n","import * as DG from 'datagrok-api/dg';\n// import * as grok from 'datagrok-api/grok';\n//import * as ui from 'datagrok-api/ui';\n\nimport {category, test, testViewer} from '@datagrok-libraries/utils/src/test';\nimport {readDataframe} from './utils';\n\n\ncategory('viewers', () => {\n const viewers = DG.Func.find({package: 'Bio', tags: ['viewer']}).map((f) => f.friendlyName);\n for (const v of viewers) {\n test(v, async () => {\n await testViewer(v, await readDataframe('data/sample_FASTA_DNA.csv'), true);\n });\n }\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {delay, expect} from '@datagrok-libraries/utils/src/test';\nimport {activityCliffs} from '../package';\n\nexport async function _testActivityCliffsOpen(df: DG.DataFrame, numberCliffs: number, method: string, colName: string) {\n await grok.data.detectSemanticTypes(df);\n const scatterPlot = await activityCliffs(\n df, df.getCol(colName), df.getCol('Activity'),\n 50, method);\n // const scatterPlot = (await grok.functions.call('Bio:activityCliffs', {\n // table: df, molecules: df.getCol(colName), activities: df.getCol('Activity'),\n // similarity: 50, methodName: method\n // })) as DG.Viewer | undefined;\n\n // test scatter plot without activityCliffs passed\n // const scatterPlot = (await df.plot.fromType(DG.VIEWER.SCATTER_PLOT, {})) as DG.Viewer;\n // const libHelper: IMonomerLibHelper = (await grok.functions.call('Bio:getMonomerLibHelper'));\n // const k = 11;\n\n expect(scatterPlot != null, true);\n\n const cliffsLink = Array.from(scatterPlot!.root.children).find((el) => {\n const classList: string[] = el.className.split(' ');\n return ['ui-btn', 'ui-btn-ok'].every((reqClassName) => classList.includes(reqClassName));\n });\n expect((cliffsLink as HTMLElement).innerText.toLowerCase(), `${numberCliffs} cliffs`);\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 {after, before, category, test} from '@datagrok-libraries/utils/src/test';\n\nimport {readDataframe} from './utils';\nimport {_testActivityCliffsOpen} from './activity-cliffs-utils';\n\n\ncategory('activityCliffs', async () => {\n let actCliffsTableView: DG.TableView;\n let actCliffsDf: DG.DataFrame;\n let actCliffsTableViewWithEmptyRows: DG.TableView;\n let actCliffsDfWithEmptyRows: DG.DataFrame;\n\n let viewList: DG.ViewBase[] = [];\n let dfList: DG.DataFrame[] = [];\n\n before(async () => {\n viewList = [];\n dfList = [];\n });\n\n after(async () => {\n // for (const df of dfList) grok.shell.closeTable(df);\n // for (const view of viewList) view.close();\n });\n\n test('activityCliffsOpens', async () => {\n actCliffsDf = await readDataframe('tests/sample_MSA_data.csv');\n dfList.push(actCliffsDf);\n actCliffsTableView = grok.shell.addTableView(actCliffsDf);\n viewList.push(actCliffsTableView);\n\n await _testActivityCliffsOpen(actCliffsDf, 57, 'UMAP', 'MSA');\n }, {skipReason: 'GROK-12774'});\n\n test('activityCliffsWithEmptyRows', async () => {\n actCliffsDfWithEmptyRows = await readDataframe('tests/sample_MSA_data_empty_vals.csv');\n dfList.push(actCliffsDfWithEmptyRows);\n actCliffsTableViewWithEmptyRows = grok.shell.addTableView(actCliffsDfWithEmptyRows);\n viewList.push(actCliffsTableViewWithEmptyRows);\n\n await _testActivityCliffsOpen(actCliffsDfWithEmptyRows, 57, 'UMAP', 'MSA');\n }, {skipReason: 'GROK-12774'});\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport {expect} from '@datagrok-libraries/utils/src/test';\nimport {sequenceSpaceTopMenu} from '../package';\n\nexport async function _testSequenceSpaceReturnsResult(df: DG.DataFrame, algorithm: string, colName: string) {\n // await grok.data.detectSemanticTypes(df);\n const col: DG.Column = df.getCol(colName);\n const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: col});\n if (semType)\n col.semType = semType;\n\n const sp = await sequenceSpaceTopMenu(df, df.col(colName)!, algorithm, 'Levenshtein', true);\n expect(sp != null, true);\n}","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, test, expect, delay} from '@datagrok-libraries/utils/src/test';\nimport {readDataframe} from './utils';\nimport {_testSequenceSpaceReturnsResult} from './sequence-space-utils';\n\ncategory('sequenceSpace', async () => {\n let testFastaDf: DG.DataFrame;\n let testFastaTableView: DG.TableView;\n let testHelmWithEmptyRows: DG.DataFrame;\n let testHelmWithEmptyRowsTableView: DG.TableView;\n\n test('sequenceSpaceOpens', async () => {\n testFastaDf = await readDataframe('tests/sample_MSA_data.csv');\n testFastaTableView = grok.shell.addTableView(testFastaDf);\n await _testSequenceSpaceReturnsResult(testFastaDf, 'UMAP', 'MSA');\n grok.shell.closeTable(testFastaDf);\n testFastaTableView.close();\n }, {skipReason: 'GROK-12775'});\n\n test('sequenceSpaceWithEmptyRows', async () => {\n testHelmWithEmptyRows = await readDataframe('tests/sample_MSA_data_empty_vals.csv');\n testHelmWithEmptyRowsTableView = grok.shell.addTableView(testHelmWithEmptyRows);\n await _testSequenceSpaceReturnsResult(testHelmWithEmptyRows, 'UMAP', 'MSA');\n grok.shell.closeTable(testHelmWithEmptyRows);\n testHelmWithEmptyRowsTableView.close();\n }, {skipReason: 'GROK-12775'});\n});\n","import * as DG from 'datagrok-api/dg';\n\nimport {runTests, TestContext, tests} from '@datagrok-libraries/utils/src/test';\n\nimport './tests/_first-tests';\nimport './tests/Palettes-test';\nimport './tests/detectors-tests';\nimport './tests/detectors-weak-and-likely-tests';\nimport './tests/detectors-benchmark-tests';\nimport './tests/msa-tests';\nimport './tests/splitters-test';\nimport './tests/monomer-libraries-tests';\nimport './tests/renderers-test';\nimport './tests/converters-test';\nimport './tests/fasta-handler-test';\nimport './tests/fasta-export-tests';\nimport './tests/bio-tests';\nimport './tests/WebLogo-positions-test';\nimport './tests/checkInputColumn-tests';\nimport './tests/similarity-diversity-tests';\nimport './tests/substructure-filters-tests';\nimport './tests/pepsea-tests';\nimport './tests/viewers';\n\n// Tests hanging github CI\nimport './tests/activity-cliffs-tests';\nimport './tests/sequence-space-test';\n\n\nexport const _package = new DG.Package();\nexport {tests};\n\n/** For the 'test' function argument names are fixed as 'category' and 'test' because of way it is called. */\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 const data = await runTests({category, test, testContext});\n return DG.DataFrame.fromObjects(data)!;\n}\n"],"names":["AminoacidsPalettes","Lesk","this","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","get","m","resM","aaSynonyms","super","Aminoacids","static","scheme","Error","c","isInner","inner","outer","char","isNaN","parseInt","monomer","_a","_b","_c","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","length","slice","amino","toUpperCase","undefinedColor","substring","AAFullNames","toLowerCase","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","expectedMonomerData","createJsonMonomerLibFromSdf","table","resultLib","i","rowCount","Object","keys","forEach","key","monomerSymbol","rgroups","split","jsonRgroups","g","rgroup","altAtom","lastIndexOf","radicalNum","match","push","getMonomerLibHelper","funcList","package","name","prepare","call","getOutputParamValue","NucleotidesPalettes","Chromatogram","chromatogram","Nucleotides","SeqPaletteBase","dt","simplified","PaletteType","palette","cp","objList","colour","obj","ind","colourPalette","constructor","_palette","StringUtils","s","hash","charCodeAt","UnknownSeqPalette","GrayAllPalette","UnknownColorPalette","concat","values","pI","hashCode","color","dgColor","r","b","distToBlack","Math","sqrt","pow","correctColor","buildPalette","UnknownSeqPalettes","Gray","gray","Color","SDF_MONOMER_NAME","jsonSdfMonomerLibDict","FastaFileHandler","descriptionsArray","_descriptionsArray","sequencesArray","_sequencesArray","parseMacromolecule","startOfSequence","endOfSequence","_fileContent","join","parseColumns","regex","exec","description","index","lastIndex","importFasta","descriptionsArrayCol","sequenceCol","semType","fileContent","getStats","seqCol","minLength","splitter","freq","sameLength","firstLength","seq","categories","mSeq","monomerRe","splitterAsFasta","toString","matchAll","map","ma","mRes","toArray","helmRe","helmPp1Re","splitterAsHelm","ea","inSeq","mm","pp1M","getSplitter","units","separator","limit","undefined","startsWith","getSplitterWithSeparator","getSplitterForColumn","col","getTag","longMonomerPartRe","monomerToShort","maxLengthOfMonomer","shortAminoMatch","needAddDots","shortAmino","getAlphabet","alphabet","getAlphabetSimilarity","gapSymbol","Set","delete","freqA","alphabetA","has","freqV","alphabetV","detectAlphabet","stats","alphabetCandidates","alphabetCandidatesSim","maxCos","max","indexOf","pickUpPalette","getPaletteByType","paletteType","pickUpSeqCol","df","semTypeColList","columns","bySemTypeAll","resCol","find","NotationConverter","_splitter","column","toFasta","targetNotation","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","defaultGapSymbol","newColumn","getNewColumn","init","idx","fastaPolymer","fastaMonomersArray","setTag","getHelmWrappers","prefix","isDna","isRna","isPeptide","convertToHelmHelper","sourcePolymer","sourceGapSymbol","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","replace","convertHelm","aligned","convertHelmToSeparator","convert","notation","isFasta","isSeparator","isHelm","UnitsHandler","_units","_column","_notation","_defaultGapSymbol","getAlphabetSize","alphabetSizeStr","alphabetSize","console","warn","getAlphabetIsMultichar","isMsa","includes","getNotation","len","newColName","dataFrame","getUnusedName","Array","fill","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","templateCol","some","p","unitsStringIsValid","tags","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","PeptideFastaAlphabet","DnaFastaAlphabet","RnaFastaAlphabet","PositionHeight","positionSeparator","TAGS","randomFloat","range","random","randomInt","floor","tests","autoTestsCatName","wasRegistered","currentCategory","assure","notNull","TestContext","catchUnhandled","report","Test","category","test","options","timeout","expect","actual","expected","error","expectFloat","tolerance","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","NaN","areEqual","abs","expectObject","expectedKey","expectedValue","entries","hasOwnProperty","actualValue","expectArray","isFinite","actualLength","expectedLength","before","after","addNamespace","f","RegExp","nqName","runTests","_d","_e","package_","func","packageId","module","moduleTests","moduleAutoTests","packFunctions","list","isArray","initAutoTests","id","results","log","testContext","x","beforeStatus","t","res","execTest","data","all","filter","d","afterStatus","success","ms","skipped","delay","logger","successful","failed","params","assign","predicate","skip","skipReason","start","Date","stop","setTimeout","awaitCheck","checkHandler","wait","clearInterval","interval","setInterval","testViewer","v","detectSemanticTypes","tv","viewerName","selector","viewer","addViewer","document","querySelector","from","viewers","row","cells","rows","select","set","currentRowIdx","props","getOptions","look","newProps","k","setOptions","layout","saveLayout","oldProps","resetLayout","loadLayout","type","JSON","stringify","close","errorToConsole","err","String","stack","message","Vector","Float32Array","assert","condition","initCoordinates","dimension1","dimension2","vectorAdd","q","multiplier","nItems","total","vectorLength","sqrSum","vectorDotProduct","v1","v2","prod","fillRandomMatrix","scale","matrix","j","calculateEuclideanDistance","sqdiffSumm","itemsSum","vectorSquare","calcDistanceMatrix","distance","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","iter","perplexity","getopt","dim","epsilon","field","defaultval","gaussRandom","u","randn","mu","std","zeros","n","ArrayBuffer","arr","Float64Array","randn2d","uses","xhere","L2","x1","x2","D","x1i","x2i","xtod","X","N","dist","d2p","tol","nf","hTarget","prow","betamin","betamax","Infinity","beta","maxtries","num","psum","pj","exp","nHere","pOut","N2","sign","initDataRaw","dists","initSolution","initDataDist","Y","gains","ystep","getSolution","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","___CSS_LOADER_EXPORT___","cssWithMappingToString","content","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","sourceMapping","__esModule","digestLength","blockSize","K","Uint32Array","hashBlocks","w","pos","a","h","t1","t2","Hash","state","Int32Array","temp","buffer","Uint8Array","bufferLength","bytesHashed","finished","reset","prototype","clean","update","dataLength","dataPos","finish","out","left","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","HMAC","pad","istate","ostate","hmac","fillBuffer","info","counter","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","pbkdf2","password","iterations","dkLen","prf","ctr","dk","factory","sha256","str1","str2","jaroDist","caseSensitive","len1","len2","window","str1Hash","str2Hash","min","point","charAt","jaro","minIndex","isAnyArray","object","endsWith","errorCalculation","parameters","parameterizedFunction","y","rescale","input","output","arguments","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","maxI","maxJ","loop","line","formatNumber","inspectData","formatNumber2","padEnd","str","fix","toFixed","toExponential","checkRowIndex","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","maxIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","resultat","blockMult","halfRows","halfCols","subMatrix","add","sub","scaleRows","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log1p","log10","log2","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","count","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","ks","cs","sn","sp","spm1","epm1","sk","ek","shift","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","ii","leftSingularVectors","diagonalMatrix","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","ans","param","auxParams","funcParam","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","levenbergMarquardt","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterValues","parameterError","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","domAPI","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","HTMLIFrameElement","contentDocument","head","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","V2000_ATOM_NAME_POS","getMonomericMols","mcol","pattern","monomersDict","molV3000Array","Map","monomers","getHelmMonomers","it","mols","dict","molsArray","curPos","endPos","molV3000","mol","atomMonomerCounts","bondMonomerCounts","atomRowI","monomerName","bondRowI","firstMonomer","trim","secondMonomer","changeV2000ToV3000","molV3000FromNonHelmSequence","monomerToShortFunction","DrawStyle","transparencyRate","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","cell","currentMonomer","textSize","measureText","maxColorTextSize","width","colorTextSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","dx","processSequence","subParts","text","gap","cellType","defaultHeight","defaultWidth","onClick","grid","invalidate","onMouseMove","colTemp","maxLengthWordsSum","argsX","offsetX","gridColumn","bounds","right","mid","splitterFunc","ui","tooltip","hide","render","cellStyle","gridRow","getUpdatedWidth","save","beginPath","rect","clip","font","textBaseline","DG","UNITS","splitLimit","tempReferenceSequence","tempCurrentWord","maxLengthWords","samples","maxLengthWordSum","printLeftOrCentered","restore","C","SEM_TYPES","MONOMER","_cellStyle","MACROMOLECULE_DIFFERENCE","tableColumn","s1","s2","drawMoleculeDifferenceOnCanvas","subParts1","subParts2","fullStringLength","molDifferences","sequences","numIdenticalStart","numIdenticalEnd","longerSeq","shorterSeq","lengthDiff","emptyMonomersArray","concatWithEmptyVals","subparts","fillShorterSequence","textSize1","textSize2","textWidth","canvas","updatedX","updatedY","amino1","amino2","color1","color2","subX0","subX1","context","getContext","width1","width2","height","VdRegionType","viewed","regionsFg","regionsRoot","isOpened","panelNode","regions","viewPromise","host","filterSourceInput","mainLayout","logos","viewSubs","regionTypes","stringList","vrt","CDR","choices","Unknown","chains","skipEmptyPositions","bool","positionWidth","float","positionHeight","string","Entropy","subs","onSizeChanged","root","subscribe","rootOnSizeChanged","bind","rxjs","fromEvent","rootOnMouseMove","onTableAttached","superOnTableAttached","buildView","onPropertyChanged","property","setData","mlbDf","debug","destroyView","detach","superDetach","purpose","empty","unsubscribe","regionsFiltered","orderList","order","orderI","regionChains","chain","region","plot","fromType","sequenceColumnName","startPositionName","positionStartName","endPositionName","positionEndName","fixWidth","transform","marginTop","marginLeft","wl","marginBottom","className","boolInput","filterSourceInputOnValueChanged","position","top","overflowX","calcSize","logoHeight","clientHeight","maxHeight","wlDict","chainI","args","filterSource","FilterSources","Selected","Filtered","wlPROPS","sequenceSpaceByFingerprints","spaceParams","version","methodName","similarityMetric","xAxis","embedAxesNames","yAxis","getEmbeddingColsNames","axes","colNameInd","names","getDistanceFromSimilarity","similarity","removeEmptyStringRows","emptyRawInd","val","rawData","getRawData","emptyRawsIndexes","removedRowsCounter","removeAt","filterCliffsSubj","Subject","nonNormalizedDistances","LINES_DF_ACT_DIFF_COL_NAME","LINES_DF_SALI_COL_NAME","LINES_DF_SIM_COL_NAME","LINES_DF_LINE_IND_COL_NAME","LINES_DF_MOL_COLS_NAMES","CLIFFS_FILTER_APPLIED","createCliffsOnlyFilter","colName","raw","checkCursorOnLine","event","lines","getBoundingClientRect","clientX","clientY","closestLine","minDist","hypot","peq","VectorMetricsNames","BitArrayMetricsNames","StringMetricsNames","vectorDistanceMetricsMethods","Euclidean","stringDistanceMetricsMethods","Levenshtein","lst","pv","mv","sc","eq","xv","myers_32","mhc","phc","hsize","vsize","vlen","pb","mb","xh","ph","mh","score","myers_x","JaroWinkler","Manhattan","bitArrayDistanceMetricsMethods","Tanimoto","trueCount","common","andWithCountBits","tanimotoSimilarity","Dice","diceSimilarity","Asymmetric","asymmetricSimilarity","BraunBlanquet","braunBlanquetSimilarity","Cosine","cosineSimilarity","Kulczynski","totalProd","kulczynskiSimilarity","McConnaughey","mcConnaugheySimilarity","RogotGoldberg","countBits","diff","rogotGoldbergSimilarity","Russel","russelSimilarity","Sokal","sokalSimilarity","Hamming","AvailableMetricsTypes","BitArray","reduce","ret","getChemSimilaritiesMatrix","simArr","fpDf","addNewString","createTooltipElement","tooltipElement","columnNames","activityCol","fontWeight","display","justifyContent","append","molIdx","activity","paddingLeft","createPropPanelElement","propPanel","activitiesArray","overflow","diffsPanel","borderBottom","createPropPanelField","sali","paddingRight","paddingTop","createLinesGrid","colNames","seqDiffCol","visible","metricsProperties","fingerprintChoices","initialized","fingerprint","int","distanceMetric","CHEM_SIMILARITY_METRICS","moleculeColumnName","debounce","onRowsRemoved","_","compute","onCurrentRowChanged","onChanged","moleculeColumn","bySemType","SEMTYPE","MACROMOLECULE","getProperty","fromOptions","computeData","beforeRender","grok","shell","SPEBase","_f","_g","steps","cycles","cutoff","lambda","dlambda","lambda2","dlambda2","distanceFunction","initDistance","vectors","calcDistance","index1","index2","coordinates","dimension","cycle","rowi","rowj","diffIJ","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","assureGoez","argName","assureInRange","src","dst","copyFrom","lengthInInts","incrementVersion","notify","versionedName","self","setLength","nIntsNeeded","set1","set2","flag","setBit","fromSeq","bytes","num1","num2","equals","getBit","bitArray","setAll","invert","flags","setIndexes","indexes","clear","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","fromValues","getRangeAsList","setRange","end","setTrue","setFalse","setRandom","andNot","notAnd","insertAt","oldlength","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","falseCount","_onBitCount","remainingBits","countWhere","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","Int8Array","checkInputColumnUi","allowedNotations","allowedAlphabets","msg","checkInputColumn","uh","activityCliffs","macroMolecule","activities","axesNames","encodedCol","scatterTitle","seqSpaceFunc","simMatrixFunc","tooltipFunc","propertyPanelFunc","linesGridFunc","seqSpaceOptions","similarityLimit","dimensionalityReduceCol","zoom","ignoreSelectionChange","cashedLinesData","acc","timer","withoutEmptyValues","emptyValsIdxs","seqSpaceParams","coordsWithInsertedEmptyVals","listValues","toList","getEmbeddingColsWithInsertedEmptyVals","countFromDistance","cats","newCol","dfSeq","distances","similarityArr","getSimilaritiesFromDistances","createSimilaritiesMatrix","cliffsMetrics","simVals","saliVals","n1","n2","cliffsMolIds","sim","getActivityCliffsMetrics","saliCount","getSaliCountCol","cliffCol","ids","colname","getCliffsBooleanCol","saliMinMax","saliValsWithoutInfinity","saliMin","getSaliMinMax","saliOpacityCoef","view","byName","xColumnName","yColumnName","showXSelector","showYSelector","showSizeSelector","showColorSelector","markerMinSize","markerMaxSize","title","getInfo","linesRes","selected","linesDf","tag","setTags","addNewFloat","addNewInt","createLines","linesDfGrid","listCliffsLink","dockManager","dock","classList","filterCliffsButton","enabled","viewerClosedSub","onCurrentCellChanged","currentMolIdx","currentCol","cashedData","propPanelFunc","panel","getPane","panelElement","updatePropertyPanel","getSortedOrder","sortByColumns","sortTypes","scrollToCell","onSelectionChanged","mouseOverRowIdx","addEventListener","clearTimeout","ctrlKey","onEvent","ctx","pointFrom","worldToScreen","pointTo","Path2D","moveTo","opacity","strokeStyle","lineWidth","lineTo","stroke","renderLines","currentLine","zoomLeft","zoomRight","zoomTop","zoomBottom","W0","H0","y1","y2","W1","H1","scaleW","scaleH","W2","H2","getZoomCoordinates","viewport","addProperty","accIcon","addTitle","addPane","createPopertyPanel","getActivityCliffs","sequenceSpaceTopMenu","plotEmbeddings","embedColsNames","chemSpaceParams","embeddings","scatterPlot","multipleSequenceAlignmentAny","performAlignment","methodInput","pepsea","setTooltip","gapOpenInput","gapExtendInput","inputRootStyles","colInput","potentialCol","unusedName","inputRootStyle","clustersColInput","fireChanged","nullable","msaCol","onOK","show","splitToMonomers","tempDf","sequenceColumn","createCol","positionCol","resultDf","columnList","sequence","positionIndex","splitAlignedSequences","originalDf","tempCol","linearSubstructureSearch","substructure","re","startsWithSep","endsWithSep","substrWithoutSep","prepareSubstructureRegex","resultArray","macromolecule","helmSubstructureSearch","invalidateMols","substructureCol","substructureMolsCol","molStringsColumn","molString","molBlockFailover","progressBar","monomericMolsCol","COLUMNS_NAMES","FLAGS","PEPSEA","$","convertDo","srcCol","LIB_STORAGE_NAME","LIB_DEFAULT","MonomerLib","_monomers","_onChanged","getMonomer","monomerType","getTypes","getMonomerMolsByType","molfile","getMonomerNamesByType","_updateInt","lib","typesNew","types","updateLibs","libList","reload","MonomerLibHelper","_monomerLib","loadLibrariesPromise","getBioLib","loadLibraries","userLibrariesSettings","libs","libFileName","readLibrary","path","fileName","file","dfSdf","fileSource","readAsBytes","readAsText","parse","monomerAdd","prop","instance","_instance","H","S","canHandle","serialize","port1","port2","MessageChannel","R","deserialize","isError","Z","argumentList","z","catch","o","postMessage","removeEventListener","Proxy","G","W","construct","J","WeakMap","L","Blob","atob","URL","webkitURL","createObjectURL","Worker","revokeObjectURL","urlCDN","urlCDNStg","dirShared","dirMounted","dirData","printInterleaved","env","B","_parseTool","tools","config","async","onmessage","tool","program","SideChainScales","scales","AlignedSequenceEncoder","aa2num","getScale","num2aa","termina","_dropDefises","_truncateSequence","encode","encodeLettter","letter","decode","code","fastaInputFilename","fastaOutputFilename","_stringsToFasta","runKalign","isAligned","unUsedName","clustersCol","sequencesLength","convertTo","compact","clustersColCategories","clustersColData","fastaSequences","clusterIndexes","rowIdx","clusterCategoryIdx","CLI","reinit","tgtCol","clusterIdx","fasta","fs","writeFile","buf","cat","clusterRowIds","clusterRowIdIdx","srcUnits","tgtAligned","pepseaMethods","alignmentObjectMetaKeys","runPepsea","method","gapOpen","gapExtend","peptideCount","clusters","bodies","cluster","clusterId","helmSeq","ID","pepseaContainer","alignedSequences","body","alignments","requestAlignedObjects","Alignment","alignment","alignedSequencesCol","dockerfileId","headers","response","request","FASTA_LINE_WIDTH","saveAsFastaDo","idColList","lineSeparator","fastaLines","rowI","seqId","seqLineList","wrapSequence","seqMonomerList","seqPos","seqLength","seqLine","seqLineTxt","getMacromoleculeColumn","updateDivInnerHTML","innerHTML","VerticalAlignments","HorizontalAlignments","PositionMarginStates","PROPS_CATS","PROPS","HTMLCanvasElement","getCursorPosition","bottom","PositionMonomerInfo","PositionInfo","sumForHeightCalc","WebLogoViewer","Length","positions","startPosition","endPosition","positionWidthWithMargin","_positionWidth","positionMarginValue","positionMarginState","unitsHandler","positionMargin","countOfRenderPositions","devicePixelRatio","canvasWidthWithRatio","firstVisibleIndex","slider","viewerId","axisHeight","rowsMasked","rowsNull","visibleSlider","allowResize","turnOfResizeForOneSetValue","backgroundColor","positionNames","viewerCount","DATA","skipEmptySequences","shrinkEmptyTail","STYLE","verticalAlignment","MIDDLE","LAYOUT","horizontalAlignment","CENTER","fitArea","minHeight","AUTO","defaultValueForPositionMargin","BEHAVIOR","helpUrl","msgHost","zIndex","onValuesChanged","sliderOnValuesChanged","alignItems","setProperty","canvasOnMouseMove","canvasOnMouseDown","canvasOnWheel","_calculate","updateSlider","updateSeqCol","updatePositions","getSelectedIndexes","maxLength","positionNamesTxt","jPos","widthArea","heightArea","xScale","clientWidth","yScale","checkIsHideSlider","showSliderWithFitArea","minScale","setSliderVisibility","diffEndScrollAndSliderMin","newMin","newMax","setValues","dataFrameTxt","dataFrameFilterOnChanged","dataFrameSelectionOnChanged","calculatedX","_nullSequence","fillerResidue","removeWhere","updateIterator","deleteIterator","_removeEmptyPositions","posCount","posName","seqM","pmInfo","pn","absoluteMaxHeight","alphabetSizeLog","entry","recalc","innerText","resetTransform","fillRect","maxCountOfRowsRendered","lastVisibleIndex","positionFontSize","posNameMaxWidth","hScale","setTransform","monomerTxt","mTm","canvasHeight","sliderHeight","hostTopMargin","hostLeftMargin","countOfPositions","calculatedWidth","errMsg","dpr","cursorP","atPI","monomerAtPosSeqCount","countForMonomerAtPosition","tooltipEl","selBS","at","checkSeqForMonomerAtPos","countOfScrollPositions","deltaY","scrollBy","take","seqMList","seqMPos","residuesSet","operators","BioSubstructureFilter","calculating","loader","filterSummary","bioFilter","isFiltering","isReadyToApplyFilter","bitset","_debounceTime","attach","columnName","FastaFilter","SeparatorFilter","HelmFilter","filterPanel","onBioFilterChangedSubs","onChangedEvent","pipe","debounceTime","_onInputChanged","applyFilter","isDetached","saveState","bioSubstructure","applyState","that","filters","substrucrureSearch","requestFilter","BioFilterBase","HTMLElement","substructureInput","placeholder","colSeparator","separatorInput","replaceAll","_filterPanel","cursor","helmSubstructure","helmEditor","updateFilterPanel","editorDiv","webEditor","createWebEditor","showHeader","showFooter","helmString","getHelm","modal","fullScreen","editor","setHelm","parentElement","resizeEditor","editDiv","__importStar","utils","makeHeap","nPoints","makeArrays","fillValue","filled","heap","heapPush","weight","weights","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","temp1","temp2","rejectionSample","nSamples","poolSize","rejectSample","tauRandInt","broken","buildCandidates","currentGraph","nVertices","nNeighbors","maxCandidates","candidateNeighbors","isn","tauRand","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","smallestFlagged","resultIndex","umap_1","UMAP","__read","iterator","ar","__values","SparseMatrix","dims","nCols","checkDims","makeKey","getAll","ordered","rowColValues","getDims","getRows","getCols","getValues","fn","vals","_this","pairwiseMultiply","elementWise","maximum","multiplyScalar","scalar","eliminateZeros","zeroIndices","removeByZeroIndex","nextValues","nextRows","nextCols","normalize","normType","e_1","normFn","normFns","colsByRow","nextMatrix","_loop_1","e_1_1","return","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","tree","makeNNDescent","distanceFn","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","makeInitializations","initFromRandom","queryPoints","_heap","initFromTree","_tree","searchFlatTree","makeInitializedNNSearch","graph","initialization","tried","vertex","candidates","candidates_1","candidates_1_1","candidate","initializeSearch","forest","e_2","forest_1","forest_1_1","e_2_1","__spread","FlatTree","hyperplanes","offsets","children","makeEuclideanTree","leafSize","splitResults","leftIndex","rightIndex","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","hyperplane","offset","euclideanRandomProjectionSplit","isLeaf","recursiveFlatten","nodeNum","leafNum","oldNodeNum","numNodes","numLeaves","selectSide","makeForest","nTrees","makeTree","nNodes","nLeaves","flattenTree","makeLeafArray","rpForest","rpForest_1","rpForest_1_1","node","__generator","label","sent","trys","ops","verb","pop","__importDefault","nnDescent","ml_levenberg_marquardt_1","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","learningRate","localConnectivity","nComponents","nEpochs","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","euclidean","isInitialized","embedding","optimizationState","OptimizationState","setParam","fit","initializeFit","optimizeLayout","fitAsync","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","knnIndices","knnDistances","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","searchGraph","makeSearchGraph","processGraphForSupervisedProjection","initializeSimplicialSetEmbedding","tail","epochsPerSample","initializeOptimization","prepareForOptimizationLoop","search","knn","neighbor","toTransform","adjustedLocalConnectivity","smoothKNNDistance","sigmas","rhos","computeMembershipStrengths","normed","csrMatrix","initTransform","reshape2d","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","sparseMatrix","prodMatrix","simplicialSet","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","ithDistances","nonZeroDists","interpolation","meanIthDistances","meanDistances","graphValues","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","findABParams","current","distSquared","rDist","gradCoeff","gradD","nNegSamples","k_1","other_1","distSquared_1","gradCoeff_1","epochCallback","epochCompleted","shouldStop","isFinished","cosine","normX","normY","clipValue","linear","yv","default","vec","vec_1","vec_1_1","ones","max2d","wu","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","definition","globalThis","Function","toStringTag","nc","cpChromatogram","_testPaletteN","cpLest","cpRasMol","cpGrokGroups","_testPaletteAA","colorMeNle","colorMeA","colorMeG","colorMeF","colorL","colorA","colorG","colorF","_testNeg","readDf","getCol","_testPos","alphabetIsMultichar","csvData","_samplesDfs","readSamples","readFile","readFileCsv","csv","readCsv","_testDf","PosCol","posCols","errList","detectFunc","detectMacromoleculeBenchmark","maxET","seqMerger","buildSeq","seqList","generate","now","tgt","checkDetectorRes","resET","benchmark","funcCall","callSync","inputs","testDetector","_testMsaIsCorrect","srcCsv","tgtCsv","srcDf","tgtDf","_testHelmSplitter","tvList","dfList","_testFastaSplitter","expectedMonomerList","helmCol","missed","unexpected","msgs","monomerLibHelper","currentMonomerLib","generateManySequences","generateLongSequence","longSequence","performanceTest","generateFunc","testName","startTime","elapsedTime","resCellRenderer","_rendererMacromoleculeFasta","_rendererMacromoleculeSeparator","_rendererMacromoleculeDifference","fastaTxt","srcSeqCol","_testAfterMsa","_testAfterConvert","renderer","_selectRendererBySemType","tgtCellRenderer","_setRendererManually","Samples","_csvTxts","fastaPt","separatorPt","helmPt","fastaDna","separatorDna","helmDna","fastaRna","separatorRna","helmRna","fastaGaps","separatorGaps","helmGaps","fastaUn","separatorUn","helmUn","helmLoneDeoxyribose","helmLoneRibose","helmLonePhosphorus","converter","_testConvert","srcKey","tgtKey","descriptionCol","sequencesCol","_testColumnsParser","inputFasta","ffh","parsedDescriptionsArray","parsedSequencesArray","WrapDataTest","wrapData","single","multi","SaveAsFastaTests","saveAsFastaData","test1","idCols","tgtFasta","test2","_testWrapSequence","testKey","srcSeq","wrapRes","wrapTgt","_testSaveAsFasta","fastaRes","csvDfN1","_testGetStats","_testGetAlphabetSimilarity","_testPickupPaletteN1","csvDfN1e","_testPickupPaletteN1e","csvDfAA1","_testPickupPaletteAA1","csvDfX","_testPickupPaletteX","expectPositionInfo","actualPos","expectedPos","csvDf1","wlViewer","resAllDf1","resPosList","tgtPosList","posI","buildDfWithSeqCol","atPI1","countAt1","readDataframe","tableName","loadFileAsText","createTableView","viewList","getSearchViewer","waitForCompute","computeCompleted","molecules","similaritySearchViewer","molCol","scores","idxs","waiter","targetMoleculeIdx","_testSimilaritySearchViewer","diversitySearchviewer","renderMolIds","_testDiversitySearchViewer","msa","helm","helmTableView","helmFilterChanged","onFilterChanged","alignedCol","alignedTestCol","friendlyName","_testActivityCliffsOpen","numberCliffs","cliffsLink","el","reqClassName","actCliffsTableView","actCliffsDf","actCliffsTableViewWithEmptyRows","actCliffsDfWithEmptyRows","_testSequenceSpaceReturnsResult","algorithm","testFastaDf","testFastaTableView","testHelmWithEmptyRows","testHelmWithEmptyRowsTableView"],"sourceRoot":""}