@datagrok/peptides 1.17.21 → 1.17.22

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","mappings":"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G,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,IAEjDnD,EAASuG,YAAc/R,UAAU2O,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,IAEjDnD,EAASyG,WAAajS,UAAU2O,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,EA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","sources":["webpack://peptides/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-works.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/seq-handler.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/splitter.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/viewers/web-logo.js","webpack://peptides/./node_modules/@datagrok-libraries/math/src/dbscan/wasm/wasmDbscan.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/dataframe-utils.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://peptides/./node_modules/cash-dom/dist/cash.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/u2.css","webpack://peptides/./src/styles.css","webpack://peptides/./node_modules/css-loader/dist/runtime/api.js","webpack://peptides/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://peptides/./node_modules/fast-sha256/sha256.js","webpack://peptides/./node_modules/fastest-levenshtein/esm/mod.js","webpack://peptides/./node_modules/jstat/dist/jstat.js","webpack://peptides/./src/styles.css?44b2","webpack://peptides/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://peptides/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://peptides/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://peptides/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://peptides/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://peptides/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/scoring.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types.js","webpack://peptides/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-aggregation.js","webpack://peptides/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-multicol-distances.js","webpack://peptides/./node_modules/@datagrok-libraries/math/src/webGPU/types.js","webpack://peptides/./node_modules/is-any-array/lib-esm/index.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/render-lines-on-sp.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js","webpack://peptides/./src/model.ts","webpack://peptides/./src/widgets/selection.ts","webpack://peptides/./node_modules/@datagrok-libraries/math/src/dbscan/wasm/dbscan-worker-creator.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/MCL/clustering-view.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/MCL/index.js","webpack://peptides/./node_modules/@datagrok-libraries/ml/src/MCL/types.js","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/u2.css?f539","webpack://peptides/./node_modules/@datagrok-libraries/utils/src/u2.js","webpack://peptides/external var \"rxjs.operators\"","webpack://peptides/./src/viewers/cluster-max-activity-viewer.ts","webpack://peptides/./src/package.ts","webpack://peptides/./node_modules/@datagrok-libraries/bio/src/trees/tree-helper.js","webpack://peptides/./src/widgets/manual-alignment.ts","webpack://peptides/./src/demo/fasta.ts","webpack://peptides/./src/utils/parallel-mutation-cliffs.ts","webpack://peptides/./src/utils/algorithms.ts","webpack://peptides/./src/utils/cell-renderer.ts","webpack://peptides/./src/utils/constants.ts","webpack://peptides/./src/utils/misc.ts","webpack://peptides/./src/utils/statistics.ts","webpack://peptides/./node_modules/@datagrok-libraries/statistics/src/tests.js","webpack://peptides/./src/utils/tooltips.ts","webpack://peptides/./src/utils/types.ts","webpack://peptides/./src/viewers/logo-summary.ts","webpack://peptides/./src/viewers/sar-viewer.ts","webpack://peptides/./src/widgets/distribution.ts","webpack://peptides/./src/widgets/mutation-cliffs.ts","webpack://peptides/./src/widgets/peptides.ts","webpack://peptides/./src/widgets/settings.ts","webpack://peptides/./node_modules/wu/dist/wu.js","webpack://peptides/external var \"DG\"","webpack://peptides/external var \"grok\"","webpack://peptides/external var \"rxjs\"","webpack://peptides/external var \"ui\"","webpack://peptides/webpack/bootstrap","webpack://peptides/webpack/runtime/amd options","webpack://peptides/webpack/runtime/compat get default export","webpack://peptides/webpack/runtime/define property getters","webpack://peptides/webpack/runtime/get javascript chunk filename","webpack://peptides/webpack/runtime/global","webpack://peptides/webpack/runtime/harmony module decorator","webpack://peptides/webpack/runtime/hasOwnProperty shorthand","webpack://peptides/webpack/runtime/make namespace object","webpack://peptides/webpack/runtime/publicPath","webpack://peptides/webpack/runtime/jsonp chunk loading","webpack://peptides/webpack/runtime/nonce","webpack://peptides/webpack/startup"],"sourcesContent":["export var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n StringMetricsNames[\"Onehot\"] = \"One-Hot\";\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 var IntArrayMetricsNames;\n(function (IntArrayMetricsNames) {\n IntArrayMetricsNames[\"TanimotoIntArray\"] = \"TanimotoIntArray\";\n})(IntArrayMetricsNames || (IntArrayMetricsNames = {}));\nexport var DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n DistanceMetricsSubjects[\"Number\"] = \"Number\";\n DistanceMetricsSubjects[\"IntArray\"] = \"IntArray\";\n DistanceMetricsSubjects[\"NumberArray\"] = \"NumberArray\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"Difference\"] = \"Difference\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\nexport var NumberArrayMetricsNames;\n(function (NumberArrayMetricsNames) {\n NumberArrayMetricsNames[\"CommonItems\"] = \"Common Items\";\n})(NumberArrayMetricsNames || (NumberArrayMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUtUO0FBTEgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7SUFDdkIsd0NBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUxTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBRVg7QUFGRCxXQUFZLG9CQUFvQjtJQUM5Qiw2REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBRlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUUvQjtBQUVELE1BQU0sQ0FBTixJQUFZLHVCQVFUO0FBUkgsV0FBWSx1QkFBdUI7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsMERBQStCLENBQUE7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsc0RBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVJTLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFRaEM7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLCtDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCO0FBRUQsTUFBTSxDQUFOLElBQVksdUJBRVg7QUFGRCxXQUFZLHVCQUF1QjtJQUNqQyx1REFBNEIsQ0FBQTtBQUM5QixDQUFDLEVBRlcsdUJBQXVCLEtBQXZCLHVCQUF1QixRQUVsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFN0cmluZ01ldHJpY3NOYW1lcyB7XG4gICAgTGV2ZW5zaHRlaW4gPSAnTGV2ZW5zaHRlaW4nLFxuICAgIEphcm9XaW5rbGVyID0gJ0phcm8tV2lua2xlcicsXG4gICAgTWFuaGF0dGFuID0gJ01hbmhhdHRhbicsXG4gICAgT25laG90ID0gJ09uZS1Ib3QnLFxuICB9XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gQml0QXJyYXlNZXRyaWNzTmFtZXMge1xuICAgIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgICBEaWNlID0gJ0RpY2UnLFxuICAgIEFzeW1tZXRyaWMgPSAnQXN5bW1ldHJpYycsXG4gICAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gICAgQ29zaW5lID0gJ0Nvc2luZScsXG4gICAgS3VsY3p5bnNraSA9ICdLdWxjenluc2tpJyxcbiAgICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gICAgUm9nb3RHb2xkYmVyZyA9ICdSb2dvdC1Hb2xkYmVyZycsXG4gICAgUnVzc2VsID0gJ1J1c3NlbCcsXG4gICAgU29rYWwgPSAnU29rYWwnLFxuICAgIEhhbW1pbmcgPSAnSGFtbWluZycsXG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gSW50QXJyYXlNZXRyaWNzTmFtZXMge1xuICBUYW5pbW90b0ludEFycmF5ID0gJ1Rhbmltb3RvSW50QXJyYXknLFxufVxuXG5leHBvcnQgZW51bSBEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cyB7XG4gICAgVmVjdG9yID0gJ1ZlY3RvcicsXG4gICAgU3RyaW5nID0gJ1N0cmluZycsXG4gICAgQml0QXJyYXkgPSAnQml0QXJyYXknLFxuICAgIE1hY3JvTW9sZWN1bGUgPSAnTWFjcm9Nb2xlY3VsZScsXG4gICAgTnVtYmVyID0gJ051bWJlcicsXG4gICAgSW50QXJyYXkgPSAnSW50QXJyYXknLFxuICAgIE51bWJlckFycmF5ID0gJ051bWJlckFycmF5JyxcbiAgfVxuXG5leHBvcnQgZW51bSBOdW1iZXJNZXRyaWNzTmFtZXMge1xuICBEaWZmZXJlbmNlID0gJ0RpZmZlcmVuY2UnLFxufVxuXG5leHBvcnQgZW51bSBOdW1iZXJBcnJheU1ldHJpY3NOYW1lcyB7XG4gIENvbW1vbkl0ZW1zID0gJ0NvbW1vbiBJdGVtcycsXG59XG4iXX0=","import BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport { BitArrayMetricsNames } from './typed-metrics/consts';\nimport { MmDistanceFunctionsNames } from './macromolecule-distance-functions';\nexport const similarityMetric = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoSimilarity,\n [BitArrayMetricsNames.Dice]: diceSimilarity,\n [BitArrayMetricsNames.Asymmetric]: asymmetricSimilarity,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetSimilarity,\n [BitArrayMetricsNames.Cosine]: cosineSimilarity,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiSimilarity,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheySimilarity,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergSimilarity,\n [BitArrayMetricsNames.Russel]: russelSimilarity,\n [BitArrayMetricsNames.Sokal]: sokalSimilarity,\n [BitArrayMetricsNames.Hamming]: hammingSimilarity,\n [BitArrayMetricsNames.Euclidean]: euclideanSimilarity,\n};\nexport const distanceMetrics = {\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 const CHEM_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Dice,\n BitArrayMetricsNames.Cosine\n];\nexport const SEQ_SPACE_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Asymmetric,\n BitArrayMetricsNames.Cosine,\n BitArrayMetricsNames.Sokal\n];\nexport const MACROMOLECULE_SIMILARITY_METRICS = [\n MmDistanceFunctionsNames.HAMMING,\n MmDistanceFunctionsNames.LEVENSHTEIN,\n MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE,\n MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH\n];\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 1 - tanimotoSimilarity(x, y);\n}\nexport function tanimotoDistanceIntArray(x, y) {\n const xb = new BitArray(x, x.length * 32);\n const yb = new BitArray(y, y.length * 32);\n return getDistanceFromSimilarity(tanimotoSimilarity(xb, yb));\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 1 - 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 1 - 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 1 - 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 1 - 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 similarity === 0 ? 3.402823E+38 : (1 / similarity) - 1;\n}\nexport function numericDistance(args) {\n if (args && args.range != undefined && args.range > 0) {\n const range = args.range;\n return (a, b) => Math.abs(a - b) / range;\n }\n return (a, b) => Math.abs(a - b);\n}\nexport function commonItemsCount(args) {\n const mostCommon = args?.mostCommon ?? new Set();\n return (arr1, arr2) => {\n const len1 = arr1.length;\n const len2 = arr2.length;\n let count = 0;\n let i1 = 0;\n let i2 = 0;\n while ((i1 < len1) && (i2 < len2)) {\n if (arr1[i1] === arr2[i2]) {\n if (!mostCommon?.has(arr1[i1]))\n ++count;\n ++i1;\n ++i2;\n }\n else if (arr1[i1] < arr2[i2]) {\n ++i1;\n }\n else {\n ++i2;\n }\n }\n return count;\n };\n}\nexport function inverseCommonItemsCount(args) {\n const f = commonItemsCount(args);\n return (arr1, arr2) => {\n if (arr2.length === 0 || arr1.length === 0)\n return 10000;\n return Math.min(arr1.length, arr2.length) / (f(arr1, arr2) + 0.0001);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVB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QkFDVixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztZQUNQLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsRUFBRSxFQUFFLENBQUM7WUFBQyxDQUFDO2lCQUFNLENBQUM7Z0JBQUMsRUFBRSxFQUFFLENBQUM7WUFBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsSUFBaUM7SUFDdkUsTUFBTSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLElBQXVCLEVBQUUsSUFBdUIsRUFBRSxFQUFFO1FBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1FBRWYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge0JpdEFycmF5TWV0cmljc05hbWVzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MvY29uc3RzJztcbmltcG9ydCB7TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzfSBmcm9tICcuL21hY3JvbW9sZWN1bGUtZGlzdGFuY2UtZnVuY3Rpb25zJztcblxuZXhwb3J0IGNvbnN0IHNpbWlsYXJpdHlNZXRyaWM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5U2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhblNpbWlsYXJpdHksXG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2VNZXRyaWNzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IENIRU1fU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZSxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTtcbmV4cG9ydCBjb25zdCBTRVFfU1BBQ0VfU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90byxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpYyxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF07XG5leHBvcnQgY29uc3QgTUFDUk9NT0xFQ1VMRV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbXG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HLFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU4sXG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFLFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hcbl07XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRhbmltb3RvU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDEuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKHRvdGFsIC0gY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhbmltb3RvRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIDEgLSB0YW5pbW90b1NpbWlsYXJpdHkoeCwgeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b0Rpc3RhbmNlSW50QXJyYXkoeDogVWludDMyQXJyYXksIHk6IFVpbnQzMkFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgeGIgPSBuZXcgQml0QXJyYXkoeCwgeC5sZW5ndGggKiAzMik7XG4gIGNvbnN0IHliID0gbmV3IEJpdEFycmF5KHksIHkubGVuZ3RoICogMzIpO1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eSh0YW5pbW90b1NpbWlsYXJpdHkoeGIsIHliKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWNlU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gMiAqIGNvbW1vbiAvIHRvdGFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gZGljZVNpbWlsYXJpdHkoeCwgeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3NpbmVTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBNYXRoLnNxcnQodG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIDEgLSBjb3NpbmVTaW1pbGFyaXR5KHgsIHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShldWNsaWRlYW5EaXN0YW5jZSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpIC0gMiAqIHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShoYW1taW5nRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2thbFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKDIgKiB0b3RhbCAtIDMgKiBjb21tb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gMSAtIHNva2FsU2ltaWxhcml0eSh4LCB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGN6eW5za2lTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IHRvdGFsUHJvZCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWxQcm9kID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIChjb21tb24gKiB0b3RhbCkgLyAoMiAqIHRvdGFsUHJvZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoa3VsY3p5bnNraVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWNDb25uYXVnaGV5U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwgLSB0b3RhbFByb2QpIC8gdG90YWxQcm9kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWNDb25uYXVnaGV5RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkobWNDb25uYXVnaGV5U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbih4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1pbiA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIDEgLSBhc3ltbWV0cmljU2ltaWxhcml0eSh4LCB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHgudHJ1ZUNvdW50KCksIHkudHJ1ZUNvdW50KCkpO1xuICBpZiAobWF4ID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1heDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGlmICh4Lmxlbmd0aCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyB4Lmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJ1c3NlbFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICBjb25zdCB0b3RhbCA9IHguY291bnRCaXRzKHRydWUpICsgeS5jb3VudEJpdHModHJ1ZSk7XG4gIGNvbnN0IGxlbiA9IHgubGVuZ3RoO1xuICBjb25zdCBkaWZmID0gbGVuIC0gdG90YWwgKyBjb21tb247XG4gIGlmICgoY29tbW9uID09IGxlbikgfHwgKGRpZmYgPT0gbGVuKSkgcmV0dXJuIDEuMDtcbiAgZWxzZSByZXR1cm4gY29tbW9uIC8gdG90YWwgKyBkaWZmIC8gKDIgKiBsZW4gLSB0b3RhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2dvdEdvbGRiZXJnRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkocm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShkaXN0YW5jZTogbnVtYmVyKSB7XG4gIHJldHVybiAxIC8gKDEgKyBkaXN0YW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNpbWlsYXJpdHk6IG51bWJlcikgeyAvL2luIGNhc2Ugc2ltaWxhcml0eSBpcyAwLCB1c2UgbWF4IG51bWJlciBmb3IgZmxvYXQzMlxuICByZXR1cm4gc2ltaWxhcml0eSA9PT0gMCA/IDMuNDAyODIzRSszOCA6ICgxIC8gc2ltaWxhcml0eSkgLSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtZXJpY0Rpc3RhbmNlKGFyZ3M/OiB7cmFuZ2U/OiBudW1iZXJ9KSB7XG4gIGlmIChhcmdzICYmIGFyZ3MucmFuZ2UgIT0gdW5kZWZpbmVkICYmIGFyZ3MucmFuZ2UgPiAwKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBhcmdzLnJhbmdlO1xuICAgIHJldHVybiAoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGguYWJzKGEgLSBiKSAvIHJhbmdlO1xuICB9XG5cbiAgcmV0dXJuIChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gTWF0aC5hYnMoYSAtIGIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tbW9uSXRlbXNDb3VudChhcmdzPzoge21vc3RDb21tb24/OiBTZXQ8bnVtYmVyPn0pIHtcbiAgY29uc3QgbW9zdENvbW1vbiA9IGFyZ3M/Lm1vc3RDb21tb24gPz8gbmV3IFNldDxudW1iZXI+KCk7XG4gIHJldHVybiAoYXJyMTogQXJyYXlMaWtlPG51bWJlcj4sIGFycjI6IEFycmF5TGlrZTxudW1iZXI+KSA9PiB7XG4gICAgY29uc3QgbGVuMSA9IGFycjEubGVuZ3RoO1xuICAgIGNvbnN0IGxlbjIgPSBhcnIyLmxlbmd0aDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBpMSA9IDA7XG4gICAgbGV0IGkyID0gMDtcblxuICAgIHdoaWxlICgoaTEgPCBsZW4xKSAmJiAoaTIgPCBsZW4yKSkge1xuICAgICAgaWYgKGFycjFbaTFdID09PSBhcnIyW2kyXSkge1xuICAgICAgICBpZiAoIW1vc3RDb21tb24/LmhhcyhhcnIxW2kxXSkpXG4gICAgICAgICAgKytjb3VudDtcbiAgICAgICAgKytpMTtcbiAgICAgICAgKytpMjtcbiAgICAgIH0gZWxzZSBpZiAoYXJyMVtpMV0gPCBhcnIyW2kyXSkgeyArK2kxOyB9IGVsc2UgeyArK2kyOyB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZUNvbW1vbkl0ZW1zQ291bnQoYXJncz86IHttb3N0Q29tbW9uPzogU2V0PG51bWJlcj59KSB7XG4gIGNvbnN0IGYgPSBjb21tb25JdGVtc0NvdW50KGFyZ3MpO1xuICByZXR1cm4gKGFycjE6IEFycmF5TGlrZTxudW1iZXI+LCBhcnIyOiBBcnJheUxpa2U8bnVtYmVyPikgPT4ge1xuICAgIGlmIChhcnIyLmxlbmd0aCA9PT0gMCB8fCBhcnIxLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiAxMDAwMDtcblxuICAgIHJldHVybiBNYXRoLm1pbihhcnIxLmxlbmd0aCwgYXJyMi5sZW5ndGgpIC8gKGYoYXJyMSwgYXJyMikgKyAwLjAwMDEpO1xuICB9O1xufVxuIl19","// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { tanimotoSimilarity } from '@datagrok-libraries/ml/src/distance-metrics-methods';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME, } from '../utils/const';\nimport { GAP_SYMBOL } from '../utils/macromolecule/types';\nimport { SeqHandler } from '../utils/seq-handler';\nimport { splitAlignedSequences } from '../utils/splitter';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const sh = SeqHandler.forColumn(col);\n const encodedStringArray = [];\n const rowCount = col.length;\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n let encodedMonomerStr = '';\n const monomers = sh.getSplitted(rowIdx);\n for (const cm of monomers.canonicals) {\n if (!monomerSymbolDict[cm]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[cm] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[cm]);\n }\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const sh = SeqHandler.forColumn(col);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const rowCount = col.length;\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const monomers = sh.getSplitted(rowIdx);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n const cm = monomers.getCanonical(j);\n if (cm) {\n if (!monomersDict[cm]) {\n grok.shell.warning(`Monomer ${cm} 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[cm])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const sh = SeqHandler.forColumn(cell.column);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const monomers = sh.getSplitted(cell.rowIndex);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n const cm = monomers.getCanonical(j);\n if (cm) {\n if (!monomersDict[cm]) {\n grok.shell.warning(`Monomer ${cm} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[cm])));\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 var _a, _b, _c, _d, _e;\n const resultLib = [];\n for (let i = 0; i < table.rowCount; i++) {\n const monomer = {};\n Object.keys(jsonSdfMonomerLibDict).forEach((key) => {\n if (key === \"symbol\" /* HELM_FIELDS.SYMBOL */) {\n const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);\n monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;\n }\n else if (key === \"rgroups\" /* HELM_FIELDS.RGROUPS */) {\n const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\\n');\n const jsonRgroups = [];\n rgroups.forEach((g) => {\n const rgroup = {};\n const altAtom = g.substring(g.lastIndexOf(']') + 1);\n const radicalNum = g.match(/\\[R(\\d+)\\]/)[1];\n rgroup[\"capGroupSmiles\" /* HELM_RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* HELM_RGROUP_FIELDS.ALTERNATE_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* HELM_RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* HELM_RGROUP_FIELDS.LABEL */] = `R${radicalNum}`;\n jsonRgroups.push(rgroup);\n });\n monomer[key] = jsonRgroups;\n }\n else {\n if (jsonSdfMonomerLibDict[key])\n monomer[key] = table.get(jsonSdfMonomerLibDict[key], i);\n }\n });\n monomer[_a = \"author\" /* HELM_REQUIRED_FIELD.AUTHOR */] ?? (monomer[_a] = '');\n monomer[_b = \"id\" /* HELM_REQUIRED_FIELD.ID */] ?? (monomer[_b] = 0);\n monomer[_c = \"smiles\" /* HELM_REQUIRED_FIELD.SMILES */] ?? (monomer[_c] = '');\n monomer[_d = \"monomerType\" /* HELM_REQUIRED_FIELD.MONOMER_TYPE */] ?? (monomer[_d] = 'Backbone');\n monomer[_e = \"createDate\" /* HELM_REQUIRED_FIELD.CREATE_DATE */] ?? (monomer[_e] = null);\n resultLib.push(monomer);\n }\n return resultLib;\n}\nexport async function getMonomerLibHelper() {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installed for MonomerLibHelper.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\nexport async function sequenceChemSimilarity(positionColumns, referenceSequence) {\n /* eslint-enable max-len */\n if (positionColumns instanceof DG.Column)\n positionColumns = splitAlignedSequences(positionColumns).columns.toList();\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n // const smilesCols: DG.Column<string>[] = new Array(monomerCols.length);\n const rawCols = new Array(positionColumns.length);\n const rowCount = positionColumns[0].length;\n const totalSimilarity = new Float32Array(rowCount);\n // Calculate base similarity\n for (let position = 0; position < positionColumns.length; ++position) {\n const referenceMonomerCanonical = referenceSequence.getCanonical(position);\n const referenceMol = monomerLib.getMonomer('PEPTIDE', referenceMonomerCanonical)?.smiles ?? '';\n const monomerCol = positionColumns[position];\n const monomerColData = monomerCol.getRawData();\n const monomerColCategories = monomerCol.categories;\n const emptyCategoryIdx = monomerColCategories.indexOf('');\n rawCols[position] = { categories: monomerColCategories, data: monomerColData, emptyIndex: emptyCategoryIdx };\n if (typeof referenceMonomerCanonical === 'undefined')\n continue;\n // Calculating similarity for\n const molCol = DG.Column.fromStrings('smiles', monomerColCategories.map((cat) => monomerLib.getMonomer('PEPTIDE', cat)?.smiles ?? ''));\n const _df = DG.DataFrame.fromColumns([molCol]); // getSimilarities expects that column is in dataframe\n const similarityCol = (await grok.chem.getSimilarities(molCol, referenceMol));\n const similarityColData = similarityCol.getRawData();\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const monomerCategoryIdx = monomerColData[rowIdx];\n totalSimilarity[rowIdx] += referenceMonomerCanonical !== GAP_SYMBOL && monomerCategoryIdx !== emptyCategoryIdx ?\n similarityColData[monomerCategoryIdx] :\n referenceMonomerCanonical === GAP_SYMBOL && monomerCategoryIdx === emptyCategoryIdx ? 1 : 0;\n }\n }\n for (let similarityIndex = 0; similarityIndex < totalSimilarity.length; ++similarityIndex) {\n let updatedSimilarity = totalSimilarity[similarityIndex] / referenceSequence.length;\n for (let position = 0; position < positionColumns.length; ++position) {\n const currentRawCol = rawCols[position];\n if ((position >= referenceSequence.length && currentRawCol.data[similarityIndex] !== currentRawCol.emptyIndex) ||\n (currentRawCol.data[similarityIndex] === currentRawCol.emptyIndex && position < referenceSequence.length)) {\n updatedSimilarity = DG.FLOAT_NULL;\n break;\n }\n }\n totalSimilarity[similarityIndex] = updatedSimilarity;\n }\n const similarityCol = DG.Column.fromFloat32Array('Similarity', totalSimilarity);\n return similarityCol;\n}\n/* eslint-disable max-len */\n/** Calculates chemical similarity between each pair of monomers.\n * @param {string[]} monomerSet Set of unique monomers.\n * @returns {Promise<{scoringMatrix: number[][], alphabetIndexes: {[monomerId: string]: number}}>} Ojbect containing similarity scoring matrix and monomer to index mapping. */\nexport async function calculateMonomerSimilarity(monomerSet) {\n /* eslint-enable max-len */\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n const scoringMatrix = [];\n const alphabetIndexes = {};\n const monomerMolecules = monomerSet.map((monomer) => monomerLib.getMonomer('PEPTIDE', monomer)?.smiles ?? '');\n const monomerMoleculesCol = DG.Column.fromStrings('smiles', monomerMolecules);\n for (let monomerIndex = 0; monomerIndex < monomerMolecules.length; ++monomerIndex) {\n const monomer = monomerSet[monomerIndex];\n alphabetIndexes[monomer] = monomerIndex;\n const monomerMol = monomerMolecules[monomerIndex];\n const similarityScores = monomerMol === '' ? new Array(monomerMolecules.length).fill(0) :\n (await grok.chem.getSimilarities(monomerMoleculesCol, monomerMol)).getRawData();\n similarityScores[monomerIndex] = 1;\n scoringMatrix[monomerIndex] = Array.from(similarityScores);\n }\n return { scoringMatrix, alphabetIndexes };\n}\nexport async function getMonomerSubstitutionMatrix(monomerSet, fingerprintType = 'Morgan') {\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n const scoringMatrix = new Array(monomerSet.length).fill(0).map(() => new Array(monomerSet.length).fill(0));\n const alphabetIndexes = {};\n const monomerMolecules = monomerSet.map((monomer) => monomerLib.getMonomer('PEPTIDE', monomer)?.smiles ?? '');\n const fingerprintsFunc = DG.Func.find({ package: 'Chem', name: 'getFingerprints' })[0];\n if (!fingerprintsFunc) {\n console.warn('Function \"Chem:getFingerprints\" is not found in chem package. falling back to Morgan fingerprints');\n return await calculateMonomerSimilarity(monomerSet);\n }\n const monomerMoleculesCol = DG.Column.fromStrings('smiles', monomerMolecules);\n // needed for function to work\n const _unusedMolDf = DG.DataFrame.fromColumns([monomerMoleculesCol]);\n const fingerPrints = (await fingerprintsFunc.apply({ col: monomerMoleculesCol, fingerprintType: fingerprintType }))?.entries;\n if (!fingerPrints) {\n console.warn(`${fingerprintType} Fingerprints could not be calculated for monomers from chem package.\n falling back to Morgan fingerprints`);\n return await calculateMonomerSimilarity(monomerSet);\n }\n for (let i = 0; i < fingerPrints.length; ++i) {\n scoringMatrix[i][i] = 1;\n alphabetIndexes[monomerSet[i]] = i;\n if (!fingerPrints[i])\n continue;\n for (let j = i + 1; j < fingerPrints.length; ++j) {\n if (!fingerPrints[j])\n continue;\n // @ts-ignore\n scoringMatrix[i][j] = scoringMatrix[j][i] = tanimotoSimilarity(fingerPrints[i], fingerPrints[j]);\n }\n }\n return { scoringMatrix, alphabetIndexes };\n}\n;\n//# sourceMappingURL=monomer-utils.js.map","export class MonomerWorks {\n //private molfileConverter: IMolfileConverter;\n constructor(monomerLib /*, molfileConverter: IMolfileConverter*/) {\n this.monomerLib = monomerLib;\n //this.molfileConverter = molfileConverter;\n }\n //types according to Monomer possible\n getCappedRotatedMonomer(monomerType, monomerName) {\n // TODO: Check type of monomerType arg\n const monomer = this.monomerLib.getMonomer(monomerType, monomerName);\n if (monomer)\n return monomer.molfile; //TODO cap\n return null;\n }\n}\nexport function helmTypeToPolymerType(helmType) {\n let polymerType = undefined;\n switch (helmType) {\n case \"HELM_BASE\" /* HelmTypes.BASE */:\n case \"HELM_SUGAR\" /* HelmTypes.SUGAR */: // r - ribose, d - deoxyribose\n case \"HELM_LINKER\" /* HelmTypes.LINKER */: // p - phosphate\n case \"HELM_NUCLETIDE\" /* HelmTypes.NUCLEOTIDE */:\n // @ts-ignore\n case 'nucleotide':\n polymerType = \"RNA\" /* PolymerTypes.RNA */;\n break;\n case \"HELM_AA\" /* HelmTypes.AA */:\n polymerType = \"PEPTIDE\" /* PolymerTypes.PEPTIDE */;\n break;\n case \"HELM_CHEM\" /* HelmTypes.CHEM */:\n polymerType = \"CHEM\" /* PolymerTypes.CHEM */;\n break;\n case \"HELM_BLOB\" /* HelmTypes.BLOB */:\n polymerType = \"BLOB\" /* PolymerTypes.BLOB */;\n break;\n default:\n polymerType = \"PEPTIDE\" /* PolymerTypes.PEPTIDE */;\n console.warn(`Unexpected HelmType '${helmType}'`);\n }\n return polymerType;\n}\n//# sourceMappingURL=monomer-works.js.map","// 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': 'Name',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerName'\n};\nexport const DUMMY_MONOMER = {\n 'monomerType': 'Backbone',\n 'smiles': '',\n 'name': '',\n 'author': 'Datagrok',\n 'molfile': '',\n 'naturalAnalog': '',\n 'rgroups': [],\n 'createDate': null,\n 'id': 0,\n 'polymerType': 'PEPTIDE',\n 'symbol': ''\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;\nexport const RIBOSE_SYMBOL = 'r';\nexport const DEOXYRIBOSE_SYMBOL = 'd';\nexport const PHOSPHATE_SYMBOL = 'p';\nexport const HELM_WRAPPERS_REGEXP = new RegExp(`[${RIBOSE_SYMBOL}${DEOXYRIBOSE_SYMBOL}]\\\\((\\\\w)\\\\)${PHOSPHATE_SYMBOL}?`, 'g');\n//# sourceMappingURL=const.js.map","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n})(NOTATION || (NOTATION = {}));\nexport var ALPHABET;\n(function (ALPHABET) {\n ALPHABET[\"DNA\"] = \"DNA\";\n ALPHABET[\"RNA\"] = \"RNA\";\n ALPHABET[\"PT\"] = \"PT\";\n /** Unknown */\n ALPHABET[\"UN\"] = \"UN\";\n})(ALPHABET || (ALPHABET = {}));\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"aligned\"] = \"aligned\";\n TAGS[\"alphabet\"] = \"alphabet\";\n TAGS[\"alphabetSize\"] = \".alphabetSize\";\n TAGS[\"alphabetIsMultichar\"] = \".alphabetIsMultichar\";\n TAGS[\"separator\"] = \"separator\";\n TAGS[\"isHelmCompatible\"] = \".isHelmCompatible\";\n TAGS[\"positionNames\"] = \".positionNames\";\n TAGS[\"positionLabels\"] = \".positionLabels\";\n TAGS[\"regions\"] = \".regions\";\n})(TAGS || (TAGS = {}));\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/g;\nexport const helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(ALPHABET.PT, Alphabets.fasta.peptide, 0.50),\n new CandidateType(ALPHABET.DNA, Alphabets.fasta.dna, 0.55),\n new CandidateType(ALPHABET.RNA, Alphabets.fasta.rna, 0.55),\n];\n//# sourceMappingURL=consts.js.map","/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\n/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","/**\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","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 */\nexport function 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 let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\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/**\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 calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\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 *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENB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QUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = monomer[0]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = monomer[1]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (monomer[0]?.toLowerCase() == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType, GAP_SYMBOL } from './types';\nimport { ALPHABET, Alphabets, candidateAlphabets, monomerRe, NOTATION } from './consts';\nimport { GapOriginals, SeqHandler } from '../seq-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\nexport class StringListSeqSplitted {\n get length() { return this.mList.length; }\n get canonicals() { return this.mList; }\n get originals() { return this.mList; }\n isGap(posIdx) {\n return this.getOriginal(posIdx) === this.gapOriginalMonomer;\n }\n getCanonical(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n return this.mList[posIdx];\n }\n getOriginal(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n return this.mList[posIdx];\n }\n constructor(mList, gapOriginalMonomer) {\n this.mList = mList;\n this.gapOriginalMonomer = gapOriginalMonomer;\n }\n}\nexport class FastaSimpleSeqSplitted {\n get length() { return this.seqS.length; }\n get canonicals() { return this.seqS; }\n get originals() { return this.seqS; }\n isGap(posIdx) {\n return this.getOriginal(posIdx) === GapOriginals[NOTATION.FASTA];\n }\n getCanonical(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n if (this.isGap(posIdx))\n return GAP_SYMBOL;\n return this.seqS[posIdx];\n }\n getOriginal(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n return this.seqS[posIdx];\n }\n constructor(seqS) {\n this.seqS = seqS;\n }\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 getStatsForCol(seqCol, minLength, splitter) {\n const cats = seqCol.categories;\n const splitted = wu.enumerate(seqCol.getRawData())\n .map(([catI, rowIdx]) => splitter(cats[catI]));\n return getStats(splitted, minLength);\n}\nfunction getStats(splitted, minLength) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const cm of mSeq.canonicals) {\n if (!(cm in freq))\n freq[cm] = 0;\n freq[cm] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param seq object with sequence\n * @param getMonomer Source of the {@link seq} string\n * @return {string[]} array of monomers\n */\nexport const splitterAsFasta = (seq) => {\n const mmList = wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n return ma[2] ?? ma[1]; // preserve '-' as gap symbol for compatibility with simpleAsFastaSimple\n }).toArray();\n return new StringListSeqSplitted(mmList, GapOriginals[NOTATION.FASTA]);\n // return new Proxy(splittedList as object, {\n // get(target: string[], p: string | symbol, receiver: any): any {\n // const k = 11;\n // }\n // }) as ISeqSplitted;\n};\nexport const splitterAsFastaSimple = (seq) => {\n return !!seq ? new FastaSimpleSeqSplitted(seq) : new StringListSeqSplitted([], GapOriginals[NOTATION.FASTA]);\n};\n/** Gets method to split sequence by separator\n * @param separator Monomer separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n if (!seq)\n return new StringListSeqSplitted([], GapOriginals[NOTATION.SEPARATOR]);\n else {\n let mmList;\n const mRe = new RegExp(String.raw `\"-\"|'-'|[^${separator}]+`, 'g'); // depends on separator args\n if (limit !== undefined) {\n mRe.lastIndex = 0;\n mmList = new Array(Math.ceil(limit));\n let mEa = null;\n let mI = 0;\n while ((mEa = mRe.exec(seq)) !== null && mI < limit) {\n mmList[mI++] = mEa[0].replace(`\"-\"`, '').replace(`'-'`, '');\n }\n mmList.splice(mI);\n }\n else\n mmList = seq.replaceAll('\\\"-\\\"', '').replaceAll('\\'-\\'', '').split(separator, limit);\n return new StringListSeqSplitted(mmList, GapOriginals[NOTATION.SEPARATOR]);\n }\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 * @param {ISeqSource} src Source of the {@link seq} string\n * @return {string[]}\n */\nexport const 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 new StringListSeqSplitted(mmList.map(mmPostProcess), GapOriginals[NOTATION.HELM]);\n};\n/** Get splitter method to split sequences to monomers (required for MacromoleculeDifferenceCellRenderer)\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(NOTATION.FASTA))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(NOTATION.HELM))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\nconst longMonomerPartRe = /([^\\W_]+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n if (amino.length <= maxLengthOfMonomer)\n return amino;\n //const kebabAmino = amino.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $);\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || (shortAminoMatch?.length ?? 0) > 1;\n const shortAmino = shortAminoMatch?.[0] ?? ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer - 1) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case ALPHABET.DNA:\n return Alphabets.fasta.dna;\n case ALPHABET.RNA:\n return Alphabets.fasta.rna;\n case ALPHABET.PT:\n return Alphabets.fasta.peptide;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else\n alphabetName = ALPHABET.UN;\n return alphabetName;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const sh = SeqHandler.forColumn(seqCol);\n alphabet = sh.alphabet;\n }\n else {\n const stats = getStatsForCol(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case ALPHABET.PT:\n return AminoacidsPalettes.GrokGroups;\n case ALPHABET.DNA:\n case ALPHABET.RNA:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n }) ?? null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { TAGS, ALPHABET, NOTATION, candidateAlphabets, positionSeparator, splitterAsFasta, getSplitterWithSeparator, splitterAsHelm, } from './macromolecule';\nimport { GAP_SYMBOL, } from './macromolecule/types';\nimport { detectAlphabet, splitterAsFastaSimple, StringListSeqSplitted } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\nimport { HELM_WRAPPERS_REGEXP, PHOSPHATE_SYMBOL } from './const';\nexport const SeqTemps = new class {\n constructor() {\n /** Column's temp slot name for a SeqHandler object */\n this.seqHandler = `seq-handler`;\n this.notationProvider = `seq-handler.notation-provider`;\n }\n}();\nexport const GapOriginals = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n};\n/** Class for handling notation units in Macromolecule columns and\n * conversion of notation systems in Macromolecule columns\n */\nexport class SeqHandler {\n constructor(col) {\n this._splitter = null;\n this.cached = true;\n this._splitted = null;\n this.columnVersion = null;\n this._stats = null;\n this._maxLength = null;\n this._posList = null;\n this._joiner = undefined;\n if (col.type !== DG.TYPE.STRING)\n throw new Error(`Unexpected column type '${col.type}', must be '${DG.TYPE.STRING}'.`);\n this._column = col;\n const units = this._column.getTag(DG.TAGS.UNITS);\n if (units !== null && units !== undefined)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapOriginal = (this.isFasta()) ? GapOriginals[NOTATION.FASTA] :\n (this.isHelm()) ? GapOriginals[NOTATION.HELM] :\n GapOriginals[NOTATION.SEPARATOR];\n if (!this.column.tags.has(TAGS.aligned) || !this.column.tags.has(TAGS.alphabet) ||\n (!this.column.tags.has(TAGS.alphabetIsMultichar) && !this.isHelm() && this.alphabet === ALPHABET.UN)) {\n // The following detectors and setters are to be called because the column is likely\n // as the UnitsHandler constructor was called on the column.\n if (this.isFasta())\n SeqHandler.setUnitsToFastaColumn(this);\n else if (this.isSeparator()) {\n const separator = col.getTag(TAGS.separator);\n SeqHandler.setUnitsToSeparatorColumn(this, separator);\n }\n else if (this.isHelm())\n SeqHandler.setUnitsToHelmColumn(this);\n else\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\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(TAGS.alphabetIsMultichar)) {\n if (this.isHelm())\n this.column.setTag(TAGS.alphabetIsMultichar, 'true');\n else if (['UN'].includes(this.alphabet)) {\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${TAGS.alphabetIsMultichar}' is mandatory.`);\n }\n }\n this.notationProvider = this.column.temp[SeqTemps.notationProvider] ?? null;\n this.columnVersion = this.column.version;\n }\n static setUnitsToFastaColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== NOTATION.FASTA)\n throw new Error(`The column of notation '${NOTATION.FASTA}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n uh.column.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n SeqHandler.setTags(uh);\n }\n static setUnitsToSeparatorColumn(uh, separator) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== NOTATION.SEPARATOR)\n throw new Error(`The column of notation '${NOTATION.SEPARATOR}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${NOTATION.SEPARATOR}' must have the separator tag.`);\n uh.column.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);\n uh.column.setTag(TAGS.separator, separator);\n SeqHandler.setTags(uh);\n }\n static setUnitsToHelmColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`The column of notation '${NOTATION.HELM}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n uh.column.setTag(DG.TAGS.UNITS, NOTATION.HELM);\n SeqHandler.setTags(uh);\n }\n /** From detectMacromolecule */\n static setTags(uh) {\n const units = uh.column.getTag(DG.TAGS.UNITS);\n if ([NOTATION.FASTA, NOTATION.SEPARATOR].includes(units)) {\n // Empty monomer alphabet is allowed, only if alphabet tag is annotated\n if (!uh.column.getTag(TAGS.alphabet) && Object.keys(uh.stats.freq).length === 0)\n throw new Error('Alphabet is empty and not annotated.');\n let aligned = uh.column.getTag(TAGS.aligned);\n if (aligned === null) {\n aligned = uh.stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n uh.column.setTag(TAGS.aligned, aligned);\n }\n let alphabet = uh.column.getTag(TAGS.alphabet);\n if (alphabet === null) {\n alphabet = detectAlphabet(uh.stats.freq, candidateAlphabets);\n uh.column.setTag(TAGS.alphabet, alphabet);\n }\n if (alphabet === ALPHABET.UN) {\n const alphabetSize = Object.keys(uh.stats.freq).length;\n const alphabetIsMultichar = Object.keys(uh.stats.freq).some((m) => m.length > 1);\n uh.column.setTag(TAGS.alphabetSize, alphabetSize.toString());\n uh.column.setTag(TAGS.alphabetIsMultichar, alphabetIsMultichar ? 'true' : 'false');\n }\n }\n }\n get column() { return this._column; }\n get length() { return this._column.length; }\n get units() { return this._units; }\n get notation() { return this._notation; }\n get defaultGapOriginal() { return this._defaultGapOriginal; }\n get separator() {\n const separator = this.column.getTag(TAGS.separator) ?? undefined;\n if (this.notation === 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(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(TAGS.alphabet);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n get helmCompatible() {\n return this.column.getTag(TAGS.isHelmCompatible);\n }\n getAlphabetSize() {\n if (this.notation == NOTATION.HELM || this.alphabet == ALPHABET.UN) {\n const alphabetSizeStr = this.column.getTag(TAGS.alphabetSize);\n let alphabetSize;\n if (alphabetSizeStr)\n alphabetSize = parseInt(alphabetSizeStr);\n else {\n // calculate alphabetSize on demand\n const stats = this.stats;\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case ALPHABET.PT:\n return 20;\n case ALPHABET.DNA:\n case 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 === NOTATION.HELM)\n return true;\n else if (this.alphabet !== ALPHABET.UN)\n return false;\n else\n return this.column.getTag(TAGS.alphabetIsMultichar) === 'true';\n }\n // /** */\n // public get splitted(): ISeqSplitted[] {\n // // TODO: Disable cache or invalidate on changing data\n // if (this._splitted === null) {\n // const splitter = this.splitter;\n // const colLength: number = this._column.length;\n // this._splitted = new Array(colLength);\n // const catIdxList = this._column.getRawData();\n // const catList: string[] = this._column.categories;\n // for (let rowIdx: number = 0; rowIdx < colLength; rowIdx++) {\n // const seq: string = catList[catIdxList[rowIdx]];\n // this._splitted[rowIdx] = splitter(seq);\n // }\n // }\n // return this._splitted;\n // }\n getSplitted(rowIdx, limit) {\n if (!this.cached || limit !== undefined) {\n const seq = this.column.get(rowIdx);\n return this.getSplitter(limit)(seq);\n }\n else {\n if (this.column.version !== this.columnVersion || this._splitted === null) {\n this.columnVersion = this.column.version;\n this._splitted = new Array(this.column.length);\n }\n let resSS = this._splitted[rowIdx] ? this._splitted[rowIdx].deref() : undefined;\n if (!resSS) {\n const seq = this.column.get(rowIdx);\n resSS = this.splitter(seq);\n this._splitted[rowIdx] = new WeakRef(resSS);\n }\n return resSS;\n }\n }\n get stats() {\n if (this._stats === null) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n const colLen = this.column.length;\n for (let rowIdx = 0; rowIdx < colLen; ++rowIdx) {\n const mSeq = this.getSplitted(rowIdx);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n for (const cm of mSeq.canonicals) {\n if (!(cm in freq))\n freq[cm] = 0;\n freq[cm] += 1;\n }\n }\n this._stats = { freq: freq, sameLength: sameLength };\n }\n return this._stats;\n }\n get maxLength() {\n if (this._maxLength === null) {\n this._maxLength = this.column.length === 0 ? 0 :\n Math.max(...wu.count(0).take(this.column.length).map((rowIdx) => this.getSplitted(rowIdx).length));\n }\n return this._maxLength;\n }\n get posList() {\n if (this._posList === null) {\n const posListTxt = this.column.getTag(TAGS.positionNames);\n this._posList = posListTxt ? posListTxt.split(positionSeparator).map((p) => p.trim()) :\n wu.count(1).take(this.maxLength).map((pos) => pos.toString()).toArray();\n }\n return this._posList;\n }\n isFasta() { return this.notation === NOTATION.FASTA; }\n isSeparator() { return this.notation === NOTATION.SEPARATOR; }\n isHelm() { return this.notation === NOTATION.HELM; }\n isRna() { return this.alphabet === ALPHABET.RNA; }\n isDna() { return this.alphabet === ALPHABET.DNA; }\n isPeptide() { return this.alphabet === ALPHABET.PT; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n isHelmCompatible() { return this.helmCompatible === 'true'; }\n /** Checks {@link om} for being a gap\n * @param {string} om Original monomer of sequence symbol\n * @return {boolean}\n */\n isGap(om) {\n return !om || om === this._defaultGapOriginal;\n }\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(NOTATION.FASTA))\n return NOTATION.FASTA;\n else if (this.units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return NOTATION.SEPARATOR;\n else if (this.units.toLowerCase().startsWith(NOTATION.HELM))\n return NOTATION.HELM;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\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()) ? 'RNA1{' :\n (this.isRna() || this.isHelmCompatible()) ? 'RNA1{' : 'PEPTIDE1{';\n const postfix = '}$$$$';\n const leftWrapper = (this.isDna()) ? 'd(' :\n (this.isRna()) ? 'r(' : '';\n const rightWrapper = (this.isDna() || this.isRna()) ? ')p' : '';\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} tgtNotation\n * @return {DG.Column}\n */\n getNewColumn(tgtNotation, tgtSeparator, colName, data) {\n const col = this.column;\n const name = tgtNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = colName ?? col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, data ?? new Array(this.column.length).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, tgtNotation);\n if (tgtNotation === NOTATION.SEPARATOR) {\n if (!tgtSeparator)\n throw new Error(`Notation \\'${NOTATION.SEPARATOR}\\' requires separator value.`);\n newColumn.setTag(TAGS.separator, tgtSeparator);\n }\n newColumn.setTag(DG.TAGS.CELL_RENDERER, tgtNotation === NOTATION.HELM ? 'helm' : 'sequence'); // cell.renderer\n const srcAligned = col.getTag(TAGS.aligned);\n if (srcAligned)\n newColumn.setTag(TAGS.aligned, srcAligned);\n let srcAlphabet = col.getTag(TAGS.alphabet);\n if (!srcAlphabet && this.notation === NOTATION.HELM && tgtNotation !== NOTATION.HELM)\n srcAlphabet = ALPHABET.UN;\n if (srcAlphabet != null)\n newColumn.setTag(TAGS.alphabet, srcAlphabet);\n let srcAlphabetSize = col.getTag(TAGS.alphabetSize);\n if (srcAlphabet != null && srcAlphabetSize)\n newColumn.setTag(TAGS.alphabetSize, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(TAGS.alphabetIsMultichar);\n if (srcAlphabet != null && srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(TAGS.alphabetIsMultichar, srcAlphabetIsMultichar);\n if (tgtNotation == NOTATION.HELM) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(TAGS.alphabetSize, srcAlphabetSize);\n }\n return newColumn;\n }\n /** Creates a new column on data of {@link seqList} with the same tags */\n getNewColumnFromList(name, seqList) {\n return this.getNewColumn(this.notation, this.separator, name, seqList);\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 = SeqHandler.forColumn(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 = [NOTATION.FASTA, NOTATION.SEPARATOR, 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 (!SeqHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n /** Gets function to split seq value to monomers */\n getSplitter(limit) {\n let splitter = null;\n splitter = this.notationProvider ? this.notationProvider.splitter : null;\n if (splitter)\n return splitter;\n if (this.units.toLowerCase().startsWith(NOTATION.FASTA)) {\n const alphabet = this.column.getTag(TAGS.alphabet);\n if (alphabet !== null && !this.getAlphabetIsMultichar())\n return splitterAsFastaSimple;\n else\n return splitterAsFasta;\n }\n else if (this.units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return getSplitterWithSeparator(this.separator, limit);\n else if (this.units.toLowerCase().startsWith(NOTATION.HELM))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${this.units} .`);\n // TODO: Splitter for HELM\n }\n split(seq) {\n return this.splitter(seq);\n }\n getDistanceFunctionName() {\n // TODO add support for helm and separator notation\n if (!this.isFasta())\n throw new Error('Only FASTA notation is supported');\n if (this.isMsa())\n return MmDistanceFunctionsNames.HAMMING;\n switch (this.alphabet) {\n case ALPHABET.DNA:\n case ALPHABET.RNA:\n // As DNA and RNA scoring matrices are same as identity matrices(mostly),\n // we can use very fast and optimized Levenshtein distance library\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n case ALPHABET.PT:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n // For default case, let's use Levenshtein distance\n default:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n }\n }\n getDistanceFunction() {\n return mmDistanceFunctions[this.getDistanceFunctionName()]();\n }\n // checks if the separator notation is compatible with helm library\n async checkHelmCompatibility() {\n // check first for the column tag to avoid extra processing\n if (this.column.tags.has(TAGS.isHelmCompatible))\n return this.column.getTag(TAGS.isHelmCompatible) === 'true';\n // get the monomer lib and check against the column\n const monomerLibHelper = await getMonomerLibHelper();\n const bioLib = monomerLibHelper.getBioLib();\n // retrieve peptides\n const peptides = bioLib.getMonomerSymbolsByType(\"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */);\n // convert the peptides list to a set for faster lookup\n const peptidesSet = new Set(peptides);\n // get splitter for given separator and check if all monomers are in the lib\n const splitterFunc = getSplitterWithSeparator(this.separator);\n // iterate over the columns, split them and check if all monomers are in the lib\n //TODO maybe add missing threshold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n const catIdxSet = new Set();\n const rowCount = this.column.length;\n const colRawData = this.column.getRawData();\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const catI = colRawData[rowIdx];\n if (!(catI in catIdxSet)) {\n catIdxSet.add(catI);\n const monomers = this.getSplitted(rowIdx);\n for (const cm of monomers.canonicals) {\n if (!peptidesSet.has(cm)) {\n this.column.setTag(TAGS.isHelmCompatible, 'false');\n return false;\n }\n }\n }\n }\n this.column.setTag(TAGS.isHelmCompatible, 'true');\n return true;\n }\n // -- Notation Converter --\n get splitter() {\n if (this._splitter === null)\n this._splitter = this.getSplitter();\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === NOTATION.FASTA; }\n toSeparator(targetNotation) { return targetNotation === NOTATION.SEPARATOR; }\n toHelm(targetNotation) { return targetNotation === NOTATION.HELM; }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} srcSeq 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} tgtGapOriginal Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(srcSeq, tgtNotation, tgtSeparator, tgtGapOriginal) {\n if (!tgtGapOriginal) {\n tgtGapOriginal = (this.toFasta(tgtNotation)) ?\n GapOriginals[NOTATION.FASTA] :\n GapOriginals[NOTATION.SEPARATOR];\n }\n if (!tgtSeparator)\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n const isNucleotide = srcSeq.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(srcSeq);\n const tgtMonomersArray = [];\n for (let posIdx = 0; posIdx < helmItemsArray.length; ++posIdx) {\n let om = helmItemsArray.getOriginal(posIdx);\n if (isNucleotide)\n om = om.replace(HELM_WRAPPERS_REGEXP, '');\n if (om === GapOriginals[NOTATION.HELM])\n tgtMonomersArray.push(tgtGapOriginal);\n else if (this.toFasta(tgtNotation) && om.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + om + ']';\n tgtMonomersArray.push(monomer);\n }\n else\n tgtMonomersArray.push(om);\n }\n return tgtMonomersArray.join(tgtSeparator);\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) {\n // Get joiner from the source column units handler (this) knowing about the source sequence.\n // For example, converting DNA Helm to fasta requires removing the r(X)p decoration.\n const joiner = this.getJoiner({ notation: tgtNotation, separator: tgtSeparator });\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the newly created empty column\n newColumn.init((rowIdx) => {\n const srcSS = this.getSplitted(rowIdx);\n return joiner(srcSS);\n });\n return newColumn;\n }\n /**\n * @param name\n * @param startIdx Start position index of the region (0-based)\n * @param endIdx End position index of the region (0-based, inclusive)\n */\n getRegion(startIdx, endIdx, name) {\n const regCol = this.getNewColumn(this.notation, this.separator);\n regCol.name = name;\n const startIdxVal = startIdx ?? 0;\n const endIdxVal = endIdx ?? this.maxLength - 1;\n const joiner = this.getJoiner();\n const regLength = endIdxVal - startIdxVal + 1;\n const gapOM = GapOriginals[this.notation];\n regCol.init((rowI) => {\n const seqS = this.getSplitted(rowI);\n // Custom slicing instead of array method to maintain gaps\n const regOMList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const seqJPos = startIdxVal + regJPos;\n regOMList[regJPos] = seqJPos < seqS.length ? seqS.getOriginal(seqJPos) : gapOM;\n }\n return joiner(new StringListSeqSplitted(regOMList, gapOM));\n });\n const getRegionOfPositionNames = (str) => {\n const srcPosList = str.split(',').map((p) => p.trim());\n const regPosList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const srcJPos = startIdxVal + regJPos;\n regPosList[regJPos] = srcJPos < srcPosList.length ? srcPosList[srcJPos] : '?';\n }\n return regPosList.join(positionSeparator);\n };\n const srcPositionNamesStr = this.column.getTag(TAGS.positionNames);\n if (srcPositionNamesStr)\n regCol.setTag(TAGS.positionNames, getRegionOfPositionNames(srcPositionNamesStr));\n const srcPositionLabelsStr = this.column.getTag(TAGS.positionLabels);\n if (srcPositionLabelsStr)\n regCol.setTag(TAGS.positionLabels, getRegionOfPositionNames(srcPositionLabelsStr));\n return regCol;\n }\n get joiner() {\n if (!this._joiner)\n this._joiner = this.getJoiner();\n return this._joiner;\n }\n getJoiner(opts) {\n const notation = opts ? opts.notation : this.notation;\n const separator = opts ? opts.separator : this.separator;\n let res;\n const srcSh = this;\n switch (notation) {\n case NOTATION.FASTA: {\n res = function (srcSS) { return srcSh.joinToFasta(srcSS, srcSh.isHelm()); };\n break;\n }\n case NOTATION.SEPARATOR: {\n if (!separator)\n throw new Error(`Separator is mandatory for notation '${notation}'.`);\n res = function (srcSS) { return joinToSeparator(srcSS, separator, srcSh.isHelm()); };\n break;\n }\n case NOTATION.HELM: {\n const isDnaOrRna = srcSh.alphabet === ALPHABET.DNA || srcSh.alphabet === ALPHABET.RNA;\n const wrappers = srcSh.getHelmWrappers();\n res = function (srcSS) { return joinToHelm(srcSS, wrappers, isDnaOrRna); };\n break;\n }\n default:\n throw new Error(`Unexpected notation '${notation}'.`);\n }\n return res;\n }\n getConverter(tgtUnits, tgtSeparator = undefined) {\n if (tgtUnits === NOTATION.SEPARATOR && !tgtSeparator)\n throw new Error(`Target separator is not specified for target units '${NOTATION.SEPARATOR}'.`);\n const srcSh = this;\n if (tgtUnits === NOTATION.FASTA)\n return function (srcSeq) { return srcSh.convertToFasta(srcSeq); };\n if (tgtUnits === NOTATION.HELM)\n return function (srcSeq) { return srcSh.convertToHelm(srcSeq); };\n else if (tgtUnits === NOTATION.SEPARATOR)\n return function (srcSeq) { return srcSh.convertToSeparator(srcSeq, tgtSeparator); };\n else\n throw new Error();\n }\n /** Gets a column's UnitsHandler object from temp slot or creates a new and stores it to the temp slot. */\n static forColumn(col) {\n // TODO: Invalidate col.temp[Temps.uh] checking column's metadata\n let res = col.temp[SeqTemps.seqHandler];\n if (!res || res.columnVersion !== col.version)\n res = col.temp[SeqTemps.seqHandler] = new SeqHandler(col);\n return res;\n }\n // -- joiners & converters --\n joinToFasta(seqS, isHelm) {\n const resMList = new Array(seqS.length);\n for (let posIdx = 0; posIdx < seqS.length; ++posIdx) {\n const cm = seqS.getOriginal(posIdx);\n let om = seqS.getOriginal(posIdx);\n if (isHelm)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.FASTA];\n else if (cm === PHOSPHATE_SYMBOL)\n om = '';\n else if (om.length > 1)\n om = '[' + om + ']';\n resMList[posIdx] = om;\n }\n return resMList.join('');\n }\n convertToFasta(src) {\n const srcUhSplitter = this.splitter;\n const srcSS = this.isHelm() ? this.splitterAsHelmNucl(src) : srcUhSplitter(src);\n return this.joinToFasta(srcSS, this.isHelm());\n }\n convertToSeparator(src, tgtSeparator) {\n const srcSS = this.isHelm() ? this.splitterAsHelmNucl(src) : this.splitter(src);\n return joinToSeparator(srcSS, tgtSeparator, this.isHelm());\n }\n convertToHelm(src) {\n const wrappers = this.getHelmWrappers();\n const isDnaOrRna = src.startsWith('DNA') || src.startsWith('RNA');\n const srcSS = this.splitter(src);\n return joinToHelm(srcSS, wrappers, isDnaOrRna);\n }\n /** Splits Helm sequence adjusting nucleotides to single char symbols. (!) Removes lone phosphorus. */\n splitterAsHelmNucl(src) {\n const srcMList = this.splitter(src);\n const tgtMList = new Array(srcMList.length);\n const isDna = src.startsWith('DNA');\n const isRna = src.startsWith('RNA');\n for (let posIdx = 0; posIdx < srcMList.length; ++posIdx) {\n let om = srcMList.getOriginal(posIdx);\n if (isDna || isRna) {\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n om = om === PHOSPHATE_SYMBOL ? null : om;\n }\n tgtMList[posIdx] = om ? om : null;\n }\n return new StringListSeqSplitted(tgtMList.filter((om) => !!om), GapOriginals[NOTATION.HELM]);\n }\n}\n// -- joiners --\nfunction joinToSeparator(seqS, tgtSeparator, isHelm) {\n const resMList = new Array(seqS.length);\n for (let posIdx = 0; posIdx < seqS.length; ++posIdx) {\n const cm = seqS.getCanonical(posIdx);\n let om = seqS.getOriginal(posIdx);\n if (isHelm)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.SEPARATOR];\n else if (cm === PHOSPHATE_SYMBOL)\n om = '';\n resMList[posIdx] = om;\n }\n return resMList.join(tgtSeparator);\n}\nfunction joinToHelm(srcSS, wrappers, isDnaOrRna) {\n const [prefix, leftWrapper, rightWrapper, postfix] = wrappers;\n const resOMList = new Array(srcSS.length);\n for (let posIdx = 0; posIdx < srcSS.length; ++posIdx) {\n const cm = srcSS.getCanonical(posIdx);\n let om = srcSS.getOriginal(posIdx);\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.HELM];\n else {\n if (isDnaOrRna)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n om = om.length === 1 ? `${leftWrapper}${om}${rightWrapper}` : `${leftWrapper}[${om}]${rightWrapper}`;\n }\n resOMList[posIdx] = om;\n }\n return `${prefix}${resOMList.join('.')}${postfix}`;\n}\n//# sourceMappingURL=seq-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport { SeqHandler } from './seq-handler';\nexport function splitAlignedSequences(sequenceColumn) {\n const getCol = (index) => columnList[index] ?? 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 const uh = SeqHandler.forColumn(sequenceColumn);\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const currentMonomerList = uh.getSplitted(rowIdx);\n for (let posIdx = 0; posIdx < currentMonomerList.length; ++posIdx) {\n const om = currentMonomerList.getOriginal(posIdx);\n const col = getCol(posIdx) || createCol(posIdx);\n col.set(rowIdx, om, false);\n }\n }\n return resultDf;\n}\n//# sourceMappingURL=splitter.js.map","import * as DG from 'datagrok-api/dg';\nexport var TAGS;\n(function (TAGS) {\n /** Controls displaying WebLogo in a Macromolecule column's header tooltip */\n TAGS[\"tooltipWebLogo\"] = \".tooltipWebLogo\";\n})(TAGS || (TAGS = {}));\nexport var PositionHeight;\n(function (PositionHeight) {\n PositionHeight[\"Entropy\"] = \"Entropy\";\n PositionHeight[\"full\"] = \"100%\";\n})(PositionHeight || (PositionHeight = {}));\n/** top, middle, bottom */\nexport var VerticalAlignments;\n(function (VerticalAlignments) {\n VerticalAlignments[\"TOP\"] = \"top\";\n VerticalAlignments[\"MIDDLE\"] = \"middle\";\n VerticalAlignments[\"BOTTOM\"] = \"bottom\";\n})(VerticalAlignments || (VerticalAlignments = {}));\n/** left, center, right */\nexport var HorizontalAlignments;\n(function (HorizontalAlignments) {\n HorizontalAlignments[\"LEFT\"] = \"left\";\n HorizontalAlignments[\"CENTER\"] = \"center\";\n HorizontalAlignments[\"RIGHT\"] = \"right\";\n})(HorizontalAlignments || (HorizontalAlignments = {}));\nexport var PositionMarginStates;\n(function (PositionMarginStates) {\n PositionMarginStates[\"AUTO\"] = \"auto\";\n PositionMarginStates[\"ON\"] = \"on\";\n PositionMarginStates[\"OFF\"] = \"off\";\n})(PositionMarginStates || (PositionMarginStates = {}));\n/** The source for filtering sequences considered to plot WebLogo */\nexport var FilterSources;\n(function (FilterSources) {\n /** Sequences of filtered rows are considered, default. */\n FilterSources[\"Filtered\"] = \"Filtered\";\n /** Sequences in selection are considered to plot WebLogo for faster exploration.\n * In case selection is empty displays all.\n */\n FilterSources[\"Selected\"] = \"Selected\";\n})(FilterSources || (FilterSources = {}));\nexport const WebLogoPropsDefault = new class {\n constructor() {\n // -- Data --\n this.sequenceColumnName = null;\n /** Aggregation function for values of {@link valueColumnName} */\n this.valueAggrType = DG.AGG.TOTAL_COUNT;\n /** Column name for values */\n this.valueColumnName = 'Activity';\n this.startPositionName = null;\n this.endPositionName = null;\n this.skipEmptySequences = true;\n this.skipEmptyPositions = false;\n this.shrinkEmptyTail = true;\n // -- Style --\n this.backgroundColor = 0xFFFFFFFF;\n this.positionHeight = PositionHeight.Entropy; // that is the way in the bioinformatics domain\n this.positionWidth = 16;\n // -- Layout --\n this.verticalAlignment = VerticalAlignments.MIDDLE;\n this.horizontalAlignment = HorizontalAlignments.CENTER;\n this.fixWidth = false;\n this.fitArea = true;\n this.minHeight = 50;\n this.maxHeight = 100;\n this.showPositionLabels = true;\n this.positionMarginState = PositionMarginStates.AUTO;\n this.positionMargin = 0;\n // -- Behavior --\n this.filterSource = FilterSources.Filtered;\n }\n}();\nexport const positionRe = /(\\d+)([A-Z]?)/;\n//# sourceMappingURL=web-logo.js.map","\r\nexport var exportCppDbscanLib = (() => {\r\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\r\n \r\n return (\r\nfunction(exportCppDbscanLib = {}) {\r\n\r\n// include: shell.js\r\n// The Module object: Our interface to the outside world. We import\r\n// and export values on it. There are various ways Module can be used:\r\n// 1. Not defined. We create it here\r\n// 2. A function parameter, function(Module) { ..generated code.. }\r\n// 3. pre-run appended it, var Module = {}; ..generated code..\r\n// 4. External script tag defines var Module.\r\n// We need to check if Module already exists (e.g. case 3 above).\r\n// Substitution will be replaced with actual code on later stage of the build,\r\n// this way Closure Compiler will not mangle it (e.g. case 4. above).\r\n// Note that if you want to run closure, and also to use Module\r\n// after the generated code, you will need to define var Module = {};\r\n// before the code. Then that object will be used in the code, and you\r\n// can continue to use Module afterwards as well.\r\nvar Module = typeof exportCppDbscanLib != 'undefined' ? exportCppDbscanLib : {};\r\n\r\n// Set up the promise that indicates the Module is initialized\r\nvar readyPromiseResolve, readyPromiseReject;\r\nModule['ready'] = new Promise(function(resolve, reject) {\r\n readyPromiseResolve = resolve;\r\n readyPromiseReject = reject;\r\n});\r\n\r\n// --pre-jses are emitted after the Module integration code, so that they can\r\n// refer to Module (if they choose; they can also define Module)\r\n\r\n\r\n// Sometimes an existing Module object exists with properties\r\n// meant to overwrite the default module functionality. Here\r\n// we collect those properties and reapply _after_ we configure\r\n// the current environment's defaults to avoid having to be so\r\n// defensive during initialization.\r\nvar moduleOverrides = Object.assign({}, Module);\r\n\r\nvar arguments_ = [];\r\nvar thisProgram = './this.program';\r\nvar quit_ = (status, toThrow) => {\r\n throw toThrow;\r\n};\r\n\r\n// Determine the runtime environment we are in. You can customize this by\r\n// setting the ENVIRONMENT setting at compile time (see settings.js).\r\n\r\n// Attempt to auto-detect the environment\r\nvar ENVIRONMENT_IS_WEB = typeof window == 'object';\r\nvar ENVIRONMENT_IS_WORKER = typeof importScripts == 'function';\r\n// N.b. Electron.js environment is simultaneously a NODE-environment, but\r\n// also a web environment.\r\nvar ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string';\r\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\r\n\r\n// `/` should be present at the end if `scriptDirectory` is not empty\r\nvar scriptDirectory = '';\r\nfunction locateFile(path) {\r\n if (Module['locateFile']) {\r\n return Module['locateFile'](path, scriptDirectory);\r\n }\r\n return scriptDirectory + path;\r\n}\r\n\r\n// Hooks that are implemented differently in different runtime environments.\r\nvar read_,\r\n readAsync,\r\n readBinary,\r\n setWindowTitle;\r\n\r\n// Note that this includes Node.js workers when relevant (pthreads is enabled).\r\n// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and\r\n// ENVIRONMENT_IS_NODE.\r\nif (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\r\n if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled\r\n scriptDirectory = self.location.href;\r\n } else if (typeof document != 'undefined' && document.currentScript) { // web\r\n scriptDirectory = document.currentScript.src;\r\n }\r\n // When MODULARIZE, this JS may be executed later, after document.currentScript\r\n // is gone, so we saved it, and we use it here instead of any other info.\r\n if (_scriptDir) {\r\n scriptDirectory = _scriptDir;\r\n }\r\n // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.\r\n // otherwise, slice off the final part of the url to find the script directory.\r\n // if scriptDirectory does not contain a slash, lastIndexOf will return -1,\r\n // and scriptDirectory will correctly be replaced with an empty string.\r\n // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),\r\n // they are removed because they could contain a slash.\r\n if (scriptDirectory.indexOf('blob:') !== 0) {\r\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf('/')+1);\r\n } else {\r\n scriptDirectory = '';\r\n }\r\n\r\n // Differentiate the Web Worker from the Node Worker case, as reading must\r\n // be done differently.\r\n {\r\n// include: web_or_worker_shell_read.js\r\nread_ = (url) => {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, false);\r\n xhr.send(null);\r\n return xhr.responseText;\r\n }\r\n\r\n if (ENVIRONMENT_IS_WORKER) {\r\n readBinary = (url) => {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, false);\r\n xhr.responseType = 'arraybuffer';\r\n xhr.send(null);\r\n return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));\r\n };\r\n }\r\n\r\n readAsync = (url, onload, onerror) => {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open('GET', url, true);\r\n xhr.responseType = 'arraybuffer';\r\n xhr.onload = () => {\r\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\r\n onload(xhr.response);\r\n return;\r\n }\r\n onerror();\r\n };\r\n xhr.onerror = onerror;\r\n xhr.send(null);\r\n }\r\n\r\n// end include: web_or_worker_shell_read.js\r\n }\r\n\r\n setWindowTitle = (title) => document.title = title;\r\n} else\r\n{\r\n}\r\n\r\nvar out = Module['print'] || console.log.bind(console);\r\nvar err = Module['printErr'] || console.warn.bind(console);\r\n\r\n// Merge back in the overrides\r\nObject.assign(Module, moduleOverrides);\r\n// Free the object hierarchy contained in the overrides, this lets the GC\r\n// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.\r\nmoduleOverrides = null;\r\n\r\n// Emit code to handle expected values on the Module object. This applies Module.x\r\n// to the proper local x. This has two benefits: first, we only emit it if it is\r\n// expected to arrive, and second, by using a local everywhere else that can be\r\n// minified.\r\n\r\nif (Module['arguments']) arguments_ = Module['arguments'];\r\n\r\nif (Module['thisProgram']) thisProgram = Module['thisProgram'];\r\n\r\nif (Module['quit']) quit_ = Module['quit'];\r\n\r\n// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message\r\n\r\n\r\n// end include: shell.js\r\n// include: preamble.js\r\n// === Preamble library stuff ===\r\n\r\n// Documentation for the public APIs defined in this file must be updated in:\r\n// site/source/docs/api_reference/preamble.js.rst\r\n// A prebuilt local version of the documentation is available at:\r\n// site/build/text/docs/api_reference/preamble.js.txt\r\n// You can also build docs locally as HTML or other formats in site/\r\n// An online HTML version (which may be of a different version of Emscripten)\r\n// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html\r\n\r\nvar wasmBinary;\r\nif (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];\r\nvar noExitRuntime = Module['noExitRuntime'] || true;\r\n\r\nif (typeof WebAssembly != 'object') {\r\n abort('no native wasm support detected');\r\n}\r\n\r\n// Wasm globals\r\n\r\nvar wasmMemory;\r\n\r\n//========================================\r\n// Runtime essentials\r\n//========================================\r\n\r\n// whether we are quitting the application. no code should run after this.\r\n// set in exit() and abort()\r\nvar ABORT = false;\r\n\r\n// set by exit() and abort(). Passed to 'onExit' handler.\r\n// NOTE: This is also used as the process return code code in shell environments\r\n// but only when noExitRuntime is false.\r\nvar EXITSTATUS;\r\n\r\n/** @type {function(*, string=)} */\r\nfunction assert(condition, text) {\r\n if (!condition) {\r\n // This build was created without ASSERTIONS defined. `assert()` should not\r\n // ever be called in this configuration but in case there are callers in\r\n // the wild leave this simple abort() implemenation here for now.\r\n abort(text);\r\n }\r\n}\r\n\r\n// Memory management\r\n\r\nvar HEAP,\r\n/** @type {!Int8Array} */\r\n HEAP8,\r\n/** @type {!Uint8Array} */\r\n HEAPU8,\r\n/** @type {!Int16Array} */\r\n HEAP16,\r\n/** @type {!Uint16Array} */\r\n HEAPU16,\r\n/** @type {!Int32Array} */\r\n HEAP32,\r\n/** @type {!Uint32Array} */\r\n HEAPU32,\r\n/** @type {!Float32Array} */\r\n HEAPF32,\r\n/** @type {!Float64Array} */\r\n HEAPF64;\r\n\r\nfunction updateMemoryViews() {\r\n var b = wasmMemory.buffer;\r\n Module['HEAP8'] = HEAP8 = new Int8Array(b);\r\n Module['HEAP16'] = HEAP16 = new Int16Array(b);\r\n Module['HEAP32'] = HEAP32 = new Int32Array(b);\r\n Module['HEAPU8'] = HEAPU8 = new Uint8Array(b);\r\n Module['HEAPU16'] = HEAPU16 = new Uint16Array(b);\r\n Module['HEAPU32'] = HEAPU32 = new Uint32Array(b);\r\n Module['HEAPF32'] = HEAPF32 = new Float32Array(b);\r\n Module['HEAPF64'] = HEAPF64 = new Float64Array(b);\r\n}\r\n\r\n// include: runtime_init_table.js\r\n// In regular non-RELOCATABLE mode the table is exported\r\n// from the wasm module and this will be assigned once\r\n// the exports are available.\r\nvar wasmTable;\r\n\r\n// end include: runtime_init_table.js\r\n// include: runtime_stack_check.js\r\n// end include: runtime_stack_check.js\r\n// include: runtime_assertions.js\r\n// end include: runtime_assertions.js\r\nvar __ATPRERUN__ = []; // functions called before the runtime is initialized\r\nvar __ATINIT__ = []; // functions called during startup\r\nvar __ATEXIT__ = []; // functions called during shutdown\r\nvar __ATPOSTRUN__ = []; // functions called after the main() is called\r\n\r\nvar runtimeInitialized = false;\r\n\r\nvar runtimeKeepaliveCounter = 0;\r\n\r\nfunction keepRuntimeAlive() {\r\n return noExitRuntime || runtimeKeepaliveCounter > 0;\r\n}\r\n\r\nfunction preRun() {\r\n if (Module['preRun']) {\r\n if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\r\n while (Module['preRun'].length) {\r\n addOnPreRun(Module['preRun'].shift());\r\n }\r\n }\r\n callRuntimeCallbacks(__ATPRERUN__);\r\n}\r\n\r\nfunction initRuntime() {\r\n runtimeInitialized = true;\r\n\r\n \r\n callRuntimeCallbacks(__ATINIT__);\r\n}\r\n\r\nfunction postRun() {\r\n\r\n if (Module['postRun']) {\r\n if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\r\n while (Module['postRun'].length) {\r\n addOnPostRun(Module['postRun'].shift());\r\n }\r\n }\r\n\r\n callRuntimeCallbacks(__ATPOSTRUN__);\r\n}\r\n\r\nfunction addOnPreRun(cb) {\r\n __ATPRERUN__.unshift(cb);\r\n}\r\n\r\nfunction addOnInit(cb) {\r\n __ATINIT__.unshift(cb);\r\n}\r\n\r\nfunction addOnExit(cb) {\r\n}\r\n\r\nfunction addOnPostRun(cb) {\r\n __ATPOSTRUN__.unshift(cb);\r\n}\r\n\r\n// include: runtime_math.js\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc\r\n\r\n// end include: runtime_math.js\r\n// A counter of dependencies for calling run(). If we need to\r\n// do asynchronous work before running, increment this and\r\n// decrement it. Incrementing must happen in a place like\r\n// Module.preRun (used by emcc to add file preloading).\r\n// Note that you can add dependencies in preRun, even though\r\n// it happens right before run - run will be postponed until\r\n// the dependencies are met.\r\nvar runDependencies = 0;\r\nvar runDependencyWatcher = null;\r\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\r\n\r\nfunction getUniqueRunDependency(id) {\r\n return id;\r\n}\r\n\r\nfunction addRunDependency(id) {\r\n runDependencies++;\r\n\r\n if (Module['monitorRunDependencies']) {\r\n Module['monitorRunDependencies'](runDependencies);\r\n }\r\n\r\n}\r\n\r\nfunction removeRunDependency(id) {\r\n runDependencies--;\r\n\r\n if (Module['monitorRunDependencies']) {\r\n Module['monitorRunDependencies'](runDependencies);\r\n }\r\n\r\n if (runDependencies == 0) {\r\n if (runDependencyWatcher !== null) {\r\n clearInterval(runDependencyWatcher);\r\n runDependencyWatcher = null;\r\n }\r\n if (dependenciesFulfilled) {\r\n var callback = dependenciesFulfilled;\r\n dependenciesFulfilled = null;\r\n callback(); // can add another dependenciesFulfilled\r\n }\r\n }\r\n}\r\n\r\n/** @param {string|number=} what */\r\nfunction abort(what) {\r\n if (Module['onAbort']) {\r\n Module['onAbort'](what);\r\n }\r\n\r\n what = 'Aborted(' + what + ')';\r\n // TODO(sbc): Should we remove printing and leave it up to whoever\r\n // catches the exception?\r\n err(what);\r\n\r\n ABORT = true;\r\n EXITSTATUS = 1;\r\n\r\n what += '. Build with -sASSERTIONS for more info.';\r\n\r\n // Use a wasm runtime error, because a JS error might be seen as a foreign\r\n // exception, which means we'd run destructors on it. We need the error to\r\n // simply make the program stop.\r\n // FIXME This approach does not work in Wasm EH because it currently does not assume\r\n // all RuntimeErrors are from traps; it decides whether a RuntimeError is from\r\n // a trap or not based on a hidden field within the object. So at the moment\r\n // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that\r\n // allows this in the wasm spec.\r\n\r\n // Suppress closure compiler warning here. Closure compiler's builtin extern\r\n // defintion for WebAssembly.RuntimeError claims it takes no arguments even\r\n // though it can.\r\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.\r\n /** @suppress {checkTypes} */\r\n var e = new WebAssembly.RuntimeError(what);\r\n\r\n readyPromiseReject(e);\r\n // Throw the error whether or not MODULARIZE is set because abort is used\r\n // in code paths apart from instantiation where an exception is expected\r\n // to be thrown when abort is called.\r\n throw e;\r\n}\r\n\r\n// include: memoryprofiler.js\r\n// end include: memoryprofiler.js\r\n// include: URIUtils.js\r\n// Prefix of data URIs emitted by SINGLE_FILE and related options.\r\nvar dataURIPrefix = 'data:application/octet-stream;base64,';\r\n\r\n// Indicates whether filename is a base64 data URI.\r\nfunction isDataURI(filename) {\r\n // Prefix of data URIs emitted by SINGLE_FILE and related options.\r\n return filename.startsWith(dataURIPrefix);\r\n}\r\n\r\n// Indicates whether filename is delivered via file protocol (as opposed to http/https)\r\nfunction isFileURI(filename) {\r\n return filename.startsWith('file://');\r\n}\r\n\r\n// end include: URIUtils.js\r\n// include: runtime_exceptions.js\r\n// end include: runtime_exceptions.js\r\nvar wasmBinaryFile;\r\n wasmBinaryFile = 'wasmDbscan.wasm';\r\n if (!isDataURI(wasmBinaryFile)) {\r\n wasmBinaryFile = locateFile(wasmBinaryFile);\r\n }\r\n\r\nfunction getBinary(file) {\r\n try {\r\n if (file == wasmBinaryFile && wasmBinary) {\r\n return new Uint8Array(wasmBinary);\r\n }\r\n if (readBinary) {\r\n return readBinary(file);\r\n }\r\n throw \"both async and sync fetching of the wasm failed\";\r\n }\r\n catch (err) {\r\n abort(err);\r\n }\r\n}\r\n\r\nfunction getBinaryPromise(binaryFile) {\r\n // If we don't have the binary yet, try to load it asynchronously.\r\n // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.\r\n // See https://github.com/github/fetch/pull/92#issuecomment-140665932\r\n // Cordova or Electron apps are typically loaded from a file:// url.\r\n // So use fetch if it is available and the url is not a file, otherwise fall back to XHR.\r\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\r\n if (typeof fetch == 'function'\r\n ) {\r\n return fetch(binaryFile, { credentials: 'same-origin' }).then(function(response) {\r\n if (!response['ok']) {\r\n throw \"failed to load wasm binary file at '\" + binaryFile + \"'\";\r\n }\r\n return response['arrayBuffer']();\r\n }).catch(function () {\r\n return getBinary(binaryFile);\r\n });\r\n }\r\n }\r\n\r\n // Otherwise, getBinary should be able to get it synchronously\r\n return Promise.resolve().then(function() { return getBinary(binaryFile); });\r\n}\r\n\r\nfunction instantiateArrayBuffer(binaryFile, imports, receiver) {\r\n return getBinaryPromise(binaryFile).then(function(binary) {\r\n return WebAssembly.instantiate(binary, imports);\r\n }).then(function (instance) {\r\n return instance;\r\n }).then(receiver, function(reason) {\r\n err('failed to asynchronously prepare wasm: ' + reason);\r\n\r\n abort(reason);\r\n });\r\n}\r\n\r\nfunction instantiateAsync(binary, binaryFile, imports, callback) {\r\n if (!binary &&\r\n typeof WebAssembly.instantiateStreaming == 'function' &&\r\n !isDataURI(binaryFile) &&\r\n typeof fetch == 'function') {\r\n return fetch(binaryFile, { credentials: 'same-origin' }).then(function(response) {\r\n // Suppress closure warning here since the upstream definition for\r\n // instantiateStreaming only allows Promise<Repsponse> rather than\r\n // an actual Response.\r\n // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.\r\n /** @suppress {checkTypes} */\r\n var result = WebAssembly.instantiateStreaming(response, imports);\r\n\r\n return result.then(\r\n callback,\r\n function(reason) {\r\n // We expect the most common failure cause to be a bad MIME type for the binary,\r\n // in which case falling back to ArrayBuffer instantiation should work.\r\n err('wasm streaming compile failed: ' + reason);\r\n err('falling back to ArrayBuffer instantiation');\r\n return instantiateArrayBuffer(binaryFile, imports, callback);\r\n });\r\n });\r\n } else {\r\n return instantiateArrayBuffer(binaryFile, imports, callback);\r\n }\r\n}\r\n\r\n// Create the wasm instance.\r\n// Receives the wasm imports, returns the exports.\r\nfunction createWasm() {\r\n // prepare imports\r\n var info = {\r\n 'env': wasmImports,\r\n 'wasi_snapshot_preview1': wasmImports,\r\n };\r\n // Load the wasm module and create an instance of using native support in the JS engine.\r\n // handle a generated wasm instance, receiving its exports and\r\n // performing other necessary setup\r\n /** @param {WebAssembly.Module=} module*/\r\n function receiveInstance(instance, module) {\r\n var exports = instance.exports;\r\n\r\n Module['asm'] = exports;\r\n\r\n wasmMemory = Module['asm']['memory'];\r\n updateMemoryViews();\r\n\r\n wasmTable = Module['asm']['__indirect_function_table'];\r\n\r\n addOnInit(Module['asm']['__wasm_call_ctors']);\r\n\r\n removeRunDependency('wasm-instantiate');\r\n\r\n return exports;\r\n }\r\n // wait for the pthread pool (if any)\r\n addRunDependency('wasm-instantiate');\r\n\r\n // Prefer streaming instantiation if available.\r\n function receiveInstantiationResult(result) {\r\n // 'result' is a ResultObject object which has both the module and instance.\r\n // receiveInstance() will swap in the exports (to Module.asm) so they can be called\r\n // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.\r\n // When the regression is fixed, can restore the above PTHREADS-enabled path.\r\n receiveInstance(result['instance']);\r\n }\r\n\r\n // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback\r\n // to manually instantiate the Wasm module themselves. This allows pages to\r\n // run the instantiation parallel to any other async startup actions they are\r\n // performing.\r\n // Also pthreads and wasm workers initialize the wasm instance through this\r\n // path.\r\n if (Module['instantiateWasm']) {\r\n\r\n try {\r\n return Module['instantiateWasm'](info, receiveInstance);\r\n } catch(e) {\r\n err('Module.instantiateWasm callback failed with error: ' + e);\r\n // If instantiation fails, reject the module ready promise.\r\n readyPromiseReject(e);\r\n }\r\n }\r\n\r\n // If instantiation fails, reject the module ready promise.\r\n instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject);\r\n return {}; // no exports yet; we'll fill them in later\r\n}\r\n\r\n// Globals used by JS i64 conversions (see makeSetValue)\r\nvar tempDouble;\r\nvar tempI64;\r\n\r\n// include: runtime_debug.js\r\n// end include: runtime_debug.js\r\n// === Body ===\r\n\r\n\r\n// end include: preamble.js\r\n\r\n /** @constructor */\r\n function ExitStatus(status) {\r\n this.name = 'ExitStatus';\r\n this.message = 'Program terminated with exit(' + status + ')';\r\n this.status = status;\r\n }\r\n\r\n function callRuntimeCallbacks(callbacks) {\r\n while (callbacks.length > 0) {\r\n // Pass the module as the first argument.\r\n callbacks.shift()(Module);\r\n }\r\n }\r\n\r\n \r\n /**\r\n * @param {number} ptr\r\n * @param {string} type\r\n */\r\n function getValue(ptr, type = 'i8') {\r\n if (type.endsWith('*')) type = '*';\r\n switch (type) {\r\n case 'i1': return HEAP8[((ptr)>>0)];\r\n case 'i8': return HEAP8[((ptr)>>0)];\r\n case 'i16': return HEAP16[((ptr)>>1)];\r\n case 'i32': return HEAP32[((ptr)>>2)];\r\n case 'i64': return HEAP32[((ptr)>>2)];\r\n case 'float': return HEAPF32[((ptr)>>2)];\r\n case 'double': return HEAPF64[((ptr)>>3)];\r\n case '*': return HEAPU32[((ptr)>>2)];\r\n default: abort('invalid type for getValue: ' + type);\r\n }\r\n }\r\n\r\n \r\n /**\r\n * @param {number} ptr\r\n * @param {number} value\r\n * @param {string} type\r\n */\r\n function setValue(ptr, value, type = 'i8') {\r\n if (type.endsWith('*')) type = '*';\r\n switch (type) {\r\n case 'i1': HEAP8[((ptr)>>0)] = value; break;\r\n case 'i8': HEAP8[((ptr)>>0)] = value; break;\r\n case 'i16': HEAP16[((ptr)>>1)] = value; break;\r\n case 'i32': HEAP32[((ptr)>>2)] = value; break;\r\n case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break;\r\n case 'float': HEAPF32[((ptr)>>2)] = value; break;\r\n case 'double': HEAPF64[((ptr)>>3)] = value; break;\r\n case '*': HEAPU32[((ptr)>>2)] = value; break;\r\n default: abort('invalid type for setValue: ' + type);\r\n }\r\n }\r\n\r\n /** @constructor */\r\n function ExceptionInfo(excPtr) {\r\n this.excPtr = excPtr;\r\n this.ptr = excPtr - 24;\r\n \r\n this.set_type = function(type) {\r\n HEAPU32[(((this.ptr)+(4))>>2)] = type;\r\n };\r\n \r\n this.get_type = function() {\r\n return HEAPU32[(((this.ptr)+(4))>>2)];\r\n };\r\n \r\n this.set_destructor = function(destructor) {\r\n HEAPU32[(((this.ptr)+(8))>>2)] = destructor;\r\n };\r\n \r\n this.get_destructor = function() {\r\n return HEAPU32[(((this.ptr)+(8))>>2)];\r\n };\r\n \r\n this.set_caught = function (caught) {\r\n caught = caught ? 1 : 0;\r\n HEAP8[(((this.ptr)+(12))>>0)] = caught;\r\n };\r\n \r\n this.get_caught = function () {\r\n return HEAP8[(((this.ptr)+(12))>>0)] != 0;\r\n };\r\n \r\n this.set_rethrown = function (rethrown) {\r\n rethrown = rethrown ? 1 : 0;\r\n HEAP8[(((this.ptr)+(13))>>0)] = rethrown;\r\n };\r\n \r\n this.get_rethrown = function () {\r\n return HEAP8[(((this.ptr)+(13))>>0)] != 0;\r\n };\r\n \r\n // Initialize native structure fields. Should be called once after allocated.\r\n this.init = function(type, destructor) {\r\n this.set_adjusted_ptr(0);\r\n this.set_type(type);\r\n this.set_destructor(destructor);\r\n }\r\n \r\n this.set_adjusted_ptr = function(adjustedPtr) {\r\n HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr;\r\n };\r\n \r\n this.get_adjusted_ptr = function() {\r\n return HEAPU32[(((this.ptr)+(16))>>2)];\r\n };\r\n \r\n // Get pointer which is expected to be received by catch clause in C++ code. It may be adjusted\r\n // when the pointer is casted to some of the exception object base classes (e.g. when virtual\r\n // inheritance is used). When a pointer is thrown this method should return the thrown pointer\r\n // itself.\r\n this.get_exception_ptr = function() {\r\n // Work around a fastcomp bug, this code is still included for some reason in a build without\r\n // exceptions support.\r\n var isPointer = ___cxa_is_pointer_type(this.get_type());\r\n if (isPointer) {\r\n return HEAPU32[((this.excPtr)>>2)];\r\n }\r\n var adjusted = this.get_adjusted_ptr();\r\n if (adjusted !== 0) return adjusted;\r\n return this.excPtr;\r\n };\r\n }\r\n \r\n var exceptionLast = 0;\r\n \r\n var uncaughtExceptionCount = 0;\r\n function ___cxa_throw(ptr, type, destructor) {\r\n var info = new ExceptionInfo(ptr);\r\n // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception.\r\n info.init(type, destructor);\r\n exceptionLast = ptr;\r\n uncaughtExceptionCount++;\r\n throw exceptionLast;\r\n }\r\n\r\n function _abort() {\r\n abort('');\r\n }\r\n\r\n function _emscripten_memcpy_big(dest, src, num) {\r\n HEAPU8.copyWithin(dest, src, src + num);\r\n }\r\n\r\n function getHeapMax() {\r\n // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate\r\n // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side\r\n // for any code that deals with heap sizes, which would require special\r\n // casing all heap size related code to treat 0 specially.\r\n return 2147483648;\r\n }\r\n \r\n function emscripten_realloc_buffer(size) {\r\n var b = wasmMemory.buffer;\r\n try {\r\n // round size grow request up to wasm page size (fixed 64KB per spec)\r\n wasmMemory.grow((size - b.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size\r\n updateMemoryViews();\r\n return 1 /*success*/;\r\n } catch(e) {\r\n }\r\n // implicit 0 return to save code size (caller will cast \"undefined\" into 0\r\n // anyhow)\r\n }\r\n function _emscripten_resize_heap(requestedSize) {\r\n var oldSize = HEAPU8.length;\r\n requestedSize = requestedSize >>> 0;\r\n // With multithreaded builds, races can happen (another thread might increase the size\r\n // in between), so return a failure, and let the caller retry.\r\n \r\n // Memory resize rules:\r\n // 1. Always increase heap size to at least the requested size, rounded up\r\n // to next page multiple.\r\n // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap\r\n // geometrically: increase the heap size according to\r\n // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most\r\n // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).\r\n // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap\r\n // linearly: increase the heap size by at least\r\n // MEMORY_GROWTH_LINEAR_STEP bytes.\r\n // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by\r\n // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest\r\n // 4. If we were unable to allocate as much memory, it may be due to\r\n // over-eager decision to excessively reserve due to (3) above.\r\n // Hence if an allocation fails, cut down on the amount of excess\r\n // growth, in an attempt to succeed to perform a smaller allocation.\r\n \r\n // A limit is set for how much we can grow. We should not exceed that\r\n // (the wasm binary specifies it, so if we tried, we'd fail anyhow).\r\n var maxHeapSize = getHeapMax();\r\n if (requestedSize > maxHeapSize) {\r\n return false;\r\n }\r\n \r\n let alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;\r\n \r\n // Loop through potential heap size increases. If we attempt a too eager\r\n // reservation that fails, cut down on the attempted size and reserve a\r\n // smaller bump instead. (max 3 times, chosen somewhat arbitrarily)\r\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\r\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth\r\n // but limit overreserving (default to capping at +96MB overgrowth at most)\r\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 );\r\n \r\n var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\r\n \r\n var replacement = emscripten_realloc_buffer(newSize);\r\n if (replacement) {\r\n \r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function getCFunc(ident) {\r\n var func = Module['_' + ident]; // closure exported function\r\n return func;\r\n }\r\n \r\n \r\n function writeArrayToMemory(array, buffer) {\r\n HEAP8.set(array, buffer);\r\n }\r\n \r\n function lengthBytesUTF8(str) {\r\n var len = 0;\r\n for (var i = 0; i < str.length; ++i) {\r\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\r\n // unit, not a Unicode code point of the character! So decode\r\n // UTF16->UTF32->UTF8.\r\n // See http://unicode.org/faq/utf_bom.html#utf16-3\r\n var c = str.charCodeAt(i); // possibly a lead surrogate\r\n if (c <= 0x7F) {\r\n len++;\r\n } else if (c <= 0x7FF) {\r\n len += 2;\r\n } else if (c >= 0xD800 && c <= 0xDFFF) {\r\n len += 4; ++i;\r\n } else {\r\n len += 3;\r\n }\r\n }\r\n return len;\r\n }\r\n \r\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\r\n // Parameter maxBytesToWrite is not optional. Negative values, 0, null,\r\n // undefined and false each don't write out any bytes.\r\n if (!(maxBytesToWrite > 0))\r\n return 0;\r\n \r\n var startIdx = outIdx;\r\n var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.\r\n for (var i = 0; i < str.length; ++i) {\r\n // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code\r\n // unit, not a Unicode code point of the character! So decode\r\n // UTF16->UTF32->UTF8.\r\n // See http://unicode.org/faq/utf_bom.html#utf16-3\r\n // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description\r\n // and https://www.ietf.org/rfc/rfc2279.txt\r\n // and https://tools.ietf.org/html/rfc3629\r\n var u = str.charCodeAt(i); // possibly a lead surrogate\r\n if (u >= 0xD800 && u <= 0xDFFF) {\r\n var u1 = str.charCodeAt(++i);\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n if (outIdx >= endIdx) break;\r\n heap[outIdx++] = u;\r\n } else if (u <= 0x7FF) {\r\n if (outIdx + 1 >= endIdx) break;\r\n heap[outIdx++] = 0xC0 | (u >> 6);\r\n heap[outIdx++] = 0x80 | (u & 63);\r\n } else if (u <= 0xFFFF) {\r\n if (outIdx + 2 >= endIdx) break;\r\n heap[outIdx++] = 0xE0 | (u >> 12);\r\n heap[outIdx++] = 0x80 | ((u >> 6) & 63);\r\n heap[outIdx++] = 0x80 | (u & 63);\r\n } else {\r\n if (outIdx + 3 >= endIdx) break;\r\n heap[outIdx++] = 0xF0 | (u >> 18);\r\n heap[outIdx++] = 0x80 | ((u >> 12) & 63);\r\n heap[outIdx++] = 0x80 | ((u >> 6) & 63);\r\n heap[outIdx++] = 0x80 | (u & 63);\r\n }\r\n }\r\n // Null-terminate the pointer to the buffer.\r\n heap[outIdx] = 0;\r\n return outIdx - startIdx;\r\n }\r\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\r\n return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);\r\n }\r\n function stringToUTF8OnStack(str) {\r\n var size = lengthBytesUTF8(str) + 1;\r\n var ret = stackAlloc(size);\r\n stringToUTF8(str, ret, size);\r\n return ret;\r\n }\r\n \r\n var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;\r\n \r\n /**\r\n * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given\r\n * array that contains uint8 values, returns a copy of that string as a\r\n * Javascript String object.\r\n * heapOrArray is either a regular array, or a JavaScript typed array view.\r\n * @param {number} idx\r\n * @param {number=} maxBytesToRead\r\n * @return {string}\r\n */\r\n function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {\r\n var endIdx = idx + maxBytesToRead;\r\n var endPtr = idx;\r\n // TextDecoder needs to know the byte length in advance, it doesn't stop on\r\n // null terminator by itself. Also, use the length info to avoid running tiny\r\n // strings through TextDecoder, since .subarray() allocates garbage.\r\n // (As a tiny code save trick, compare endPtr against endIdx using a negation,\r\n // so that undefined means Infinity)\r\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\r\n \r\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\r\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\r\n }\r\n var str = '';\r\n // If building with TextDecoder, we have already computed the string length\r\n // above, so test loop end condition against that\r\n while (idx < endPtr) {\r\n // For UTF8 byte structure, see:\r\n // http://en.wikipedia.org/wiki/UTF-8#Description\r\n // https://www.ietf.org/rfc/rfc2279.txt\r\n // https://tools.ietf.org/html/rfc3629\r\n var u0 = heapOrArray[idx++];\r\n if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }\r\n var u1 = heapOrArray[idx++] & 63;\r\n if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }\r\n var u2 = heapOrArray[idx++] & 63;\r\n if ((u0 & 0xF0) == 0xE0) {\r\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);\r\n }\r\n \r\n if (u0 < 0x10000) {\r\n str += String.fromCharCode(u0);\r\n } else {\r\n var ch = u0 - 0x10000;\r\n str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\r\n }\r\n }\r\n return str;\r\n }\r\n \r\n \r\n /**\r\n * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the\r\n * emscripten HEAP, returns a copy of that string as a Javascript String object.\r\n *\r\n * @param {number} ptr\r\n * @param {number=} maxBytesToRead - An optional length that specifies the\r\n * maximum number of bytes to read. You can omit this parameter to scan the\r\n * string until the first \u0000 byte. If maxBytesToRead is passed, and the string\r\n * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the\r\n * string will cut short at that byte index (i.e. maxBytesToRead will not\r\n * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing\r\n * frequent uses of UTF8ToString() with and without maxBytesToRead may throw\r\n * JS JIT optimizations off, so it is worth to consider consistently using one\r\n * @return {string}\r\n */\r\n function UTF8ToString(ptr, maxBytesToRead) {\r\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';\r\n }\r\n \r\n /**\r\n * @param {string|null=} returnType\r\n * @param {Array=} argTypes\r\n * @param {Arguments|Array=} args\r\n * @param {Object=} opts\r\n */\r\n function ccall(ident, returnType, argTypes, args, opts) {\r\n // For fast lookup of conversion functions\r\n var toC = {\r\n 'string': (str) => {\r\n var ret = 0;\r\n if (str !== null && str !== undefined && str !== 0) { // null string\r\n // at most 4 bytes per UTF-8 code point, +1 for the trailing '\\0'\r\n ret = stringToUTF8OnStack(str);\r\n }\r\n return ret;\r\n },\r\n 'array': (arr) => {\r\n var ret = stackAlloc(arr.length);\r\n writeArrayToMemory(arr, ret);\r\n return ret;\r\n }\r\n };\r\n \r\n function convertReturnValue(ret) {\r\n if (returnType === 'string') {\r\n \r\n return UTF8ToString(ret);\r\n }\r\n if (returnType === 'boolean') return Boolean(ret);\r\n return ret;\r\n }\r\n \r\n var func = getCFunc(ident);\r\n var cArgs = [];\r\n var stack = 0;\r\n if (args) {\r\n for (var i = 0; i < args.length; i++) {\r\n var converter = toC[argTypes[i]];\r\n if (converter) {\r\n if (stack === 0) stack = stackSave();\r\n cArgs[i] = converter(args[i]);\r\n } else {\r\n cArgs[i] = args[i];\r\n }\r\n }\r\n }\r\n var ret = func.apply(null, cArgs);\r\n function onDone(ret) {\r\n if (stack !== 0) stackRestore(stack);\r\n return convertReturnValue(ret);\r\n }\r\n \r\n ret = onDone(ret);\r\n return ret;\r\n }\r\n \r\n /**\r\n * @param {string=} returnType\r\n * @param {Array=} argTypes\r\n * @param {Object=} opts\r\n */\r\n function cwrap(ident, returnType, argTypes, opts) {\r\n // When the function takes numbers and returns a number, we can just return\r\n // the original function\r\n var numericArgs = !argTypes || argTypes.every((type) => type === 'number' || type === 'boolean');\r\n var numericRet = returnType !== 'string';\r\n if (numericRet && numericArgs && !opts) {\r\n return getCFunc(ident);\r\n }\r\n return function() {\r\n return ccall(ident, returnType, argTypes, arguments, opts);\r\n }\r\n }\r\n\r\nvar wasmImports = {\r\n \"__cxa_throw\": ___cxa_throw,\r\n \"abort\": _abort,\r\n \"emscripten_memcpy_big\": _emscripten_memcpy_big,\r\n \"emscripten_resize_heap\": _emscripten_resize_heap\r\n};\r\nvar asm = createWasm();\r\n/** @type {function(...*):?} */\r\nvar ___wasm_call_ctors = function() {\r\n return (___wasm_call_ctors = Module[\"asm\"][\"__wasm_call_ctors\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar _dbscan = Module[\"_dbscan\"] = function() {\r\n return (_dbscan = Module[\"_dbscan\"] = Module[\"asm\"][\"dbscan\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar ___errno_location = function() {\r\n return (___errno_location = Module[\"asm\"][\"__errno_location\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar _malloc = Module[\"_malloc\"] = function() {\r\n return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"malloc\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar _free = Module[\"_free\"] = function() {\r\n return (_free = Module[\"_free\"] = Module[\"asm\"][\"free\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar stackSave = function() {\r\n return (stackSave = Module[\"asm\"][\"stackSave\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar stackRestore = function() {\r\n return (stackRestore = Module[\"asm\"][\"stackRestore\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar stackAlloc = function() {\r\n return (stackAlloc = Module[\"asm\"][\"stackAlloc\"]).apply(null, arguments);\r\n};\r\n\r\n/** @type {function(...*):?} */\r\nvar ___cxa_is_pointer_type = function() {\r\n return (___cxa_is_pointer_type = Module[\"asm\"][\"__cxa_is_pointer_type\"]).apply(null, arguments);\r\n};\r\n\r\n\r\n\r\n// include: postamble.js\r\n// === Auto-generated postamble setup entry stuff ===\r\n\r\nModule[\"ccall\"] = ccall;\r\nModule[\"cwrap\"] = cwrap;\r\n\r\n\r\nvar calledRun;\r\n\r\ndependenciesFulfilled = function runCaller() {\r\n // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\r\n if (!calledRun) run();\r\n if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\r\n};\r\n\r\nfunction run() {\r\n\r\n if (runDependencies > 0) {\r\n return;\r\n }\r\n\r\n preRun();\r\n\r\n // a preRun added a dependency, run will be called later\r\n if (runDependencies > 0) {\r\n return;\r\n }\r\n\r\n function doRun() {\r\n // run may have just been called through dependencies being fulfilled just in this very frame,\r\n // or while the async setStatus time below was happening\r\n if (calledRun) return;\r\n calledRun = true;\r\n Module['calledRun'] = true;\r\n\r\n if (ABORT) return;\r\n\r\n initRuntime();\r\n\r\n readyPromiseResolve(Module);\r\n if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();\r\n\r\n postRun();\r\n }\r\n\r\n if (Module['setStatus']) {\r\n Module['setStatus']('Running...');\r\n setTimeout(function() {\r\n setTimeout(function() {\r\n Module['setStatus']('');\r\n }, 1);\r\n doRun();\r\n }, 1);\r\n } else\r\n {\r\n doRun();\r\n }\r\n}\r\n\r\nif (Module['preInit']) {\r\n if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\r\n while (Module['preInit'].length > 0) {\r\n Module['preInit'].pop()();\r\n }\r\n}\r\n\r\nrun();\r\n\r\n\r\n// end include: postamble.js\r\n\r\n\r\n return exportCppDbscanLib.ready\r\n}\r\n\r\n);\r\n})();\r\nif (typeof exports === 'object' && typeof module === 'object')\r\n module.exports = exportCppDbscanLib;\r\nelse if (typeof define === 'function' && define['amd'])\r\n define([], function() { return exportCppDbscanLib; });\r\nelse if (typeof exports === 'object')\r\n exports[\"exportCppDbscanLib\"] = exportCppDbscanLib;\r\n","export function hamming(args = {}) {\n function getDistanceF() {\n if (!args || !args.scoringMatrix || !args.alphabetIndexes)\n return (a, b) => a === b ? 0 : 1;\n if (args.scoringMatrix.length !== Object.keys(args.alphabetIndexes).length)\n throw new Error('Scoring matrix and alphabet indexes should have the same length');\n const indexes = args.alphabetIndexes;\n const matrix = args.scoringMatrix;\n //const matrixMap = new Map<string, Map<string, number>>();\n //const map2: any = {};\n const minCharCode = Math.min(...Object.keys(indexes).map((k) => k.charCodeAt(0))) + 1;\n const scorringArray = new Float32Array((matrix.length + minCharCode) * (matrix.length + minCharCode));\n Object.entries(indexes).forEach(([key, index]) => {\n //matrixMap.set(key, new Map<string, number>());\n //map2[key] = {};\n const matrixRow = matrix[index];\n Object.entries(indexes).forEach(([key2, index2]) => {\n //matrixMap.get(key)!.set(key2, matrixRow[index2]);\n scorringArray[key.charCodeAt(0) * matrix.length + key2.charCodeAt(0)] = matrixRow[index2];\n //map2[key][key2] = matrixRow[index2];\n });\n });\n return (a, b) => {\n return 1 - scorringArray[a.charCodeAt(0) * matrix.length + b.charCodeAt(0)];\n };\n }\n const distanceF = getDistanceF();\n const threshold = args?.threshold ?? 0;\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n const s1l = seq1.length;\n const s2l = seq2.length;\n const thresholdLimit = Math.ceil(Math.max(s1l, s2l) * (1 - threshold));\n if (s1l !== s2l)\n diff = Math.abs(s1l - s2l);\n let result = 0;\n for (let i = 0; i < Math.min(s1l, s2l); i++) {\n if (seq1[i] !== seq2[i]) {\n result += distanceF(seq1[i], seq2[i]);\n if (result > thresholdLimit)\n return 1;\n }\n }\n result += diff;\n result /= Math.max(s1l, s2l);\n return result;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUF3QyxFQUFFO0lBQ2hFLFNBQVMsWUFBWTtRQUNuQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3ZELE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU07WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsQywyREFBMkQ7UUFDM0QsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0RyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDL0MsZ0RBQWdEO1lBQ2hELGlCQUFpQjtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUNqRCxtREFBbUQ7Z0JBQ25ELGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUYsc0NBQXNDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUV2QyxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ3BDLCtEQUErRDtRQUMvRCwrRkFBK0Y7UUFDL0YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLEdBQUcsS0FBSyxHQUFHO1lBQ2IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxNQUFNLEdBQUcsY0FBYztvQkFDekIsT0FBTyxDQUFDLENBQUM7WUFDYixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDZixNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uQXJncywgbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nKGFyZ3M6IFBhcnRpYWw8bW1EaXN0YW5jZUZ1bmN0aW9uQXJncz4gPSB7fSk6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICBmdW5jdGlvbiBnZXREaXN0YW5jZUYoKTogKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBudW1iZXIge1xuICAgIGlmICghYXJncyB8fCAhYXJncy5zY29yaW5nTWF0cml4IHx8ICFhcmdzLmFscGhhYmV0SW5kZXhlcylcbiAgICAgIHJldHVybiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IGEgPT09IGIgPyAwIDogMTtcbiAgICBpZiAoYXJncy5zY29yaW5nTWF0cml4Lmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYXJncy5hbHBoYWJldEluZGV4ZXMpLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2NvcmluZyBtYXRyaXggYW5kIGFscGhhYmV0IGluZGV4ZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgY29uc3QgaW5kZXhlcyA9IGFyZ3MuYWxwaGFiZXRJbmRleGVzO1xuICAgIGNvbnN0IG1hdHJpeCA9IGFyZ3Muc2NvcmluZ01hdHJpeDtcbiAgICAvL2NvbnN0IG1hdHJpeE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIC8vY29uc3QgbWFwMjogYW55ID0ge307XG4gICAgY29uc3QgbWluQ2hhckNvZGUgPSBNYXRoLm1pbiguLi5PYmplY3Qua2V5cyhpbmRleGVzKS5tYXAoKGspID0+IGsuY2hhckNvZGVBdCgwKSkpICsgMTtcblxuICAgIGNvbnN0IHNjb3JyaW5nQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KChtYXRyaXgubGVuZ3RoICsgbWluQ2hhckNvZGUpICogKG1hdHJpeC5sZW5ndGggKyBtaW5DaGFyQ29kZSkpO1xuICAgIE9iamVjdC5lbnRyaWVzKGluZGV4ZXMpLmZvckVhY2goKFtrZXksIGluZGV4XSkgPT4ge1xuICAgICAgLy9tYXRyaXhNYXAuc2V0KGtleSwgbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSk7XG4gICAgICAvL21hcDJba2V5XSA9IHt9O1xuICAgICAgY29uc3QgbWF0cml4Um93ID0gbWF0cml4W2luZGV4XTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGluZGV4ZXMpLmZvckVhY2goKFtrZXkyLCBpbmRleDJdKSA9PiB7XG4gICAgICAgIC8vbWF0cml4TWFwLmdldChrZXkpIS5zZXQoa2V5MiwgbWF0cml4Um93W2luZGV4Ml0pO1xuICAgICAgICBzY29ycmluZ0FycmF5W2tleS5jaGFyQ29kZUF0KDApICogbWF0cml4Lmxlbmd0aCArIGtleTIuY2hhckNvZGVBdCgwKV0gPSBtYXRyaXhSb3dbaW5kZXgyXTtcbiAgICAgICAgLy9tYXAyW2tleV1ba2V5Ml0gPSBtYXRyaXhSb3dbaW5kZXgyXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiAxIC0gc2NvcnJpbmdBcnJheVthLmNoYXJDb2RlQXQoMCkgKiBtYXRyaXgubGVuZ3RoICsgYi5jaGFyQ29kZUF0KDApXTtcbiAgICB9O1xuICB9XG4gIGNvbnN0IGRpc3RhbmNlRiA9IGdldERpc3RhbmNlRigpO1xuXG4gIGNvbnN0IHRocmVzaG9sZCA9IGFyZ3M/LnRocmVzaG9sZCA/PyAwO1xuXG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICAvLyBoYW1taW5nIGRpc3RhbmNlIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBzYW1lIHNpemUgc3RyaW5ncyxcbiAgICAvLyBidXQgc3RpbGwsIGxldHMgYWRkIGEgY2hlY2sgYW5kIGlmIHRoZXkgYXJlIG5vdCBzYW1lIGxlbmd0aCBhZGQgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHJlc3VsdFxuICAgIGxldCBkaWZmID0gMDtcbiAgICBjb25zdCBzMWwgPSBzZXExLmxlbmd0aDtcbiAgICBjb25zdCBzMmwgPSBzZXEyLmxlbmd0aDtcbiAgICBjb25zdCB0aHJlc2hvbGRMaW1pdCA9IE1hdGguY2VpbChNYXRoLm1heChzMWwsIHMybCkgKiAoMSAtIHRocmVzaG9sZCkpO1xuICAgIGlmIChzMWwgIT09IHMybClcbiAgICAgIGRpZmYgPSBNYXRoLmFicyhzMWwgLSBzMmwpO1xuXG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihzMWwsIHMybCk7IGkrKykge1xuICAgICAgaWYgKHNlcTFbaV0gIT09IHNlcTJbaV0pIHtcbiAgICAgICAgcmVzdWx0ICs9IGRpc3RhbmNlRihzZXExW2ldLCBzZXEyW2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCA+IHRocmVzaG9sZExpbWl0KVxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQgKz0gZGlmZjtcbiAgICByZXN1bHQgLz0gTWF0aC5tYXgoczFsLCBzMmwpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG4iXX0=","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlzdGFuY2V9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc3RlaW4oKTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gZGlzdGFuY2Uoc2VxMSwgc2VxMikgLyBNYXRoLm1heChzZXExLmxlbmd0aCwgc2VxMi5sZW5ndGgpO1xuICB9O1xufVxuIl19","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n MmDistanceFunctionsNames[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch,\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: hamming\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFLWDtBQUxELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0lBQ3ZDLG1GQUF1RCxDQUFBO0FBQzNELENBQUMsRUFMVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBS25DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0lBQzVELENBQUMsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsRUFBRSxPQUFPO0NBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCcsXG4gICAgTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSA9ICdNb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlJ1xufTtcblxuZXhwb3J0IGNvbnN0IG1tRGlzdGFuY2VGdW5jdGlvbnM6IFJlY29yZDxNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMsICh2YWx1ZT86IGFueSkgPT4gbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZT4gPSB7XG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR106IGhhbW1pbmcsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU5dOiBsZXZlbnN0ZWluLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbmVlZGxlbWFuV3VuY2gsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IGhhbW1pbmdcbn07XG4iXX0=","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],\n [1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],\n [0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],\n [0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1]];\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 1,\n gapExtend: 0.6,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args) {\n const maxLen = 10000;\n const charCodeArray = new Uint16Array(0x10000);\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = { ...defaultArgs, ...args };\n Object.entries(alphabetIndexes).forEach(([k, v]) => charCodeArray[k.charCodeAt(0)] = v);\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Float32Array(maxLen),\n new Float32Array(maxLen)\n ];\n return (seq1, seq2) => {\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++) {\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n matrix[1][i] = 0;\n }\n matrix[0][0] = 0;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] +\n scoringMatrix[charCodeArray[seq1.charCodeAt(j - 1)]][charCodeArray[seq2.charCodeAt(i - 1)]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n // const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n // .reduce((a, b) => a + b, 0);\n // const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n // .reduce((a, b) => a + b, 0);\n // const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n const maxScore = Math.max(seq1.length, seq2.length);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRW5HLG9DQUFvQztBQUNwQyxNQUFNLFdBQVcsR0FBeUI7SUFDeEMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7SUFDckUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7Q0FDOUQsQ0FBQztBQU9GLE1BQU0sV0FBVyxHQUF1QjtJQUN0QyxPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxHQUFHO0lBQ2QsYUFBYSxFQUFFLFFBQVE7SUFDdkIsZUFBZSxFQUFFLFdBQVc7Q0FDN0IsQ0FBQztBQUVGOzs7RUFHRTtBQUNGLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBaUM7SUFDOUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRS9DLE1BQU0sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUMsR0FBRyxFQUFDLEdBQUcsV0FBVyxFQUFFLEdBQUcsSUFBSSxFQUFDLENBQUM7SUFDdkYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RixnRUFBZ0U7SUFDaEUsK0NBQStDO0lBQy9DLE1BQU0sTUFBTSxHQUF3QjtRQUNsQyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDeEIsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDO0tBQ3pCLENBQUM7SUFDRixPQUFPLENBQUMsSUFBWSxFQUFFLElBQVksRUFBVyxFQUFFO1FBQzdDLDZFQUE2RTtRQUM3RSw0RkFBNEY7UUFFNUYsTUFBTSxZQUFZLEdBQWMsSUFBSSxLQUFLLENBQVUsSUFBSSxDQUFDLE1BQU0sR0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0UsTUFBTSxjQUFjLEdBQWMsSUFBSSxLQUFLLENBQVUsSUFBSSxDQUFDLE1BQU0sR0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsNkNBQTZDO1FBQzdDLDBDQUEwQztRQUMxQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLHVCQUF1QjtRQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakIsbUNBQW1DO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sUUFBUSxHQUNaLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwQixhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFFLENBQUM7Z0JBQzFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDM0IsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQ3BCLENBQUM7Z0JBQ0Ysb0JBQW9CO2dCQUNwQixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDcEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDeEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsQ0FBQztxQkFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDdkMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDeEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDM0IsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDO1lBQ0QsWUFBWTtZQUNaLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDbEIsT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLHVFQUF1RTtRQUN2RSw0R0FBNEc7UUFDNUcsaUNBQWlDO1FBQ2pDLDRHQUE0RztRQUM1RyxpQ0FBaUM7UUFDakMsaUVBQWlFO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlELENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvbkFyZ3MsIG1tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBCbG9zdW0gNjIgbWF0cml4IGZvciBwcm90ZWluIHNlcXVlbmNlc1xuY29uc3QgQkxPU1VNNjI6QXJyYXk8QXJyYXk8bnVtYmVyPj4gPVxuW1s0LCAtMSwgLTIsIC0yLCAwLCAtMSwgLTEsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAxLCAwLCAtMywgLTIsIDAsIC0yLCAtMSwgMCwgLTRdLFxuICBbLTEsIDUsIDAsIC0yLCAtMywgMSwgMCwgLTIsIDAsIC0zLCAtMiwgMiwgLTEsIC0zLCAtMiwgLTEsIC0xLCAtMywgLTIsIC0zLCAtMSwgMCwgLTEsIC00XSxcbiAgWy0yLCAwLCA2LCAxLCAtMywgMCwgMCwgMCwgMSwgLTMsIC0zLCAwLCAtMiwgLTMsIC0yLCAxLCAwLCAtNCwgLTIsIC0zLCAzLCAwLCAtMSwgLTRdLFxuICBbLTIsIC0yLCAxLCA2LCAtMywgMCwgMiwgLTEsIC0xLCAtMywgLTQsIC0xLCAtMywgLTMsIC0xLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWzAsIC0zLCAtMywgLTMsIDksIC0zLCAtNCwgLTMsIC0zLCAtMSwgLTEsIC0zLCAtMSwgLTIsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTEsIC0zLCAtMywgLTIsIC00XSxcbiAgWy0xLCAxLCAwLCAwLCAtMywgNSwgMiwgLTIsIDAsIC0zLCAtMiwgMSwgMCwgLTMsIC0xLCAwLCAtMSwgLTIsIC0xLCAtMiwgMCwgMywgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAyLCAtNCwgMiwgNSwgLTIsIDAsIC0zLCAtMywgMSwgLTIsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMiwgMCwgLTEsIC0zLCAtMiwgLTIsIDYsIC0yLCAtNCwgLTQsIC0yLCAtMywgLTMsIC0yLCAwLCAtMiwgLTIsIC0zLCAtMywgLTEsIC0yLCAtMSwgLTRdLFxuICBbLTIsIDAsIDEsIC0xLCAtMywgMCwgMCwgLTIsIDgsIC0zLCAtMywgLTEsIC0yLCAtMSwgLTIsIC0xLCAtMiwgLTIsIDIsIC0zLCAwLCAwLCAtMSwgLTRdLFxuICBbLTEsIC0zLCAtMywgLTMsIC0xLCAtMywgLTMsIC00LCAtMywgNCwgMiwgLTMsIDEsIDAsIC0zLCAtMiwgLTEsIC0zLCAtMSwgMywgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMywgLTQsIC0xLCAtMiwgLTMsIC00LCAtMywgMiwgNCwgLTIsIDIsIDAsIC0zLCAtMiwgLTEsIC0yLCAtMSwgMSwgLTQsIC0zLCAtMSwgLTRdLFxuICBbLTEsIDIsIDAsIC0xLCAtMywgMSwgMSwgLTIsIC0xLCAtMywgLTIsIDUsIC0xLCAtMywgLTEsIDAsIC0xLCAtMywgLTIsIC0yLCAwLCAxLCAtMSwgLTRdLFxuICBbLTEsIC0xLCAtMiwgLTMsIC0xLCAwLCAtMiwgLTMsIC0yLCAxLCAyLCAtMSwgNSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMywgLTEsIC0xLCAtNF0sXG4gIFstMiwgLTMsIC0zLCAtMywgLTIsIC0zLCAtMywgLTMsIC0xLCAwLCAwLCAtMywgMCwgNiwgLTQsIC0yLCAtMiwgMSwgMywgLTEsIC0zLCAtMywgLTEsIC00XSxcbiAgWy0xLCAtMiwgLTIsIC0xLCAtMywgLTEsIC0xLCAtMiwgLTIsIC0zLCAtMywgLTEsIC0yLCAtNCwgNywgLTEsIC0xLCAtNCwgLTMsIC0yLCAtMiwgLTEsIC0yLCAtNF0sXG4gIFsxLCAtMSwgMSwgMCwgLTEsIDAsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMiwgLTEsIDQsIDEsIC0zLCAtMiwgLTIsIDAsIDAsIDAsIC00XSxcbiAgWzAsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAxLCA1LCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTRdLFxuICBbLTMsIC0zLCAtNCwgLTQsIC0yLCAtMiwgLTMsIC0yLCAtMiwgLTMsIC0yLCAtMywgLTEsIDEsIC00LCAtMywgLTIsIDExLCAyLCAtMywgLTQsIC0zLCAtMiwgLTRdLFxuICBbLTIsIC0yLCAtMiwgLTMsIC0yLCAtMSwgLTIsIC0zLCAyLCAtMSwgLTEsIC0yLCAtMSwgMywgLTMsIC0yLCAtMiwgMiwgNywgLTEsIC0zLCAtMiwgLTEsIC00XSxcbiAgWzAsIC0zLCAtMywgLTMsIC0xLCAtMiwgLTIsIC0zLCAtMywgMywgMSwgLTIsIDEsIC0xLCAtMiwgLTIsIDAsIC0zLCAtMSwgNCwgLTMsIC0yLCAtMSwgLTRdLFxuICBbLTIsIC0xLCAzLCA0LCAtMywgMCwgMSwgLTEsIDAsIC0zLCAtNCwgMCwgLTMsIC0zLCAtMiwgMCwgLTEsIC00LCAtMywgLTMsIDQsIDEsIC0xLCAtNF0sXG4gIFstMSwgMCwgMCwgMSwgLTMsIDMsIDQsIC0yLCAwLCAtMywgLTMsIDEsIC0xLCAtMywgLTEsIDAsIC0xLCAtMywgLTIsIC0yLCAxLCA0LCAtMSwgLTRdLFxuICBbMCwgLTEsIC0xLCAtMSwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAwLCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtNF0sXG4gIFstNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIDFdXTtcblxuLy8gUHJvdGVpbiBpbmRleGVzIGZvciBCTE9TVU0gbWF0cml4XG5jb25zdCBQcm90SW5kZXhlczoge1tpZDpzdHJpbmddOm51bWJlcn0gPSB7XG4gICdBJzogMCwgJ1InOiAxLCAnTic6IDIsICdEJzogMywgJ0MnOiA0LCAnUSc6IDUsICdFJzogNiwgJ0cnOiA3LCAnSCc6IDgsXG4gICdJJzogOSwgJ0wnOiAxMCwgJ0snOiAxMSwgJ00nOiAxMiwgJ0YnOiAxMywgJ1AnOiAxNCwgJ1MnOiAxNSwgJ1QnOiAxNixcbiAgJ1cnOiAxNywgJ1knOiAxOCwgJ1YnOiAxOSwgJ0InOiAyMCwgJ1onOiAyMSwgJ1gnOiAyMiwgJyonOiAyM1xufTtcblxudHlwZSBOZWVkbGVtYW5XdW5jaEFyZ3MgPSBtbURpc3RhbmNlRnVuY3Rpb25BcmdzICYge1xuICBnYXBPcGVuOiBudW1iZXI7XG4gIGdhcEV4dGVuZDogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0QXJnczogTmVlZGxlbWFuV3VuY2hBcmdzID0ge1xuICBnYXBPcGVuOiAxLFxuICBnYXBFeHRlbmQ6IDAuNixcbiAgc2NvcmluZ01hdHJpeDogQkxPU1VNNjIsXG4gIGFscGhhYmV0SW5kZXhlczogUHJvdEluZGV4ZXNcbn07XG5cbi8qKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgYmFzZWQgb24gZ2FwIHBlbmFsdHkgYW5kIG1hdHJpeFxuICogQHBhcmFtIHtQYXJ0aWFsPE5lZWRsZW1hbld1bmNoQXJncz59YXJncyAtIGFyZ3VtZW50cyBmb3IgTmVlZGxlbWFuLVd1bmNoIGFsZ29yaXRobSBsaWtlIGdhcCBwZW5hbHR5LCBTY29yaW5nIG1hdHJpeC4uXG4gKiBAcmV0dXJuIHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSAtIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRsZW1hbld1bmNoKGFyZ3M6IFBhcnRpYWw8TmVlZGxlbWFuV3VuY2hBcmdzPik6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICBjb25zdCBtYXhMZW4gPSAxMDAwMDtcbiAgY29uc3QgY2hhckNvZGVBcnJheSA9IG5ldyBVaW50MTZBcnJheSgweDEwMDAwKTtcblxuICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgT2JqZWN0LmVudHJpZXMoYWxwaGFiZXRJbmRleGVzKS5mb3JFYWNoKChbaywgdl0pID0+IGNoYXJDb2RlQXJyYXlbay5jaGFyQ29kZUF0KDApXSA9IHYpO1xuICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gIC8vIEludGVhZCwgd2Ugd2lsbCBzdG9yZSBvbmx5IHRoZSBsYXN0IHR3byByb3dzXG4gIGNvbnN0IG1hdHJpeDogQXJyYXk8RmxvYXQzMkFycmF5PiA9IFtcbiAgICBuZXcgRmxvYXQzMkFycmF5KG1heExlbiksXG4gICAgbmV3IEZsb2F0MzJBcnJheShtYXhMZW4pXG4gIF07XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICAvLyBzaW1pbGFybHksIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IG9wZXJhdGlvbiBsZWQgdG8gdGhlIGN1cnJlbnQgY2VsbFxuICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG5cbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArMSkuZmlsbChmYWxzZSk7XG4gICAgY29uc3QgaG9yaXpvbnRhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArMSkuZmlsbChmYWxzZSk7XG4gICAgLy92YXJpYWJsZXMgdG8ga2VlcCB0cmFjayB3aGljaCByb3cgd2UgYXJlIGluXG4gICAgLy8gdGhleSB3aWxsIHN3YXAgcGxhY2VzIG9uIGVhY2ggaXRlcmF0aW9uXG4gICAgbGV0IHByZXZSb3cgPSAwO1xuICAgIGxldCBjdXJyUm93ID0gMTtcbiAgICAvLyBJbml0aWFsaXplIGZpcnN0IHJvd1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxMS5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIG1hdHJpeFswXVtpXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcbiAgICAgIG1hdHJpeFsxXVtpXSA9IDA7XG4gICAgfVxuICAgIG1hdHJpeFswXVswXSA9IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJlc3Qgb2YgdGhlIG1hdHJpeFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxMi5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIG1hdHJpeFtjdXJyUm93XVswXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcbiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2VxMS5sZW5ndGggKyAxOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGlhZ29uYWwgPVxuICAgICAgICAgIG1hdHJpeFtwcmV2Um93XVtqIC0gMV0gK1xuICAgICAgICAgICAgc2NvcmluZ01hdHJpeFtjaGFyQ29kZUFycmF5W3NlcTEuY2hhckNvZGVBdChqIC0gMSldXVtjaGFyQ29kZUFycmF5W3NlcTIuY2hhckNvZGVBdChpIC0gMSldXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCBjb21wYXJlIGl0IHRvIHBlcmZlY3QgbWF0Y2ggc2NvcmUgdG8gZ2V0IHJlYXNvbmFibGUgZGlzdGFuY2VcbiAgICAvLyBjb25zdCBwZXJmZWN0TWF0Y2hTZXExID0gc2VxMS5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAvLyAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAvLyBjb25zdCBwZXJmZWN0TWF0Y2hTZXEyID0gc2VxMi5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAvLyAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAvLyBjb25zdCBtYXhTY29yZSA9IE1hdGgubWF4KHBlcmZlY3RNYXRjaFNlcTEsIHBlcmZlY3RNYXRjaFNlcTIpO1xuICAgIGNvbnN0IG1heFNjb3JlID0gTWF0aC5tYXgoc2VxMS5sZW5ndGgsIHNlcTIubGVuZ3RoKTtcbiAgICByZXR1cm4gKG1heFNjb3JlIC0gbWF0cml4W3ByZXZSb3ddW3NlcTEubGVuZ3RoXSkgLyBtYXhTY29yZTtcbiAgfTtcbn1cbiJdfQ==","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=","/* eslint-disable max-len */\nimport * 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}\nexport const testData = DG.DataFrame.fromCsv(`countries,fasta,smiles,molregno,LON,Zip Code,Street Address Line 1,ImageUrl,user_id,error_message,xray,flag,magnitude,CS-id,pdb_id,accel_a,time_offset,chart,fit,Questions,empty_number,empty_string\nBelgium,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C(=O)OCCCc1cccnc1)c2cccc(c2)C(=O)c3ccccc3,1480014,36.276729583740234,995042300,14016 ROUTE 31W,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,1,1,1QBS,1,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.497360340644872, 1.7058694986686864, 5.278052678195135, 0.16000320889028383],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.374499797821045},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.6242473125457764},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.367267608642578},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.6723148822784424},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.6537344455718994},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.3651671409606934},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.5654284954071045},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.4160959720611572},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.286726713180542},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.5100042819976807},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6676985025405884},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.680136501789093},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3391543924808502},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.09038983285427094},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.19802775979042053}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[7.525235855508179, 1.3186911876809984, 5.335672608564294, 0.7860743343958098],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":7.988070487976074},{\"\"x\"\":0.6000000238418579,\"\"y\"\":7.018453121185303},{\"\"x\"\":1.100000023841858,\"\"y\"\":8.115279197692871},{\"\"x\"\":1.600000023841858,\"\"y\"\":7.486658096313477},{\"\"x\"\":2.0999999046325684,\"\"y\"\":7.396438121795654},{\"\"x\"\":2.5999999046325684,\"\"y\"\":7.477052211761475},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.913095474243164},{\"\"x\"\":3.5999999046325684,\"\"y\"\":8.01385498046875},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.985900402069092},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.970335960388184},{\"\"x\"\":5.099999904632568,\"\"y\"\":5.448817253112793},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.5534818172454834},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.893947958946228},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6340042352676392},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8403874039649963}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,100,abc\nBurundi,MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW,COc1ccc2cc(ccc2c1)C(C)C(=O)Oc3ccc(C)cc3OC,1480015,36.276729583740234,995073444,80 STATE HIGHWAY 310,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,2,2,1ZP8,2,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.431460753103398, 2.1691498799246745, 5.266445597102774, 0.7825762827017926],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.751083850860596},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.203000068664551},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.415858745574951},{\"\"x\"\":1.600000023841858,\"\"y\"\":4.68414306640625},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.198400974273682},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.179222106933594},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.638473987579346},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.708553314208984},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.291589260101318},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.038082599639893},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4349939823150635},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.2194708585739136},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.1920831203460693},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.5352635979652405},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.3346920311450958}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.339458017970126, -1.0734184310171178, 4.746332950550934, 0.2482416857595658],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.2139337658882141},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.4269562065601349},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.2441573292016983},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.146635964512825},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.08818462491035461},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.2560656666755676},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.42434045672416687},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.37111231684684753},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.5581737160682678},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.183590054512024},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.5629843473434448},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3211288452148438},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.229961633682251},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.2560226917266846},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.2142398357391357}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCameroon,MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL,COc1ccc2cc(ccc2c1)C(C)C(=O)OCCCc3cccnc3,1480016,36.26095962524414,995153596,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,3,3,2BDJ,3,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.6760652578642325, 0.9046956320756703, 5.651408971856738, 0.07738846012184185],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.32425594329834},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.668442249298096},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.379785060882568},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.0345139503479},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.878653526306152},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.3451313972473145},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.336992263793945},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.037430286407471},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.0092692375183105},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.151902675628662},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4066951274871826},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3732759952545166},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.673728108406067},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48574790358543396},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.2783052325248718}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.938395863010111, -1.4658480661392117, 5.462702751996584, 0.3473139023615039],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.4941710829734802},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.15323974192142487},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.46373432874679565},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.3370431363582611},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.5179030299186707},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.27899765968322754},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.22075064480304718},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.5789918899536133},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.21169911324977875},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.27857646346092224},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0906332731246948},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8520300388336182},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.7177059650421143},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.8680918216705322},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.2413077354431152}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCanada,MMELVLKTIIGPIVVGVVLRIVDKWLNKDK,CC(C(=O)NCCS)c1cccc(c1)C(=O)c2ccccc2,1480017,36.26095962524414,99515,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,4,4,1IAN,4,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[0.8597390975430008, 1.0957625732481946, 5.260537067987958, 0.07974187998177736],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.8190152645111084},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.8421689867973328},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.8740922212600708},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.8924275040626526},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.8249067664146423},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.9327669143676758},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.8522974252700806},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.8174492716789246},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.8394647240638733},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.7139387726783752},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.5561167597770691},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3276226818561554},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.12479474395513535},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.13006797432899475},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.059702079743146896}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.760930219582546, 1.6591793293833013, 4.667155929720851, 0.7858109544121652],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.156993389129639},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.236701965332031},{\"\"x\"\":1.100000023841858,\"\"y\"\":6.010560512542725},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.495512962341309},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.087770462036133},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.79986572265625},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.597546577453613},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.520902156829834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.360654354095459},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.5539746284484863},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.577236294746399},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.0001264810562134},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.9305797815322876},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6033638715744019},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.4203685522079468}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nColombia,MDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN,FC(F)(F)c1ccc(OC2CCNCC2)cc1,1480029,36.3309440612793,995152050,1 COURT HOUSE SQUARE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,5,5,4UJ1,5,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[6.4995088314153655, 2.4270351004539914, 5.178659535348579, 0.625653346241577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.496231555938721},{\"\"x\"\":0.6000000238418579,\"\"y\"\":6.42543363571167},{\"\"x\"\":1.100000023841858,\"\"y\"\":7.040063858032227},{\"\"x\"\":1.600000023841858,\"\"y\"\":6.1115403175354},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.680728435516357},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.406774520874023},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.611269474029541},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.889094352722168},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.75344705581665},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.361435890197754},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.1666975021362305},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.172118902206421},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.801048994064331},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.4640021026134491},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.0010357667924836278}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.4734381347446401, 1.1649805188074196, 4.82958608866421, 0.09500545496710007],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.5279096364974976},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.3559974431991577},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.5246378183364868},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.5567657947540283},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.4114240407943726},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.4045010805130005},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.4769829511642456},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.4875500202178955},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.2991987466812134},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.922961413860321},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.6520044803619385},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.15350978076457977},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1078903079032898},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.17276449501514435},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.14066608250141144}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCosta Rica,MKSTKEEIQTIKTLLKDSRTAKYHKRLQIVL,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCCc3ccccc3,1480018,36.3309440612793,995084218,4041 SOUTHWESTERN BLVD,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,6,6,2BPW,6,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.4833641843311227, -1.8945978742090062, 4.671127708092568, 0.24159861311815153],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.0969524160027504},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.028483040630817413},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.22087176144123077},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.0068915546871721745},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.4305879771709442},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.44774115085601807},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.45346319675445557},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.2370593100786209},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.4657953977584839},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.155200719833374},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.2294070720672607},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.4311530590057373},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.33846116065979},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.608201026916504},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.8136143684387207}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.224573521642033, 1.4454033924198528, 5.6014197746076535, 0.2823216054197577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.95027494430542},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.1754679679870605},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.276752948760986},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.589294910430908},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.616994857788086},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.120813846588135},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.340766906738281},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.876471042633057},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.94999361038208},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.162564754486084},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.399557590484619},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.7977969646453857},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.0229872465133667},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48275601863861084},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.10408931970596313}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCuba,MHAILRYFIRRLFYHIFYKIYSLISKKHQSLPSDVRQF,COc1ccc2c(c1)c(CC(=O)N3CCCC3C(=O)Oc4ccc(C)cc4OC)c(C)n2C(=O)c5ccc(Cl)cc5,1480019,36.33115768432617,995081928,1227 US HIGHWAY 11,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,7,7,1QBS,7,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.320838679713925, -1.2421619987316728, 4.831325425225256, 0.3236011098403072],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.3727470338344574},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.12365014106035233},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.48422467708587646},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.2264465093612671},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.16821794211864471},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.3879014551639557},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.5470244884490967},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.3419053554534912},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.7655120491981506},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.2346516847610474},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.453336715698242},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.9565491676330566},{\"\"x\"\":6.099999904632568,\"\"y\"\":3.335299491882324},{\"\"x\"\":6.599999904632568,\"\"y\"\":3.240290880203247},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.1107218265533447}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.6401853521511094, 1.26211588875013, 5.399028074402744, 0.5089580830068091],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.8585598468780518},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.6077206134796143},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.855252265930176},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.619039297103882},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.839388370513916},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.335283041000366},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.571141481399536},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.4155046939849854},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7316646575927734},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.0680155754089355},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.891066551208496},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.6022753715515137},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.7652576565742493},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6875326037406921},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5828871726989746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nItaly,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO[N+](=O)[O-],1480020,36.33115768432617,99502,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,8,8,1ZP8,8,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.293592105923809, 1.3781586549141835, 5.1025898038676605, 0.03493851245291291],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.1287283897399902},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.267972230911255},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.398442506790161},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.5130622386932373},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.3255116939544678},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.127340793609619},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.47259783744812},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.131181478500366},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.090421438217163},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.02299165725708},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.1105059385299683},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.4494485855102539},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1375635862350464},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.036351121962070465},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.1619771122932434}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.953125499439879, 1.2528620255306528, 5.187637440149802, 0.3110348753260886],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.6585283279418945},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.911152362823486},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.924920082092285},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.8469438552856445},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.929472923278809},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.190037727355957},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.236179828643799},{\"\"x\"\":3.5999999046325684,\"\"y\"\":6.141019344329834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.295210838317871},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.265801906585693},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.3722851276397705},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8299226760864258},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.32690900564193726},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6274543404579163},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8441857099533081}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nRwanda,MPNSEPASLLELFNSIATQGELVRSLKAGNASK,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO,1480021,36.33137130737305,995037247,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,9,2BDJ,9,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.8209972202654474, 1.3779216716448506, 5.299882228439686, 0.06040645519069608],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.7821109294891357},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.542433023452759},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.7008674144744873},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.717301607131958},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.024452209472656},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.013899326324463},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.945094347000122},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.866621971130371},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7461626529693604},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.3454740047454834},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.61944317817688},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.999405026435852},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.46259793639183044},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.054134611040353775},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.05711187422275543}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.6318079657726035, 1.8495493770000595, 5.391793312471116, 0.17060707587348442],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.458079814910889},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.554427146911621},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.799983024597168},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.364140033721924},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.864485740661621},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.4509806632995605},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.702574729919434},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.7314534187316895},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.5123443603515625},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.724395751953125},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.354506969451904},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.7307666540145874},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.6305936574935913},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.035183437168598175},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.7575169205665588}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nSwitzerland,IRVVGRYLIEVWKAAGMDMDKVLFLWSSDEI,CN1CCC(CC1)Oc2ccc(cc2)C(F)(F)F,1480028,36.33137130737305,99504,92-11 179TH PLACE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,10,1IAN,10,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.1190255865097471, 2.3163895161544437, 5.4968866182279195, 0.2035204047289052],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.1057683229446411},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.1019697189331055},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.0818607807159424},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.062997817993164},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.046447515487671},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.1217249631881714},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.2166996002197266},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.215477705001831},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.0581893920898438},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.1747995615005493},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0181127786636353},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.5344523191452026},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.2569526433944702},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.1912207305431366},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.15060538053512573}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.1038581025805785, 2.0032224204185245, 5.087602825989163, 0.13277988512492753],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.0498509407043457},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.805217742919922},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.3415253162384033},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.0549843311309814},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.250074863433838},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.0432586669921875},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.265852451324463},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.9475724697113037},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.1929898262023926},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.7460060119628906},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6175861358642578},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3006608486175537},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3444803059101105},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.015537971630692482},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5527358055114746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\n,,,,,,,,,,,,,,,,,,,,,`);\ntestData.columns.add(DG.Column.fromList(DG.TYPE.BYTE_ARRAY, 'BinaryImage', Array.from(new Uint8Array(11))));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFtQixFQUFFLEdBQWM7SUFDdkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzVCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsa0JBQWtCLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0tBQ0Y7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQW1CLEVBQUUsS0FBZ0I7SUFDakUsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLElBQUwsS0FBSyxHQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQStCdkIsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHNoYTI1NiBmcm9tICdmYXN0LXNoYTI1Nic7XG4vKipcbiAqIEZvciBjb2x1bW5zIG9mIHN0cmluZyB0eXBlLiBDaGVja3Mgd2hldGhlciBjb2x1bW4gY29udGFpbnMgZW1wdHkgdmFsdWVzIGFuZCByZW1vdmVzIGNvcnJlc3BvbmRpbmcgcm93cyBpbiBjYXNlIHVzZXIgc2VsZWN0cyB0byByZW1vdmUuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRW1wdHlTdHJpbmdSb3dzKHRhYmxlOiBERy5EYXRhRnJhbWUsIGNvbDogREcuQ29sdW1uKTogbnVtYmVyW10ge1xuICBjb25zdCBjYXRzID0gY29sLmNhdGVnb3JpZXM7XG4gIGNvbnN0IGVtcHR5UmF3SW5kID0gY2F0cy5tYXAoKHZhbCwgaW5kKSA9PiAhdmFsID8gaW5kIDogbnVsbCkuZmlsdGVyKChpdCkgPT4gaXQgIT09IG51bGwpO1xuICBjb25zdCByYXdEYXRhID0gWy4uLmNvbC5nZXRSYXdEYXRhKCldO1xuICBjb25zdCBlbXB0eVJhd3NJbmRleGVzID0gW107XG4gIGxldCByZW1vdmVkUm93c0NvdW50ZXIgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd0NvdW50OyBpKyspIHtcbiAgICBpZiAoZW1wdHlSYXdJbmQuaW5jbHVkZXMocmF3RGF0YVtpXSkpIHtcbiAgICAgIHRhYmxlLnJvd3MucmVtb3ZlQXQoaSAtIHJlbW92ZWRSb3dzQ291bnRlcik7XG4gICAgICBlbXB0eVJhd3NJbmRleGVzLnB1c2goaSk7XG4gICAgICByZW1vdmVkUm93c0NvdW50ZXIgKz0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtcHR5UmF3c0luZGV4ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRGF0YUZyYW1lKHRhYmxlOiBERy5EYXRhRnJhbWUsIG5hbWVzPzogc3RyaW5nW10pOiBVaW50OEFycmF5IHtcbiAgbmFtZXMgPz89IHRhYmxlLmNvbHVtbnMubmFtZXMoKTtcbiAgY29uc3QgaGFzaGVyID0gbmV3IHNoYTI1Ni5IYXNoKCk7XG4gIGNvbnN0IG9yZGVyID0gdGFibGUuZ2V0U29ydGVkT3JkZXIobmFtZXMpO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmNvbHVtbnMuYnlOYW1lKG5hbWUpO1xuICAgIGNvbnN0IGRhdGFBcnJheSA9IGNvbHVtbi5nZXRSYXdEYXRhKCk7XG4gICAgY29uc3QgaXNTdHJpbmcgPSBjb2x1bW4udHlwZSA9PSBERy5UWVBFLlNUUklORztcbiAgICBjb25zdCBjYXRzID0gY29sdW1uLmNhdGVnb3JpZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc1N0cmluZykge1xuICAgICAgICBjb25zdCBkYXRhID0gY2F0c1tkYXRhQXJyYXlbb3JkZXJbaV1dXTtcbiAgICAgICAgaGFzaGVyLnVwZGF0ZShlbmNvZGVyLmVuY29kZShkYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkYXRhID0gZGF0YUFycmF5W29yZGVyW2ldXTtcbiAgICAgICAgaGFzaGVyLnVwZGF0ZShVaW50OEFycmF5LmZyb20oW2RhdGFdKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoZXIuZGlnZXN0KCk7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0RGF0YSA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGBjb3VudHJpZXMsZmFzdGEsc21pbGVzLG1vbHJlZ25vLExPTixaaXAgQ29kZSxTdHJlZXQgQWRkcmVzcyBMaW5lIDEsSW1hZ2VVcmwsdXNlcl9pZCxlcnJvcl9tZXNzYWdlLHhyYXksZmxhZyxtYWduaXR1ZGUsQ1MtaWQscGRiX2lkLGFjY2VsX2EsdGltZV9vZmZzZXQsY2hhcnQsZml0LFF1ZXN0aW9ucyxlbXB0eV9udW1iZXIsZW1wdHlfc3RyaW5nXG5CZWxnaXVtLE1TTkZITkVIVk1RRllSTk5MS1RLR1ZGR1JRLENDKEMoPU8pT0NDQ2MxY2NjbmMxKWMyY2NjYyhjMilDKD1PKWMzY2NjY2MzLDE0ODAwMTQsMzYuMjc2NzI5NTgzNzQwMjM0LDk5NTA0MjMwMCwxNDAxNiBST1VURSAzMVcsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZywxLDEsMVFCUywxLDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi40OTczNjAzNDA2NDQ4NzIsIDEuNzA1ODY5NDk4NjY4Njg2NCwgNS4yNzgwNTI2NzgxOTUxMzUsIDAuMTYwMDAzMjA4ODkwMjgzODNdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjIuMzc0NDk5Nzk3ODIxMDQ1fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi42MjQyNDczMTI1NDU3NzY0fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjM2NzI2NzYwODY0MjU3OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Mi42NzIzMTQ4ODIyNzg0NDI0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi42NTM3MzQ0NDU1NzE4OTk0fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi4zNjUxNjcxNDA5NjA2OTM0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi41NjU0Mjg0OTU0MDcxMDQ1fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi40MTYwOTU5NzIwNjExNTcyfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjI4NjcyNjcxMzE4MDU0Mn0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi41MTAwMDQyODE5OTc2ODA3fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjY2NzY5ODUwMjU0MDU4ODR9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjgwMTM2NTAxNzg5MDkzfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMzOTE1NDM5MjQ4MDg1MDJ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDkwMzg5ODMyODU0MjcwOTR9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTk4MDI3NzU5NzkwNDIwNTN9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzcuNTI1MjM1ODU1NTA4MTc5LCAxLjMxODY5MTE4NzY4MDk5ODQsIDUuMzM1NjcyNjA4NTY0Mjk0LCAwLjc4NjA3NDMzNDM5NTgwOThdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjcuOTg4MDcwNDg3OTc2MDc0fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Ny4wMTg0NTMxMjExODUzMDN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjguMTE1Mjc5MTk3NjkyODcxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo3LjQ4NjY1ODA5NjMxMzQ3N30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjcuMzk2NDM4MTIxNzk1NjU0fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ny40NzcwNTIyMTE3NjE0NzV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjkxMzA5NTQ3NDI0MzE2NH0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjguMDEzODU0OTgwNDY4NzV9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuOTg1OTAwNDAyMDY5MDkyfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2Ljk3MDMzNTk2MDM4ODE4NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS40NDg4MTcyNTMxMTI3OTN9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNTUzNDgxODE3MjQ1NDgzNH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS44OTM5NDc5NTg5NDYyMjh9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjM0MDA0MjM1MjY3NjM5Mn0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44NDAzODc0MDM5NjQ5OTYzfV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwxMDAsYWJjXG5CdXJ1bmRpLE1EWUtFVExMTVBLVERGUE1SR0dMUE5LRVBRSVFFS1csQ09jMWNjYzJjYyhjY2MyYzEpQyhDKUMoPU8pT2MzY2NjKEMpY2MzT0MsMTQ4MDAxNSwzNi4yNzY3Mjk1ODM3NDAyMzQsOTk1MDczNDQ0LDgwIFNUQVRFIEhJR0hXQVkgMzEwLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsMiwyLDFaUDgsMiwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzQuNDMxNDYwNzUzMTAzMzk4LCAyLjE2OTE0OTg3OTkyNDY3NDUsIDUuMjY2NDQ1NTk3MTAyNzc0LCAwLjc4MjU3NjI4MjcwMTc5MjZdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjQuNzUxMDgzODUwODYwNTk2fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NC4yMDMwMDAwNjg2NjQ1NTF9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjQuNDE1ODU4NzQ1NTc0OTUxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo0LjY4NDE0MzA2NjQwNjI1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4xOTg0MDA5NzQyNzM2ODJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjE3OTIyMjEwNjkzMzU5NH0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuNjM4NDczOTg3NTc5MzQ2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC43MDg1NTMzMTQyMDg5ODR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMjkxNTg5MjYwMTAxMzE4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjAzODA4MjU5OTYzOTg5M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My40MzQ5OTM5ODIzMTUwNjM1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjIxOTQ3MDg1ODU3MzkxMzZ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTkyMDgzMTIwMzQ2MDY5M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41MzUyNjM1OTc5NjUyNDA1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMzNDY5MjAzMTE0NTA5NTh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuMzM5NDU4MDE3OTcwMTI2LCAtMS4wNzM0MTg0MzEwMTcxMTc4LCA0Ljc0NjMzMjk1MDU1MDkzNCwgMC4yNDgyNDE2ODU3NTk1NjU4XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjIxMzkzMzc2NTg4ODIxNDF9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjQyNjk1NjIwNjU2MDEzNDl9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMjQ0MTU3MzI5MjAxNjk4M30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4xNDY2MzU5NjQ1MTI4MjV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjA4ODE4NDYyNDkxMDM1NDYxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4yNTYwNjU2NjY2NzU1Njc2fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40MjQzNDA0NTY3MjQxNjY4N30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMzcxMTEyMzE2ODQ2ODQ3NTN9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTU4MTczNzE2MDY4MjY3OH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xODM1OTAwNTQ1MTIwMjR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNTYyOTg0MzQ3MzQzNDQ0OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4zMjExMjg4NDUyMTQ4NDM4fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjIyOTk2MTYzMzY4MjI1MX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4yNTYwMjI2OTE3MjY2ODQ2fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjIxNDIzOTgzNTczOTEzNTd9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNhbWVyb29uLE1JRVZGTEZHSVZMR0xJUElUTEFHTEZWVEFZTFFZUlJHRFFMREwsQ09jMWNjYzJjYyhjY2MyYzEpQyhDKUMoPU8pT0NDQ2MzY2NjbmMzLDE0ODAwMTYsMzYuMjYwOTU5NjI1MjQ0MTQsOTk1MTUzNTk2LDMwLTU2IFdISVRFU1RPTkUgRVhQWSxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDMsMywyQkRKLDMsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls0LjY3NjA2NTI1Nzg2NDIzMjUsIDAuOTA0Njk1NjMyMDc1NjcwMywgNS42NTE0MDg5NzE4NTY3MzgsIDAuMDc3Mzg4NDYwMTIxODQxODVdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjQuMzI0MjU1OTQzMjk4MzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo0LjY2ODQ0MjI0OTI5ODA5Nn0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NC4zNzk3ODUwNjA4ODI1Njh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuMDM0NTEzOTUwMzQ3OX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuODc4NjUzNTI2MzA2MTUyfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4zNDUxMzEzOTcyNDczMTQ1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4zMzY5OTIyNjM3OTM5NDV9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjAzNzQzMDI4NjQwNzQ3MX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4wMDkyNjkyMzc1MTgzMTA1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjE1MTkwMjY3NTYyODY2Mn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My40MDY2OTUxMjc0ODcxODI2fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjM3MzI3NTk5NTI1NDUxNjZ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjczNzI4MTA4NDA2MDY3fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ4NTc0NzkwMzU4NTQzMzk2fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI3ODMwNTIzMjUyNDg3MTh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuOTM4Mzk1ODYzMDEwMTExLCAtMS40NjU4NDgwNjYxMzkyMTE3LCA1LjQ2MjcwMjc1MTk5NjU4NCwgMC4zNDczMTM5MDIzNjE1MDM5XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjQ5NDE3MTA4Mjk3MzQ4MDJ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjE1MzIzOTc0MTkyMTQyNDg3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjQ2MzczNDMyODc0Njc5NTY1fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjMzNzA0MzEzNjM1ODI2MTF9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjUxNzkwMzAyOTkxODY3MDd9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjI3ODk5NzY1OTY4MzIyNzU0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4yMjA3NTA2NDQ4MDMwNDcxOH0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNTc4OTkxODg5OTUzNjEzM30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yMTE2OTkxMTMyNDk3Nzg3NX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yNzg1NzY0NjM0NjA5MjIyNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wOTA2MzMyNzMxMjQ2OTQ4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjg1MjAzMDAzODgzMzYxODJ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNzE3NzA1OTY1MDQyMTE0M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi44NjgwOTE4MjE2NzA1MzIyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjI0MTMwNzczNTQ0MzExNTJ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNhbmFkYSxNTUVMVkxLVElJR1BJVlZHVlZMUklWREtXTE5LREssQ0MoQyg9TylOQ0NTKWMxY2NjYyhjMSlDKD1PKWMyY2NjY2MyLDE0ODAwMTcsMzYuMjYwOTU5NjI1MjQ0MTQsOTk1MTUsMzAtNTYgV0hJVEVTVE9ORSBFWFBZLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNCw0LDFJQU4sNCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzAuODU5NzM5MDk3NTQzMDAwOCwgMS4wOTU3NjI1NzMyNDgxOTQ2LCA1LjI2MDUzNzA2Nzk4Nzk1OCwgMC4wNzk3NDE4Nzk5ODE3NzczNl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MC44MTkwMTUyNjQ1MTExMDg0fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MC44NDIxNjg5ODY3OTczMzI4fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjg3NDA5MjIyMTI2MDA3MDh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuODkyNDI3NTA0MDYyNjUyNn0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODI0OTA2NzY2NDE0NjQyM30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuOTMyNzY2OTE0MzY3Njc1OH0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODUyMjk3NDI1MjcwMDgwNn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODE3NDQ5MjcxNjc4OTI0Nn0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44Mzk0NjQ3MjQwNjM4NzMzfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjcxMzkzODc3MjY3ODM3NTJ9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTU2MTE2NzU5Nzc3MDY5MX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMjc2MjI2ODE4NTYxNTU0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEyNDc5NDc0Mzk1NTEzNTM1fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEzMDA2Nzk3NDMyODk5NDc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1OTcwMjA3OTc0MzE0Njg5Nn1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS43NjA5MzAyMTk1ODI1NDYsIDEuNjU5MTc5MzI5MzgzMzAxMywgNC42NjcxNTU5Mjk3MjA4NTEsIDAuNzg1ODEwOTU0NDEyMTY1Ml0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ni4xNTY5OTMzODkxMjk2Mzl9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo1LjIzNjcwMTk2NTMzMjAzMX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ni4wMTA1NjA1MTI1NDI3MjV9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNDk1NTEyOTYyMzQxMzA5fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4wODc3NzA0NjIwMzYxMzN9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1Ljc5OTg2NTcyMjY1NjI1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS41OTc1NDY1Nzc0NTM2MTN9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjUyMDkwMjE1NjgyOTgzNH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4zNjA2NTQzNTQwOTU0NTl9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuNTUzOTc0NjI4NDQ4NDg2M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS41NzcyMzYyOTQ3NDYzOTl9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDAwMTI2NDgxMDU2MjEzNH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC45MzA1Nzk3ODE1MzIyODc2fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjYwMzM2Mzg3MTU3NDQwMTl9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDIwMzY4NTUyMjA3OTQ2OH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ29sb21iaWEsTURSVERFVlNOSFRIREtQVExUV0ZFRUlGRUVZSFNQRkhOLEZDKEYpKEYpYzFjY2MoT0MyQ0NOQ0MyKWNjMSwxNDgwMDI5LDM2LjMzMDk0NDA2MTI3OTMsOTk1MTUyMDUwLDEgQ09VUlQgSE9VU0UgU1FVQVJFLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNSw1LDRVSjEsNSwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzYuNDk5NTA4ODMxNDE1MzY1NSwgMi40MjcwMzUxMDA0NTM5OTE0LCA1LjE3ODY1OTUzNTM0ODU3OSwgMC42MjU2NTMzNDYyNDE1NzddLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjYuNDk2MjMxNTU1OTM4NzIxfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Ni40MjU0MzM2MzU3MTE2N30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ny4wNDAwNjM4NTgwMzIyMjd9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjYuMTExNTQwMzE3NTM1NH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuNjgwNzI4NDM1NTE2MzU3fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni40MDY3NzQ1MjA4NzQwMjN9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjYxMTI2OTQ3NDAyOTU0MX0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuODg5MDk0MzUyNzIyMTY4fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2Ljc1MzQ0NzA1NTgxNjY1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2LjM2MTQzNTg5MDE5Nzc1NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC4xNjY2OTc1MDIxMzYyMzA1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE3MjExODkwMjIwNjQyMX0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44MDEwNDg5OTQwNjQzMzF9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDY0MDAyMTAyNjEzNDQ5MX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMDEwMzU3NjY3OTI0ODM2Mjc4fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsxLjQ3MzQzODEzNDc0NDY0MDEsIDEuMTY0OTgwNTE4ODA3NDE5NiwgNC44Mjk1ODYwODg2NjQyMSwgMC4wOTUwMDU0NTQ5NjcxMDAwN10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MS41Mjc5MDk2MzY0OTc0OTc2fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MS4zNTU5OTc0NDMxOTkxNTc3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjUyNDYzNzgxODMzNjQ4Njh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuNTU2NzY1Nzk0NzU0MDI4M30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDExNDI0MDQwNzk0MzcyNn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDA0NTAxMDgwNTEzMDAwNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDc2OTgyOTUxMTY0MjQ1Nn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDg3NTUwMDIwMjE3ODk1NX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4yOTkxOTg3NDY2ODEyMTM0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjkyMjk2MTQxMzg2MDMyMX0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42NTIwMDQ0ODAzNjE5Mzg1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE1MzUwOTc4MDc2NDU3OTc3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEwNzg5MDMwNzkwMzI4OTh9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTcyNzY0NDk1MDE1MTQ0MzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTQwNjY2MDgyNTAxNDExNDR9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNvc3RhIFJpY2EsTUtTVEtFRUlRVElLVExMS0RTUlRBS1lIS1JMUUlWTCxDQyhDKUNjMWNjYyhjYzEpQyhDKUMoPU8pTjJDQ0NDMkMoPU8pT0NDQ2MzY2NjY2MzLDE0ODAwMTgsMzYuMzMwOTQ0MDYxMjc5Myw5OTUwODQyMTgsNDA0MSBTT1VUSFdFU1RFUk4gQkxWRCxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDYsNiwyQlBXLDYsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsyLjQ4MzM2NDE4NDMzMTEyMjcsIC0xLjg5NDU5Nzg3NDIwOTAwNjIsIDQuNjcxMTI3NzA4MDkyNTY4LCAwLjI0MTU5ODYxMzExODE1MTUzXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjA5Njk1MjQxNjAwMjc1MDR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjAyODQ4MzA0MDYzMDgxNzQxM30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4yMjA4NzE3NjE0NDEyMzA3N30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4wMDY4OTE1NTQ2ODcxNzIxNzQ1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40MzA1ODc5NzcxNzA5NDQyfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40NDc3NDExNTA4NTYwMTgwN30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNDUzNDYzMTk2NzU0NDU1NTd9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjIzNzA1OTMxMDA3ODYyMDl9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDY1Nzk1Mzk3NzU4NDgzOX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xNTUyMDA3MTk4MzMzNzR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjI5NDA3MDcyMDY3MjYwN30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi40MzExNTMwNTkwMDU3MzczfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjMzODQ2MTE2MDY1OTc5fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjYwODIwMTAyNjkxNjUwNH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi44MTM2MTQzNjg0Mzg3MjA3fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1LjIyNDU3MzUyMTY0MjAzMywgMS40NDU0MDMzOTI0MTk4NTI4LCA1LjYwMTQxOTc3NDYwNzY1MzUsIDAuMjgyMzIxNjA1NDE5NzU3N10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC45NTAyNzQ5NDQzMDU0Mn0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuMTc1NDY3OTY3OTg3MDYwNX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4yNzY3NTI5NDg3NjA5ODZ9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNTg5Mjk0OTEwNDMwOTA4fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS42MTY5OTQ4NTc3ODgwODZ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjEyMDgxMzg0NjU4ODEzNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMzQwNzY2OTA2NzM4MjgxfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC44NzY0NzEwNDI2MzMwNTd9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuOTQ5OTkzNjEwMzgyMDh9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMTYyNTY0NzU0NDg2MDg0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjM5OTU1NzU5MDQ4NDYxOX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi43OTc3OTY5NjQ2NDUzODU3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjAyMjk4NzI0NjUxMzM2Njd9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDgyNzU2MDE4NjM4NjEwODR9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTA0MDg5MzE5NzA1OTYzMTN9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkN1YmEsTUhBSUxSWUZJUlJMRllISUZZS0lZU0xJU0tLSFFTTFBTRFZSUUYsQ09jMWNjYzJjKGMxKWMoQ0MoPU8pTjNDQ0NDM0MoPU8pT2M0Y2NjKEMpY2M0T0MpYyhDKW4yQyg9TyljNWNjYyhDbCljYzUsMTQ4MDAxOSwzNi4zMzExNTc2ODQzMjYxNyw5OTUwODE5MjgsMTIyNyBVUyBISUdIV0FZIDExLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNyw3LDFRQlMsNywxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuMzIwODM4Njc5NzEzOTI1LCAtMS4yNDIxNjE5OTg3MzE2NzI4LCA0LjgzMTMyNTQyNTIyNTI1NiwgMC4zMjM2MDExMDk4NDAzMDcyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjM3Mjc0NzAzMzgzNDQ1NzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjEyMzY1MDE0MTA2MDM1MjMzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjQ4NDIyNDY3NzA4NTg3NjQ2fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjIyNjQ0NjUwOTM2MTI2NzF9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjE2ODIxNzk0MjExODY0NDcxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zODc5MDE0NTUxNjM5NTU3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC41NDcwMjQ0ODg0NDkwOTY3fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zNDE5MDUzNTU0NTM0OTEyfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc2NTUxMjA0OTE5ODE1MDZ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMjM0NjUxNjg0NzYxMDQ3NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi40NTMzMzY3MTU2OTgyNDJ9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuOTU2NTQ5MTY3NjMzMDU2Nn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4zMzUyOTk0OTE4ODIzMjR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMjQwMjkwODgwMjAzMjQ3fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjExMDcyMTgyNjU1MzM0NDd9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuNjQwMTg1MzUyMTUxMTA5NCwgMS4yNjIxMTU4ODg3NTAxMywgNS4zOTkwMjgwNzQ0MDI3NDQsIDAuNTA4OTU4MDgzMDA2ODA5MV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My44NTg1NTk4NDY4NzgwNTE4fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6My42MDc3MjA2MTM0Nzk2MTQzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjg1NTI1MjI2NTkzMDE3Nn0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My42MTkwMzkyOTcxMDM4ODJ9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjgzOTM4ODM3MDUxMzkxNn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMzM1MjgzMDQxMDAwMzY2fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My41NzExNDE0ODEzOTk1MzZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjQxNTUwNDY5Mzk4NDk4NTR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuNzMxNjY0NjU3NTkyNzczNH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4wNjgwMTU1NzU0MDg5MzU1fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjg5MTA2NjU1MTIwODQ5Nn0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42MDIyNzUzNzE1NTE1MTM3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc2NTI1NzY1NjU3NDI0OTN9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjg3NTMyNjAzNzQwNjkyMX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41ODI4ODcxNzI2OTg5NzQ2fV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5JdGFseSxNU05GSE5FSFZNUUZZUk5OTEtUS0dWRkdSUSxDQyhDKUNjMWNjYyhjYzEpQyhDKUMoPU8pTjJDQ0NDMkMoPU8pT0NDT1tOK10oPU8pW08tXSwxNDgwMDIwLDM2LjMzMTE1NzY4NDMyNjE3LDk5NTAyLFwiMTY4LTQ2IDkxU1QgQVZFLiwgMk5EIEZMUlwiLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsOCw4LDFaUDgsOCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuMjkzNTkyMTA1OTIzODA5LCAxLjM3ODE1ODY1NDkxNDE4MzUsIDUuMTAyNTg5ODAzODY3NjYwNSwgMC4wMzQ5Mzg1MTI0NTI5MTI5MV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Mi4xMjg3MjgzODk3Mzk5OTAyfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi4yNjc5NzIyMzA5MTEyNTV9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuMzk4NDQyNTA2NzkwMTYxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjUxMzA2MjIzODY5MzIzNzN9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjMyNTUxMTY5Mzk1NDQ2Nzh9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjEyNzM0MDc5MzYwOTYxOX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuNDcyNTk3ODM3NDQ4MTJ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjEzMTE4MTQ3ODUwMDM2Nn0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4wOTA0MjE0MzgyMTcxNjN9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMDIyOTkxNjU3MjU3MDh9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTEwNTA1OTM4NTI5OTY4M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NDk0NDg1ODU1MTAyNTM5fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEzNzU2MzU4NjIzNTA0NjR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDM2MzUxMTIxOTYyMDcwNDY1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE2MTk3NzExMjI5MzI0MzR9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzUuOTUzMTI1NDk5NDM5ODc5LCAxLjI1Mjg2MjAyNTUzMDY1MjgsIDUuMTg3NjM3NDQwMTQ5ODAyLCAwLjMxMTAzNDg3NTMyNjA4ODZdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjUuNjU4NTI4MzI3OTQxODk0NX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuOTExMTUyMzYyODIzNDg2fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjkyNDkyMDA4MjA5MjI4NX0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS44NDY5NDM4NTUyODU2NDQ1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS45Mjk0NzI5MjMyNzg4MDl9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjE5MDAzNzcyNzM1NTk1N30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuMjM2MTc5ODI4NjQzNzk5fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4xNDEwMTkzNDQzMjk4MzR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMjk1MjEwODM4MzE3ODcxfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjI2NTgwMTkwNjU4NTY5M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4zNzIyODUxMjc2Mzk3NzA1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjgyOTkyMjY3NjA4NjQyNTh9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzI2OTA5MDA1NjQxOTM3MjZ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjI3NDU0MzQwNDU3OTE2M30se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44NDQxODU3MDk5NTMzMDgxfV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5Sd2FuZGEsTVBOU0VQQVNMTEVMRk5TSUFUUUdFTFZSU0xLQUdOQVNLLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NPLDE0ODAwMjEsMzYuMzMxMzcxMzA3MzczMDUsOTk1MDM3MjQ3LFwiMTY4LTQ2IDkxU1QgQVZFLiwgMk5EIEZMUlwiLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsOSw5LDJCREosOSwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuODIwOTk3MjIwMjY1NDQ3NCwgMS4zNzc5MjE2NzE2NDQ4NTA2LCA1LjI5OTg4MjIyODQzOTY4NiwgMC4wNjA0MDY0NTUxOTA2OTYwOF0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My43ODIxMTA5Mjk0ODkxMzU3fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6My41NDI0MzMwMjM0NTI3NTl9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuNzAwODY3NDE0NDc0NDg3M30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My43MTczMDE2MDcxMzE5NTh9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjAyNDQ1MjIwOTQ3MjY1Nn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMDEzODk5MzI2MzI0NDYzfSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My45NDUwOTQzNDcwMDAxMjJ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjg2NjYyMTk3MTEzMDM3MX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My43NDYxNjI2NTI5NjkzNjA0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjM0NTQ3NDAwNDc0NTQ4MzR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNjE5NDQzMTc4MTc2ODh9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuOTk5NDA1MDI2NDM1ODUyfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ2MjU5NzkzNjM5MTgzMDQ0fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1NDEzNDYxMTA0MDM1Mzc3NX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wNTcxMTE4NzQyMjI3NTU0M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS42MzE4MDc5NjU3NzI2MDM1LCAxLjg0OTU0OTM3NzAwMDA1OTUsIDUuMzkxNzkzMzEyNDcxMTE2LCAwLjE3MDYwNzA3NTg3MzQ4NDQyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo1LjQ1ODA3OTgxNDkxMDg4OX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuNTU0NDI3MTQ2OTExNjIxfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1Ljc5OTk4MzAyNDU5NzE2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4zNjQxNDAwMzM3MjE5MjR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1Ljg2NDQ4NTc0MDY2MTYyMX0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNDUwOTgwNjYzMjk5NTYwNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNzAyNTc0NzI5OTE5NDM0fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS43MzE0NTM0MTg3MzE2ODk1fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjUxMjM0NDM2MDM1MTU2MjV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuNzI0Mzk1NzUxOTUzMTI1fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjM1NDUwNjk2OTQ1MTkwNH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS43MzA3NjY2NTQwMTQ1ODc0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjYzMDU5MzY1NzQ5MzU5MTN9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDM1MTgzNDM3MTY4NTk4MTc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc1NzUxNjkyMDU2NjU1ODh9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcblN3aXR6ZXJsYW5kLElSVlZHUllMSUVWV0tBQUdNRE1ES1ZMRkxXU1NERUksQ04xQ0NDKENDMSlPYzJjY2MoY2MyKUMoRikoRilGLDE0ODAwMjgsMzYuMzMxMzcxMzA3MzczMDUsOTk1MDQsOTItMTEgMTc5VEggUExBQ0UsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw5LDEwLDFJQU4sMTAsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsxLjExOTAyNTU4NjUwOTc0NzEsIDIuMzE2Mzg5NTE2MTU0NDQzNywgNS40OTY4ODY2MTgyMjc5MTk1LCAwLjIwMzUyMDQwNDcyODkwNTJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjEuMTA1NzY4MzIyOTQ0NjQxMX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjEuMTAxOTY5NzE4OTMzMTA1NX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MS4wODE4NjA3ODA3MTU5NDI0fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjA2Mjk5NzgxNzk5MzE2NH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuMDQ2NDQ3NTE1NDg3NjcxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4xMjE3MjQ5NjMxODgxNzE0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4yMTY2OTk2MDAyMTk3MjY2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4yMTU0Nzc3MDUwMDE4MzF9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDU4MTg5MzkyMDg5ODQzOH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xNzQ3OTk1NjE1MDA1NDkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjAxODExMjc3ODY2MzYzNTN9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTM0NDUyMzE5MTQ1MjAyNn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yNTY5NTI2NDMzOTQ0NzAyfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE5MTIyMDczMDU0MzEzNjZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTUwNjA1MzgwNTM1MTI1NzN9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuMTAzODU4MTAyNTgwNTc4NSwgMi4wMDMyMjI0MjA0MTg1MjQ1LCA1LjA4NzYwMjgyNTk4OTE2MywgMC4xMzI3Nzk4ODUxMjQ5Mjc1M10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My4wNDk4NTA5NDA3MDQzNDU3fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi44MDUyMTc3NDI5MTk5MjJ9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuMzQxNTI1MzE2MjM4NDAzM30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My4wNTQ5ODQzMzExMzA5ODE0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My4yNTAwNzQ4NjM0MzM4Mzh9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjA0MzI1ODY2Njk5MjE4NzV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjI2NTg1MjQ1MTMyNDQ2M30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuOTQ3NTcyNDY5NzExMzAzN30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4xOTI5ODk4MjYyMDIzOTI2fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjc0NjAwNjAxMTk2Mjg5MDZ9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjE3NTg2MTM1ODY0MjU3OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMDA2NjA4NDg2MTc1NTM3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjM0NDQ4MDMwNTkxMDExMDV9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDE1NTM3OTcxNjMwNjkyNDgyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjU1MjczNTgwNTUxMTQ3NDZ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbiwsLCwsLCwsLCwsLCwsLCwsLCwsLGApO1xudGVzdERhdGEuY29sdW1ucy5hZGQoREcuQ29sdW1uLmZyb21MaXN0KERHLlRZUEUuQllURV9BUlJBWSwgJ0JpbmFyeUltYWdlJywgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheSgxMSkpKSk7XG4iXX0=","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 { testData } from './dataframe-utils';\nimport { changeOptionsSaveLayout, filterAsync, loadLayout, selectFilterChangeCurrent, testViewerInternal } from './test-viewer-utils';\nconst STANDART_TIMEOUT = 30000;\nconst BENCHMARK_TIMEOUT = 10800000;\nconst stdLog = console.log.bind(console);\nconst stdInfo = console.info.bind(console);\nconst stdWarn = console.warn.bind(console);\nconst stdError = console.error.bind(console);\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\nconst demoCatName = 'Demo';\nconst detectorsCatName = 'Detectors';\nconst coreCatName = 'Core';\nconst wasRegistered = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\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 = STANDART_TIMEOUT);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n 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, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n try {\n handler(args);\n resolve('OK');\n }\n catch (e) {\n reject(e);\n }\n finally {\n sub.unsubscribe();\n clearTimeout(timeout);\n }\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function testEventAsync(event, handler, trigger, ms = 0, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n handler(args).then(() => {\n resolve('OK');\n }).catch((e) => {\n reject(e);\n }).finally(() => {\n sub.unsubscribe();\n clearTimeout(timeout);\n });\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected = true, error) {\n if (error)\n error = `${error}, `;\n else\n error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001, error) {\n if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||\n (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||\n (actual === Number.NaN && expected === Number.NaN) || (isNaN(actual) && isNaN(expected)))\n return;\n const areEqual = Math.abs(actual - expected) < tolerance;\n expect(areEqual, true, `${error !== null && error !== void 0 ? error : ''} (tolerance = ${tolerance})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectTable(actual, expected, error) {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error !== null && error !== void 0 ? error : ''}, row count`);\n for (const column of expected.columns) {\n const actualColumn = actual.columns.byName(column.name);\n if (actualColumn == null)\n throw new Error(`Column ${column.name} not found`);\n if (actualColumn.type != column.type)\n throw new Error(`Column ${column.name} type expected ${column.type} got ${actualColumn.type}`);\n for (let i = 0; i < expectedRowCount; i++) {\n const value = column.get(i);\n const actualValue = actualColumn.get(i);\n if (column.type == DG.TYPE.FLOAT)\n expectFloat(actualValue, value, 0.0001, error);\n else if (column.type == DG.TYPE.DATE_TIME)\n expect(actualValue.isSame(value), true, error);\n else\n expect(actualValue, value, error);\n }\n }\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests_, options) {\n var _a;\n currentCategory = category;\n tests_();\n if (tests[currentCategory]) {\n tests[currentCategory].clear = (_a = options === null || options === void 0 ? void 0 : options.clear) !== null && _a !== void 0 ? _a : true;\n tests[currentCategory].timeout = options === null || options === void 0 ? void 0 : options.timeout;\n }\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nfunction addNamespace(s, f) {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\nexport function initAutoTests(package_, module) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const packageId = package_.id;\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (moduleTests[autoTestsCatName] !== undefined ||\n moduleTests[demoCatName] !== undefined ||\n Object.keys(moduleTests).find((c) => c.startsWith(autoTestsCatName) || c.startsWith(coreCatName))) {\n wasRegistered[packageId] = true;\n return;\n }\n if (package_.name === 'DevTools' || (!!module && module._package.name === 'DevTools')) {\n for (const f of window.dartTests) {\n const arr = f.name.split(/\\s*\\|\\s*!/g);\n const name = (_a = arr.pop()) !== null && _a !== void 0 ? _a : f.name;\n const cat = arr.length ? coreCatName + ': ' + arr.join(': ') : coreCatName;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(new Test(cat, name, f.test, { isAggregated: false, timeout: STANDART_TIMEOUT }));\n }\n }\n const moduleAutoTests = [];\n const moduleDemo = [];\n const moduleDetectors = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n const reg = new RegExp(/skip:\\s*([^,\\s]+)|wait:\\s*(\\d+)|cat:\\s*([^,\\s]+)|timeout:\\s*(\\d+)/g);\n for (const f of packFunctions) {\n const tests = f.options['test'];\n const demo = f.options['demoPath'];\n if ((tests && Array.isArray(tests) && tests.length)) {\n for (let i = 0; i < tests.length; i++) {\n const res = tests[i].matchAll(reg);\n const map = {};\n Array.from(res).forEach((arr) => {\n if (arr[0].startsWith('skip'))\n map['skip'] = arr[1];\n else if (arr[0].startsWith('wait'))\n map['wait'] = parseInt(arr[2]);\n else if (arr[0].startsWith('cat'))\n map['cat'] = arr[3];\n else if (arr[0].startsWith('timeout'))\n map['timeout'] = parseInt(arr[4]);\n });\n const test = new Test(autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {\n const res = yield grok.functions.eval(addNamespace(tests[i], f));\n if (map.wait)\n yield delay(map.wait);\n // eslint-disable-next-line no-throw-literal\n if (typeof res === 'boolean' && !res)\n throw `Failed: ${tests[i]}, expected true, got ${res}`;\n }), { skipReason: map.skip, timeout: map.timeout });\n if (map.cat) {\n const cat = autoTestsCatName + ': ' + map.cat;\n test.category = cat;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(test);\n }\n else\n moduleAutoTests.push(test);\n }\n }\n if (demo) {\n const wait = f.options['demoWait'] ? parseInt(f.options['demoWait']) : undefined;\n const test = new Test(demoCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n //grok.shell.clearLastError();\n yield f.apply();\n yield delay(wait ? wait : 2000);\n const unhandled = yield grok.shell.lastError;\n if (unhandled)\n throw new Error(unhandled);\n }), { skipReason: f.options['demoSkip'] });\n moduleDemo.push(test);\n }\n if (f.hasTag('semTypeDetector')) {\n const test = new Test(detectorsCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n const arr = [];\n for (const col of testData.clone().columns) {\n const res = yield f.apply([col]);\n arr.push(res || col.semType);\n }\n expect(arr.filter((i) => i).length, 1);\n }), { skipReason: f.options['skipTest'] });\n moduleDetectors.push(test);\n }\n }\n wasRegistered[packageId] = true;\n if (moduleAutoTests.length)\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests, clear: true };\n if (moduleDemo.length)\n moduleTests[demoCatName] = { tests: moduleDemo, clear: true };\n if (moduleDetectors.length)\n moduleTests[detectorsCatName] = { tests: moduleDetectors, clear: false };\n });\n}\nfunction redefineConsole() {\n const logs = [];\n console.log = (...args) => {\n logs.push(...args);\n stdLog(...args);\n };\n console.info = (...args) => {\n logs.push(...args);\n stdInfo(...args);\n };\n console.warn = (...args) => {\n logs.push(...args);\n stdWarn(...args);\n };\n console.error = (...args) => {\n logs.push(...args);\n stdError(...args);\n };\n return logs;\n}\nfunction resetConsole() {\n console.log = stdLog;\n console.info = stdInfo;\n console.warn = stdWarn;\n console.error = stdError;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d, _e, _f;\n var _g;\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_);\n const results = [];\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_g = options).testContext) !== null && _c !== void 0 ? _c : (_g.testContext = new TestContext());\n //grok.shell.clearLastError();\n const categories = [];\n const logs = redefineConsole();\n try {\n for (const [key, value] of Object.entries(tests)) {\n if ((!!(options === null || options === void 0 ? void 0 : options.category) && !key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase())) ||\n ((_d = options.exclude) === null || _d === void 0 ? void 0 : _d.some((c) => key.startsWith(c))))\n continue;\n stdLog(`Started ${key} category`);\n categories.push(key);\n const skipped = (_e = value.tests) === null || _e === void 0 ? void 0 : _e.every((t) => { var _a; return (_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason; });\n try {\n if (value.before && !skipped) {\n yield timeout(() => __awaiter(this, void 0, void 0, function* () {\n yield value.before();\n }), 100000, `before ${options.category}: timeout error`);\n }\n }\n catch (x) {\n value.beforeStatus = yield getResult(x);\n }\n const t = (_f = value.tests) !== null && _f !== void 0 ? _f : [];\n const res = [];\n if (value.clear) {\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, logs, value.timeout, package_.name, options.verbose));\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n }\n }\n else {\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, logs, value.timeout, package_.name, options.verbose));\n }\n const data = res.filter((d) => d.result != 'skipped');\n try {\n if (value.after && !skipped) {\n yield timeout(() => __awaiter(this, void 0, void 0, function* () {\n yield value.after();\n }), 100000, `After ${options.category}: timeout error`);\n }\n }\n catch (x) {\n value.afterStatus = yield getResult(x);\n }\n // Clear after category\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n if (value.afterStatus)\n data.push({ category: key, name: 'after', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'before', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n }\n finally {\n resetConsole();\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n const error = yield grok.shell.lastError;\n const params = {\n category: 'Unhandled exceptions',\n name: 'Exception',\n result: error !== null && error !== void 0 ? error : '', success: !error, ms: 0, skipped: false\n };\n results.push(params);\n params.package = package_.name;\n if (grok.shell.reportTest != null)\n yield grok.shell.reportTest('package', params);\n else {\n yield fetch(`${grok.dapi.root}/log/tests/package`, {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(params)\n });\n }\n }\n return results;\n });\n}\nfunction getResult(x) {\n return __awaiter(this, void 0, void 0, function* () {\n return `${x.toString()}\\n${x.stack ? (yield DG.Logger.translateStackTrace(x.stack)) : ''}`;\n });\n}\nfunction execTest(t, predicate, logs, categoryTimeout, packageName, verbose) {\n var _a, _b, _c, _d, _e, _f;\n return __awaiter(this, void 0, void 0, function* () {\n logs.length = 0;\n let r;\n let type = 'package';\n const filter = predicate != undefined && (t.name.toLowerCase() !== predicate.toLowerCase());\n 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 stdLog(`Started ${t.category} ${t.name}`);\n const start = Date.now();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else {\n let timeout_ = ((_c = t.options) === null || _c === void 0 ? void 0 : _c.timeout) === STANDART_TIMEOUT &&\n categoryTimeout ? categoryTimeout : (_d = t.options) === null || _d === void 0 ? void 0 : _d.timeout;\n timeout_ = DG.Test.isInBenchmark && timeout_ === STANDART_TIMEOUT ? BENCHMARK_TIMEOUT : timeout_;\n r = { success: true, result: (_e = yield timeout(t.test, timeout_)) !== null && _e !== void 0 ? _e : 'OK', ms: 0, skipped: false };\n }\n }\n catch (x) {\n stdError(x);\n r = { success: false, result: yield getResult(x), ms: 0, skipped: false };\n }\n if (((_f = t.options) === null || _f === void 0 ? void 0 : _f.isAggregated) && r.result.constructor === DG.DataFrame) {\n const col = r.result.col('success');\n if (col)\n r.success = col.stats.sum === col.length;\n if (!verbose) {\n const df = r.result;\n df.columns.remove('stack');\n df.rows.removeWhere((r) => r.get('success'));\n r.result = df;\n }\n r.result = r.result.toCsv();\n }\n r.logs = logs.join('\\n');\n r.ms = Date.now() - start;\n if (!skip)\n stdLog(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n if (!filter) {\n let params = {\n 'success': r.success, 'result': r.result, 'ms': r.ms,\n 'skipped': r.skipped, 'package': packageName, 'category': t.category, 'name': t.name, 'logs': r.logs\n };\n if (r.result.constructor == Object) {\n const res = Object.keys(r.result).reduce((acc, k) => (Object.assign(Object.assign({}, acc), { ['result.' + k]: r.result[k] })), {});\n params = Object.assign(Object.assign({}, params), res);\n }\n if (grok.shell.reportTest != null)\n yield grok.shell.reportTest(type, params);\n else {\n yield fetch(`${grok.dapi.root}/log/tests/${type}`, {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(params)\n });\n }\n }\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, interval = 50) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const intervalId = setInterval(() => {\n if (checkHandler()) {\n clearInterval(intervalId);\n resolve();\n }\n }, interval);\n });\n });\n}\n// Returns test execution result or an error in case of timeout\nexport function timeout(func, testTimeout, timeoutReason = 'EXECUTION TIMEOUT') {\n return __awaiter(this, void 0, void 0, function* () {\n let timeout = null;\n const timeoutPromise = new Promise((_, reject) => {\n timeout = setTimeout(() => {\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(timeoutReason);\n }, testTimeout);\n });\n try {\n return yield Promise.race([func(), timeoutPromise]);\n }\n finally {\n if (timeout)\n clearTimeout(timeout);\n }\n });\n}\nexport function isDialogPresent(dialogTitle) {\n const dialogs = DG.Dialog.getOpenDialogs();\n for (let i = 0; i < dialogs.length; i++) {\n if (dialogs[i].title == dialogTitle)\n return true;\n }\n return false;\n}\n/** Expects an asynchronous {@link action} to throw an exception. Use {@link check} to perform\n * deeper inspection of the exception if necessary.\n * @param {function(): Promise<void>} action\n * @param {function(any): boolean} check\n * @return {Promise<void>}\n */\nexport function expectExceptionAsync(action, check) {\n return __awaiter(this, void 0, void 0, function* () {\n let caught = false;\n let checked = false;\n try {\n yield action();\n }\n catch (e) {\n caught = true;\n checked = !check || check(e);\n }\n finally {\n if (!caught)\n throw new Error('An exception is expected but not thrown');\n if (!checked)\n throw new Error('An expected exception is thrown, but it does not satisfy the condition');\n }\n });\n}\nconst catDF = DG.DataFrame.fromColumns([DG.Column.fromStrings('col', ['val1', 'val2', 'val3'])]);\n/**\n * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a\n * @param {string} v Viewer name\n * @param {DG.DataFrame} df Dataframe to use. Should have at least 3 rows\n * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not\n * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test\n * @param {boolean} options.arbitraryDfTest If set to false, test on arbitrary dataframe\n * (one categorical column) will not be performed\n * @param {object} options List of options (optional)\n * @return {Promise<void>} The test is considered successful if it completes without errors\n */\nexport function testViewer(v, df, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const packageName = (_a = options === null || options === void 0 ? void 0 : options.packageName) !== null && _a !== void 0 ? _a : '';\n if (options === null || options === void 0 ? void 0 : options.detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n try {\n //1. Open, do nothing and close\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded);\n //in case viewer with async rendering - wait for render to complete\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, undefined, options.awaitViewer);\n //2. Open viewer, run selection, filter, etc. and close\n if (!(options === null || options === void 0 ? void 0 : options.readOnly)) {\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, selectFilterChangeCurrent);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, selectFilterChangeCurrent, options.awaitViewer);\n }\n //2. Open viewer, change options, save layout and close\n let propsAndLayout = null;\n propsAndLayout = yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, changeOptionsSaveLayout);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n propsAndLayout = yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, changeOptionsSaveLayout, options.awaitViewer);\n //3. Load layout\n yield testViewerInternal(tv, v, packageName, grok.events.onViewLayoutApplied, loadLayout, undefined, propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.layout, { savedProps: propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.savedProps });\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewLayoutApplied, loadLayout, options.awaitViewer, propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.layout, { savedProps: propsAndLayout === null || propsAndLayout === void 0 ? void 0 : propsAndLayout.savedProps });\n //4. Open viewer on arbitary dataset\n if ((options === null || options === void 0 ? void 0 : options.arbitraryDfTest) !== false) {\n tv.dataFrame = catDF;\n yield delay(50);\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, undefined, options.awaitViewer);\n }\n //5. Call postponed filtering\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, filterAsync);\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield testViewerInternal(tv, v, packageName, grok.events.onViewerAdded, filterAsync, options.awaitViewer);\n }\n finally {\n // closeAll() is handling by common test workflow\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRJLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDO0FBRW5DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7QUFDckMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUErQixFQUFFLENBQUM7QUFDckQsTUFBTSxDQUFDLElBQUksZUFBdUIsQ0FBQztBQUVuQyxNQUFNLEtBQVcsTUFBTSxDQUt0QjtBQUxE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RSxXQUFXO29CQUN0QixNQUFNLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDNUc7WUFFRCw2QkFBNkI7WUFDN0IsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNyRixJQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXO2dCQUN0QixNQUFNLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxPQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7U0FFOUc7Z0JBQVM7WUFDUixpREFBaUQ7WUFDakQseUJBQXlCO1lBQ3pCLHlCQUF5QjtTQUMxQjs7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRlc3REYXRhIH0gZnJvbSAnLi9kYXRhZnJhbWUtdXRpbHMnO1xuaW1wb3J0IFRpbWVvdXQgPSBOb2RlSlMuVGltZW91dDtcbmltcG9ydCB7IGNoYW5nZU9wdGlvbnNTYXZlTGF5b3V0LCBmaWx0ZXJBc3luYywgbG9hZExheW91dCwgc2VsZWN0RmlsdGVyQ2hhbmdlQ3VycmVudCwgdGVzdFZpZXdlckludGVybmFsIH0gZnJvbSAnLi90ZXN0LXZpZXdlci11dGlscyc7XG5cbmNvbnN0IFNUQU5EQVJUX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IEJFTkNITUFSS19USU1FT1VUID0gMTA4MDAwMDA7XG5cbmNvbnN0IHN0ZExvZyA9IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG5jb25zdCBzdGRJbmZvID0gY29uc29sZS5pbmZvLmJpbmQoY29uc29sZSk7XG5jb25zdCBzdGRXYXJuID0gY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7XG5jb25zdCBzdGRFcnJvciA9IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcblxuZXhwb3J0IGNvbnN0IHRlc3RzOiB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICB0ZXN0cz86IFRlc3RbXSwgYmVmb3JlPzogKCkgPT4gUHJvbWlzZTx2b2lkPiwgYWZ0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGJlZm9yZVN0YXR1cz86IHN0cmluZywgYWZ0ZXJTdGF0dXM/OiBzdHJpbmcsIGNsZWFyPzogYm9vbGVhbiwgdGltZW91dD86IG51bWJlclxuICB9XG59ID0ge307XG5cbmNvbnN0IGF1dG9UZXN0c0NhdE5hbWUgPSAnQXV0byBUZXN0cyc7XG5jb25zdCBkZW1vQ2F0TmFtZSA9ICdEZW1vJztcbmNvbnN0IGRldGVjdG9yc0NhdE5hbWUgPSAnRGV0ZWN0b3JzJztcbmNvbnN0IGNvcmVDYXROYW1lID0gJ0NvcmUnO1xuY29uc3Qgd2FzUmVnaXN0ZXJlZDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5OiBzdHJpbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgYXNzdXJlIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIG5vdE51bGwodmFsdWU6IGFueSwgbmFtZT86IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWUgPT0gbnVsbCA/ICdWYWx1ZScgOiBuYW1lfSBub3QgZGVmaW5lZGApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICB1bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0PzogbnVtYmVyO1xuICBza2lwUmVhc29uPzogc3RyaW5nO1xuICBpc0FnZ3JlZ2F0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5T3B0aW9ucyB7XG4gIGNsZWFyPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSBTVEFOREFSVF9USU1FT1VUO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy50ZXN0ID0gYXN5bmMgKCk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGVzdCgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEV2ZW50PFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gdm9pZCwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDAsIHJlYXNvbjogc3RyaW5nID0gYHRpbWVvdXRgXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJnczogVCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudEFzeW5jPFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gUHJvbWlzZTx2b2lkPiwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDAsIHJlYXNvbjogc3RyaW5nID0gYHRpbWVvdXRgXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJnczogVCkgPT4ge1xuICAgICAgaGFuZGxlcihhcmdzKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkgPSB0cnVlLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXJyb3IpXG4gICAgZXJyb3IgPSBgJHtlcnJvcn0sIGA7XG4gIGVsc2UgZXJyb3IgPSAnJztcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfUV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKChhY3R1YWwgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB8fFxuICAgIChhY3R1YWwgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSB8fFxuICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbiAgaWYgKCFhcmVFcXVhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RUYWJsZShhY3R1YWw6IERHLkRhdGFGcmFtZSwgZXhwZWN0ZWQ6IERHLkRhdGFGcmFtZSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWRSb3dDb3VudCA9IGV4cGVjdGVkLnJvd0NvdW50O1xuICBjb25zdCBhY3R1YWxSb3dDb3VudCA9IGFjdHVhbC5yb3dDb3VudDtcbiAgZXhwZWN0KGFjdHVhbFJvd0NvdW50LCBleHBlY3RlZFJvd0NvdW50LCBgJHtlcnJvciA/PyAnJ30sIHJvdyBjb3VudGApO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGV4cGVjdGVkLmNvbHVtbnMpIHtcbiAgICBjb25zdCBhY3R1YWxDb2x1bW4gPSBhY3R1YWwuY29sdW1ucy5ieU5hbWUoY29sdW1uLm5hbWUpO1xuICAgIGlmIChhY3R1YWxDb2x1bW4gPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmIChhY3R1YWxDb2x1bW4udHlwZSAhPSBjb2x1bW4udHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IHR5cGUgZXhwZWN0ZWQgJHtjb2x1bW4udHlwZX0gZ290ICR7YWN0dWFsQ29sdW1uLnR5cGV9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZFJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmdldChpKTtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsQ29sdW1uLmdldChpKTtcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PSBERy5UWVBFLkZMT0FUKVxuICAgICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgdmFsdWUsIDAuMDAwMSwgZXJyb3IpO1xuICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5EQVRFX1RJTUUpXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZS5pc1NhbWUodmFsdWUpLCB0cnVlLCBlcnJvcik7XG4gICAgICBlbHNlXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZSwgdmFsdWUsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdE9iamVjdChhY3R1YWw6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGV4cGVjdGVkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIGZvciAoY29uc3QgW2V4cGVjdGVkS2V5LCBleHBlY3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICBpZiAoIWFjdHVhbC5oYXNPd25Qcm9wZXJ0eShleHBlY3RlZEtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHByb3BlcnR5IFwiJHtleHBlY3RlZEtleX1cIiBub3QgZm91bmRgKTtcblxuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsW2V4cGVjdGVkS2V5XTtcbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGFjdHVhbFZhbHVlKSAmJiBOdW1iZXIuaXNGaW5pdGUoZXhwZWN0ZWRWYWx1ZSkpXG4gICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgKCR7ZXhwZWN0ZWRWYWx1ZX0pIGZvciBrZXkgJyR7ZXhwZWN0ZWRLZXl9JywgZ290ICgke2FjdHVhbFZhbHVlfSlgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0QXJyYXkoYWN0dWFsOiBBcnJheUxpa2U8YW55PiwgZXhwZWN0ZWQ6IEFycmF5TGlrZTxhbnk+KSB7XG4gIGNvbnN0IGFjdHVhbExlbmd0aCA9IGFjdHVhbC5sZW5ndGg7XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoO1xuXG4gIGlmIChhY3R1YWxMZW5ndGggIT0gZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aDogYWN0dWFsIGFycmF5IGxlbmd0aCBpcyAke2FjdHVhbExlbmd0aH0gYCArXG4gICAgICBgYW5kIGV4cGVjdGVkIGFycmF5IGxlbmd0aCBpcyAke2V4cGVjdGVkTGVuZ3RofWApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykge1xuICAgIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSAhPSBleHBlY3RlZFtpXSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZFtpXX0gYXQgcG9zaXRpb24gJHtpfSwgZ290ICR7YWN0dWFsW2ldfWApO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSB0ZXN0IHN1aXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcsIHRlc3RzXzogKCkgPT4gdm9pZCwgb3B0aW9ucz86IENhdGVnb3J5T3B0aW9ucyk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHNfKCk7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldKSB7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5jbGVhciA9IG9wdGlvbnM/LmNsZWFyID8/IHRydWU7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dDtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmUoYmVmb3JlOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuZnVuY3Rpb24gYWRkTmFtZXNwYWNlKHM6IHN0cmluZywgZjogREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfOiBERy5QYWNrYWdlLCBtb2R1bGU/OiBhbnkpIHtcbiAgY29uc3QgcGFja2FnZUlkID0gcGFja2FnZV8uaWQ7XG4gIGlmICh3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0pIHJldHVybjtcbiAgY29uc3QgbW9kdWxlVGVzdHMgPSBtb2R1bGUgPyBtb2R1bGUudGVzdHMgOiB0ZXN0cztcbiAgaWYgKG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICBtb2R1bGVUZXN0c1tkZW1vQ2F0TmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgIE9iamVjdC5rZXlzKG1vZHVsZVRlc3RzKS5maW5kKChjKSA9PiBjLnN0YXJ0c1dpdGgoYXV0b1Rlc3RzQ2F0TmFtZSkgfHwgYy5zdGFydHNXaXRoKGNvcmVDYXROYW1lKSkpIHtcbiAgICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocGFja2FnZV8ubmFtZSA9PT0gJ0RldlRvb2xzJyB8fCAoISFtb2R1bGUgJiYgbW9kdWxlLl9wYWNrYWdlLm5hbWUgPT09ICdEZXZUb29scycpKSB7XG4gICAgZm9yIChjb25zdCBmIG9mICg8YW55PndpbmRvdykuZGFydFRlc3RzKSB7XG4gICAgICBjb25zdCBhcnIgPSBmLm5hbWUuc3BsaXQoL1xccypcXHxcXHMqIS9nKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBhcnIucG9wKCkgPz8gZi5uYW1lO1xuICAgICAgY29uc3QgY2F0ID0gYXJyLmxlbmd0aCA/IGNvcmVDYXROYW1lICsgJzogJyArIGFyci5qb2luKCc6ICcpIDogY29yZUNhdE5hbWU7XG4gICAgICBpZiAobW9kdWxlVGVzdHNbY2F0XSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBtb2R1bGVUZXN0c1tjYXRdID0ge3Rlc3RzOiBbXSwgY2xlYXI6IHRydWV9O1xuICAgICAgbW9kdWxlVGVzdHNbY2F0XS50ZXN0cy5wdXNoKG5ldyBUZXN0KGNhdCwgbmFtZSwgZi50ZXN0LCB7aXNBZ2dyZWdhdGVkOiBmYWxzZSwgdGltZW91dDogU1RBTkRBUlRfVElNRU9VVH0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbW9kdWxlQXV0b1Rlc3RzID0gW107XG4gIGNvbnN0IG1vZHVsZURlbW8gPSBbXTtcbiAgY29uc3QgbW9kdWxlRGV0ZWN0b3JzID0gW107XG4gIGNvbnN0IHBhY2tGdW5jdGlvbnMgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbHRlcihgcGFja2FnZS5pZCA9IFwiJHtwYWNrYWdlSWR9XCJgKS5saXN0KCk7XG4gIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoL3NraXA6XFxzKihbXixcXHNdKyl8d2FpdDpcXHMqKFxcZCspfGNhdDpcXHMqKFteLFxcc10rKXx0aW1lb3V0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBjb25zdCBkZW1vID0gZi5vcHRpb25zWydkZW1vUGF0aCddO1xuICAgIGlmICgodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgICBjb25zdCBtYXA6IHsgc2tpcD86IHN0cmluZywgd2FpdD86IG51bWJlciwgY2F0Pzogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgQXJyYXkuZnJvbShyZXMpLmZvckVhY2goKGFycikgPT4ge1xuICAgICAgICAgIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnc2tpcCcpKSBtYXBbJ3NraXAnXSA9IGFyclsxXTtcbiAgICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgnd2FpdCcpKSBtYXBbJ3dhaXQnXSA9IHBhcnNlSW50KGFyclsyXSk7XG4gICAgICAgICAgZWxzZSBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ2NhdCcpKSBtYXBbJ2NhdCddID0gYXJyWzNdO1xuICAgICAgICAgIGVsc2UgaWYgKGFyclswXS5zdGFydHNXaXRoKCd0aW1lb3V0JykpIG1hcFsndGltZW91dCddID0gcGFyc2VJbnQoYXJyWzRdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRlc3QgPSBuZXcgVGVzdChhdXRvVGVzdHNDYXROYW1lLCB0ZXN0cy5sZW5ndGggPT09IDEgPyBmLm5hbWUgOiBgJHtmLm5hbWV9ICR7aSArIDF9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdyb2suZnVuY3Rpb25zLmV2YWwoYWRkTmFtZXNwYWNlKHRlc3RzW2ldLCBmKSk7XG4gICAgICAgICAgaWYgKG1hcC53YWl0KSBhd2FpdCBkZWxheShtYXAud2FpdCk7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ2Jvb2xlYW4nICYmICFyZXMpIHRocm93IGBGYWlsZWQ6ICR7dGVzdHNbaV19LCBleHBlY3RlZCB0cnVlLCBnb3QgJHtyZXN9YDtcbiAgICAgICAgfSwgeyBza2lwUmVhc29uOiBtYXAuc2tpcCwgdGltZW91dDogbWFwLnRpbWVvdXQgfSk7XG4gICAgICAgIGlmIChtYXAuY2F0KSB7XG4gICAgICAgICAgY29uc3QgY2F0OiBzdHJpbmcgPSBhdXRvVGVzdHNDYXROYW1lICsgJzogJyArIG1hcC5jYXQ7XG4gICAgICAgICAgdGVzdC5jYXRlZ29yeSA9IGNhdDtcbiAgICAgICAgICBpZiAobW9kdWxlVGVzdHNbY2F0XSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgbW9kdWxlVGVzdHNbY2F0XSA9IHsgdGVzdHM6IFtdLCBjbGVhcjogdHJ1ZSB9O1xuICAgICAgICAgIG1vZHVsZVRlc3RzW2NhdF0udGVzdHMucHVzaCh0ZXN0KTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgbW9kdWxlQXV0b1Rlc3RzLnB1c2godGVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZW1vKSB7XG4gICAgICBjb25zdCB3YWl0ID0gZi5vcHRpb25zWydkZW1vV2FpdCddID8gcGFyc2VJbnQoZi5vcHRpb25zWydkZW1vV2FpdCddKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRlc3QgPSBuZXcgVGVzdChkZW1vQ2F0TmFtZSwgZi5mcmllbmRseU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy9ncm9rLnNoZWxsLmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIGF3YWl0IGYuYXBwbHkoKTtcbiAgICAgICAgYXdhaXQgZGVsYXkod2FpdCA/IHdhaXQgOiAyMDAwKTtcbiAgICAgICAgY29uc3QgdW5oYW5kbGVkID0gYXdhaXQgZ3Jvay5zaGVsbC5sYXN0RXJyb3I7XG4gICAgICAgIGlmICh1bmhhbmRsZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHVuaGFuZGxlZCk7XG5cbiAgICAgIH0sIHsgc2tpcFJlYXNvbjogZi5vcHRpb25zWydkZW1vU2tpcCddIH0pO1xuICAgICAgbW9kdWxlRGVtby5wdXNoKHRlc3QpO1xuICAgIH1cbiAgICBpZiAoZi5oYXNUYWcoJ3NlbVR5cGVEZXRlY3RvcicpKSB7XG4gICAgICBjb25zdCB0ZXN0ID0gbmV3IFRlc3QoZGV0ZWN0b3JzQ2F0TmFtZSwgZi5mcmllbmRseU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRlc3REYXRhLmNsb25lKCkuY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGYuYXBwbHkoW2NvbF0pO1xuICAgICAgICAgIGFyci5wdXNoKHJlcyB8fCBjb2wuc2VtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwZWN0KGFyci5maWx0ZXIoKGkpID0+IGkpLmxlbmd0aCwgMSk7XG4gICAgICB9LCB7IHNraXBSZWFzb246IGYub3B0aW9uc1snc2tpcFRlc3QnXSB9KTtcbiAgICAgIG1vZHVsZURldGVjdG9ycy5wdXNoKHRlc3QpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAobW9kdWxlQXV0b1Rlc3RzLmxlbmd0aClcbiAgICBtb2R1bGVUZXN0c1thdXRvVGVzdHNDYXROYW1lXSA9IHsgdGVzdHM6IG1vZHVsZUF1dG9UZXN0cywgY2xlYXI6IHRydWUgfTtcbiAgaWYgKG1vZHVsZURlbW8ubGVuZ3RoKVxuICAgIG1vZHVsZVRlc3RzW2RlbW9DYXROYW1lXSA9IHsgdGVzdHM6IG1vZHVsZURlbW8sIGNsZWFyOiB0cnVlIH07XG4gIGlmIChtb2R1bGVEZXRlY3RvcnMubGVuZ3RoKVxuICAgIG1vZHVsZVRlc3RzW2RldGVjdG9yc0NhdE5hbWVdID0geyB0ZXN0czogbW9kdWxlRGV0ZWN0b3JzLCBjbGVhcjogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gcmVkZWZpbmVDb25zb2xlKCk6IGFueVtdIHtcbiAgY29uc3QgbG9nczogYW55W10gPSBbXTtcbiAgY29uc29sZS5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5hcmdzKTtcbiAgICBzdGRMb2coLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZEluZm8oLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUud2FybiA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZFdhcm4oLi4uYXJncyk7XG4gIH07XG4gIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5hcmdzKTtcbiAgICBzdGRFcnJvciguLi5hcmdzKTtcbiAgfTtcbiAgcmV0dXJuIGxvZ3M7XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q29uc29sZSgpOiB2b2lkIHtcbiAgY29uc29sZS5sb2cgPSBzdGRMb2c7XG4gIGNvbnNvbGUuaW5mbyA9IHN0ZEluZm87XG4gIGNvbnNvbGUud2FybiA9IHN0ZFdhcm47XG4gIGNvbnNvbGUuZXJyb3IgPSBzdGRFcnJvcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKG9wdGlvbnM/OlxuICB7IGNhdGVnb3J5Pzogc3RyaW5nLCB0ZXN0Pzogc3RyaW5nLCB0ZXN0Q29udGV4dD86IFRlc3RDb250ZXh0LCBleGNsdWRlPzogc3RyaW5nW10sIHZlcmJvc2U/OiBib29sZWFuIH0pIHtcbiAgY29uc3QgcGFja2FnZV8gPSBncm9rLmZ1bmN0aW9ucy5nZXRDdXJyZW50Q2FsbCgpPy5mdW5jPy5wYWNrYWdlO1xuICBhd2FpdCBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfKTtcbiAgY29uc3QgcmVzdWx0czoge1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLFxuICAgIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuXG4gIH1bXSA9IFtdO1xuICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICBvcHRpb25zID8/PSB7fTtcbiAgb3B0aW9ucyEudGVzdENvbnRleHQgPz89IG5ldyBUZXN0Q29udGV4dCgpO1xuICAvL2dyb2suc2hlbGwuY2xlYXJMYXN0RXJyb3IoKTtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IFtdO1xuICBjb25zdCBsb2dzID0gcmVkZWZpbmVDb25zb2xlKCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgICBpZiAoKCEhb3B0aW9ucz8uY2F0ZWdvcnkgJiYgIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpIHx8XG4gICAgICAgIG9wdGlvbnMuZXhjbHVkZT8uc29tZSgoYykgPT4ga2V5LnN0YXJ0c1dpdGgoYykpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHN0ZExvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICAgIGNhdGVnb3JpZXMucHVzaChrZXkpO1xuICAgICAgY29uc3Qgc2tpcHBlZCA9IHZhbHVlLnRlc3RzPy5ldmVyeSgodCkgPT4gdC5vcHRpb25zPy5za2lwUmVhc29uKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWx1ZS5iZWZvcmUgJiYgIXNraXBwZWQpIHtcbiAgICAgICAgICBhd2FpdCB0aW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSEoKTtcbiAgICAgICAgICB9LCAxMDAwMDAsIGBiZWZvcmUgJHtvcHRpb25zLmNhdGVnb3J5fTogdGltZW91dCBlcnJvcmApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0gYXdhaXQgZ2V0UmVzdWx0KHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdCA9IHZhbHVlLnRlc3RzID8/IFtdO1xuICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICBpZiAodmFsdWUuY2xlYXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCwgbG9ncywgdmFsdWUudGltZW91dCwgcGFja2FnZV8ubmFtZSwgb3B0aW9ucy52ZXJib3NlKSk7XG4gICAgICAgICAgZ3Jvay5zaGVsbC5jbG9zZUFsbCgpO1xuICAgICAgICAgIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHJlcy5wdXNoKGF3YWl0IGV4ZWNUZXN0KHRbaV0sIG9wdGlvbnM/LnRlc3QsIGxvZ3MsIHZhbHVlLnRpbWVvdXQsIHBhY2thZ2VfLm5hbWUsIG9wdGlvbnMudmVyYm9zZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IHJlcy5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUuYWZ0ZXIgJiYgIXNraXBwZWQpIHsgXG4gICAgICAgICAgYXdhaXQgdGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB2YWx1ZS5hZnRlciEoKTtcbiAgICAgICAgICB9LCAxMDAwMDAsIGBBZnRlciAke29wdGlvbnMuY2F0ZWdvcnl9OiB0aW1lb3V0IGVycm9yYCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgICB2YWx1ZS5hZnRlclN0YXR1cyA9IGF3YWl0IGdldFJlc3VsdCh4KTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGFmdGVyIGNhdGVnb3J5XG4gICAgICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAvLyBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICAgIGRhdGEucHVzaCh7IGNhdGVnb3J5OiBrZXksIG5hbWU6ICdhZnRlcicsIHJlc3VsdDogdmFsdWUuYWZ0ZXJTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2UgfSk7XG4gICAgICBpZiAodmFsdWUuYmVmb3JlU3RhdHVzKVxuICAgICAgICBkYXRhLnB1c2goeyBjYXRlZ29yeToga2V5LCBuYW1lOiAnYmVmb3JlJywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2UgfSk7XG4gICAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlc2V0Q29uc29sZSgpO1xuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LmNhdGNoVW5oYW5kbGVkKSB7XG4gICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBncm9rLnNoZWxsLmxhc3RFcnJvcjtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBjYXRlZ29yeTogJ1VuaGFuZGxlZCBleGNlcHRpb25zJyxcbiAgICAgIG5hbWU6ICdFeGNlcHRpb24nLFxuICAgICAgcmVzdWx0OiBlcnJvciA/PyAnJywgc3VjY2VzczogIWVycm9yLCBtczogMCwgc2tpcHBlZDogZmFsc2VcbiAgICB9O1xuICAgIHJlc3VsdHMucHVzaChwYXJhbXMpO1xuICAgICg8YW55PnBhcmFtcykucGFja2FnZSA9IHBhY2thZ2VfLm5hbWU7XG4gICAgaWYgKCg8YW55Pmdyb2suc2hlbGwpLnJlcG9ydFRlc3QgIT0gbnVsbClcbiAgICAgIGF3YWl0ICg8YW55Pmdyb2suc2hlbGwpLnJlcG9ydFRlc3QoJ3BhY2thZ2UnLCBwYXJhbXMpO1xuICAgIGVsc2Uge1xuICAgICAgYXdhaXQgZmV0Y2goYCR7Z3Jvay5kYXBpLnJvb3R9L2xvZy90ZXN0cy9wYWNrYWdlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZXN1bHQoeDogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGAke3gudG9TdHJpbmcoKX1cXG4ke3guc3RhY2sgPyAoYXdhaXQgREcuTG9nZ2VyLnRyYW5zbGF0ZVN0YWNrVHJhY2UoeC5zdGFjaykpIDogJyd9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY1Rlc3QodDogVGVzdCwgcHJlZGljYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGxvZ3M6IGFueVtdLFxuICBjYXRlZ29yeVRpbWVvdXQ/OiBudW1iZXIsIHBhY2thZ2VOYW1lPzogc3RyaW5nLCB2ZXJib3NlPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gIGxvZ3MubGVuZ3RoID0gMDtcbiAgbGV0IHI6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogYW55LCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuLCBsb2dzPzogc3RyaW5nIH07XG4gIGxldCB0eXBlOiBzdHJpbmcgPSAncGFja2FnZSc7XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKHQubmFtZS50b0xvd2VyQ2FzZSgpICE9PSBwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IHNraXAgPSB0Lm9wdGlvbnM/LnNraXBSZWFzb24gfHwgZmlsdGVyO1xuICBjb25zdCBza2lwUmVhc29uID0gZmlsdGVyID8gJ3NraXBwZWQnIDogdC5vcHRpb25zPy5za2lwUmVhc29uO1xuICBpZiAoIXNraXApXG4gICAgc3RkTG9nKGBTdGFydGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9YCk7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogc2tpcFJlYXNvbiEsIG1zOiAwLCBza2lwcGVkOiB0cnVlIH07XG4gICAgZWxzZSB7XG4gICAgICBsZXQgdGltZW91dF8gPSB0Lm9wdGlvbnM/LnRpbWVvdXQgPT09IFNUQU5EQVJUX1RJTUVPVVQgJiZcbiAgICAgICAgY2F0ZWdvcnlUaW1lb3V0ID8gY2F0ZWdvcnlUaW1lb3V0IDogdC5vcHRpb25zPy50aW1lb3V0ITtcbiAgICAgIHRpbWVvdXRfID0gREcuVGVzdC5pc0luQmVuY2htYXJrICYmIHRpbWVvdXRfID09PSBTVEFOREFSVF9USU1FT1VUID8gQkVOQ0hNQVJLX1RJTUVPVVQgOiB0aW1lb3V0XztcbiAgICAgIHIgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdGltZW91dCh0LnRlc3QsIHRpbWVvdXRfKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgIHN0ZEVycm9yKHgpO1xuICAgIHIgPSB7IHN1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IGF3YWl0IGdldFJlc3VsdCh4KSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cbiAgaWYgKHQub3B0aW9ucz8uaXNBZ2dyZWdhdGVkICYmIHIucmVzdWx0LmNvbnN0cnVjdG9yID09PSBERy5EYXRhRnJhbWUpIHtcbiAgICBjb25zdCBjb2wgPSByLnJlc3VsdC5jb2woJ3N1Y2Nlc3MnKTtcbiAgICBpZiAoY29sKVxuICAgICAgci5zdWNjZXNzID0gY29sLnN0YXRzLnN1bSA9PT0gY29sLmxlbmd0aDtcbiAgICBpZiAoIXZlcmJvc2UpIHtcbiAgICAgIGNvbnN0IGRmID0gci5yZXN1bHQ7XG4gICAgICBkZi5jb2x1bW5zLnJlbW92ZSgnc3RhY2snKTtcbiAgICAgIGRmLnJvd3MucmVtb3ZlV2hlcmUoKHIpID0+IHIuZ2V0KCdzdWNjZXNzJykpO1xuICAgICAgci5yZXN1bHQgPSBkZjtcbiAgICB9XG4gICAgci5yZXN1bHQgPSByLnJlc3VsdC50b0NzdigpO1xuICB9XG4gIHIubG9ncyA9IGxvZ3Muam9pbignXFxuJyk7XG4gIHIubXMgPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gIGlmICghc2tpcClcbiAgICBzdGRMb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG4gIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICByLm5hbWUgPSB0Lm5hbWU7XG4gIGlmICghZmlsdGVyKSB7XG4gICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgICdzdWNjZXNzJzogci5zdWNjZXNzLCAncmVzdWx0Jzogci5yZXN1bHQsICdtcyc6IHIubXMsXG4gICAgICAnc2tpcHBlZCc6IHIuc2tpcHBlZCwgJ3BhY2thZ2UnOiBwYWNrYWdlTmFtZSwgJ2NhdGVnb3J5JzogdC5jYXRlZ29yeSwgJ25hbWUnOiB0Lm5hbWUsICdsb2dzJzogci5sb2dzXG4gICAgfTtcbiAgICBpZiAoci5yZXN1bHQuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XG4gICAgICBjb25zdCByZXMgPSBPYmplY3Qua2V5cyhyLnJlc3VsdCkucmVkdWNlKChhY2MsIGspID0+ICh7IC4uLmFjYywgWydyZXN1bHQuJyArIGtdOiByLnJlc3VsdFtrXSB9KSwge30pO1xuICAgICAgcGFyYW1zID0geyAuLi5wYXJhbXMsIC4uLnJlcyB9O1xuICAgIH1cbiAgICBpZiAoKDxhbnk+Z3Jvay5zaGVsbCkucmVwb3J0VGVzdCAhPSBudWxsKVxuICAgICAgYXdhaXQgKDxhbnk+Z3Jvay5zaGVsbCkucmVwb3J0VGVzdCh0eXBlLCBwYXJhbXMpO1xuICAgIGVsc2Uge1xuICAgICAgYXdhaXQgZmV0Y2goYCR7Z3Jvay5kYXBpLnJvb3R9L2xvZy90ZXN0cy8ke3R5cGV9YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LFxuICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGFyYW1zKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufVxuXG4vKiBXYWl0cyBbbXNdIG1pbGxpc2Vjb25kcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpIHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF3YWl0Q2hlY2soY2hlY2tIYW5kbGVyOiAoKSA9PiBib29sZWFuLFxuICBlcnJvcjogc3RyaW5nID0gJ1RpbWVvdXQgZXhjZWVkZWQnLCB3YWl0OiBudW1iZXIgPSA1MDAsIGludGVydmFsOiBudW1iZXIgPSA1MCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICB9LCB3YWl0KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWxJZDogVGltZW91dCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmIChjaGVja0hhbmRsZXIoKSkge1xuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgaW50ZXJ2YWwpO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyB0ZXN0IGV4ZWN1dGlvbiByZXN1bHQgb3IgYW4gZXJyb3IgaW4gY2FzZSBvZiB0aW1lb3V0XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZW91dChmdW5jOiAoKSA9PiBQcm9taXNlPGFueT4sIHRlc3RUaW1lb3V0OiBudW1iZXIsIHRpbWVvdXRSZWFzb246IHN0cmluZyA9ICdFWEVDVVRJT04gVElNRU9VVCcpOiBQcm9taXNlPGFueT4ge1xuICBsZXQgdGltZW91dDogYW55ID0gbnVsbDtcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChfLCByZWplY3QpID0+IHtcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KHRpbWVvdXRSZWFzb24pO1xuICAgIH0sIHRlc3RUaW1lb3V0KTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbZnVuYygpLCB0aW1lb3V0UHJvbWlzZV0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0aW1lb3V0KVxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RpYWxvZ1ByZXNlbnQoZGlhbG9nVGl0bGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBkaWFsb2dzID0gREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlhbG9ncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkaWFsb2dzW2ldLnRpdGxlID09IGRpYWxvZ1RpdGxlKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogRXhwZWN0cyBhbiBhc3luY2hyb25vdXMge0BsaW5rIGFjdGlvbn0gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLiBVc2Uge0BsaW5rIGNoZWNrfSB0byBwZXJmb3JtXG4gKiBkZWVwZXIgaW5zcGVjdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGlmIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9uKCk6IFByb21pc2U8dm9pZD59IGFjdGlvblxuICogQHBhcmFtICB7ZnVuY3Rpb24oYW55KTogYm9vbGVhbn0gY2hlY2tcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBlY3RFeGNlcHRpb25Bc3luYyhhY3Rpb246ICgpID0+IFByb21pc2U8dm9pZD4sXG4gIGNoZWNrPzogKGV4Y2VwdGlvbjogYW55KSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBjYXVnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbGV0IGNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhY3Rpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNhdWdodCA9IHRydWU7XG4gICAgY2hlY2tlZCA9ICFjaGVjayB8fCBjaGVjayhlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWNhdWdodClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGJ1dCBub3QgdGhyb3duJyk7XG4gICAgaWYgKCFjaGVja2VkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBleHBlY3RlZCBleGNlcHRpb24gaXMgdGhyb3duLCBidXQgaXQgZG9lcyBub3Qgc2F0aXNmeSB0aGUgY29uZGl0aW9uJyk7XG4gIH1cbn1cblxuY29uc3QgY2F0REYgPSBERy5EYXRhRnJhbWUuZnJvbUNvbHVtbnMoW0RHLkNvbHVtbi5mcm9tU3RyaW5ncygnY29sJywgWyd2YWwxJywgJ3ZhbDInLCAndmFsMyddKV0pO1xuXG4vKipcbiAqIFVuaXZlcnNhbCB0ZXN0IGZvciB2aWV3ZXJzLiBJdCBzZWFyY2ggdmlld2VycyBpbiBET00gYnkgdGFnczogY2FudmFzLCBzdmcsIGltZywgaW5wdXQsIGgxLCBhXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHYgVmlld2VyIG5hbWVcbiAqIEBwYXJhbSAge0RHLkRhdGFGcmFtZX0gZGYgRGF0YWZyYW1lIHRvIHVzZS4gU2hvdWxkIGhhdmUgYXQgbGVhc3QgMyByb3dzXG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLmRldGVjdFNlbWFudGljVHlwZXMgU3BlY2lmeSB3aGV0aGVyIHRvIGRldGVjdCBzZW1hbnRpYyB0eXBlcyBvciBub3RcbiAqIEBwYXJhbSAge2Jvb2xlYW59IG9wdGlvbnMucmVhZE9ubHkgSWYgc2V0IHRvIHRydWUsIHRoZSBkYXRhZnJhbWUgd2lsbCBub3QgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSB0ZXN0XG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLmFyYml0cmFyeURmVGVzdCBJZiBzZXQgdG8gZmFsc2UsIHRlc3Qgb24gYXJiaXRyYXJ5IGRhdGFmcmFtZVxuICogKG9uZSBjYXRlZ29yaWNhbCBjb2x1bW4pIHdpbGwgbm90IGJlIHBlcmZvcm1lZFxuICogQHBhcmFtICB7b2JqZWN0fSBvcHRpb25zIExpc3Qgb2Ygb3B0aW9ucyAob3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBUaGUgdGVzdCBpcyBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgaWYgaXQgY29tcGxldGVzIHdpdGhvdXQgZXJyb3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgb3B0aW9ucz86IHtcbiAgZGV0ZWN0U2VtYW50aWNUeXBlcz86IGJvb2xlYW4sIHJlYWRPbmx5PzogYm9vbGVhbiwgYXJiaXRyYXJ5RGZUZXN0PzogYm9vbGVhbixcbiAgcGFja2FnZU5hbWU/OiBzdHJpbmcsIGF3YWl0Vmlld2VyPzogKHZpZXdlcjogREcuVmlld2VyKSA9PiBQcm9taXNlPHZvaWQ+XG59KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgY29uc3QgcGFja2FnZU5hbWUgPSBvcHRpb25zPy5wYWNrYWdlTmFtZSA/PyAnJztcbiAgaWYgKG9wdGlvbnM/LmRldGVjdFNlbWFudGljVHlwZXMpXG4gICAgYXdhaXQgZ3Jvay5kYXRhLmRldGVjdFNlbWFudGljVHlwZXMoZGYpO1xuICBjb25zdCB0diA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KGRmKTtcblxuICB0cnkge1xuICAgIC8vMS4gT3BlbiwgZG8gbm90aGluZyBhbmQgY2xvc2VcbiAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkKTtcbiAgICAvL2luIGNhc2Ugdmlld2VyIHdpdGggYXN5bmMgcmVuZGVyaW5nIC0gd2FpdCBmb3IgcmVuZGVyIHRvIGNvbXBsZXRlXG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgdW5kZWZpbmVkLCBvcHRpb25zIS5hd2FpdFZpZXdlcik7XG5cbiAgICAvLzIuIE9wZW4gdmlld2VyLCBydW4gc2VsZWN0aW9uLCBmaWx0ZXIsIGV0Yy4gYW5kIGNsb3NlXG4gICAgaWYgKCFvcHRpb25zPy5yZWFkT25seSkge1xuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgc2VsZWN0RmlsdGVyQ2hhbmdlQ3VycmVudCk7XG4gICAgICBpZiAob3B0aW9ucz8uYXdhaXRWaWV3ZXIpXG4gICAgICAgIGF3YWl0IHRlc3RWaWV3ZXJJbnRlcm5hbCh0diwgdiwgcGFja2FnZU5hbWUsIGdyb2suZXZlbnRzLm9uVmlld2VyQWRkZWQsIHNlbGVjdEZpbHRlckNoYW5nZUN1cnJlbnQsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKTtcbiAgICB9XG5cbiAgICAvLzIuIE9wZW4gdmlld2VyLCBjaGFuZ2Ugb3B0aW9ucywgc2F2ZSBsYXlvdXQgYW5kIGNsb3NlXG4gICAgbGV0IHByb3BzQW5kTGF5b3V0OiB7IGxheW91dDogYW55LCBzYXZlZFByb3BzOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICAgIHByb3BzQW5kTGF5b3V0ID0gYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgY2hhbmdlT3B0aW9uc1NhdmVMYXlvdXQpO1xuICAgIGlmIChvcHRpb25zPy5hd2FpdFZpZXdlcilcbiAgICAgIHByb3BzQW5kTGF5b3V0ID0gYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCxcbiAgICAgICAgY2hhbmdlT3B0aW9uc1NhdmVMYXlvdXQsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKVxuXG4gICAgLy8zLiBMb2FkIGxheW91dFxuICAgIGF3YWl0IHRlc3RWaWV3ZXJJbnRlcm5hbCh0diwgdiwgcGFja2FnZU5hbWUsIGdyb2suZXZlbnRzLm9uVmlld0xheW91dEFwcGxpZWQsIGxvYWRMYXlvdXQsIHVuZGVmaW5lZCwgcHJvcHNBbmRMYXlvdXQ/LmxheW91dCxcbiAgICAgIHsgc2F2ZWRQcm9wczogcHJvcHNBbmRMYXlvdXQ/LnNhdmVkUHJvcHMgfSk7XG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3TGF5b3V0QXBwbGllZCwgbG9hZExheW91dCwgb3B0aW9ucyEuYXdhaXRWaWV3ZXIsXG4gICAgICAgIHByb3BzQW5kTGF5b3V0Py5sYXlvdXQsIHsgc2F2ZWRQcm9wczogcHJvcHNBbmRMYXlvdXQ/LnNhdmVkUHJvcHMgfSk7XG5cbiAgICAvLzQuIE9wZW4gdmlld2VyIG9uIGFyYml0YXJ5IGRhdGFzZXRcbiAgICBpZiAob3B0aW9ucz8uYXJiaXRyYXJ5RGZUZXN0ICE9PSBmYWxzZSkge1xuICAgICAgdHYuZGF0YUZyYW1lID0gY2F0REY7XG4gICAgICBhd2FpdCBkZWxheSg1MCk7XG4gICAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkKTtcbiAgICAgIGlmIChvcHRpb25zPy5hd2FpdFZpZXdlcilcbiAgICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgdW5kZWZpbmVkLCBvcHRpb25zIS5hd2FpdFZpZXdlcik7XG4gICAgfVxuXG4gICAgLy81LiBDYWxsIHBvc3Rwb25lZCBmaWx0ZXJpbmdcbiAgICBhd2FpdCB0ZXN0Vmlld2VySW50ZXJuYWwodHYsIHYsIHBhY2thZ2VOYW1lLCBncm9rLmV2ZW50cy5vblZpZXdlckFkZGVkLCBmaWx0ZXJBc3luYyk7XG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKVxuICAgICAgYXdhaXQgdGVzdFZpZXdlckludGVybmFsKHR2LCB2LCBwYWNrYWdlTmFtZSwgZ3Jvay5ldmVudHMub25WaWV3ZXJBZGRlZCwgZmlsdGVyQXN5bmMsIG9wdGlvbnMhLmF3YWl0Vmlld2VyKTtcblxuICB9IGZpbmFsbHkge1xuICAgIC8vIGNsb3NlQWxsKCkgaXMgaGFuZGxpbmcgYnkgY29tbW9uIHRlc3Qgd29ya2Zsb3dcbiAgICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgLy8gREcuQmFsbG9vbi5jbG9zZUFsbCgpO1xuICB9XG59XG4iXX0=","(function(){\n\"use strict\";\nvar doc = document;\nvar win = window;\nvar docEle = doc.documentElement;\nvar createElement = doc.createElement.bind(doc);\nvar div = createElement('div');\nvar table = createElement('table');\nvar tbody = createElement('tbody');\nvar tr = createElement('tr');\nvar isArray = Array.isArray, ArrayPrototype = Array.prototype;\nvar concat = ArrayPrototype.concat, filter = ArrayPrototype.filter, indexOf = ArrayPrototype.indexOf, map = ArrayPrototype.map, push = ArrayPrototype.push, slice = ArrayPrototype.slice, some = ArrayPrototype.some, splice = ArrayPrototype.splice;\nvar idRe = /^#(?:[\\w-]|\\\\.|[^\\x00-\\xa0])*$/;\nvar classRe = /^\\.(?:[\\w-]|\\\\.|[^\\x00-\\xa0])*$/;\nvar htmlRe = /<.+>/;\nvar tagRe = /^\\w+$/;\n// @require ./variables.ts\nfunction find(selector, context) {\n var isFragment = isDocumentFragment(context);\n return !selector || (!isFragment && !isDocument(context) && !isElement(context))\n ? []\n : !isFragment && classRe.test(selector)\n ? context.getElementsByClassName(selector.slice(1).replace(/\\\\/g, ''))\n : !isFragment && tagRe.test(selector)\n ? context.getElementsByTagName(selector)\n : context.querySelectorAll(selector);\n}\n// @require ./find.ts\n// @require ./variables.ts\nvar Cash = /** @class */ (function () {\n function Cash(selector, context) {\n if (!selector)\n return;\n if (isCash(selector))\n return selector;\n var eles = selector;\n if (isString(selector)) {\n var ctx = context || doc;\n eles = idRe.test(selector) && isDocument(ctx)\n ? ctx.getElementById(selector.slice(1).replace(/\\\\/g, ''))\n : htmlRe.test(selector)\n ? parseHTML(selector)\n : isCash(ctx)\n ? ctx.find(selector)\n : isString(ctx)\n ? cash(ctx).find(selector)\n : find(selector, ctx);\n if (!eles)\n return;\n }\n else if (isFunction(selector)) {\n return this.ready(selector); //FIXME: `fn.ready` is not included in `core`, but it's actually a core functionality\n }\n if (eles.nodeType || eles === win)\n eles = [eles];\n this.length = eles.length;\n for (var i = 0, l = this.length; i < l; i++) {\n this[i] = eles[i];\n }\n }\n Cash.prototype.init = function (selector, context) {\n return new Cash(selector, context);\n };\n return Cash;\n}());\nvar fn = Cash.prototype;\nvar cash = fn.init;\ncash.fn = cash.prototype = fn; // Ensuring that `cash () instanceof cash`\nfn.length = 0;\nfn.splice = splice; // Ensuring a cash collection gets printed as array-like in Chrome's devtools\nif (typeof Symbol === 'function') { // Ensuring a cash collection is iterable\n fn[Symbol['iterator']] = ArrayPrototype[Symbol['iterator']];\n}\nfunction isCash(value) {\n return value instanceof Cash;\n}\nfunction isWindow(value) {\n return !!value && value === value.window;\n}\nfunction isDocument(value) {\n return !!value && value.nodeType === 9;\n}\nfunction isDocumentFragment(value) {\n return !!value && value.nodeType === 11;\n}\nfunction isElement(value) {\n return !!value && value.nodeType === 1;\n}\nfunction isText(value) {\n return !!value && value.nodeType === 3;\n}\nfunction isBoolean(value) {\n return typeof value === 'boolean';\n}\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction isUndefined(value) {\n return value === undefined;\n}\nfunction isNull(value) {\n return value === null;\n}\nfunction isNumeric(value) {\n return !isNaN(parseFloat(value)) && isFinite(value);\n}\nfunction isPlainObject(value) {\n if (typeof value !== 'object' || value === null)\n return false;\n var proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\ncash.isWindow = isWindow;\ncash.isFunction = isFunction;\ncash.isArray = isArray;\ncash.isNumeric = isNumeric;\ncash.isPlainObject = isPlainObject;\nfunction each(arr, callback, _reverse) {\n if (_reverse) {\n var i = arr.length;\n while (i--) {\n if (callback.call(arr[i], i, arr[i]) === false)\n return arr;\n }\n }\n else if (isPlainObject(arr)) {\n var keys = Object.keys(arr);\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n if (callback.call(arr[key], key, arr[key]) === false)\n return arr;\n }\n }\n else {\n for (var i = 0, l = arr.length; i < l; i++) {\n if (callback.call(arr[i], i, arr[i]) === false)\n return arr;\n }\n }\n return arr;\n}\ncash.each = each;\nfn.each = function (callback) {\n return each(this, callback);\n};\nfn.empty = function () {\n return this.each(function (i, ele) {\n while (ele.firstChild) {\n ele.removeChild(ele.firstChild);\n }\n });\n};\nfunction extend() {\n var sources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sources[_i] = arguments[_i];\n }\n var deep = isBoolean(sources[0]) ? sources.shift() : false;\n var target = sources.shift();\n var length = sources.length;\n if (!target)\n return {};\n if (!length)\n return extend(deep, cash, target);\n for (var i = 0; i < length; i++) {\n var source = sources[i];\n for (var key in source) {\n if (deep && (isArray(source[key]) || isPlainObject(source[key]))) {\n if (!target[key] || target[key].constructor !== source[key].constructor)\n target[key] = new source[key].constructor();\n extend(deep, target[key], source[key]);\n }\n else {\n target[key] = source[key];\n }\n }\n }\n return target;\n}\ncash.extend = extend;\nfn.extend = function (plugins) {\n return extend(fn, plugins);\n};\n// @require ./type_checking.ts\nvar splitValuesRe = /\\S+/g;\nfunction getSplitValues(str) {\n return isString(str) ? str.match(splitValuesRe) || [] : [];\n}\nfn.toggleClass = function (cls, force) {\n var classes = getSplitValues(cls);\n var isForce = !isUndefined(force);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n each(classes, function (i, c) {\n if (isForce) {\n force ? ele.classList.add(c) : ele.classList.remove(c);\n }\n else {\n ele.classList.toggle(c);\n }\n });\n });\n};\nfn.addClass = function (cls) {\n return this.toggleClass(cls, true);\n};\nfn.removeAttr = function (attr) {\n var attrs = getSplitValues(attr);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n each(attrs, function (i, a) {\n ele.removeAttribute(a);\n });\n });\n};\nfunction attr(attr, value) {\n if (!attr)\n return;\n if (isString(attr)) {\n if (arguments.length < 2) {\n if (!this[0] || !isElement(this[0]))\n return;\n var value_1 = this[0].getAttribute(attr);\n return isNull(value_1) ? undefined : value_1;\n }\n if (isUndefined(value))\n return this;\n if (isNull(value))\n return this.removeAttr(attr);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n ele.setAttribute(attr, value);\n });\n }\n for (var key in attr) {\n this.attr(key, attr[key]);\n }\n return this;\n}\nfn.attr = attr;\nfn.removeClass = function (cls) {\n if (arguments.length)\n return this.toggleClass(cls, false);\n return this.attr('class', '');\n};\nfn.hasClass = function (cls) {\n return !!cls && some.call(this, function (ele) { return isElement(ele) && ele.classList.contains(cls); });\n};\nfn.get = function (index) {\n if (isUndefined(index))\n return slice.call(this);\n index = Number(index);\n return this[index < 0 ? index + this.length : index];\n};\nfn.eq = function (index) {\n return cash(this.get(index));\n};\nfn.first = function () {\n return this.eq(0);\n};\nfn.last = function () {\n return this.eq(-1);\n};\nfunction text(text) {\n if (isUndefined(text)) {\n return this.get().map(function (ele) { return isElement(ele) || isText(ele) ? ele.textContent : ''; }).join('');\n }\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n ele.textContent = text;\n });\n}\nfn.text = text;\n// @require core/type_checking.ts\n// @require core/variables.ts\nfunction computeStyle(ele, prop, isVariable) {\n if (!isElement(ele))\n return;\n var style = win.getComputedStyle(ele, null);\n return isVariable ? style.getPropertyValue(prop) || undefined : style[prop] || ele.style[prop];\n}\n// @require ./compute_style.ts\nfunction computeStyleInt(ele, prop) {\n return parseInt(computeStyle(ele, prop), 10) || 0;\n}\n// @require css/helpers/compute_style_int.ts\nfunction getExtraSpace(ele, xAxis) {\n return computeStyleInt(ele, \"border\".concat(xAxis ? 'Left' : 'Top', \"Width\")) + computeStyleInt(ele, \"padding\".concat(xAxis ? 'Left' : 'Top')) + computeStyleInt(ele, \"padding\".concat(xAxis ? 'Right' : 'Bottom')) + computeStyleInt(ele, \"border\".concat(xAxis ? 'Right' : 'Bottom', \"Width\"));\n}\n// @require css/helpers/compute_style.ts\nvar defaultDisplay = {};\nfunction getDefaultDisplay(tagName) {\n if (defaultDisplay[tagName])\n return defaultDisplay[tagName];\n var ele = createElement(tagName);\n doc.body.insertBefore(ele, null);\n var display = computeStyle(ele, 'display');\n doc.body.removeChild(ele);\n return defaultDisplay[tagName] = display !== 'none' ? display : 'block';\n}\n// @require css/helpers/compute_style.ts\nfunction isHidden(ele) {\n return computeStyle(ele, 'display') === 'none';\n}\n// @require ./cash.ts\nfunction matches(ele, selector) {\n var matches = ele && (ele['matches'] || ele['webkitMatchesSelector'] || ele['msMatchesSelector']);\n return !!matches && !!selector && matches.call(ele, selector);\n}\n// @require ./matches.ts\n// @require ./type_checking.ts\nfunction getCompareFunction(comparator) {\n return isString(comparator)\n ? function (i, ele) { return matches(ele, comparator); }\n : isFunction(comparator)\n ? comparator\n : isCash(comparator)\n ? function (i, ele) { return comparator.is(ele); }\n : !comparator\n ? function () { return false; }\n : function (i, ele) { return ele === comparator; };\n}\nfn.filter = function (comparator) {\n var compare = getCompareFunction(comparator);\n return cash(filter.call(this, function (ele, i) { return compare.call(ele, i, ele); }));\n};\n// @require collection/filter.ts\nfunction filtered(collection, comparator) {\n return !comparator ? collection : collection.filter(comparator);\n}\nfn.detach = function (comparator) {\n filtered(this, comparator).each(function (i, ele) {\n if (ele.parentNode) {\n ele.parentNode.removeChild(ele);\n }\n });\n return this;\n};\nvar fragmentRe = /^\\s*<(\\w+)[^>]*>/;\nvar singleTagRe = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/;\nvar containers = {\n '*': div,\n tr: tbody,\n td: tr,\n th: tr,\n thead: table,\n tbody: table,\n tfoot: table\n};\n//TODO: Create elements inside a document fragment, in order to prevent inline event handlers from firing\n//TODO: Ensure the created elements have the fragment as their parent instead of null, this also ensures we can deal with detatched nodes more reliably\nfunction parseHTML(html) {\n if (!isString(html))\n return [];\n if (singleTagRe.test(html))\n return [createElement(RegExp.$1)];\n var fragment = fragmentRe.test(html) && RegExp.$1;\n var container = containers[fragment] || containers['*'];\n container.innerHTML = html;\n return cash(container.childNodes).detach().get();\n}\ncash.parseHTML = parseHTML;\nfn.has = function (selector) {\n var comparator = isString(selector)\n ? function (i, ele) { return find(selector, ele).length; }\n : function (i, ele) { return ele.contains(selector); };\n return this.filter(comparator);\n};\nfn.not = function (comparator) {\n var compare = getCompareFunction(comparator);\n return this.filter(function (i, ele) { return (!isString(comparator) || isElement(ele)) && !compare.call(ele, i, ele); });\n};\nfunction pluck(arr, prop, deep, until) {\n var plucked = [];\n var isCallback = isFunction(prop);\n var compare = until && getCompareFunction(until);\n for (var i = 0, l = arr.length; i < l; i++) {\n if (isCallback) {\n var val_1 = prop(arr[i]);\n if (val_1.length)\n push.apply(plucked, val_1);\n }\n else {\n var val_2 = arr[i][prop];\n while (val_2 != null) {\n if (until && compare(-1, val_2))\n break;\n plucked.push(val_2);\n val_2 = deep ? val_2[prop] : null;\n }\n }\n }\n return plucked;\n}\n// @require core/pluck.ts\n// @require core/variables.ts\nfunction getValue(ele) {\n if (ele.multiple && ele.options)\n return pluck(filter.call(ele.options, function (option) { return option.selected && !option.disabled && !option.parentNode.disabled; }), 'value');\n return ele.value || '';\n}\nfunction val(value) {\n if (!arguments.length)\n return this[0] && getValue(this[0]);\n return this.each(function (i, ele) {\n var isSelect = ele.multiple && ele.options;\n if (isSelect || checkableRe.test(ele.type)) {\n var eleValue_1 = isArray(value) ? map.call(value, String) : (isNull(value) ? [] : [String(value)]);\n if (isSelect) {\n each(ele.options, function (i, option) {\n option.selected = eleValue_1.indexOf(option.value) >= 0;\n }, true);\n }\n else {\n ele.checked = eleValue_1.indexOf(ele.value) >= 0;\n }\n }\n else {\n ele.value = isUndefined(value) || isNull(value) ? '' : value;\n }\n });\n}\nfn.val = val;\nfn.is = function (comparator) {\n var compare = getCompareFunction(comparator);\n return some.call(this, function (ele, i) { return compare.call(ele, i, ele); });\n};\ncash.guid = 1;\nfunction unique(arr) {\n return arr.length > 1 ? filter.call(arr, function (item, index, self) { return indexOf.call(self, item) === index; }) : arr;\n}\ncash.unique = unique;\nfn.add = function (selector, context) {\n return cash(unique(this.get().concat(cash(selector, context).get())));\n};\nfn.children = function (comparator) {\n return filtered(cash(unique(pluck(this, function (ele) { return ele.children; }))), comparator);\n};\nfn.parent = function (comparator) {\n return filtered(cash(unique(pluck(this, 'parentNode'))), comparator);\n};\nfn.index = function (selector) {\n var child = selector ? cash(selector)[0] : this[0];\n var collection = selector ? this : cash(child).parent().children();\n return indexOf.call(collection, child);\n};\nfn.closest = function (comparator) {\n var filtered = this.filter(comparator);\n if (filtered.length)\n return filtered;\n var $parent = this.parent();\n if (!$parent.length)\n return filtered;\n return $parent.closest(comparator);\n};\nfn.siblings = function (comparator) {\n return filtered(cash(unique(pluck(this, function (ele) { return cash(ele).parent().children().not(ele); }))), comparator);\n};\nfn.find = function (selector) {\n return cash(unique(pluck(this, function (ele) { return find(selector, ele); })));\n};\n// @require core/variables.ts\n// @require collection/filter.ts\n// @require traversal/find.ts\nvar HTMLCDATARe = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\nvar scriptTypeRe = /^$|^module$|\\/(java|ecma)script/i;\nvar scriptAttributes = ['type', 'src', 'nonce', 'noModule'];\nfunction evalScripts(node, doc) {\n var collection = cash(node);\n collection.filter('script').add(collection.find('script')).each(function (i, ele) {\n if (scriptTypeRe.test(ele.type) && docEle.contains(ele)) { // The script type is supported // The element is attached to the DOM // Using `documentElement` for broader browser support\n var script_1 = createElement('script');\n script_1.text = ele.textContent.replace(HTMLCDATARe, '');\n each(scriptAttributes, function (i, attr) {\n if (ele[attr])\n script_1[attr] = ele[attr];\n });\n doc.head.insertBefore(script_1, null);\n doc.head.removeChild(script_1);\n }\n });\n}\n// @require ./eval_scripts.ts\nfunction insertElement(anchor, target, left, inside, evaluate) {\n if (inside) { // prepend/append\n anchor.insertBefore(target, left ? anchor.firstChild : null);\n }\n else { // before/after\n if (anchor.nodeName === 'HTML') {\n anchor.parentNode.replaceChild(target, anchor);\n }\n else {\n anchor.parentNode.insertBefore(target, left ? anchor : anchor.nextSibling);\n }\n }\n if (evaluate) {\n evalScripts(target, anchor.ownerDocument);\n }\n}\n// @require ./insert_element.ts\nfunction insertSelectors(selectors, anchors, inverse, left, inside, reverseLoop1, reverseLoop2, reverseLoop3) {\n each(selectors, function (si, selector) {\n each(cash(selector), function (ti, target) {\n each(cash(anchors), function (ai, anchor) {\n var anchorFinal = inverse ? target : anchor;\n var targetFinal = inverse ? anchor : target;\n var indexFinal = inverse ? ti : ai;\n insertElement(anchorFinal, !indexFinal ? targetFinal : targetFinal.cloneNode(true), left, inside, !indexFinal);\n }, reverseLoop3);\n }, reverseLoop2);\n }, reverseLoop1);\n return anchors;\n}\nfn.after = function () {\n return insertSelectors(arguments, this, false, false, false, true, true);\n};\nfn.append = function () {\n return insertSelectors(arguments, this, false, false, true);\n};\nfunction html(html) {\n if (!arguments.length)\n return this[0] && this[0].innerHTML;\n if (isUndefined(html))\n return this;\n var hasScript = /<script[\\s>]/.test(html);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n if (hasScript) {\n cash(ele).empty().append(html);\n }\n else {\n ele.innerHTML = html;\n }\n });\n}\nfn.html = html;\nfn.appendTo = function (selector) {\n return insertSelectors(arguments, this, true, false, true);\n};\nfn.wrapInner = function (selector) {\n return this.each(function (i, ele) {\n var $ele = cash(ele);\n var contents = $ele.contents();\n contents.length ? contents.wrapAll(selector) : $ele.append(selector);\n });\n};\nfn.before = function () {\n return insertSelectors(arguments, this, false, true);\n};\nfn.wrapAll = function (selector) {\n var structure = cash(selector);\n var wrapper = structure[0];\n while (wrapper.children.length)\n wrapper = wrapper.firstElementChild;\n this.first().before(structure);\n return this.appendTo(wrapper);\n};\nfn.wrap = function (selector) {\n return this.each(function (i, ele) {\n var wrapper = cash(selector)[0];\n cash(ele).wrapAll(!i ? wrapper : wrapper.cloneNode(true));\n });\n};\nfn.insertAfter = function (selector) {\n return insertSelectors(arguments, this, true, false, false, false, false, true);\n};\nfn.insertBefore = function (selector) {\n return insertSelectors(arguments, this, true, true);\n};\nfn.prepend = function () {\n return insertSelectors(arguments, this, false, true, true, true, true);\n};\nfn.prependTo = function (selector) {\n return insertSelectors(arguments, this, true, true, true, false, false, true);\n};\nfn.contents = function () {\n return cash(unique(pluck(this, function (ele) { return ele.tagName === 'IFRAME' ? [ele.contentDocument] : (ele.tagName === 'TEMPLATE' ? ele.content.childNodes : ele.childNodes); })));\n};\nfn.next = function (comparator, _all, _until) {\n return filtered(cash(unique(pluck(this, 'nextElementSibling', _all, _until))), comparator);\n};\nfn.nextAll = function (comparator) {\n return this.next(comparator, true);\n};\nfn.nextUntil = function (until, comparator) {\n return this.next(comparator, true, until);\n};\nfn.parents = function (comparator, _until) {\n return filtered(cash(unique(pluck(this, 'parentElement', true, _until))), comparator);\n};\nfn.parentsUntil = function (until, comparator) {\n return this.parents(comparator, until);\n};\nfn.prev = function (comparator, _all, _until) {\n return filtered(cash(unique(pluck(this, 'previousElementSibling', _all, _until))), comparator);\n};\nfn.prevAll = function (comparator) {\n return this.prev(comparator, true);\n};\nfn.prevUntil = function (until, comparator) {\n return this.prev(comparator, true, until);\n};\nfn.map = function (callback) {\n return cash(concat.apply([], map.call(this, function (ele, i) { return callback.call(ele, i, ele); })));\n};\nfn.clone = function () {\n return this.map(function (i, ele) { return ele.cloneNode(true); });\n};\nfn.offsetParent = function () {\n return this.map(function (i, ele) {\n var offsetParent = ele.offsetParent;\n while (offsetParent && computeStyle(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.offsetParent;\n }\n return offsetParent || docEle;\n });\n};\nfn.slice = function (start, end) {\n return cash(slice.call(this, start, end));\n};\n// @require ./cash.ts\nvar dashAlphaRe = /-([a-z])/g;\nfunction camelCase(str) {\n return str.replace(dashAlphaRe, function (match, letter) { return letter.toUpperCase(); });\n}\nfn.ready = function (callback) {\n var cb = function () { return setTimeout(callback, 0, cash); };\n if (doc.readyState !== 'loading') {\n cb();\n }\n else {\n doc.addEventListener('DOMContentLoaded', cb);\n }\n return this;\n};\nfn.unwrap = function () {\n this.parent().each(function (i, ele) {\n if (ele.tagName === 'BODY')\n return;\n var $ele = cash(ele);\n $ele.replaceWith($ele.children());\n });\n return this;\n};\nfn.offset = function () {\n var ele = this[0];\n if (!ele)\n return;\n var rect = ele.getBoundingClientRect();\n return {\n top: rect.top + win.pageYOffset,\n left: rect.left + win.pageXOffset\n };\n};\nfn.position = function () {\n var ele = this[0];\n if (!ele)\n return;\n var isFixed = (computeStyle(ele, 'position') === 'fixed');\n var offset = isFixed ? ele.getBoundingClientRect() : this.offset();\n if (!isFixed) {\n var doc_1 = ele.ownerDocument;\n var offsetParent = ele.offsetParent || doc_1.documentElement;\n while ((offsetParent === doc_1.body || offsetParent === doc_1.documentElement) && computeStyle(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.parentNode;\n }\n if (offsetParent !== ele && isElement(offsetParent)) {\n var parentOffset = cash(offsetParent).offset();\n offset.top -= parentOffset.top + computeStyleInt(offsetParent, 'borderTopWidth');\n offset.left -= parentOffset.left + computeStyleInt(offsetParent, 'borderLeftWidth');\n }\n }\n return {\n top: offset.top - computeStyleInt(ele, 'marginTop'),\n left: offset.left - computeStyleInt(ele, 'marginLeft')\n };\n};\nvar propMap = {\n /* GENERAL */\n class: 'className',\n contenteditable: 'contentEditable',\n /* LABEL */\n for: 'htmlFor',\n /* INPUT */\n readonly: 'readOnly',\n maxlength: 'maxLength',\n tabindex: 'tabIndex',\n /* TABLE */\n colspan: 'colSpan',\n rowspan: 'rowSpan',\n /* IMAGE */\n usemap: 'useMap'\n};\nfn.prop = function (prop, value) {\n if (!prop)\n return;\n if (isString(prop)) {\n prop = propMap[prop] || prop;\n if (arguments.length < 2)\n return this[0] && this[0][prop];\n return this.each(function (i, ele) { ele[prop] = value; });\n }\n for (var key in prop) {\n this.prop(key, prop[key]);\n }\n return this;\n};\nfn.removeProp = function (prop) {\n return this.each(function (i, ele) { delete ele[propMap[prop] || prop]; });\n};\nvar cssVariableRe = /^--/;\n// @require ./variables.ts\nfunction isCSSVariable(prop) {\n return cssVariableRe.test(prop);\n}\n// @require core/camel_case.ts\n// @require core/cash.ts\n// @require core/each.ts\n// @require core/variables.ts\n// @require ./is_css_variable.ts\nvar prefixedProps = {};\nvar style = div.style;\nvar vendorsPrefixes = ['webkit', 'moz', 'ms'];\nfunction getPrefixedProp(prop, isVariable) {\n if (isVariable === void 0) { isVariable = isCSSVariable(prop); }\n if (isVariable)\n return prop;\n if (!prefixedProps[prop]) {\n var propCC = camelCase(prop);\n var propUC = \"\".concat(propCC[0].toUpperCase()).concat(propCC.slice(1));\n var props = (\"\".concat(propCC, \" \").concat(vendorsPrefixes.join(\"\".concat(propUC, \" \"))).concat(propUC)).split(' ');\n each(props, function (i, p) {\n if (p in style) {\n prefixedProps[prop] = p;\n return false;\n }\n });\n }\n return prefixedProps[prop];\n}\n// @require core/type_checking.ts\n// @require ./is_css_variable.ts\nvar numericProps = {\n animationIterationCount: true,\n columnCount: true,\n flexGrow: true,\n flexShrink: true,\n fontWeight: true,\n gridArea: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnStart: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowStart: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n widows: true,\n zIndex: true\n};\nfunction getSuffixedValue(prop, value, isVariable) {\n if (isVariable === void 0) { isVariable = isCSSVariable(prop); }\n return !isVariable && !numericProps[prop] && isNumeric(value) ? \"\".concat(value, \"px\") : value;\n}\nfunction css(prop, value) {\n if (isString(prop)) {\n var isVariable_1 = isCSSVariable(prop);\n prop = getPrefixedProp(prop, isVariable_1);\n if (arguments.length < 2)\n return this[0] && computeStyle(this[0], prop, isVariable_1);\n if (!prop)\n return this;\n value = getSuffixedValue(prop, value, isVariable_1);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n if (isVariable_1) {\n ele.style.setProperty(prop, value);\n }\n else {\n ele.style[prop] = value;\n }\n });\n }\n for (var key in prop) {\n this.css(key, prop[key]);\n }\n return this;\n}\n;\nfn.css = css;\nfunction attempt(fn, arg) {\n try {\n return fn(arg);\n }\n catch (_a) {\n return arg;\n }\n}\n// @require core/attempt.ts\n// @require core/camel_case.ts\nvar JSONStringRe = /^\\s+|\\s+$/;\nfunction getData(ele, key) {\n var value = ele.dataset[key] || ele.dataset[camelCase(key)];\n if (JSONStringRe.test(value))\n return value;\n return attempt(JSON.parse, value);\n}\n// @require core/attempt.ts\n// @require core/camel_case.ts\nfunction setData(ele, key, value) {\n value = attempt(JSON.stringify, value);\n ele.dataset[camelCase(key)] = value;\n}\nfunction data(name, value) {\n if (!name) {\n if (!this[0])\n return;\n var datas = {};\n for (var key in this[0].dataset) {\n datas[key] = getData(this[0], key);\n }\n return datas;\n }\n if (isString(name)) {\n if (arguments.length < 2)\n return this[0] && getData(this[0], name);\n if (isUndefined(value))\n return this;\n return this.each(function (i, ele) { setData(ele, name, value); });\n }\n for (var key in name) {\n this.data(key, name[key]);\n }\n return this;\n}\nfn.data = data;\nfunction getDocumentDimension(doc, dimension) {\n var docEle = doc.documentElement;\n return Math.max(doc.body[\"scroll\".concat(dimension)], docEle[\"scroll\".concat(dimension)], doc.body[\"offset\".concat(dimension)], docEle[\"offset\".concat(dimension)], docEle[\"client\".concat(dimension)]);\n}\neach([true, false], function (i, outer) {\n each(['Width', 'Height'], function (i, prop) {\n var name = \"\".concat(outer ? 'outer' : 'inner').concat(prop);\n fn[name] = function (includeMargins) {\n if (!this[0])\n return;\n if (isWindow(this[0]))\n return outer ? this[0][\"inner\".concat(prop)] : this[0].document.documentElement[\"client\".concat(prop)];\n if (isDocument(this[0]))\n return getDocumentDimension(this[0], prop);\n return this[0][\"\".concat(outer ? 'offset' : 'client').concat(prop)] + (includeMargins && outer ? computeStyleInt(this[0], \"margin\".concat(i ? 'Top' : 'Left')) + computeStyleInt(this[0], \"margin\".concat(i ? 'Bottom' : 'Right')) : 0);\n };\n });\n});\neach(['Width', 'Height'], function (index, prop) {\n var propLC = prop.toLowerCase();\n fn[propLC] = function (value) {\n if (!this[0])\n return isUndefined(value) ? undefined : this;\n if (!arguments.length) {\n if (isWindow(this[0]))\n return this[0].document.documentElement[\"client\".concat(prop)];\n if (isDocument(this[0]))\n return getDocumentDimension(this[0], prop);\n return this[0].getBoundingClientRect()[propLC] - getExtraSpace(this[0], !index);\n }\n var valueNumber = parseInt(value, 10);\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n var boxSizing = computeStyle(ele, 'boxSizing');\n ele.style[propLC] = getSuffixedValue(propLC, valueNumber + (boxSizing === 'border-box' ? getExtraSpace(ele, !index) : 0));\n });\n };\n});\nvar displayProperty = '___cd';\nfn.toggle = function (force) {\n return this.each(function (i, ele) {\n if (!isElement(ele))\n return;\n var hidden = isHidden(ele);\n var show = isUndefined(force) ? hidden : force;\n if (show) {\n ele.style.display = ele[displayProperty] || '';\n if (isHidden(ele)) {\n ele.style.display = getDefaultDisplay(ele.tagName);\n }\n }\n else if (!hidden) {\n ele[displayProperty] = computeStyle(ele, 'display');\n ele.style.display = 'none';\n }\n });\n};\nfn.hide = function () {\n return this.toggle(false);\n};\nfn.show = function () {\n return this.toggle(true);\n};\nvar eventsNamespace = '___ce';\nvar eventsNamespacesSeparator = '.';\nvar eventsFocus = { focus: 'focusin', blur: 'focusout' };\nvar eventsHover = { mouseenter: 'mouseover', mouseleave: 'mouseout' };\nvar eventsMouseRe = /^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;\n// @require ./variables.ts\nfunction getEventNameBubbling(name) {\n return eventsHover[name] || eventsFocus[name] || name;\n}\n// @require ./variables.ts\nfunction parseEventName(eventName) {\n var parts = eventName.split(eventsNamespacesSeparator);\n return [parts[0], parts.slice(1).sort()]; // [name, namespace[]]\n}\nfn.trigger = function (event, data) {\n if (isString(event)) {\n var _a = parseEventName(event), nameOriginal = _a[0], namespaces = _a[1];\n var name_1 = getEventNameBubbling(nameOriginal);\n if (!name_1)\n return this;\n var type = eventsMouseRe.test(name_1) ? 'MouseEvents' : 'HTMLEvents';\n event = doc.createEvent(type);\n event.initEvent(name_1, true, true);\n event.namespace = namespaces.join(eventsNamespacesSeparator);\n event.___ot = nameOriginal;\n }\n event.___td = data;\n var isEventFocus = (event.___ot in eventsFocus);\n return this.each(function (i, ele) {\n if (isEventFocus && isFunction(ele[event.___ot])) {\n ele[\"___i\".concat(event.type)] = true; // Ensuring the native event is ignored\n ele[event.___ot]();\n ele[\"___i\".concat(event.type)] = false; // Ensuring the custom event is not ignored\n }\n ele.dispatchEvent(event);\n });\n};\n// @require ./variables.ts\nfunction getEventsCache(ele) {\n return ele[eventsNamespace] = (ele[eventsNamespace] || {});\n}\n// @require core/guid.ts\n// @require events/helpers/get_events_cache.ts\nfunction addEvent(ele, name, namespaces, selector, callback) {\n var eventCache = getEventsCache(ele);\n eventCache[name] = (eventCache[name] || []);\n eventCache[name].push([namespaces, selector, callback]);\n ele.addEventListener(name, callback);\n}\nfunction hasNamespaces(ns1, ns2) {\n return !ns2 || !some.call(ns2, function (ns) { return ns1.indexOf(ns) < 0; });\n}\n// @require ./get_events_cache.ts\n// @require ./has_namespaces.ts\n// @require ./parse_event_name.ts\nfunction removeEvent(ele, name, namespaces, selector, callback) {\n var cache = getEventsCache(ele);\n if (!name) {\n for (name in cache) {\n removeEvent(ele, name, namespaces, selector, callback);\n }\n }\n else if (cache[name]) {\n cache[name] = cache[name].filter(function (_a) {\n var ns = _a[0], sel = _a[1], cb = _a[2];\n if ((callback && cb.guid !== callback.guid) || !hasNamespaces(ns, namespaces) || (selector && selector !== sel))\n return true;\n ele.removeEventListener(name, cb);\n });\n }\n}\nfn.off = function (eventFullName, selector, callback) {\n var _this = this;\n if (isUndefined(eventFullName)) {\n this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n removeEvent(ele);\n });\n }\n else if (!isString(eventFullName)) {\n for (var key in eventFullName) {\n this.off(key, eventFullName[key]);\n }\n }\n else {\n if (isFunction(selector)) {\n callback = selector;\n selector = '';\n }\n each(getSplitValues(eventFullName), function (i, eventFullName) {\n var _a = parseEventName(eventFullName), nameOriginal = _a[0], namespaces = _a[1];\n var name = getEventNameBubbling(nameOriginal);\n _this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n removeEvent(ele, name, namespaces, selector, callback);\n });\n });\n }\n return this;\n};\nfn.remove = function (comparator) {\n filtered(this, comparator).detach().off();\n return this;\n};\nfn.replaceWith = function (selector) {\n return this.before(selector).remove();\n};\nfn.replaceAll = function (selector) {\n cash(selector).replaceWith(this);\n return this;\n};\nfunction on(eventFullName, selector, data, callback, _one) {\n var _this = this;\n if (!isString(eventFullName)) {\n for (var key in eventFullName) {\n this.on(key, selector, data, eventFullName[key], _one);\n }\n return this;\n }\n if (!isString(selector)) {\n if (isUndefined(selector) || isNull(selector)) {\n selector = '';\n }\n else if (isUndefined(data)) {\n data = selector;\n selector = '';\n }\n else {\n callback = data;\n data = selector;\n selector = '';\n }\n }\n if (!isFunction(callback)) {\n callback = data;\n data = undefined;\n }\n if (!callback)\n return this;\n each(getSplitValues(eventFullName), function (i, eventFullName) {\n var _a = parseEventName(eventFullName), nameOriginal = _a[0], namespaces = _a[1];\n var name = getEventNameBubbling(nameOriginal);\n var isEventHover = (nameOriginal in eventsHover);\n var isEventFocus = (nameOriginal in eventsFocus);\n if (!name)\n return;\n _this.each(function (i, ele) {\n if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))\n return;\n var finalCallback = function (event) {\n if (event.target[\"___i\".concat(event.type)])\n return event.stopImmediatePropagation(); // Ignoring native event in favor of the upcoming custom one\n if (event.namespace && !hasNamespaces(namespaces, event.namespace.split(eventsNamespacesSeparator)))\n return;\n if (!selector && ((isEventFocus && (event.target !== ele || event.___ot === name)) || (isEventHover && event.relatedTarget && ele.contains(event.relatedTarget))))\n return;\n var thisArg = ele;\n if (selector) {\n var target = event.target;\n while (!matches(target, selector)) {\n if (target === ele)\n return;\n target = target.parentNode;\n if (!target)\n return;\n }\n thisArg = target;\n }\n Object.defineProperty(event, 'currentTarget', {\n configurable: true,\n get: function () {\n return thisArg;\n }\n });\n Object.defineProperty(event, 'delegateTarget', {\n configurable: true,\n get: function () {\n return ele;\n }\n });\n Object.defineProperty(event, 'data', {\n configurable: true,\n get: function () {\n return data;\n }\n });\n var returnValue = callback.call(thisArg, event, event.___td);\n if (_one) {\n removeEvent(ele, name, namespaces, selector, finalCallback);\n }\n if (returnValue === false) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n finalCallback.guid = callback.guid = (callback.guid || cash.guid++);\n addEvent(ele, name, namespaces, selector, finalCallback);\n });\n });\n return this;\n}\nfn.on = on;\nfunction one(eventFullName, selector, data, callback) {\n return this.on(eventFullName, selector, data, callback, true);\n}\n;\nfn.one = one;\nvar queryEncodeCRLFRe = /\\r?\\n/g;\nfunction queryEncode(prop, value) {\n return \"&\".concat(encodeURIComponent(prop), \"=\").concat(encodeURIComponent(value.replace(queryEncodeCRLFRe, '\\r\\n')));\n}\nvar skippableRe = /file|reset|submit|button|image/i;\nvar checkableRe = /radio|checkbox/i;\nfn.serialize = function () {\n var query = '';\n this.each(function (i, ele) {\n each(ele.elements || [ele], function (i, ele) {\n if (ele.disabled || !ele.name || ele.tagName === 'FIELDSET' || skippableRe.test(ele.type) || (checkableRe.test(ele.type) && !ele.checked))\n return;\n var value = getValue(ele);\n if (!isUndefined(value)) {\n var values = isArray(value) ? value : [value];\n each(values, function (i, value) {\n query += queryEncode(ele.name, value);\n });\n }\n });\n });\n return query.slice(1);\n};\n// @require core/types.ts\n// @require core/cash.ts\n// @require core/type_checking.ts\n// @require core/variables.ts\n// @require core/each.ts\n// @require core/extend.ts\n// @require core/find.ts\n// @require core/get_compare_function.ts\n// @require core/get_split_values.ts\n// @require core/guid.ts\n// @require core/parse_html.ts\n// @require core/unique.ts\n// @require attributes/add_class.ts\n// @require attributes/attr.ts\n// @require attributes/has_class.ts\n// @require attributes/prop.ts\n// @require attributes/remove_attr.ts\n// @require attributes/remove_class.ts\n// @require attributes/remove_prop.ts\n// @require attributes/toggle_class.ts\n// @require collection/add.ts\n// @require collection/each.ts\n// @require collection/eq.ts\n// @require collection/filter.ts\n// @require collection/first.ts\n// @require collection/get.ts\n// @require collection/index.ts\n// @require collection/last.ts\n// @require collection/map.ts\n// @require collection/slice.ts\n// @require css/css.ts\n// @require data/data.ts\n// @require dimensions/inner_outer.ts\n// @require dimensions/normal.ts\n// @require effects/hide.ts\n// @require effects/show.ts\n// @require effects/toggle.ts\n// @require events/off.ts\n// @require events/on.ts\n// @require events/one.ts\n// @require events/ready.ts\n// @require events/trigger.ts\n// @require forms/serialize.ts\n// @require forms/val.ts\n// @require manipulation/after.ts\n// @require manipulation/append.ts\n// @require manipulation/append_to.ts\n// @require manipulation/before.ts\n// @require manipulation/clone.ts\n// @require manipulation/detach.ts\n// @require manipulation/empty.ts\n// @require manipulation/html.ts\n// @require manipulation/insert_after.ts\n// @require manipulation/insert_before.ts\n// @require manipulation/prepend.ts\n// @require manipulation/prepend_to.ts\n// @require manipulation/remove.ts\n// @require manipulation/replace_all.ts\n// @require manipulation/replace_with.ts\n// @require manipulation/text.ts\n// @require manipulation/unwrap.ts\n// @require manipulation/wrap.ts\n// @require manipulation/wrap_all.ts\n// @require manipulation/wrap_inner.ts\n// @require offset/offset.ts\n// @require offset/offset_parent.ts\n// @require offset/position.ts\n// @require traversal/children.ts\n// @require traversal/closest.ts\n// @require traversal/contents.ts\n// @require traversal/find.ts\n// @require traversal/has.ts\n// @require traversal/is.ts\n// @require traversal/next.ts\n// @require traversal/next_all.ts\n// @require traversal/next_until.ts\n// @require traversal/not.ts\n// @require traversal/parent.ts\n// @require traversal/parents.ts\n// @require traversal/parents_until.ts\n// @require traversal/prev.ts\n// @require traversal/prev_all.ts\n// @require traversal/prev_until.ts\n// @require traversal/siblings.ts\n// @no-require extras/get_script.ts\n// @no-require extras/shorthands.ts\n// @require methods.ts\nif (typeof exports !== 'undefined') { // Node.js\n module.exports = cash;\n}\nelse { // Browser\n win['cash'] = win['$'] = cash;\n}\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, `.ui-app-header {\n\n}\n\n.ui-app-header-icon {\n width: 150px;\n height: 150px;\n margin-right: 20px;\n}\n\n.u2-panel {\n gap: 10px;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@datagrok-libraries/utils/src/u2.css\"],\"names\":[],\"mappings\":\"AAAA;;AAEA;;AAEA;IACI,YAAY;IACZ,aAAa;IACb,kBAAkB;AACtB;;AAEA;IACI,SAAS;AACb\",\"sourcesContent\":[\".ui-app-header {\\n\\n}\\n\\n.ui-app-header-icon {\\n width: 150px;\\n height: 150px;\\n margin-right: 20px;\\n}\\n\\n.u2-panel {\\n gap: 10px;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/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, `.pep-textarea-box {\n position: relative;\n}\n\n.pep-textarea-box:hover .pep-snippet-editor-icon {\n visibility: visible;\n}\n\n.pep-snippet-editor-icon {\n position: absolute;\n top: 5px;\n visibility: hidden;\n margin: 5px;\n z-index: 1;\n}\n\n.pep-reset-icon {\n right: 10px;\n}\n\n.pep-snippet-editor-icon i {\n font-size: 13px;\n}\n\n.pep-snippet-editor-icon:hover {\n background-color: var(--steel-1);\n border-radius: 2px;\n}\n\n.pep-snippet-inline-icon i {\n font-size: 13px;\n}\n\n.pep-textinput {\n height: 50px;\n overflow: hidden;\n}\n\n#pep-hist-host #center {\n height: 131px;\n}\n\n#pep-hist-host > #root {\n height: unset;\n width: 100%;\n}\n\n#pep-viewer-title {\n height: 23px;\n font-size: 1.2rem;\n font-family: 'Roboto', 'Roboto Local', sans-serif;\n color: #4D5261;\n text-align: center;\n width: 100%;\n align-self: end;\n}\n\n.pep-help-icon {\n position: absolute;\n left: 5px;\n top: 1px;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;EAClB,QAAQ;EACR,kBAAkB;EAClB,WAAW;EACX,UAAU;AACZ;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,gCAAgC;EAChC,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,YAAY;EACZ,gBAAgB;AAClB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;EACb,WAAW;AACb;;AAEA;EACE,YAAY;EACZ,iBAAiB;EACjB,iDAAiD;EACjD,cAAc;EACd,kBAAkB;EAClB,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,QAAQ;AACV\",\"sourcesContent\":[\".pep-textarea-box {\\n position: relative;\\n}\\n\\n.pep-textarea-box:hover .pep-snippet-editor-icon {\\n visibility: visible;\\n}\\n\\n.pep-snippet-editor-icon {\\n position: absolute;\\n top: 5px;\\n visibility: hidden;\\n margin: 5px;\\n z-index: 1;\\n}\\n\\n.pep-reset-icon {\\n right: 10px;\\n}\\n\\n.pep-snippet-editor-icon i {\\n font-size: 13px;\\n}\\n\\n.pep-snippet-editor-icon:hover {\\n background-color: var(--steel-1);\\n border-radius: 2px;\\n}\\n\\n.pep-snippet-inline-icon i {\\n font-size: 13px;\\n}\\n\\n.pep-textinput {\\n height: 50px;\\n overflow: hidden;\\n}\\n\\n#pep-hist-host #center {\\n height: 131px;\\n}\\n\\n#pep-hist-host > #root {\\n height: unset;\\n width: 100%;\\n}\\n\\n#pep-viewer-title {\\n height: 23px;\\n font-size: 1.2rem;\\n font-family: 'Roboto', 'Roboto Local', sans-serif;\\n color: #4D5261;\\n text-align: center;\\n width: 100%;\\n align-self: end;\\n}\\n\\n.pep-help-icon {\\n position: absolute;\\n left: 5px;\\n top: 1px;\\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","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","(function (window, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n window.jStat = factory();\n }\n})(this, function () {\nvar jStat = (function(Math, undefined) {\n\n// For quick reference.\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\nvar toString = Object.prototype.toString;\n\n// Calculate correction for IEEE error\n// TODO: This calculation can be improved.\nfunction calcRdx(n, m) {\n var val = n > m ? n : m;\n return Math.pow(10,\n 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));\n}\n\n\nvar isArray = Array.isArray || function isArray(arg) {\n return toString.call(arg) === '[object Array]';\n};\n\n\nfunction isFunction(arg) {\n return toString.call(arg) === '[object Function]';\n}\n\n\nfunction isNumber(num) {\n return (typeof num === 'number') ? num - num === 0 : false;\n}\n\n\n// Converts the jStat matrix to vector.\nfunction toVector(arr) {\n return concat.apply([], arr);\n}\n\n\n// The one and only jStat constructor.\nfunction jStat() {\n return new jStat._init(arguments);\n}\n\n\n// TODO: Remove after all references in src files have been removed.\njStat.fn = jStat.prototype;\n\n\n// By separating the initializer from the constructor it's easier to handle\n// always returning a new instance whether \"new\" was used or not.\njStat._init = function _init(args) {\n // If first argument is an array, must be vector or matrix.\n if (isArray(args[0])) {\n // Check if matrix.\n if (isArray(args[0][0])) {\n // See if a mapping function was also passed.\n if (isFunction(args[1]))\n args[0] = jStat.map(args[0], args[1]);\n // Iterate over each is faster than this.push.apply(this, args[0].\n for (var i = 0; i < args[0].length; i++)\n this[i] = args[0][i];\n this.length = args[0].length;\n\n // Otherwise must be a vector.\n } else {\n this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];\n this.length = 1;\n }\n\n // If first argument is number, assume creation of sequence.\n } else if (isNumber(args[0])) {\n this[0] = jStat.seq.apply(null, args);\n this.length = 1;\n\n // Handle case when jStat object is passed to jStat.\n } else if (args[0] instanceof jStat) {\n // Duplicate the object and pass it back.\n return jStat(args[0].toArray());\n\n // Unexpected argument value, return empty jStat object.\n // TODO: This is strange behavior. Shouldn't this throw or some such to let\n // the user know they had bad arguments?\n } else {\n this[0] = [];\n this.length = 1;\n }\n\n return this;\n};\njStat._init.prototype = jStat.prototype;\njStat._init.constructor = jStat;\n\n\n// Utility functions.\n// TODO: for internal use only?\njStat.utils = {\n calcRdx: calcRdx,\n isArray: isArray,\n isFunction: isFunction,\n isNumber: isNumber,\n toVector: toVector\n};\n\n\njStat._random_fn = Math.random;\njStat.setRandom = function setRandom(fn) {\n if (typeof fn !== 'function')\n throw new TypeError('fn is not a function');\n jStat._random_fn = fn;\n};\n\n\n// Easily extend the jStat object.\n// TODO: is this seriously necessary?\njStat.extend = function extend(obj) {\n var i, j;\n\n if (arguments.length === 1) {\n for (j in obj)\n jStat[j] = obj[j];\n return this;\n }\n\n for (i = 1; i < arguments.length; i++) {\n for (j in arguments[i])\n obj[j] = arguments[i][j];\n }\n\n return obj;\n};\n\n\n// Returns the number of rows in the matrix.\njStat.rows = function rows(arr) {\n return arr.length || 1;\n};\n\n\n// Returns the number of columns in the matrix.\njStat.cols = function cols(arr) {\n return arr[0].length || 1;\n};\n\n\n// Returns the dimensions of the object { rows: i, cols: j }\njStat.dimensions = function dimensions(arr) {\n return {\n rows: jStat.rows(arr),\n cols: jStat.cols(arr)\n };\n};\n\n\n// Returns a specified row as a vector or return a sub matrix by pick some rows\njStat.row = function row(arr, index) {\n if (isArray(index)) {\n return index.map(function(i) {\n return jStat.row(arr, i);\n })\n }\n return arr[index];\n};\n\n\n// return row as array\n// rowa([[1,2],[3,4]],0) -> [1,2]\njStat.rowa = function rowa(arr, i) {\n return jStat.row(arr, i);\n};\n\n\n// Returns the specified column as a vector or return a sub matrix by pick some\n// columns\njStat.col = function col(arr, index) {\n if (isArray(index)) {\n var submat = jStat.arange(arr.length).map(function() {\n return new Array(index.length);\n });\n index.forEach(function(ind, i){\n jStat.arange(arr.length).forEach(function(j) {\n submat[j][i] = arr[j][ind];\n });\n });\n return submat;\n }\n var column = new Array(arr.length);\n for (var i = 0; i < arr.length; i++)\n column[i] = [arr[i][index]];\n return column;\n};\n\n\n// return column as array\n// cola([[1,2],[3,4]],0) -> [1,3]\njStat.cola = function cola(arr, i) {\n return jStat.col(arr, i).map(function(a){ return a[0] });\n};\n\n\n// Returns the diagonal of the matrix\njStat.diag = function diag(arr) {\n var nrow = jStat.rows(arr);\n var res = new Array(nrow);\n for (var row = 0; row < nrow; row++)\n res[row] = [arr[row][row]];\n return res;\n};\n\n\n// Returns the anti-diagonal of the matrix\njStat.antidiag = function antidiag(arr) {\n var nrow = jStat.rows(arr) - 1;\n var res = new Array(nrow);\n for (var i = 0; nrow >= 0; nrow--, i++)\n res[i] = [arr[i][nrow]];\n return res;\n};\n\n// Transpose a matrix or array.\njStat.transpose = function transpose(arr) {\n var obj = [];\n var objArr, rows, cols, j, i;\n\n // Make sure arr is in matrix format.\n if (!isArray(arr[0]))\n arr = [arr];\n\n rows = arr.length;\n cols = arr[0].length;\n\n for (i = 0; i < cols; i++) {\n objArr = new Array(rows);\n for (j = 0; j < rows; j++)\n objArr[j] = arr[j][i];\n obj.push(objArr);\n }\n\n // If obj is vector, return only single array.\n return obj.length === 1 ? obj[0] : obj;\n};\n\n\n// Map a function to an array or array of arrays.\n// \"toAlter\" is an internal variable.\njStat.map = function map(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n for (col = 0; col < ncol; col++)\n res[row][col] = func(arr[row][col], row, col);\n }\n\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Cumulatively combine the elements of an array or array of arrays using a function.\njStat.cumreduce = function cumreduce(arr, func, toAlter) {\n var row, nrow, ncol, res, col;\n\n if (!isArray(arr[0]))\n arr = [arr];\n\n nrow = arr.length;\n ncol = arr[0].length;\n res = toAlter ? arr : new Array(nrow);\n\n for (row = 0; row < nrow; row++) {\n // if the row doesn't exist, create it\n if (!res[row])\n res[row] = new Array(ncol);\n if (ncol > 0)\n res[row][0] = arr[row][0];\n for (col = 1; col < ncol; col++)\n res[row][col] = func(res[row][col-1], arr[row][col]);\n }\n return res.length === 1 ? res[0] : res;\n};\n\n\n// Destructively alter an array.\njStat.alter = function alter(arr, func) {\n return jStat.map(arr, func, true);\n};\n\n\n// Generate a rows x cols matrix according to the supplied function.\njStat.create = function create(rows, cols, func) {\n var res = new Array(rows);\n var i, j;\n\n if (isFunction(cols)) {\n func = cols;\n cols = rows;\n }\n\n for (i = 0; i < rows; i++) {\n res[i] = new Array(cols);\n for (j = 0; j < cols; j++)\n res[i][j] = func(i, j);\n }\n\n return res;\n};\n\n\nfunction retZero() { return 0; }\n\n\n// Generate a rows x cols matrix of zeros.\njStat.zeros = function zeros(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retZero);\n};\n\n\nfunction retOne() { return 1; }\n\n\n// Generate a rows x cols matrix of ones.\njStat.ones = function ones(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retOne);\n};\n\n\n// Generate a rows x cols matrix of uniformly random numbers.\njStat.rand = function rand(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, jStat._random_fn);\n};\n\n\nfunction retIdent(i, j) { return i === j ? 1 : 0; }\n\n\n// Generate an identity matrix of size row x cols.\njStat.identity = function identity(rows, cols) {\n if (!isNumber(cols))\n cols = rows;\n return jStat.create(rows, cols, retIdent);\n};\n\n\n// Tests whether a matrix is symmetric\njStat.symmetric = function symmetric(arr) {\n var size = arr.length;\n var row, col;\n\n if (arr.length !== arr[0].length)\n return false;\n\n for (row = 0; row < size; row++) {\n for (col = 0; col < size; col++)\n if (arr[col][row] !== arr[row][col])\n return false;\n }\n\n return true;\n};\n\n\n// Set all values to zero.\njStat.clear = function clear(arr) {\n return jStat.alter(arr, retZero);\n};\n\n\n// Generate sequence.\njStat.seq = function seq(min, max, length, func) {\n if (!isFunction(func))\n func = false;\n\n var arr = [];\n var hival = calcRdx(min, max);\n var step = (max * hival - min * hival) / ((length - 1) * hival);\n var current = min;\n var cnt;\n\n // Current is assigned using a technique to compensate for IEEE error.\n // TODO: Needs better implementation.\n for (cnt = 0;\n current <= max && cnt < length;\n cnt++, current = (min * hival + step * hival * cnt) / hival) {\n arr.push((func ? func(current, cnt) : current));\n }\n\n return arr;\n};\n\n\n// arange(5) -> [0,1,2,3,4]\n// arange(1,5) -> [1,2,3,4]\n// arange(5,1,-1) -> [5,4,3,2]\njStat.arange = function arange(start, end, step) {\n var rl = [];\n var i;\n step = step || 1;\n if (end === undefined) {\n end = start;\n start = 0;\n }\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(i);\n }\n } else {\n for (i = start; i > end; i += step) {\n rl.push(i);\n }\n }\n return rl;\n};\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// slice(A,{row:{end:2},col:{start:1}}) -> [[2,3],[5,6]]\n// slice(A,1,{start:1}) -> [5,6]\n// as numpy code A[:2,1:]\njStat.slice = (function(){\n function _slice(list, start, end, step) {\n // note it's not equal to range.map mode it's a bug\n var i;\n var rl = [];\n var length = list.length;\n if (start === undefined && end === undefined && step === undefined) {\n return jStat.copy(list);\n }\n\n start = start || 0;\n end = end || list.length;\n start = start >= 0 ? start : length + start;\n end = end >= 0 ? end : length + end;\n step = step || 1;\n if (start === end || step === 0) {\n return [];\n }\n if (start < end && step < 0) {\n return [];\n }\n if (start > end && step > 0) {\n return [];\n }\n if (step > 0) {\n for (i = start; i < end; i += step) {\n rl.push(list[i]);\n }\n } else {\n for (i = start; i > end;i += step) {\n rl.push(list[i]);\n }\n }\n return rl;\n }\n\n function slice(list, rcSlice) {\n var colSlice, rowSlice;\n rcSlice = rcSlice || {};\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return list[rcSlice.row][rcSlice.col];\n var row = jStat.rowa(list, rcSlice.row);\n colSlice = rcSlice.col || {};\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n }\n\n if (isNumber(rcSlice.col)) {\n var col = jStat.cola(list, rcSlice.col);\n rowSlice = rcSlice.row || {};\n return _slice(col, rowSlice.start, rowSlice.end, rowSlice.step);\n }\n\n rowSlice = rcSlice.row || {};\n colSlice = rcSlice.col || {};\n var rows = _slice(list, rowSlice.start, rowSlice.end, rowSlice.step);\n return rows.map(function(row) {\n return _slice(row, colSlice.start, colSlice.end, colSlice.step);\n });\n }\n\n return slice;\n}());\n\n\n// A=[[1,2,3],[4,5,6],[7,8,9]]\n// sliceAssign(A,{row:{start:1},col:{start:1}},[[0,0],[0,0]])\n// A=[[1,2,3],[4,0,0],[7,0,0]]\njStat.sliceAssign = function sliceAssign(A, rcSlice, B) {\n var nl, ml;\n if (isNumber(rcSlice.row)) {\n if (isNumber(rcSlice.col))\n return A[rcSlice.row][rcSlice.col] = B;\n rcSlice.col = rcSlice.col || {};\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A.length, rcSlice.col.end),\n rcSlice.col.step);\n var m = rcSlice.row;\n nl.forEach(function(n, i) {\n A[m][n] = B[i];\n });\n return A;\n }\n\n if (isNumber(rcSlice.col)) {\n rcSlice.row = rcSlice.row || {};\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A[0].length, rcSlice.row.end),\n rcSlice.row.step);\n var n = rcSlice.col;\n ml.forEach(function(m, j) {\n A[m][n] = B[j];\n });\n return A;\n }\n\n if (B[0].length === undefined) {\n B = [B];\n }\n rcSlice.row.start = rcSlice.row.start || 0;\n rcSlice.row.end = rcSlice.row.end || A.length;\n rcSlice.row.step = rcSlice.row.step || 1;\n rcSlice.col.start = rcSlice.col.start || 0;\n rcSlice.col.end = rcSlice.col.end || A[0].length;\n rcSlice.col.step = rcSlice.col.step || 1;\n ml = jStat.arange(rcSlice.row.start,\n Math.min(A.length, rcSlice.row.end),\n rcSlice.row.step);\n nl = jStat.arange(rcSlice.col.start,\n Math.min(A[0].length, rcSlice.col.end),\n rcSlice.col.step);\n ml.forEach(function(m, i) {\n nl.forEach(function(n, j) {\n A[m][n] = B[i][j];\n });\n });\n return A;\n};\n\n\n// [1,2,3] ->\n// [[1,0,0],[0,2,0],[0,0,3]]\njStat.diagonal = function diagonal(diagArray) {\n var mat = jStat.zeros(diagArray.length, diagArray.length);\n diagArray.forEach(function(t, i) {\n mat[i][i] = t;\n });\n return mat;\n};\n\n\n// return copy of A\njStat.copy = function copy(A) {\n return A.map(function(row) {\n if (isNumber(row))\n return row;\n return row.map(function(t) {\n return t;\n });\n });\n};\n\n\n// TODO: Go over this entire implementation. Seems a tragic waste of resources\n// doing all this work. Instead, and while ugly, use new Function() to generate\n// a custom function for each static method.\n\n// Quick reference.\nvar jProto = jStat.prototype;\n\n// Default length.\njProto.length = 0;\n\n// For internal use only.\n// TODO: Check if they're actually used, and if they are then rename them\n// to _*\njProto.push = Array.prototype.push;\njProto.sort = Array.prototype.sort;\njProto.splice = Array.prototype.splice;\njProto.slice = Array.prototype.slice;\n\n\n// Return a clean array.\njProto.toArray = function toArray() {\n return this.length > 1 ? slice.call(this) : slice.call(this)[0];\n};\n\n\n// Map a function to a matrix or vector.\njProto.map = function map(func, toAlter) {\n return jStat(jStat.map(this, func, toAlter));\n};\n\n\n// Cumulatively combine the elements of a matrix or vector using a function.\njProto.cumreduce = function cumreduce(func, toAlter) {\n return jStat(jStat.cumreduce(this, func, toAlter));\n};\n\n\n// Destructively alter an array.\njProto.alter = function alter(func) {\n jStat.alter(this, func);\n return this;\n};\n\n\n// Extend prototype with methods that have no argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(func) {\n var self = this,\n results;\n // Check for callback.\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self));\n });\n return this;\n }\n results = jStat[passfunc](this);\n return isArray(results) ? jStat(results) : results;\n };\n })(funcs[i]);\n})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));\n\n\n// Extend prototype with methods that have one argument.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function(index, func) {\n var self = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(self, jProto[passfunc].call(self, index));\n });\n return this;\n }\n return jStat(jStat[passfunc](this, index));\n };\n })(funcs[i]);\n})('row col'.split(' '));\n\n\n// Extend prototype with simple shortcut methods.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('create zeros ones rand identity'.split(' '));\n\n\n// Exposing jStat.\nreturn jStat;\n\n}(Math));\n(function(jStat, Math) {\n\nvar isFunction = jStat.utils.isFunction;\n\n// Ascending functions for sort\nfunction ascNum(a, b) { return a - b; }\n\nfunction clip(arg, min, max) {\n return Math.max(min, Math.min(arg, max));\n}\n\n\n// sum of an array\njStat.sum = function sum(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n\n// sum squared\njStat.sumsqrd = function sumsqrd(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i] * arr[i];\n return sum;\n};\n\n\n// sum of squared errors of prediction (SSE)\njStat.sumsqerr = function sumsqerr(arr) {\n var mean = jStat.mean(arr);\n var sum = 0;\n var i = arr.length;\n var tmp;\n while (--i >= 0) {\n tmp = arr[i] - mean;\n sum += tmp * tmp;\n }\n return sum;\n};\n\n// sum of an array in each row\njStat.sumrow = function sumrow(arr) {\n var sum = 0;\n var i = arr.length;\n while (--i >= 0)\n sum += arr[i];\n return sum;\n};\n\n// product of an array\njStat.product = function product(arr) {\n var prod = 1;\n var i = arr.length;\n while (--i >= 0)\n prod *= arr[i];\n return prod;\n};\n\n\n// minimum value of an array\njStat.min = function min(arr) {\n var low = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] < low)\n low = arr[i];\n return low;\n};\n\n\n// maximum value of an array\njStat.max = function max(arr) {\n var high = arr[0];\n var i = 0;\n while (++i < arr.length)\n if (arr[i] > high)\n high = arr[i];\n return high;\n};\n\n\n// unique values of an array\njStat.unique = function unique(arr) {\n var hash = {}, _arr = [];\n for(var i = 0; i < arr.length; i++) {\n if (!hash[arr[i]]) {\n hash[arr[i]] = true;\n _arr.push(arr[i]);\n }\n }\n return _arr;\n};\n\n\n// mean value of an array\njStat.mean = function mean(arr) {\n return jStat.sum(arr) / arr.length;\n};\n\n\n// mean squared error (MSE)\njStat.meansqerr = function meansqerr(arr) {\n return jStat.sumsqerr(arr) / arr.length;\n};\n\n\n// geometric mean of an array\njStat.geomean = function geomean(arr) {\n var logs = arr.map(Math.log)\n var meanOfLogs = jStat.mean(logs)\n return Math.exp(meanOfLogs)\n};\n\n\n// median of an array\njStat.median = function median(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n // check if array is even or odd, then return the appropriate\n return !(arrlen & 1)\n ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2\n : _arr[(arrlen / 2) | 0 ];\n};\n\n\n// cumulative sum of an array\njStat.cumsum = function cumsum(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a + b; });\n};\n\n\n// cumulative product of an array\njStat.cumprod = function cumprod(arr) {\n return jStat.cumreduce(arr, function (a, b) { return a * b; });\n};\n\n\n// successive differences of a sequence\njStat.diff = function diff(arr) {\n var diffs = [];\n var arrLen = arr.length;\n var i;\n for (i = 1; i < arrLen; i++)\n diffs.push(arr[i] - arr[i - 1]);\n return diffs;\n};\n\n\n// ranks of an array\njStat.rank = function (arr) {\n var i;\n var distinctNumbers = [];\n var numberCounts = {};\n for (i = 0; i < arr.length; i++) {\n var number = arr[i];\n if (numberCounts[number]) {\n numberCounts[number]++;\n } else {\n numberCounts[number] = 1;\n distinctNumbers.push(number);\n }\n }\n\n var sortedDistinctNumbers = distinctNumbers.sort(ascNum);\n var numberRanks = {};\n var currentRank = 1;\n for (i = 0; i < sortedDistinctNumbers.length; i++) {\n var number = sortedDistinctNumbers[i];\n var count = numberCounts[number];\n var first = currentRank;\n var last = currentRank + count - 1;\n var rank = (first + last) / 2;\n numberRanks[number] = rank;\n currentRank += count;\n }\n\n return arr.map(function (number) {\n return numberRanks[number];\n });\n};\n\n\n// mode of an array\n// if there are multiple modes of an array, return all of them\n// is this the appropriate way of handling it?\njStat.mode = function mode(arr) {\n var arrLen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n var count = 1;\n var maxCount = 0;\n var numMaxCount = 0;\n var mode_arr = [];\n var i;\n\n for (i = 0; i < arrLen; i++) {\n if (_arr[i] === _arr[i + 1]) {\n count++;\n } else {\n if (count > maxCount) {\n mode_arr = [_arr[i]];\n maxCount = count;\n numMaxCount = 0;\n }\n // are there multiple max counts\n else if (count === maxCount) {\n mode_arr.push(_arr[i]);\n numMaxCount++;\n }\n // resetting count for new value in array\n count = 1;\n }\n }\n\n return numMaxCount === 0 ? mode_arr[0] : mode_arr;\n};\n\n\n// range of an array\njStat.range = function range(arr) {\n return jStat.max(arr) - jStat.min(arr);\n};\n\n// variance of an array\n// flag = true indicates sample instead of population\njStat.variance = function variance(arr, flag) {\n return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));\n};\n\n// pooled variance of an array of arrays\njStat.pooledvariance = function pooledvariance(arr) {\n var sumsqerr = arr.reduce(function (a, samples) {return a + jStat.sumsqerr(samples);}, 0);\n var count = arr.reduce(function (a, samples) {return a + samples.length;}, 0);\n return sumsqerr / (count - arr.length);\n};\n\n// deviation of an array\njStat.deviation = function (arr) {\n var mean = jStat.mean(arr);\n var arrlen = arr.length;\n var dev = new Array(arrlen);\n for (var i = 0; i < arrlen; i++) {\n dev[i] = arr[i] - mean;\n }\n return dev;\n};\n\n// standard deviation of an array\n// flag = true indicates sample instead of population\njStat.stdev = function stdev(arr, flag) {\n return Math.sqrt(jStat.variance(arr, flag));\n};\n\n// pooled standard deviation of an array of arrays\njStat.pooledstdev = function pooledstdev(arr) {\n return Math.sqrt(jStat.pooledvariance(arr));\n};\n\n// mean deviation (mean absolute deviation) of an array\njStat.meandev = function meandev(arr) {\n var mean = jStat.mean(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - mean));\n }\n return jStat.mean(a);\n};\n\n\n// median deviation (median absolute deviation) of an array\njStat.meddev = function meddev(arr) {\n var median = jStat.median(arr);\n var a = [];\n for (var i = arr.length - 1; i >= 0; i--) {\n a.push(Math.abs(arr[i] - median));\n }\n return jStat.median(a);\n};\n\n\n// coefficient of variation\njStat.coeffvar = function coeffvar(arr) {\n return jStat.stdev(arr) / jStat.mean(arr);\n};\n\n\n// quartiles of an array\njStat.quartiles = function quartiles(arr) {\n var arrlen = arr.length;\n var _arr = arr.slice().sort(ascNum);\n return [\n _arr[ Math.round((arrlen) / 4) - 1 ],\n _arr[ Math.round((arrlen) / 2) - 1 ],\n _arr[ Math.round((arrlen) * 3 / 4) - 1 ]\n ];\n};\n\n\n// Arbitary quantiles of an array. Direct port of the scipy.stats\n// implementation by Pierre GF Gerard-Marchant.\njStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {\n var sortedArray = arr.slice().sort(ascNum);\n var quantileVals = [quantilesArray.length];\n var n = arr.length;\n var i, p, m, aleph, k, gamma;\n\n if (typeof alphap === 'undefined')\n alphap = 3 / 8;\n if (typeof betap === 'undefined')\n betap = 3 / 8;\n\n for (i = 0; i < quantilesArray.length; i++) {\n p = quantilesArray[i];\n m = alphap + p * (1 - alphap - betap);\n aleph = n * p + m;\n k = Math.floor(clip(aleph, 1, n - 1));\n gamma = clip(aleph - k, 0, 1);\n quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];\n }\n\n return quantileVals;\n};\n\n// Return the k-th percentile of values in a range, where k is in the range 0..1, inclusive.\n// Passing true for the exclusive parameter excludes both endpoints of the range.\njStat.percentile = function percentile(arr, k, exclusive) {\n var _arr = arr.slice().sort(ascNum);\n var realIndex = k * (_arr.length + (exclusive ? 1 : -1)) + (exclusive ? 0 : 1);\n var index = parseInt(realIndex);\n var frac = realIndex - index;\n if (index + 1 < _arr.length) {\n return _arr[index - 1] + frac * (_arr[index] - _arr[index - 1]);\n } else {\n return _arr[index - 1];\n }\n}\n\n// The percentile rank of score in a given array. Returns the percentage\n// of all values in the input array that are less than (kind='strict') or\n// less or equal than (kind='weak') score. Default is weak.\njStat.percentileOfScore = function percentileOfScore(arr, score, kind) {\n var counter = 0;\n var len = arr.length;\n var strict = false;\n var value, i;\n\n if (kind === 'strict')\n strict = true;\n\n for (i = 0; i < len; i++) {\n value = arr[i];\n if ((strict && value < score) ||\n (!strict && value <= score)) {\n counter++;\n }\n }\n\n return counter / len;\n};\n\n\n// Histogram (bin count) data\njStat.histogram = function histogram(arr, binCnt) {\n binCnt = binCnt || 4;\n var first = jStat.min(arr);\n var binWidth = (jStat.max(arr) - first) / binCnt;\n var len = arr.length;\n var bins = [];\n var i;\n\n for (i = 0; i < binCnt; i++)\n bins[i] = 0;\n for (i = 0; i < len; i++)\n bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;\n\n return bins;\n};\n\n\n// covariance of two arrays\njStat.covariance = function covariance(arr1, arr2) {\n var u = jStat.mean(arr1);\n var v = jStat.mean(arr2);\n var arr1Len = arr1.length;\n var sq_dev = new Array(arr1Len);\n var i;\n\n for (i = 0; i < arr1Len; i++)\n sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);\n\n return jStat.sum(sq_dev) / (arr1Len - 1);\n};\n\n\n// (pearson's) population correlation coefficient, rho\njStat.corrcoeff = function corrcoeff(arr1, arr2) {\n return jStat.covariance(arr1, arr2) /\n jStat.stdev(arr1, 1) /\n jStat.stdev(arr2, 1);\n};\n\n // (spearman's) rank correlation coefficient, sp\njStat.spearmancoeff = function (arr1, arr2) {\n arr1 = jStat.rank(arr1);\n arr2 = jStat.rank(arr2);\n //return pearson's correlation of the ranks:\n return jStat.corrcoeff(arr1, arr2);\n}\n\n\n// statistical standardized moments (general form of skew/kurt)\njStat.stanMoment = function stanMoment(arr, n) {\n var mu = jStat.mean(arr);\n var sigma = jStat.stdev(arr);\n var len = arr.length;\n var skewSum = 0;\n\n for (var i = 0; i < len; i++)\n skewSum += Math.pow((arr[i] - mu) / sigma, n);\n\n return skewSum / arr.length;\n};\n\n// (pearson's) moment coefficient of skewness\njStat.skewness = function skewness(arr) {\n return jStat.stanMoment(arr, 3);\n};\n\n// (pearson's) (excess) kurtosis\njStat.kurtosis = function kurtosis(arr) {\n return jStat.stanMoment(arr, 4) - 3;\n};\n\n\nvar jProto = jStat.prototype;\n\n\n// Extend jProto with method for calculating cumulative sums and products.\n// This differs from the similar extension below as cumsum and cumprod should\n// not be run again in the case fullbool === true.\n// If a matrix is passed, automatically assume operation should be done on the\n// columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('cumsum cumprod').split(' '));\n\n\n// Extend jProto with methods which don't require arguments and work on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n // If a matrix is passed, automatically assume operation should be done on\n // the columns.\n jProto[passfunc] = function(fullbool, func) {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n // Assignment reassignation depending on how parameters were passed in.\n if (isFunction(fullbool)) {\n func = fullbool;\n fullbool = false;\n }\n // Check if a callback was passed with the function.\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));\n });\n return this;\n }\n // Check if matrix and run calculations.\n if (this.length > 1) {\n if (passfunc !== 'sumrow')\n tmpthis = fullbool === true ? this : this.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = jStat[passfunc](tmpthis[i]);\n return fullbool === true\n ? jStat[passfunc](jStat.utils.toVector(arr))\n : arr;\n }\n // Pass fullbool if only vector, not a matrix. for variance and stdev.\n return jStat[passfunc](this[0], fullbool);\n };\n })(funcs[i]);\n})(('sum sumsqrd sumsqerr sumrow product min max unique mean meansqerr ' +\n 'geomean median diff rank mode range variance deviation stdev meandev ' +\n 'meddev coeffvar quartiles histogram skewness kurtosis').split(' '));\n\n\n// Extend jProto with functions that take arguments. Operations on matrices are\n// done on columns.\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jProto[passfunc] = function() {\n var arr = [];\n var i = 0;\n var tmpthis = this;\n var args = Array.prototype.slice.call(arguments);\n var callbackFunction;\n\n // If the last argument is a function, we assume it's a callback; we\n // strip the callback out and call the function again.\n if (isFunction(args[args.length - 1])) {\n callbackFunction = args[args.length - 1];\n var argsToPass = args.slice(0, args.length - 1);\n\n setTimeout(function() {\n callbackFunction.call(tmpthis,\n jProto[passfunc].apply(tmpthis, argsToPass));\n });\n return this;\n\n // Otherwise we curry the function args and call normally.\n } else {\n callbackFunction = undefined;\n var curriedFunction = function curriedFunction(vector) {\n return jStat[passfunc].apply(tmpthis, [vector].concat(args));\n }\n }\n\n // If this is a matrix, run column-by-column.\n if (this.length > 1) {\n tmpthis = tmpthis.transpose();\n for (; i < tmpthis.length; i++)\n arr[i] = curriedFunction(tmpthis[i]);\n return arr;\n }\n\n // Otherwise run on the vector.\n return curriedFunction(this[0]);\n };\n })(funcs[i]);\n})('quantiles percentileOfScore'.split(' '));\n\n}(jStat, Math));\n// Special functions //\n(function(jStat, Math) {\n\n// Log-gamma function\njStat.gammaln = function gammaln(x) {\n var j = 0;\n var cof = [\n 76.18009172947146, -86.50532032941677, 24.01409824083091,\n -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5\n ];\n var ser = 1.000000000190015;\n var xx, y, tmp;\n tmp = (y = xx = x) + 5.5;\n tmp -= (xx + 0.5) * Math.log(tmp);\n for (; j < 6; j++)\n ser += cof[j] / ++y;\n return Math.log(2.5066282746310005 * ser / xx) - tmp;\n};\n\n/*\n * log-gamma function to support poisson distribution sampling. The\n * algorithm comes from SPECFUN by Shanjie Zhang and Jianming Jin and their\n * book \"Computation of Special Functions\", 1996, John Wiley & Sons, Inc.\n */\njStat.loggam = function loggam(x) {\n var x0, x2, xp, gl, gl0;\n var k, n;\n\n var a = [8.333333333333333e-02, -2.777777777777778e-03,\n 7.936507936507937e-04, -5.952380952380952e-04,\n 8.417508417508418e-04, -1.917526917526918e-03,\n 6.410256410256410e-03, -2.955065359477124e-02,\n 1.796443723688307e-01, -1.39243221690590e+00];\n x0 = x;\n n = 0;\n if ((x == 1.0) || (x == 2.0)) {\n return 0.0;\n }\n if (x <= 7.0) {\n n = Math.floor(7 - x);\n x0 = x + n;\n }\n x2 = 1.0 / (x0 * x0);\n xp = 2 * Math.PI;\n gl0 = a[9];\n for (k = 8; k >= 0; k--) {\n gl0 *= x2;\n gl0 += a[k];\n }\n gl = gl0 / x0 + 0.5 * Math.log(xp) + (x0 - 0.5) * Math.log(x0) - x0;\n if (x <= 7.0) {\n for (k = 1; k <= n; k++) {\n gl -= Math.log(x0 - 1.0);\n x0 -= 1.0;\n }\n }\n return gl;\n}\n\n// gamma of x\njStat.gammafn = function gammafn(x) {\n var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,\n 629.3311553128184, 866.9662027904133, -31451.272968848367,\n -36144.413418691176, 66456.14382024054\n ];\n var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,\n -3107.771671572311, 22538.118420980151, 4755.8462775278811,\n -134659.9598649693, -115132.2596755535];\n var fact = false;\n var n = 0;\n var xden = 0;\n var xnum = 0;\n var y = x;\n var i, z, yi, res;\n if (x > 171.6243769536076) {\n return Infinity;\n }\n if (y <= 0) {\n res = y % 1 + 3.6e-16;\n if (res) {\n fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);\n y = 1 - y;\n } else {\n return Infinity;\n }\n }\n yi = y;\n if (y < 1) {\n z = y++;\n } else {\n z = (y -= n = (y | 0) - 1) - 1;\n }\n for (i = 0; i < 8; ++i) {\n xnum = (xnum + p[i]) * z;\n xden = xden * z + q[i];\n }\n res = xnum / xden + 1;\n if (yi < y) {\n res /= yi;\n } else if (yi > y) {\n for (i = 0; i < n; ++i) {\n res *= y;\n y++;\n }\n }\n if (fact) {\n res = fact / res;\n }\n return res;\n};\n\n\n// lower incomplete gamma function, which is usually typeset with a\n// lower-case greek gamma as the function symbol\njStat.gammap = function gammap(a, x) {\n return jStat.lowRegGamma(a, x) * jStat.gammafn(a);\n};\n\n\n// The lower regularized incomplete gamma function, usually written P(a,x)\njStat.lowRegGamma = function lowRegGamma(a, x) {\n var aln = jStat.gammaln(a);\n var ap = a;\n var sum = 1 / a;\n var del = sum;\n var b = x + 1 - a;\n var c = 1 / 1.0e-30;\n var d = 1 / b;\n var h = d;\n var i = 1;\n // calculate maximum number of itterations required for a\n var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);\n var an;\n\n if (x < 0 || a <= 0) {\n return NaN;\n } else if (x < a + 1) {\n for (; i <= ITMAX; i++) {\n sum += del *= x / ++ap;\n }\n return (sum * Math.exp(-x + a * Math.log(x) - (aln)));\n }\n\n for (; i <= ITMAX; i++) {\n an = -i * (i - a);\n b += 2;\n d = an * d + b;\n c = b + an / c;\n d = 1 / d;\n h *= d * c;\n }\n\n return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));\n};\n\n// natural log factorial of n\njStat.factorialln = function factorialln(n) {\n return n < 0 ? NaN : jStat.gammaln(n + 1);\n};\n\n// factorial of n\njStat.factorial = function factorial(n) {\n return n < 0 ? NaN : jStat.gammafn(n + 1);\n};\n\n// combinations of n, m\njStat.combination = function combination(n, m) {\n // make sure n or m don't exceed the upper limit of usable values\n return (n > 170 || m > 170)\n ? Math.exp(jStat.combinationln(n, m))\n : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);\n};\n\n\njStat.combinationln = function combinationln(n, m){\n return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);\n};\n\n\n// permutations of n, m\njStat.permutation = function permutation(n, m) {\n return jStat.factorial(n) / jStat.factorial(n - m);\n};\n\n\n// beta function\njStat.betafn = function betafn(x, y) {\n // ensure arguments are positive\n if (x <= 0 || y <= 0)\n return undefined;\n // make sure x + y doesn't exceed the upper limit of usable values\n return (x + y > 170)\n ? Math.exp(jStat.betaln(x, y))\n : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);\n};\n\n\n// natural logarithm of beta function\njStat.betaln = function betaln(x, y) {\n return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);\n};\n\n\n// Evaluates the continued fraction for incomplete beta function by modified\n// Lentz's method.\njStat.betacf = function betacf(x, a, b) {\n var fpmin = 1e-30;\n var m = 1;\n var qab = a + b;\n var qap = a + 1;\n var qam = a - 1;\n var c = 1;\n var d = 1 - qab * x / qap;\n var m2, aa, del, h;\n\n // These q's will be used in factors that occur in the coefficients\n if (Math.abs(d) < fpmin)\n d = fpmin;\n d = 1 / d;\n h = d;\n\n for (; m <= 100; m++) {\n m2 = 2 * m;\n aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n // One step (the even one) of the recurrence\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n h *= d * c;\n aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n // Next step of the recurrence (the odd one)\n d = 1 + aa * d;\n if (Math.abs(d) < fpmin)\n d = fpmin;\n c = 1 + aa / c;\n if (Math.abs(c) < fpmin)\n c = fpmin;\n d = 1 / d;\n del = d * c;\n h *= del;\n if (Math.abs(del - 1.0) < 3e-7)\n break;\n }\n\n return h;\n};\n\n\n// Returns the inverse of the lower regularized inomplete gamma function\njStat.gammapinv = function gammapinv(p, a) {\n var j = 0;\n var a1 = a - 1;\n var EPS = 1e-8;\n var gln = jStat.gammaln(a);\n var x, err, t, u, pp, lna1, afac;\n\n if (p >= 1)\n return Math.max(100, a + 100 * Math.sqrt(a));\n if (p <= 0)\n return 0;\n if (a > 1) {\n lna1 = Math.log(a1);\n afac = Math.exp(a1 * (lna1 - 1) - gln);\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n x = Math.max(1e-3,\n a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));\n } else {\n t = 1 - a * (0.253 + a * 0.12);\n if (p < t)\n x = Math.pow(p / t, 1 / a);\n else\n x = 1 - Math.log(1 - (p - t) / (1 - t));\n }\n\n for(; j < 12; j++) {\n if (x <= 0)\n return 0;\n err = jStat.lowRegGamma(a, x) - p;\n if (a > 1)\n t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));\n else\n t = Math.exp(-x + a1 * Math.log(x) - gln);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (Math.abs(t) < EPS * x)\n break;\n }\n\n return x;\n};\n\n\n// Returns the error function erf(x)\njStat.erf = function erf(x) {\n var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,\n -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,\n 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,\n 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,\n 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,\n -2.27365122e-10, 9.6467911e-11, 2.394038e-12,\n -6.886027e-12, 8.94487e-13, 3.13092e-13,\n -1.12708e-13, 3.81e-16, 7.106e-15,\n -1.523e-15, -9.4e-17, 1.21e-16,\n -2.8e-17];\n var j = cof.length - 1;\n var isneg = false;\n var d = 0;\n var dd = 0;\n var t, ty, tmp, res;\n\n if (x < 0) {\n x = -x;\n isneg = true;\n }\n\n t = 2 / (2 + x);\n ty = 4 * t - 2;\n\n for(; j > 0; j--) {\n tmp = d;\n d = ty * d - dd + cof[j];\n dd = tmp;\n }\n\n res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);\n return isneg ? res - 1 : 1 - res;\n};\n\n\n// Returns the complmentary error function erfc(x)\njStat.erfc = function erfc(x) {\n return 1 - jStat.erf(x);\n};\n\n\n// Returns the inverse of the complementary error function\njStat.erfcinv = function erfcinv(p) {\n var j = 0;\n var x, err, t, pp;\n if (p >= 2)\n return -100;\n if (p <= 0)\n return 100;\n pp = (p < 1) ? p : 2 - p;\n t = Math.sqrt(-2 * Math.log(pp / 2));\n x = -0.70711 * ((2.30753 + t * 0.27061) /\n (1 + t * (0.99229 + t * 0.04481)) - t);\n for (; j < 2; j++) {\n err = jStat.erfc(x) - pp;\n x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);\n }\n return (p < 1) ? x : -x;\n};\n\n\n// Returns the inverse of the incomplete beta function\njStat.ibetainv = function ibetainv(p, a, b) {\n var EPS = 1e-8;\n var a1 = a - 1;\n var b1 = b - 1;\n var j = 0;\n var lna, lnb, pp, t, u, err, x, al, h, w, afac;\n if (p <= 0)\n return 0;\n if (p >= 1)\n return 1;\n if (a >= 1 && b >= 1) {\n pp = (p < 0.5) ? p : 1 - p;\n t = Math.sqrt(-2 * Math.log(pp));\n x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;\n if (p < 0.5)\n x = -x;\n al = (x * x - 3) / 6;\n h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));\n w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *\n (al + 5 / 6 - 2 / (3 * h));\n x = a / (a + b * Math.exp(2 * w));\n } else {\n lna = Math.log(a / (a + b));\n lnb = Math.log(b / (a + b));\n t = Math.exp(a * lna) / a;\n u = Math.exp(b * lnb) / b;\n w = t + u;\n if (p < t / w)\n x = Math.pow(a * w * p, 1 / a);\n else\n x = 1 - Math.pow(b * w * (1 - p), 1 / b);\n }\n afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);\n for(; j < 10; j++) {\n if (x === 0 || x === 1)\n return x;\n err = jStat.ibeta(x, a, b) - p;\n t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);\n u = err / t;\n x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));\n if (x <= 0)\n x = 0.5 * (x + t);\n if (x >= 1)\n x = 0.5 * (x + t + 1);\n if (Math.abs(t) < EPS * x && j > 0)\n break;\n }\n return x;\n};\n\n\n// Returns the incomplete beta function I_x(a,b)\njStat.ibeta = function ibeta(x, a, b) {\n // Factors in front of the continued fraction.\n var bt = (x === 0 || x === 1) ? 0 :\n Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -\n jStat.gammaln(b) + a * Math.log(x) + b *\n Math.log(1 - x));\n if (x < 0 || x > 1)\n return false;\n if (x < (a + 1) / (a + b + 2))\n // Use continued fraction directly.\n return bt * jStat.betacf(x, a, b) / a;\n // else use continued fraction after making the symmetry transformation.\n return 1 - bt * jStat.betacf(1 - x, b, a) / b;\n};\n\n\n// Returns a normal deviate (mu=0, sigma=1).\n// If n and m are specified it returns a object of normal deviates.\njStat.randn = function randn(n, m) {\n var u, v, x, y, q;\n if (!m)\n m = n;\n if (n)\n return jStat.create(n, m, function() { return jStat.randn(); });\n do {\n u = jStat._random_fn();\n v = 1.7156 * (jStat._random_fn() - 0.5);\n x = u - 0.449871;\n y = Math.abs(v) + 0.386595;\n q = x * x + y * (0.19600 * y - 0.25472 * x);\n } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));\n return v / u;\n};\n\n\n// Returns a gamma deviate by the method of Marsaglia and Tsang.\njStat.randg = function randg(shape, n, m) {\n var oalph = shape;\n var a1, a2, u, v, x, mat;\n if (!m)\n m = n;\n if (!shape)\n shape = 1;\n if (n) {\n mat = jStat.zeros(n,m);\n mat.alter(function() { return jStat.randg(shape); });\n return mat;\n }\n if (shape < 1)\n shape += 1;\n a1 = shape - 1 / 3;\n a2 = 1 / Math.sqrt(9 * a1);\n do {\n do {\n x = jStat.randn();\n v = 1 + a2 * x;\n } while(v <= 0);\n v = v * v * v;\n u = jStat._random_fn();\n } while(u > 1 - 0.331 * Math.pow(x, 4) &&\n Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));\n // alpha > 1\n if (shape == oalph)\n return a1 * v;\n // alpha < 1\n do {\n u = jStat._random_fn();\n } while(u === 0);\n return Math.pow(u, 1 / oalph) * a1 * v;\n};\n\n\n// making use of static methods on the instance\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(\n jStat.map(this, function(value) { return jStat[passfunc](value); }));\n }\n })(funcs[i]);\n})('gammaln gammafn factorial factorialln'.split(' '));\n\n\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function() {\n return jStat(jStat[passfunc].apply(null, arguments));\n };\n })(funcs[i]);\n})('randn'.split(' '));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\n// generate all distribution instance methods\n(function(list) {\n for (var i = 0; i < list.length; i++) (function(func) {\n // distribution instance method\n jStat[func] = function f(a, b, c) {\n if (!(this instanceof f))\n return new f(a, b, c);\n this._a = a;\n this._b = b;\n this._c = c;\n return this;\n };\n // distribution method to be used on a jStat instance\n jStat.fn[func] = function(a, b, c) {\n var newthis = jStat[func](a, b, c);\n newthis.data = this;\n return newthis;\n };\n // sample instance method\n jStat[func].prototype.sample = function(arr) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (arr)\n return jStat.alter(arr, function() {\n return jStat[func].sample(a, b, c);\n });\n else\n return jStat[func].sample(a, b, c);\n };\n // generate the pdf, cdf and inv instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function(x) {\n var a = this._a;\n var b = this._b;\n var c = this._c;\n if (!x && x !== 0)\n x = this.data;\n if (typeof x !== 'number') {\n return jStat.fn.map.call(x, function(x) {\n return jStat[func][fnfunc](x, a, b, c);\n });\n }\n return jStat[func][fnfunc](x, a, b, c);\n };\n })(vals[i]);\n })('pdf cdf inv'.split(' '));\n // generate the mean, median, mode and variance instance methods\n (function(vals) {\n for (var i = 0; i < vals.length; i++) (function(fnfunc) {\n jStat[func].prototype[fnfunc] = function() {\n return jStat[func][fnfunc](this._a, this._b, this._c);\n };\n })(vals[i]);\n })('mean median mode variance'.split(' '));\n })(list[i]);\n})((\n 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +\n 'laplace lognormal noncentralt normal pareto studentt weibull uniform ' +\n 'binomial negbin hypgeom poisson triangular tukey arcsine'\n).split(' '));\n\n\n\n// extend beta function with static methods\njStat.extend(jStat.beta, {\n pdf: function pdf(x, alpha, beta) {\n // PDF is zero outside the support\n if (x > 1 || x < 0)\n return 0;\n // PDF is one for the uniform case\n if (alpha == 1 && beta == 1)\n return 1;\n\n if (alpha < 512 && beta < 512) {\n return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /\n jStat.betafn(alpha, beta);\n } else {\n return Math.exp((alpha - 1) * Math.log(x) +\n (beta - 1) * Math.log(1 - x) -\n jStat.betaln(alpha, beta));\n }\n },\n\n cdf: function cdf(x, alpha, beta) {\n return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);\n },\n\n inv: function inv(x, alpha, beta) {\n return jStat.ibetainv(x, alpha, beta);\n },\n\n mean: function mean(alpha, beta) {\n return alpha / (alpha + beta);\n },\n\n median: function median(alpha, beta) {\n return jStat.ibetainv(0.5, alpha, beta);\n },\n\n mode: function mode(alpha, beta) {\n return (alpha - 1 ) / ( alpha + beta - 2);\n },\n\n // return a random sample\n sample: function sample(alpha, beta) {\n var u = jStat.randg(alpha);\n return u / (u + jStat.randg(beta));\n },\n\n variance: function variance(alpha, beta) {\n return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));\n }\n});\n\n// extend F function with static methods\njStat.extend(jStat.centralF, {\n // This implementation of the pdf function avoids float overflow\n // See the way that R calculates this value:\n // https://svn.r-project.org/R/trunk/src/nmath/df.c\n pdf: function pdf(x, df1, df2) {\n var p, q, f;\n\n if (x < 0)\n return 0;\n\n if (df1 <= 2) {\n if (x === 0 && df1 < 2) {\n return Infinity;\n }\n if (x === 0 && df1 === 2) {\n return 1;\n }\n return (1 / jStat.betafn(df1 / 2, df2 / 2)) *\n Math.pow(df1 / df2, df1 / 2) *\n Math.pow(x, (df1/2) - 1) *\n Math.pow((1 + (df1 / df2) * x), -(df1 + df2) / 2);\n }\n\n p = (df1 * x) / (df2 + x * df1);\n q = df2 / (df2 + x * df1);\n f = df1 * q / 2.0;\n return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);\n },\n\n cdf: function cdf(x, df1, df2) {\n if (x < 0)\n return 0;\n return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);\n },\n\n inv: function inv(x, df1, df2) {\n return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));\n },\n\n mean: function mean(df1, df2) {\n return (df2 > 2) ? df2 / (df2 - 2) : undefined;\n },\n\n mode: function mode(df1, df2) {\n return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;\n },\n\n // return a random sample\n sample: function sample(df1, df2) {\n var x1 = jStat.randg(df1 / 2) * 2;\n var x2 = jStat.randg(df2 / 2) * 2;\n return (x1 / df1) / (x2 / df2);\n },\n\n variance: function variance(df1, df2) {\n if (df2 <= 4)\n return undefined;\n return 2 * df2 * df2 * (df1 + df2 - 2) /\n (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));\n }\n});\n\n\n// extend cauchy function with static methods\njStat.extend(jStat.cauchy, {\n pdf: function pdf(x, local, scale) {\n if (scale < 0) { return 0; }\n\n return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;\n },\n\n cdf: function cdf(x, local, scale) {\n return Math.atan((x - local) / scale) / Math.PI + 0.5;\n },\n\n inv: function(p, local, scale) {\n return local + scale * Math.tan(Math.PI * (p - 0.5));\n },\n\n median: function median(local/*, scale*/) {\n return local;\n },\n\n mode: function mode(local/*, scale*/) {\n return local;\n },\n\n sample: function sample(local, scale) {\n return jStat.randn() *\n Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;\n }\n});\n\n\n\n// extend chisquare function with static methods\njStat.extend(jStat.chisquare, {\n pdf: function pdf(x, dof) {\n if (x < 0)\n return 0;\n return (x === 0 && dof === 2) ? 0.5 :\n Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *\n Math.log(2) - jStat.gammaln(dof / 2));\n },\n\n cdf: function cdf(x, dof) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(dof / 2, x / 2);\n },\n\n inv: function(p, dof) {\n return 2 * jStat.gammapinv(p, 0.5 * dof);\n },\n\n mean : function(dof) {\n return dof;\n },\n\n // TODO: this is an approximation (is there a better way?)\n median: function median(dof) {\n return dof * Math.pow(1 - (2 / (9 * dof)), 3);\n },\n\n mode: function mode(dof) {\n return (dof - 2 > 0) ? dof - 2 : 0;\n },\n\n sample: function sample(dof) {\n return jStat.randg(dof / 2) * 2;\n },\n\n variance: function variance(dof) {\n return 2 * dof;\n }\n});\n\n\n\n// extend exponential function with static methods\njStat.extend(jStat.exponential, {\n pdf: function pdf(x, rate) {\n return x < 0 ? 0 : rate * Math.exp(-rate * x);\n },\n\n cdf: function cdf(x, rate) {\n return x < 0 ? 0 : 1 - Math.exp(-rate * x);\n },\n\n inv: function(p, rate) {\n return -Math.log(1 - p) / rate;\n },\n\n mean : function(rate) {\n return 1 / rate;\n },\n\n median: function (rate) {\n return (1 / rate) * Math.log(2);\n },\n\n mode: function mode(/*rate*/) {\n return 0;\n },\n\n sample: function sample(rate) {\n return -1 / rate * Math.log(jStat._random_fn());\n },\n\n variance : function(rate) {\n return Math.pow(rate, -2);\n }\n});\n\n\n\n// extend gamma function with static methods\njStat.extend(jStat.gamma, {\n pdf: function pdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return (x === 0 && shape === 1) ? 1 / scale :\n Math.exp((shape - 1) * Math.log(x) - x / scale -\n jStat.gammaln(shape) - shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x < 0)\n return 0;\n return jStat.lowRegGamma(shape, x / scale);\n },\n\n inv: function(p, shape, scale) {\n return jStat.gammapinv(p, shape) * scale;\n },\n\n mean : function(shape, scale) {\n return shape * scale;\n },\n\n mode: function mode(shape, scale) {\n if(shape > 1) return (shape - 1) * scale;\n return undefined;\n },\n\n sample: function sample(shape, scale) {\n return jStat.randg(shape) * scale;\n },\n\n variance: function variance(shape, scale) {\n return shape * scale * scale;\n }\n});\n\n// extend inverse gamma function with static methods\njStat.extend(jStat.invgamma, {\n pdf: function pdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return Math.exp(-(shape + 1) * Math.log(x) - scale / x -\n jStat.gammaln(shape) + shape * Math.log(scale));\n },\n\n cdf: function cdf(x, shape, scale) {\n if (x <= 0)\n return 0;\n return 1 - jStat.lowRegGamma(shape, scale / x);\n },\n\n inv: function(p, shape, scale) {\n return scale / jStat.gammapinv(1 - p, shape);\n },\n\n mean : function(shape, scale) {\n return (shape > 1) ? scale / (shape - 1) : undefined;\n },\n\n mode: function mode(shape, scale) {\n return scale / (shape + 1);\n },\n\n sample: function sample(shape, scale) {\n return scale / jStat.randg(shape);\n },\n\n variance: function variance(shape, scale) {\n if (shape <= 2)\n return undefined;\n return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));\n }\n});\n\n\n// extend kumaraswamy function with static methods\njStat.extend(jStat.kumaraswamy, {\n pdf: function pdf(x, alpha, beta) {\n if (x === 0 && alpha === 1)\n return beta;\n else if (x === 1 && beta === 1)\n return alpha;\n return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *\n Math.log(x) + (beta - 1) *\n Math.log(1 - Math.pow(x, alpha)));\n },\n\n cdf: function cdf(x, alpha, beta) {\n if (x < 0)\n return 0;\n else if (x > 1)\n return 1;\n return (1 - Math.pow(1 - Math.pow(x, alpha), beta));\n },\n\n inv: function inv(p, alpha, beta) {\n return Math.pow(1 - Math.pow(1 - p, 1 / beta), 1 / alpha);\n },\n\n mean : function(alpha, beta) {\n return (beta * jStat.gammafn(1 + 1 / alpha) *\n jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));\n },\n\n median: function median(alpha, beta) {\n return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);\n },\n\n mode: function mode(alpha, beta) {\n if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))\n return undefined;\n return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);\n },\n\n variance: function variance(/*alpha, beta*/) {\n throw new Error('variance not yet implemented');\n // TODO: complete this\n }\n});\n\n\n\n// extend lognormal function with static methods\njStat.extend(jStat.lognormal, {\n pdf: function pdf(x, mu, sigma) {\n if (x <= 0)\n return 0;\n return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -\n Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /\n (2 * sigma * sigma));\n },\n\n cdf: function cdf(x, mu, sigma) {\n if (x < 0)\n return 0;\n return 0.5 +\n (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));\n },\n\n inv: function(p, mu, sigma) {\n return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);\n },\n\n mean: function mean(mu, sigma) {\n return Math.exp(mu + sigma * sigma / 2);\n },\n\n median: function median(mu/*, sigma*/) {\n return Math.exp(mu);\n },\n\n mode: function mode(mu, sigma) {\n return Math.exp(mu - sigma * sigma);\n },\n\n sample: function sample(mu, sigma) {\n return Math.exp(jStat.randn() * sigma + mu);\n },\n\n variance: function variance(mu, sigma) {\n return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);\n }\n});\n\n\n\n// extend noncentralt function with static methods\njStat.extend(jStat.noncentralt, {\n pdf: function pdf(x, dof, ncp) {\n var tol = 1e-14;\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.pdf(x, dof)\n\n if (Math.abs(x) < tol) { // different formula for x == 0\n return Math.exp(jStat.gammaln((dof + 1) / 2) - ncp * ncp / 2 -\n 0.5 * Math.log(Math.PI * dof) - jStat.gammaln(dof / 2));\n }\n\n // formula for x != 0\n return dof / x *\n (jStat.noncentralt.cdf(x * Math.sqrt(1 + 2 / dof), dof+2, ncp) -\n jStat.noncentralt.cdf(x, dof, ncp));\n },\n\n cdf: function cdf(x, dof, ncp) {\n var tol = 1e-14;\n var min_iterations = 200;\n\n if (Math.abs(ncp) < tol) // ncp approx 0; use student-t\n return jStat.studentt.cdf(x, dof);\n\n // turn negative x into positive and flip result afterwards\n var flip = false;\n if (x < 0) {\n flip = true;\n ncp = -ncp;\n }\n\n var prob = jStat.normal.cdf(-ncp, 0, 1);\n var value = tol + 1;\n // use value at last two steps to determine convergence\n var lastvalue = value;\n var y = x * x / (x * x + dof);\n var j = 0;\n var p = Math.exp(-ncp * ncp / 2);\n var q = Math.exp(-ncp * ncp / 2 - 0.5 * Math.log(2) -\n jStat.gammaln(3 / 2)) * ncp;\n while (j < min_iterations || lastvalue > tol || value > tol) {\n lastvalue = value;\n if (j > 0) {\n p *= (ncp * ncp) / (2 * j);\n q *= (ncp * ncp) / (2 * (j + 1 / 2));\n }\n value = p * jStat.beta.cdf(y, j + 0.5, dof / 2) +\n q * jStat.beta.cdf(y, j+1, dof/2);\n prob += 0.5 * value;\n j++;\n }\n\n return flip ? (1 - prob) : prob;\n }\n});\n\n\n// extend normal function with static methods\njStat.extend(jStat.normal, {\n pdf: function pdf(x, mean, std) {\n return Math.exp(-0.5 * Math.log(2 * Math.PI) -\n Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));\n },\n\n cdf: function cdf(x, mean, std) {\n return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));\n },\n\n inv: function(p, mean, std) {\n return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;\n },\n\n mean : function(mean/*, std*/) {\n return mean;\n },\n\n median: function median(mean/*, std*/) {\n return mean;\n },\n\n mode: function (mean/*, std*/) {\n return mean;\n },\n\n sample: function sample(mean, std) {\n return jStat.randn() * std + mean;\n },\n\n variance : function(mean, std) {\n return std * std;\n }\n});\n\n\n\n// extend pareto function with static methods\njStat.extend(jStat.pareto, {\n pdf: function pdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);\n },\n\n cdf: function cdf(x, scale, shape) {\n if (x < scale)\n return 0;\n return 1 - Math.pow(scale / x, shape);\n },\n\n inv: function inv(p, scale, shape) {\n return scale / Math.pow(1 - p, 1 / shape);\n },\n\n mean: function mean(scale, shape) {\n if (shape <= 1)\n return undefined;\n return (shape * Math.pow(scale, shape)) / (shape - 1);\n },\n\n median: function median(scale, shape) {\n return scale * (shape * Math.SQRT2);\n },\n\n mode: function mode(scale/*, shape*/) {\n return scale;\n },\n\n variance : function(scale, shape) {\n if (shape <= 2)\n return undefined;\n return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));\n }\n});\n\n\n\n// extend studentt function with static methods\njStat.extend(jStat.studentt, {\n pdf: function pdf(x, dof) {\n dof = dof > 1e100 ? 1e100 : dof;\n return (1/(Math.sqrt(dof) * jStat.betafn(0.5, dof/2))) *\n Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));\n },\n\n cdf: function cdf(x, dof) {\n var dof2 = dof / 2;\n return jStat.ibeta((x + Math.sqrt(x * x + dof)) /\n (2 * Math.sqrt(x * x + dof)), dof2, dof2);\n },\n\n inv: function(p, dof) {\n var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);\n x = Math.sqrt(dof * (1 - x) / x);\n return (p > 0.5) ? x : -x;\n },\n\n mean: function mean(dof) {\n return (dof > 1) ? 0 : undefined;\n },\n\n median: function median(/*dof*/) {\n return 0;\n },\n\n mode: function mode(/*dof*/) {\n return 0;\n },\n\n sample: function sample(dof) {\n return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));\n },\n\n variance: function variance(dof) {\n return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;\n }\n});\n\n\n\n// extend weibull function with static methods\njStat.extend(jStat.weibull, {\n pdf: function pdf(x, scale, shape) {\n if (x < 0 || scale < 0 || shape < 0)\n return 0;\n return (shape / scale) * Math.pow((x / scale), (shape - 1)) *\n Math.exp(-(Math.pow((x / scale), shape)));\n },\n\n cdf: function cdf(x, scale, shape) {\n return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));\n },\n\n inv: function(p, scale, shape) {\n return scale * Math.pow(-Math.log(1 - p), 1 / shape);\n },\n\n mean : function(scale, shape) {\n return scale * jStat.gammafn(1 + 1 / shape);\n },\n\n median: function median(scale, shape) {\n return scale * Math.pow(Math.log(2), 1 / shape);\n },\n\n mode: function mode(scale, shape) {\n if (shape <= 1)\n return 0;\n return scale * Math.pow((shape - 1) / shape, 1 / shape);\n },\n\n sample: function sample(scale, shape) {\n return scale * Math.pow(-Math.log(jStat._random_fn()), 1 / shape);\n },\n\n variance: function variance(scale, shape) {\n return scale * scale * jStat.gammafn(1 + 2 / shape) -\n Math.pow(jStat.weibull.mean(scale, shape), 2);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.uniform, {\n pdf: function pdf(x, a, b) {\n return (x < a || x > b) ? 0 : 1 / (b - a);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (x - a) / (b - a);\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (p * (b - a));\n },\n\n mean: function mean(a, b) {\n return 0.5 * (a + b);\n },\n\n median: function median(a, b) {\n return jStat.mean(a, b);\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * jStat._random_fn() - 1);\n },\n\n variance: function variance(a, b) {\n return Math.pow(b - a, 2) / 12;\n }\n});\n\n\n// Got this from http://www.math.ucla.edu/~tom/distributions/binomial.html\nfunction betinc(x, a, b, eps) {\n var a0 = 0;\n var b0 = 1;\n var a1 = 1;\n var b1 = 1;\n var m9 = 0;\n var a2 = 0;\n var c9;\n\n while (Math.abs((a1 - a2) / a1) > eps) {\n a2 = a1;\n c9 = -(a + m9) * (a + b + m9) * x / (a + 2 * m9) / (a + 2 * m9 + 1);\n a0 = a1 + c9 * a0;\n b0 = b1 + c9 * b0;\n m9 = m9 + 1;\n c9 = m9 * (b - m9) * x / (a + 2 * m9 - 1) / (a + 2 * m9);\n a1 = a0 + c9 * a1;\n b1 = b0 + c9 * b1;\n a0 = a0 / b1;\n b0 = b0 / b1;\n a1 = a1 / b1;\n b1 = 1;\n }\n\n return a1 / a;\n}\n\n\n// extend uniform function with static methods\njStat.extend(jStat.binomial, {\n pdf: function pdf(k, n, p) {\n return (p === 0 || p === 1) ?\n ((n * p) === k ? 1 : 0) :\n jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n },\n\n cdf: function cdf(x, n, p) {\n var betacdf;\n var eps = 1e-10;\n\n if (x < 0)\n return 0;\n if (x >= n)\n return 1;\n if (p < 0 || p > 1 || n <= 0)\n return NaN;\n\n x = Math.floor(x);\n var z = p;\n var a = x + 1;\n var b = n - x;\n var s = a + b;\n var bt = Math.exp(jStat.gammaln(s) - jStat.gammaln(b) -\n jStat.gammaln(a) + a * Math.log(z) + b * Math.log(1 - z));\n\n if (z < (a + 1) / (s + 2))\n betacdf = bt * betinc(z, a, b, eps);\n else\n betacdf = 1 - bt * betinc(1 - z, b, a, eps);\n\n return Math.round((1 - betacdf) * (1 / eps)) / (1 / eps);\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.negbin, {\n pdf: function pdf(k, r, p) {\n if (k !== k >>> 0)\n return false;\n if (k < 0)\n return 0;\n return jStat.combination(k + r - 1, r - 1) *\n Math.pow(1 - p, k) * Math.pow(p, r);\n },\n\n cdf: function cdf(x, r, p) {\n var sum = 0,\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sum += jStat.negbin.pdf(k, r, p);\n }\n return sum;\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.hypgeom, {\n pdf: function pdf(k, N, m, n) {\n // Hypergeometric PDF.\n\n // A simplification of the CDF algorithm below.\n\n // k = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(k !== k | 0) {\n return false;\n } else if(k < 0 || k < m - (N - n)) {\n // It's impossible to have this few successes drawn.\n return 0;\n } else if(k > n || k > m) {\n // It's impossible to have this many successes drawn.\n return 0;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return jStat.hypgeom.pdf(n - k, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return jStat.hypgeom.pdf(m - k, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.pdf(k, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate product to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < k; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledPDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n scaledPDF *= 1 - (m / (N - samplesDone));\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledPDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledPDF));\n }\n },\n\n cdf: function cdf(x, N, m, n) {\n // Hypergeometric CDF.\n\n // This algorithm is due to Prof. Thomas S. Ferguson, <tom@math.ucla.edu>,\n // and comes from his hypergeometric test calculator at\n // <http://www.math.ucla.edu/~tom/distributions/Hypergeometric.html>.\n\n // x = number of successes drawn\n // N = population size\n // m = number of successes in population\n // n = number of items drawn from population\n\n if(x < 0 || x < m - (N - n)) {\n // It's impossible to have this few successes drawn or fewer.\n return 0;\n } else if(x >= n || x >= m) {\n // We will always have this many successes or fewer.\n return 1;\n } else if (m * 2 > N) {\n // More than half the population is successes.\n\n if(n * 2 > N) {\n // More than half the population is sampled.\n\n return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)\n } else {\n // Half or less of the population is sampled.\n\n return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);\n }\n\n } else if(n * 2 > N) {\n // Half or less is successes.\n\n return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);\n\n } else if(m < n) {\n // We want to have the number of things sampled to be less than the\n // successes available. So swap the definitions of successful and sampled.\n return jStat.hypgeom.cdf(x, N, n, m);\n } else {\n // If we get here, half or less of the population was sampled, half or\n // less of it was successes, and we had fewer sampled things than\n // successes. Now we can do this complicated iterative algorithm in an\n // efficient way.\n\n // The basic premise of the algorithm is that we partially normalize our\n // intermediate sum to keep it in a numerically good region, and then\n // finish the normalization at the end.\n\n // Holds the intermediate, scaled total CDF.\n var scaledCDF = 1;\n\n // This variable holds the scaled probability of the current number of\n // successes.\n var scaledPDF = 1;\n\n // This keeps track of how much we have normalized.\n var samplesDone = 0;\n\n for(var i = 0; i < x; i++) {\n // For every possible number of successes up to that observed...\n\n while(scaledCDF > 1 && samplesDone < n) {\n // Intermediate result is growing too big. Apply some of the\n // normalization to shrink everything.\n\n var factor = 1 - (m / (N - samplesDone));\n\n scaledPDF *= factor;\n scaledCDF *= factor;\n\n // Say we've normalized by this sample already.\n samplesDone++;\n }\n\n // Work out the partially-normalized hypergeometric PDF for the next\n // number of successes\n scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));\n\n // Add to the CDF answer.\n scaledCDF += scaledPDF;\n }\n\n for(; samplesDone < n; samplesDone++) {\n // Apply all the rest of the normalization\n scaledCDF *= 1 - (m / (N - samplesDone));\n }\n\n // Bound answer sanely before returning.\n return Math.min(1, Math.max(0, scaledCDF));\n }\n }\n});\n\n\n\n// extend uniform function with static methods\njStat.extend(jStat.poisson, {\n pdf: function pdf(k, l) {\n if (l < 0 || (k % 1) !== 0 || k < 0) {\n return 0;\n }\n\n return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);\n },\n\n cdf: function cdf(x, l) {\n var sumarr = [],\n k = 0;\n if (x < 0) return 0;\n for (; k <= x; k++) {\n sumarr.push(jStat.poisson.pdf(k, l));\n }\n return jStat.sum(sumarr);\n },\n\n mean : function(l) {\n return l;\n },\n\n variance : function(l) {\n return l;\n },\n\n sampleSmall: function sampleSmall(l) {\n var p = 1, k = 0, L = Math.exp(-l);\n do {\n k++;\n p *= jStat._random_fn();\n } while (p > L);\n return k - 1;\n },\n\n sampleLarge: function sampleLarge(l) {\n var lam = l;\n var k;\n var U, V, slam, loglam, a, b, invalpha, vr, us;\n\n slam = Math.sqrt(lam);\n loglam = Math.log(lam);\n b = 0.931 + 2.53 * slam;\n a = -0.059 + 0.02483 * b;\n invalpha = 1.1239 + 1.1328 / (b - 3.4);\n vr = 0.9277 - 3.6224 / (b - 2);\n\n while (1) {\n U = Math.random() - 0.5;\n V = Math.random();\n us = 0.5 - Math.abs(U);\n k = Math.floor((2 * a / us + b) * U + lam + 0.43);\n if ((us >= 0.07) && (V <= vr)) {\n return k;\n }\n if ((k < 0) || ((us < 0.013) && (V > us))) {\n continue;\n }\n /* log(V) == log(0.0) ok here */\n /* if U==0.0 so that us==0.0, log is ok since always returns */\n if ((Math.log(V) + Math.log(invalpha) - Math.log(a / (us * us) + b)) <= (-lam + k * loglam - jStat.loggam(k + 1))) {\n return k;\n }\n }\n },\n\n sample: function sample(l) {\n if (l < 10)\n return this.sampleSmall(l);\n else\n return this.sampleLarge(l);\n }\n});\n\n// extend triangular function with static methods\njStat.extend(jStat.triangular, {\n pdf: function pdf(x, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (x < a || x > b) {\n return 0;\n } else if (x < c) {\n return (2 * (x - a)) / ((b - a) * (c - a));\n } else if (x === c) {\n return (2 / (b - a));\n } else { // x > c\n return (2 * (b - x)) / ((b - a) * (b - c));\n }\n }\n },\n\n cdf: function cdf(x, a, b, c) {\n if (b <= a || c < a || c > b)\n return NaN;\n if (x <= a)\n return 0;\n else if (x >= b)\n return 1;\n if (x <= c)\n return Math.pow(x - a, 2) / ((b - a) * (c - a));\n else // x > c\n return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));\n },\n\n inv: function inv(p, a, b, c) {\n if (b <= a || c < a || c > b) {\n return NaN;\n } else {\n if (p <= ((c - a) / (b - a))) {\n return a + (b - a) * Math.sqrt(p * ((c - a) / (b - a)));\n } else { // p > ((c - a) / (b - a))\n return a + (b - a) * (1 - Math.sqrt((1 - p) * (1 - ((c - a) / (b - a)))));\n }\n }\n },\n\n mean: function mean(a, b, c) {\n return (a + b + c) / 3;\n },\n\n median: function median(a, b, c) {\n if (c <= (a + b) / 2) {\n return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);\n } else if (c > (a + b) / 2) {\n return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);\n }\n },\n\n mode: function mode(a, b, c) {\n return c;\n },\n\n sample: function sample(a, b, c) {\n var u = jStat._random_fn();\n if (u < ((c - a) / (b - a)))\n return a + Math.sqrt(u * (b - a) * (c - a))\n return b - Math.sqrt((1 - u) * (b - a) * (b - c));\n },\n\n variance: function variance(a, b, c) {\n return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;\n }\n});\n\n\n// extend arcsine function with static methods\njStat.extend(jStat.arcsine, {\n pdf: function pdf(x, a, b) {\n if (b <= a) return NaN;\n\n return (x <= a || x >= b) ? 0 :\n (2 / Math.PI) *\n Math.pow(Math.pow(b - a, 2) -\n Math.pow(2 * x - a - b, 2), -0.5);\n },\n\n cdf: function cdf(x, a, b) {\n if (x < a)\n return 0;\n else if (x < b)\n return (2 / Math.PI) * Math.asin(Math.sqrt((x - a)/(b - a)));\n return 1;\n },\n\n inv: function(p, a, b) {\n return a + (0.5 - 0.5 * Math.cos(Math.PI * p)) * (b - a);\n },\n\n mean: function mean(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n median: function median(a, b) {\n if (b <= a) return NaN;\n return (a + b) / 2;\n },\n\n mode: function mode(/*a, b*/) {\n throw new Error('mode is not yet implemented');\n },\n\n sample: function sample(a, b) {\n return ((a + b) / 2) + ((b - a) / 2) *\n Math.sin(2 * Math.PI * jStat.uniform.sample(0, 1));\n },\n\n variance: function variance(a, b) {\n if (b <= a) return NaN;\n return Math.pow(b - a, 2) / 8;\n }\n});\n\n\nfunction laplaceSign(x) { return x / Math.abs(x); }\n\njStat.extend(jStat.laplace, {\n pdf: function pdf(x, mu, b) {\n return (b <= 0) ? 0 : (Math.exp(-Math.abs(x - mu) / b)) / (2 * b);\n },\n\n cdf: function cdf(x, mu, b) {\n if (b <= 0) { return 0; }\n\n if(x < mu) {\n return 0.5 * Math.exp((x - mu) / b);\n } else {\n return 1 - 0.5 * Math.exp(- (x - mu) / b);\n }\n },\n\n mean: function(mu/*, b*/) {\n return mu;\n },\n\n median: function(mu/*, b*/) {\n return mu;\n },\n\n mode: function(mu/*, b*/) {\n return mu;\n },\n\n variance: function(mu, b) {\n return 2 * b * b;\n },\n\n sample: function sample(mu, b) {\n var u = jStat._random_fn() - 0.5;\n\n return mu - (b * laplaceSign(u) * Math.log(1 - (2 * Math.abs(u))));\n }\n});\n\nfunction tukeyWprob(w, rr, cc) {\n var nleg = 12;\n var ihalf = 6;\n\n var C1 = -30;\n var C2 = -50;\n var C3 = 60;\n var bb = 8;\n var wlar = 3;\n var wincr1 = 2;\n var wincr2 = 3;\n var xleg = [\n 0.981560634246719250690549090149,\n 0.904117256370474856678465866119,\n 0.769902674194304687036893833213,\n 0.587317954286617447296702418941,\n 0.367831498998180193752691536644,\n 0.125233408511468915472441369464\n ];\n var aleg = [\n 0.047175336386511827194615961485,\n 0.106939325995318430960254718194,\n 0.160078328543346226334652529543,\n 0.203167426723065921749064455810,\n 0.233492536538354808760849898925,\n 0.249147045813402785000562436043\n ];\n\n var qsqz = w * 0.5;\n\n // if w >= 16 then the integral lower bound (occurs for c=20)\n // is 0.99999999999995 so return a value of 1.\n\n if (qsqz >= bb)\n return 1.0;\n\n // find (f(w/2) - 1) ^ cc\n // (first term in integral of hartley's form).\n\n var pr_w = 2 * jStat.normal.cdf(qsqz, 0, 1, 1, 0) - 1; // erf(qsqz / M_SQRT2)\n // if pr_w ^ cc < 2e-22 then set pr_w = 0\n if (pr_w >= Math.exp(C2 / cc))\n pr_w = Math.pow(pr_w, cc);\n else\n pr_w = 0.0;\n\n // if w is large then the second component of the\n // integral is small, so fewer intervals are needed.\n\n var wincr;\n if (w > wlar)\n wincr = wincr1;\n else\n wincr = wincr2;\n\n // find the integral of second term of hartley's form\n // for the integral of the range for equal-length\n // intervals using legendre quadrature. limits of\n // integration are from (w/2, 8). two or three\n // equal-length intervals are used.\n\n // blb and bub are lower and upper limits of integration.\n\n var blb = qsqz;\n var binc = (bb - qsqz) / wincr;\n var bub = blb + binc;\n var einsum = 0.0;\n\n // integrate over each interval\n\n var cc1 = cc - 1.0;\n for (var wi = 1; wi <= wincr; wi++) {\n var elsum = 0.0;\n var a = 0.5 * (bub + blb);\n\n // legendre quadrature with order = nleg\n\n var b = 0.5 * (bub - blb);\n\n for (var jj = 1; jj <= nleg; jj++) {\n var j, xx;\n if (ihalf < jj) {\n j = (nleg - jj) + 1;\n xx = xleg[j-1];\n } else {\n j = jj;\n xx = -xleg[j-1];\n }\n var c = b * xx;\n var ac = a + c;\n\n // if exp(-qexpo/2) < 9e-14,\n // then doesn't contribute to integral\n\n var qexpo = ac * ac;\n if (qexpo > C3)\n break;\n\n var pplus = 2 * jStat.normal.cdf(ac, 0, 1, 1, 0);\n var pminus= 2 * jStat.normal.cdf(ac, w, 1, 1, 0);\n\n // if rinsum ^ (cc-1) < 9e-14,\n // then doesn't contribute to integral\n\n var rinsum = (pplus * 0.5) - (pminus * 0.5);\n if (rinsum >= Math.exp(C1 / cc1)) {\n rinsum = (aleg[j-1] * Math.exp(-(0.5 * qexpo))) * Math.pow(rinsum, cc1);\n elsum += rinsum;\n }\n }\n elsum *= (((2.0 * b) * cc) / Math.sqrt(2 * Math.PI));\n einsum += elsum;\n blb = bub;\n bub += binc;\n }\n\n // if pr_w ^ rr < 9e-14, then return 0\n pr_w += einsum;\n if (pr_w <= Math.exp(C1 / rr))\n return 0;\n\n pr_w = Math.pow(pr_w, rr);\n if (pr_w >= 1) // 1 was iMax was eps\n return 1;\n return pr_w;\n}\n\nfunction tukeyQinv(p, c, v) {\n var p0 = 0.322232421088;\n var q0 = 0.993484626060e-01;\n var p1 = -1.0;\n var q1 = 0.588581570495;\n var p2 = -0.342242088547;\n var q2 = 0.531103462366;\n var p3 = -0.204231210125;\n var q3 = 0.103537752850;\n var p4 = -0.453642210148e-04;\n var q4 = 0.38560700634e-02;\n var c1 = 0.8832;\n var c2 = 0.2368;\n var c3 = 1.214;\n var c4 = 1.208;\n var c5 = 1.4142;\n var vmax = 120.0;\n\n var ps = 0.5 - 0.5 * p;\n var yi = Math.sqrt(Math.log(1.0 / (ps * ps)));\n var t = yi + (((( yi * p4 + p3) * yi + p2) * yi + p1) * yi + p0)\n / (((( yi * q4 + q3) * yi + q2) * yi + q1) * yi + q0);\n if (v < vmax) t += (t * t * t + t) / v / 4.0;\n var q = c1 - c2 * t;\n if (v < vmax) q += -c3 / v + c4 * t / v;\n return t * (q * Math.log(c - 1.0) + c5);\n}\n\njStat.extend(jStat.tukey, {\n cdf: function cdf(q, nmeans, df) {\n // Identical implementation as the R ptukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var nlegq = 16;\n var ihalfq = 8;\n\n var eps1 = -30.0;\n var eps2 = 1.0e-14;\n var dhaf = 100.0;\n var dquar = 800.0;\n var deigh = 5000.0;\n var dlarg = 25000.0;\n var ulen1 = 1.0;\n var ulen2 = 0.5;\n var ulen3 = 0.25;\n var ulen4 = 0.125;\n var xlegq = [\n 0.989400934991649932596154173450,\n 0.944575023073232576077988415535,\n 0.865631202387831743880467897712,\n 0.755404408355003033895101194847,\n 0.617876244402643748446671764049,\n 0.458016777657227386342419442984,\n 0.281603550779258913230460501460,\n 0.950125098376374401853193354250e-1\n ];\n var alegq = [\n 0.271524594117540948517805724560e-1,\n 0.622535239386478928628438369944e-1,\n 0.951585116824927848099251076022e-1,\n 0.124628971255533872052476282192,\n 0.149595988816576732081501730547,\n 0.169156519395002538189312079030,\n 0.182603415044923588866763667969,\n 0.189450610455068496285396723208\n ];\n\n if (q <= 0)\n return 0;\n\n // df must be > 1\n // there must be at least two values\n\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (!Number.isFinite(q))\n return 1;\n\n if (df > dlarg)\n return tukeyWprob(q, rr, cc);\n\n // calculate leading constant\n\n var f2 = df * 0.5;\n var f2lf = ((f2 * Math.log(df)) - (df * Math.log(2))) - jStat.gammaln(f2);\n var f21 = f2 - 1.0;\n\n // integral is divided into unit, half-unit, quarter-unit, or\n // eighth-unit length intervals depending on the value of the\n // degrees of freedom.\n\n var ff4 = df * 0.25;\n var ulen;\n if (df <= dhaf) ulen = ulen1;\n else if (df <= dquar) ulen = ulen2;\n else if (df <= deigh) ulen = ulen3;\n else ulen = ulen4;\n\n f2lf += Math.log(ulen);\n\n // integrate over each subinterval\n\n var ans = 0.0;\n\n for (var i = 1; i <= 50; i++) {\n var otsum = 0.0;\n\n // legendre quadrature with order = nlegq\n // nodes (stored in xlegq) are symmetric around zero.\n\n var twa1 = (2 * i - 1) * ulen;\n\n for (var jj = 1; jj <= nlegq; jj++) {\n var j, t1;\n if (ihalfq < jj) {\n j = jj - ihalfq - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 + (xlegq[j] * ulen))))\n - (((xlegq[j] * ulen) + twa1) * ff4);\n } else {\n j = jj - 1;\n t1 = (f2lf + (f21 * Math.log(twa1 - (xlegq[j] * ulen))))\n + (((xlegq[j] * ulen) - twa1) * ff4);\n }\n\n // if exp(t1) < 9e-14, then doesn't contribute to integral\n var qsqz;\n if (t1 >= eps1) {\n if (ihalfq < jj) {\n qsqz = q * Math.sqrt(((xlegq[j] * ulen) + twa1) * 0.5);\n } else {\n qsqz = q * Math.sqrt(((-(xlegq[j] * ulen)) + twa1) * 0.5);\n }\n\n // call wprob to find integral of range portion\n\n var wprb = tukeyWprob(qsqz, rr, cc);\n var rotsum = (wprb * alegq[j]) * Math.exp(t1);\n otsum += rotsum;\n }\n // end legendre integral for interval i\n // L200:\n }\n\n // if integral for interval i < 1e-14, then stop.\n // However, in order to avoid small area under left tail,\n // at least 1 / ulen intervals are calculated.\n if (i * ulen >= 1.0 && otsum <= eps2)\n break;\n\n // end of interval i\n // L330:\n\n ans += otsum;\n }\n\n if (otsum > eps2) { // not converged\n throw new Error('tukey.cdf failed to converge');\n }\n if (ans > 1)\n ans = 1;\n return ans;\n },\n\n inv: function(p, nmeans, df) {\n // Identical implementation as the R qtukey() function as of commit 68947\n var rr = 1;\n var cc = nmeans;\n\n var eps = 0.0001;\n var maxiter = 50;\n\n // df must be > 1 ; there must be at least two values\n if (df < 2 || rr < 1 || cc < 2) return NaN;\n\n if (p < 0 || p > 1) return NaN;\n if (p === 0) return 0;\n if (p === 1) return Infinity;\n\n // Initial value\n\n var x0 = tukeyQinv(p, cc, df);\n\n // Find prob(value < x0)\n\n var valx0 = jStat.tukey.cdf(x0, nmeans, df) - p;\n\n // Find the second iterate and prob(value < x1).\n // If the first iterate has probability value\n // exceeding p then second iterate is 1 less than\n // first iterate; otherwise it is 1 greater.\n\n var x1;\n if (valx0 > 0.0)\n x1 = Math.max(0.0, x0 - 1.0);\n else\n x1 = x0 + 1.0;\n var valx1 = jStat.tukey.cdf(x1, nmeans, df) - p;\n\n // Find new iterate\n\n var ans;\n for(var iter = 1; iter < maxiter; iter++) {\n ans = x1 - ((valx1 * (x1 - x0)) / (valx1 - valx0));\n valx0 = valx1;\n\n // New iterate must be >= 0\n\n x0 = x1;\n if (ans < 0.0) {\n ans = 0.0;\n valx1 = -p;\n }\n // Find prob(value < new iterate)\n\n valx1 = jStat.tukey.cdf(ans, nmeans, df) - p;\n x1 = ans;\n\n // If the difference between two successive\n // iterates is less than eps, stop\n\n var xabs = Math.abs(x1 - x0);\n if (xabs < eps)\n return ans;\n }\n\n throw new Error('tukey.inv failed to converge');\n }\n});\n\n}(jStat, Math));\n/* Provides functions for the solution of linear system of equations, integration, extrapolation,\n * interpolation, eigenvalue problems, differential equations and PCA analysis. */\n\n(function(jStat, Math) {\n\nvar push = Array.prototype.push;\nvar isArray = jStat.utils.isArray;\n\nfunction isUsable(arg) {\n return isArray(arg) || arg instanceof jStat;\n}\n\njStat.extend({\n\n // add a vector/matrix to a vector/matrix or scalar\n add: function add(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value + arg[row][col];\n });\n }\n return jStat.map(arr, function(value) { return value + arg; });\n },\n\n // subtract a vector or scalar from the vector\n subtract: function subtract(arr, arg) {\n // check if arg is a vector or scalar\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.map(arr, function(value, row, col) {\n return value - arg[row][col] || 0;\n });\n }\n return jStat.map(arr, function(value) { return value - arg; });\n },\n\n // matrix division\n divide: function divide(arr, arg) {\n if (isUsable(arg)) {\n if (!isUsable(arg[0])) arg = [ arg ];\n return jStat.multiply(arr, jStat.inv(arg));\n }\n return jStat.map(arr, function(value) { return value / arg; });\n },\n\n // matrix multiplication\n multiply: function multiply(arr, arg) {\n var row, col, nrescols, sum, nrow, ncol, res, rescols;\n // eg: arr = 2 arg = 3 -> 6 for res[0][0] statement closure\n if (arr.length === undefined && arg.length === undefined) {\n return arr * arg;\n }\n nrow = arr.length,\n ncol = arr[0].length,\n res = jStat.zeros(nrow, nrescols = (isUsable(arg)) ? arg[0].length : ncol),\n rescols = 0;\n if (isUsable(arg)) {\n for (; rescols < nrescols; rescols++) {\n for (row = 0; row < nrow; row++) {\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += arr[row][col] * arg[col][rescols];\n res[row][rescols] = sum;\n }\n }\n return (nrow === 1 && rescols === 1) ? res[0][0] : res;\n }\n return jStat.map(arr, function(value) { return value * arg; });\n },\n\n // outer([1,2,3],[4,5,6])\n // ===\n // [[1],[2],[3]] times [[4,5,6]]\n // ->\n // [[4,5,6],[8,10,12],[12,15,18]]\n outer:function outer(A, B) {\n return jStat.multiply(A.map(function(t){ return [t] }), [B]);\n },\n\n\n // Returns the dot product of two matricies\n dot: function dot(arr, arg) {\n if (!isUsable(arr[0])) arr = [ arr ];\n if (!isUsable(arg[0])) arg = [ arg ];\n // convert column to row vector\n var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,\n right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,\n res = [],\n row = 0,\n nrow = left.length,\n ncol = left[0].length,\n sum, col;\n for (; row < nrow; row++) {\n res[row] = [];\n sum = 0;\n for (col = 0; col < ncol; col++)\n sum += left[row][col] * right[row][col];\n res[row] = sum;\n }\n return (res.length === 1) ? res[0] : res;\n },\n\n // raise every element by a scalar\n pow: function pow(arr, arg) {\n return jStat.map(arr, function(value) { return Math.pow(value, arg); });\n },\n\n // exponentiate every element\n exp: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.exp(value); });\n },\n\n // generate the natural log of every element\n log: function exp(arr) {\n return jStat.map(arr, function(value) { return Math.log(value); });\n },\n\n // generate the absolute values of the vector\n abs: function abs(arr) {\n return jStat.map(arr, function(value) { return Math.abs(value); });\n },\n\n // computes the p-norm of the vector\n // In the case that a matrix is passed, uses the first row as the vector\n norm: function norm(arr, p) {\n var nnorm = 0,\n i = 0;\n // check the p-value of the norm, and set for most common case\n if (isNaN(p)) p = 2;\n // check if multi-dimensional array, and make vector correction\n if (isUsable(arr[0])) arr = arr[0];\n // vector norm\n for (; i < arr.length; i++) {\n nnorm += Math.pow(Math.abs(arr[i]), p);\n }\n return Math.pow(nnorm, 1 / p);\n },\n\n // computes the angle between two vectors in rads\n // In case a matrix is passed, this uses the first row as the vector\n angle: function angle(arr, arg) {\n return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));\n },\n\n // augment one matrix by another\n // Note: this function returns a matrix, not a jStat object\n aug: function aug(a, b) {\n var newarr = [];\n var i;\n for (i = 0; i < a.length; i++) {\n newarr.push(a[i].slice());\n }\n for (i = 0; i < newarr.length; i++) {\n push.apply(newarr[i], b[i]);\n }\n return newarr;\n },\n\n // The inv() function calculates the inverse of a matrix\n // Create the inverse by augmenting the matrix by the identity matrix of the\n // appropriate size, and then use G-J elimination on the augmented matrix.\n inv: function inv(a) {\n var rows = a.length;\n var cols = a[0].length;\n var b = jStat.identity(rows, cols);\n var c = jStat.gauss_jordan(a, b);\n var result = [];\n var i = 0;\n var j;\n\n //We need to copy the inverse portion to a new matrix to rid G-J artifacts\n for (; i < rows; i++) {\n result[i] = [];\n for (j = cols; j < c[0].length; j++)\n result[i][j - cols] = c[i][j];\n }\n return result;\n },\n\n // calculate the determinant of a matrix\n det: function det(a) {\n if (a.length === 2) {\n return a[0][0] * a[1][1] - a[0][1] * a[1][0];\n }\n\n var determinant = 0;\n for (var i = 0; i < a.length; i++) {\n // build a sub matrix without column `i`\n var submatrix = [];\n for (var row = 1; row < a.length; row++) {\n submatrix[row - 1] = [];\n for (var col = 0; col < a.length; col++) {\n if (col < i) {\n submatrix[row - 1][col] = a[row][col];\n } else if (col > i) {\n submatrix[row - 1][col - 1] = a[row][col];\n }\n }\n }\n\n // alternate between + and - between determinants\n var sign = i % 2 ? -1 : 1;\n determinant += det(submatrix) * a[0][i] * sign;\n }\n\n return determinant\n },\n\n gauss_elimination: function gauss_elimination(a, b) {\n var i = 0,\n j = 0,\n n = a.length,\n m = a[0].length,\n factor = 1,\n sum = 0,\n x = [],\n maug, pivot, temp, k;\n a = jStat.aug(a, b);\n maug = a[0].length;\n for(i = 0; i < n; i++) {\n pivot = a[i][i];\n j = i;\n for (k = i + 1; k < m; k++) {\n if (pivot < Math.abs(a[k][i])) {\n pivot = a[k][i];\n j = k;\n }\n }\n if (j != i) {\n for(k = 0; k < maug; k++) {\n temp = a[i][k];\n a[i][k] = a[j][k];\n a[j][k] = temp;\n }\n }\n for (j = i + 1; j < n; j++) {\n factor = a[j][i] / a[i][i];\n for(k = i; k < maug; k++) {\n a[j][k] = a[j][k] - factor * a[i][k];\n }\n }\n }\n for (i = n - 1; i >= 0; i--) {\n sum = 0;\n for (j = i + 1; j<= n - 1; j++) {\n sum = sum + x[j] * a[i][j];\n }\n x[i] =(a[i][maug - 1] - sum) / a[i][i];\n }\n return x;\n },\n\n gauss_jordan: function gauss_jordan(a, b) {\n var m = jStat.aug(a, b);\n var h = m.length;\n var w = m[0].length;\n var c = 0;\n var x, y, y2;\n // find max pivot\n for (y = 0; y < h; y++) {\n var maxrow = y;\n for (y2 = y+1; y2 < h; y2++) {\n if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))\n maxrow = y2;\n }\n var tmp = m[y];\n m[y] = m[maxrow];\n m[maxrow] = tmp\n for (y2 = y+1; y2 < h; y2++) {\n c = m[y2][y] / m[y][y];\n for (x = y; x < w; x++) {\n m[y2][x] -= m[y][x] * c;\n }\n }\n }\n // backsubstitute\n for (y = h-1; y >= 0; y--) {\n c = m[y][y];\n for (y2 = 0; y2 < y; y2++) {\n for (x = w-1; x > y-1; x--) {\n m[y2][x] -= m[y][x] * m[y2][y] / c;\n }\n }\n m[y][y] /= c;\n for (x = h; x < w; x++) {\n m[y][x] /= c;\n }\n }\n return m;\n },\n\n // solve equation\n // Ax=b\n // A is upper triangular matrix\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[1,2,3]\n // triaUpSolve(A,b) // -> [2.666,0.1666,1.666]\n // if you use matrix style\n // A=[[1,2,3],[0,4,5],[0,6,7]]\n // b=[[1],[2],[3]]\n // will return [[2.666],[0.1666],[1.666]]\n triaUpSolve: function triaUpSolve(A, b) {\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n var matrix_mode = false;\n\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n parts = jStat.arange(i + 1, size).map(function(j) {\n return x[j] * A[i][j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n });\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n triaLowSolve: function triaLowSolve(A, b) {\n // like to triaUpSolve but A is lower triangular matrix\n var size = A[0].length;\n var x = jStat.zeros(1, size)[0];\n var parts;\n\n var matrix_mode=false;\n if (b[0].length != undefined) {\n b = b.map(function(i){ return i[0] });\n matrix_mode = true;\n }\n\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(j) {\n return A[i][j] * x[j];\n });\n x[i] = (b[i] - jStat.sum(parts)) / A[i][i];\n })\n\n if (matrix_mode)\n return x.map(function(i){ return [i] });\n return x;\n },\n\n\n // A -> [L,U]\n // A=LU\n // L is lower triangular matrix\n // U is upper triangular matrix\n lu: function lu(A) {\n var size = A.length;\n //var L=jStat.diagonal(jStat.ones(1,size)[0]);\n var L = jStat.identity(size);\n var R = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(t) {\n R[0][t] = A[0][t];\n });\n jStat.arange(1, size).forEach(function(l) {\n jStat.arange(l).forEach(function(i) {\n parts = jStat.arange(i).map(function(jj) {\n return L[l][jj] * R[jj][i];\n });\n L[l][i] = (A[l][i] - jStat.sum(parts)) / R[i][i];\n });\n jStat.arange(l, size).forEach(function(j) {\n parts = jStat.arange(l).map(function(jj) {\n return L[l][jj] * R[jj][j];\n });\n R[l][j] = A[parts.length][j] - jStat.sum(parts);\n });\n });\n return [L, R];\n },\n\n // A -> T\n // A=TT'\n // T is lower triangular matrix\n cholesky: function cholesky(A) {\n var size = A.length;\n var T = jStat.zeros(A.length, A[0].length);\n var parts;\n jStat.arange(size).forEach(function(i) {\n parts = jStat.arange(i).map(function(t) {\n return Math.pow(T[i][t],2);\n });\n T[i][i] = Math.sqrt(A[i][i] - jStat.sum(parts));\n jStat.arange(i + 1, size).forEach(function(j) {\n parts = jStat.arange(i).map(function(t) {\n return T[i][t] * T[j][t];\n });\n T[j][i] = (A[i][j] - jStat.sum(parts)) / T[i][i];\n });\n });\n return T;\n },\n\n\n gauss_jacobi: function gauss_jacobi(a, b, x, r) {\n var i = 0;\n var j = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);\n c = jStat.multiply(jStat.inv(d), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n gauss_seidel: function gauss_seidel(a, b, x, r) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);\n c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i = i + 1;\n }\n return xk;\n },\n\n SOR: function SOR(a, b, x, r, w) {\n var i = 0;\n var n = a.length;\n var l = [];\n var u = [];\n var d = [];\n var j, xv, c, h, xk;\n for (; i < n; i++) {\n l[i] = [];\n u[i] = [];\n d[i] = [];\n for (j = 0; j < n; j++) {\n if (i > j) {\n l[i][j] = a[i][j];\n u[i][j] = d[i][j] = 0;\n } else if (i < j) {\n u[i][j] = a[i][j];\n l[i][j] = d[i][j] = 0;\n } else {\n d[i][j] = a[i][j];\n l[i][j] = u[i][j] = 0;\n }\n }\n }\n h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),\n jStat.subtract(jStat.multiply(d, 1 - w),\n jStat.multiply(u, w)));\n c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,\n jStat.multiply(l, w))), b), w);\n xv = x;\n xk = jStat.add(jStat.multiply(h, x), c);\n i = 2;\n while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {\n xv = xk;\n xk = jStat.add(jStat.multiply(h, xv), c);\n i++;\n }\n return xk;\n },\n\n householder: function householder(a) {\n var m = a.length;\n var n = a[0].length;\n var i = 0;\n var w = [];\n var p = [];\n var alpha, r, k, j, factor;\n for (; i < m - 1; i++) {\n alpha = 0;\n for (j = i + 1; j < n; j++)\n alpha += (a[j][i] * a[j][i]);\n factor = (a[i + 1][i] > 0) ? -1 : 1;\n alpha = factor * Math.sqrt(alpha);\n r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));\n w = jStat.zeros(m, 1);\n w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);\n for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);\n p = jStat.subtract(jStat.identity(m, n),\n jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));\n a = jStat.multiply(p, jStat.multiply(a, p));\n }\n return a;\n },\n\n // A -> [Q,R]\n // Q is orthogonal matrix\n // R is upper triangular\n QR: (function() {\n // x -> Q\n // find a orthogonal matrix Q st.\n // Qx=y\n // y is [||x||,0,0,...]\n\n // quick ref\n var sum = jStat.sum;\n var range = jStat.arange;\n\n function qr2(x) {\n // quick impletation\n // https://www.stat.wisc.edu/~larget/math496/qr.html\n\n var n = x.length;\n var p = x[0].length;\n\n var r = jStat.zeros(p, p);\n x = jStat.copy(x);\n\n var i,j,k;\n for(j = 0; j < p; j++){\n r[j][j] = Math.sqrt(sum(range(n).map(function(i){\n return x[i][j] * x[i][j];\n })));\n for(i = 0; i < n; i++){\n x[i][j] = x[i][j] / r[j][j];\n }\n for(k = j+1; k < p; k++){\n r[j][k] = sum(range(n).map(function(i){\n return x[i][j] * x[i][k];\n }));\n for(i = 0; i < n; i++){\n x[i][k] = x[i][k] - x[i][j]*r[j][k];\n }\n }\n }\n return [x, r];\n }\n\n return qr2;\n }()),\n\n lstsq: (function() {\n // solve least squard problem for Ax=b as QR decomposition way if b is\n // [[b1],[b2],[b3]] form will return [[x1],[x2],[x3]] array form solution\n // else b is [b1,b2,b3] form will return [x1,x2,x3] array form solution\n function R_I(A) {\n A = jStat.copy(A);\n var size = A.length;\n var I = jStat.identity(size);\n jStat.arange(size - 1, -1, -1).forEach(function(i) {\n jStat.sliceAssign(\n I, { row: i }, jStat.divide(jStat.slice(I, { row: i }), A[i][i]));\n jStat.sliceAssign(\n A, { row: i }, jStat.divide(jStat.slice(A, { row: i }), A[i][i]));\n jStat.arange(i).forEach(function(j) {\n var c = jStat.multiply(A[j][i], -1);\n var Aj = jStat.slice(A, { row: j });\n var cAi = jStat.multiply(jStat.slice(A, { row: i }), c);\n jStat.sliceAssign(A, { row: j }, jStat.add(Aj, cAi));\n var Ij = jStat.slice(I, { row: j });\n var cIi = jStat.multiply(jStat.slice(I, { row: i }), c);\n jStat.sliceAssign(I, { row: j }, jStat.add(Ij, cIi));\n })\n });\n return I;\n }\n\n function qr_solve(A, b){\n var array_mode = false;\n if (b[0].length === undefined) {\n // [c1,c2,c3] mode\n b = b.map(function(x){ return [x] });\n array_mode = true;\n }\n var QR = jStat.QR(A);\n var Q = QR[0];\n var R = QR[1];\n var attrs = A[0].length;\n var Q1 = jStat.slice(Q,{col:{end:attrs}});\n var R1 = jStat.slice(R,{row:{end:attrs}});\n var RI = R_I(R1);\n var Q2 = jStat.transpose(Q1);\n\n if(Q2[0].length === undefined){\n Q2 = [Q2]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n var x = jStat.multiply(jStat.multiply(RI, Q2), b);\n\n if(x.length === undefined){\n x = [[x]]; // The confusing jStat.multifly implementation threat nature process again.\n }\n\n\n if (array_mode)\n return x.map(function(i){ return i[0] });\n return x;\n }\n\n return qr_solve;\n }()),\n\n jacobi: function jacobi(a) {\n var condition = 1;\n var n = a.length;\n var e = jStat.identity(n, n);\n var ev = [];\n var b, i, j, p, q, maxim, theta, s;\n // condition === 1 only if tolerance is not reached\n while (condition === 1) {\n maxim = a[0][1];\n p = 0;\n q = 1;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i != j) {\n if (maxim < Math.abs(a[i][j])) {\n maxim = Math.abs(a[i][j]);\n p = i;\n q = j;\n }\n }\n }\n }\n if (a[p][p] === a[q][q])\n theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;\n else\n theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;\n s = jStat.identity(n, n);\n s[p][p] = Math.cos(theta);\n s[p][q] = -Math.sin(theta);\n s[q][p] = Math.sin(theta);\n s[q][q] = Math.cos(theta);\n // eigen vector matrix\n e = jStat.multiply(e, s);\n b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);\n a = b;\n condition = 0;\n for (i = 1; i < n; i++) {\n for (j = 1; j < n; j++) {\n if (i != j && Math.abs(a[i][j]) > 0.001) {\n condition = 1;\n }\n }\n }\n }\n for (i = 0; i < n; i++) ev.push(a[i][i]);\n //returns both the eigenvalue and eigenmatrix\n return [e, ev];\n },\n\n rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {\n var k1, k2, u_j1, k3, k4;\n if (order === 2) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h, u_j + k1);\n u_j1 = u_j + (k1 + k2) / 2;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n if (order === 4) {\n while (t_j <= p) {\n k1 = h * f(t_j, u_j);\n k2 = h * f(t_j + h / 2, u_j + k1 / 2);\n k3 = h * f(t_j + h / 2, u_j + k2 / 2);\n k4 = h * f(t_j +h, u_j + k3);\n u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;\n u_j = u_j1;\n t_j = t_j + h;\n }\n }\n return u_j;\n },\n\n romberg: function romberg(f, a, b, order) {\n var i = 0;\n var h = (b - a) / 2;\n var x = [];\n var h1 = [];\n var g = [];\n var m, a1, j, k, I;\n while (i < order / 2) {\n I = f(a);\n for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;\n m = x.length;\n for (j = 1; j < m - 1; j++) {\n I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);\n }\n I = (h / 3) * (I + f(b));\n g[i] = I;\n h /= 2;\n i++;\n }\n a1 = g.length;\n m = 1;\n while (a1 !== 1) {\n for (j = 0; j < a1 - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a1 = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n richardson: function richardson(X, f, x, h) {\n function pos(X, x) {\n var i = 0;\n var n = X.length;\n var p;\n for (; i < n; i++)\n if (X[i] === x) p = i;\n return p;\n }\n var h_min = Math.abs(x - X[pos(X, x) + 1]);\n var i = 0;\n var g = [];\n var h1 = [];\n var y1, y2, m, a, j;\n while (h >= h_min) {\n y1 = pos(X, x + h);\n y2 = pos(X, x);\n g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);\n h /= 2;\n i++;\n }\n a = g.length;\n m = 1;\n while (a != 1) {\n for (j = 0; j < a - 1; j++)\n h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);\n a = h1.length;\n g = h1;\n h1 = [];\n m++;\n }\n return g;\n },\n\n simpson: function simpson(f, a, b, n) {\n var h = (b - a) / n;\n var I = f(a);\n var x = [];\n var j = a;\n var k = 0;\n var i = 1;\n var m;\n for (; j <= b; j = j + h, k++)\n x[k] = j;\n m = x.length;\n for (; i < m - 1; i++) {\n I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);\n }\n return (h / 3) * (I + f(b));\n },\n\n hermite: function hermite(X, F, dF, value) {\n var n = X.length;\n var p = 0;\n var i = 0;\n var l = [];\n var dl = [];\n var A = [];\n var B = [];\n var j;\n for (; i < n; i++) {\n l[i] = 1;\n for (j = 0; j < n; j++) {\n if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);\n }\n dl[i] = 0;\n for (j = 0; j < n; j++) {\n if (i != j) dl[i] += 1 / (X [i] - X[j]);\n }\n A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);\n B[i] = (value - X[i]) * (l[i] * l[i]);\n p += (A[i] * F[i] + B[i] * dF[i]);\n }\n return p;\n },\n\n lagrange: function lagrange(X, F, value) {\n var p = 0;\n var i = 0;\n var j, l;\n var n = X.length;\n for (; i < n; i++) {\n l = F[i];\n for (j = 0; j < n; j++) {\n // calculating the lagrange polynomial L_i\n if (i != j) l *= (value - X[j]) / (X[i] - X[j]);\n }\n // adding the lagrange polynomials found above\n p += l;\n }\n return p;\n },\n\n cubic_spline: function cubic_spline(X, F, value) {\n var n = X.length;\n var i = 0, j;\n var A = [];\n var B = [];\n var alpha = [];\n var c = [];\n var h = [];\n var b = [];\n var d = [];\n for (; i < n - 1; i++)\n h[i] = X[i + 1] - X[i];\n alpha[0] = 0;\n for (i = 1; i < n - 1; i++) {\n alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -\n (3 / h[i-1]) * (F[i] - F[i-1]);\n }\n for (i = 1; i < n - 1; i++) {\n A[i] = [];\n B[i] = [];\n A[i][i-1] = h[i-1];\n A[i][i] = 2 * (h[i - 1] + h[i]);\n A[i][i+1] = h[i];\n B[i][0] = alpha[i];\n }\n c = jStat.multiply(jStat.inv(A), B);\n for (j = 0; j < n - 1; j++) {\n b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;\n d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);\n }\n for (j = 0; j < n; j++) {\n if (X[j] > value) break;\n }\n j -= 1;\n return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *\n c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];\n },\n\n gauss_quadrature: function gauss_quadrature() {\n throw new Error('gauss_quadrature not yet implemented');\n },\n\n PCA: function PCA(X) {\n var m = X.length;\n var n = X[0].length;\n var i = 0;\n var j, temp1;\n var u = [];\n var D = [];\n var result = [];\n var temp2 = [];\n var Y = [];\n var Bt = [];\n var B = [];\n var C = [];\n var V = [];\n var Vt = [];\n for (i = 0; i < m; i++) {\n u[i] = jStat.sum(X[i]) / n;\n }\n for (i = 0; i < n; i++) {\n B[i] = [];\n for(j = 0; j < m; j++) {\n B[i][j] = X[j][i] - u[j];\n }\n }\n B = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n C[i] = [];\n for (j = 0; j < m; j++) {\n C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);\n }\n }\n result = jStat.jacobi(C);\n V = result[0];\n D = result[1];\n Vt = jStat.transpose(V);\n for (i = 0; i < D.length; i++) {\n for (j = i; j < D.length; j++) {\n if(D[i] < D[j]) {\n temp1 = D[i];\n D[i] = D[j];\n D[j] = temp1;\n temp2 = Vt[i];\n Vt[i] = Vt[j];\n Vt[j] = temp2;\n }\n }\n }\n Bt = jStat.transpose(B);\n for (i = 0; i < m; i++) {\n Y[i] = [];\n for (j = 0; j < Bt.length; j++) {\n Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);\n }\n }\n return [X, D, Vt, Y];\n }\n});\n\n// extend jStat.fn with methods that require one argument\n(function(funcs) {\n for (var i = 0; i < funcs.length; i++) (function(passfunc) {\n jStat.fn[passfunc] = function(arg, func) {\n var tmpthis = this;\n // check for callback\n if (func) {\n setTimeout(function() {\n func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));\n }, 15);\n return this;\n }\n if (typeof jStat[passfunc](this, arg) === 'number')\n return jStat[passfunc](this, arg);\n else\n return jStat(jStat[passfunc](this, arg));\n };\n }(funcs[i]));\n}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));\n\n}(jStat, Math));\n(function(jStat, Math) {\n\nvar slice = [].slice;\nvar isNumber = jStat.utils.isNumber;\nvar isArray = jStat.utils.isArray;\n\n// flag==true denotes use of sample standard deviation\n// Z Statistics\njStat.extend({\n // 2 different parameter lists:\n // (value, mean, sd)\n // (value, array, flag)\n zscore: function zscore() {\n var args = slice.call(arguments);\n if (isNumber(args[1])) {\n return (args[0] - args[1]) / args[2];\n }\n return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, sides)\n // (zscore, sides)\n // (value, array, sides, flag)\n ztest: function ztest() {\n var args = slice.call(arguments);\n var z;\n if (isArray(args[1])) {\n // (value, array, sides, flag)\n z = jStat.zscore(args[0],args[1],args[3]);\n return (args[2] === 1) ?\n (jStat.normal.cdf(-Math.abs(z), 0, 1)) :\n (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);\n } else {\n if (args.length > 2) {\n // (value, mean, sd, sides)\n z = jStat.zscore(args[0],args[1],args[2]);\n return (args[3] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)* 2);\n } else {\n // (zscore, sides)\n z = args[0];\n return (args[1] === 1) ?\n (jStat.normal.cdf(-Math.abs(z),0,1)) :\n (jStat.normal.cdf(-Math.abs(z),0,1)*2);\n }\n }\n }\n});\n\njStat.extend(jStat.fn, {\n zscore: function zscore(value, flag) {\n return (value - this.mean()) / this.stdev(flag);\n },\n\n ztest: function ztest(value, sides, flag) {\n var zscore = Math.abs(this.zscore(value, flag));\n return (sides === 1) ?\n (jStat.normal.cdf(-zscore, 0, 1)) :\n (jStat.normal.cdf(-zscore, 0, 1) * 2);\n }\n});\n\n// T Statistics\njStat.extend({\n // 2 parameter lists\n // (value, mean, sd, n)\n // (value, array)\n tscore: function tscore() {\n var args = slice.call(arguments);\n return (args.length === 4) ?\n ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :\n ((args[0] - jStat.mean(args[1])) /\n (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));\n },\n\n // 3 different paramter lists:\n // (value, mean, sd, n, sides)\n // (tscore, n, sides)\n // (value, array, sides)\n ttest: function ttest() {\n var args = slice.call(arguments);\n var tscore;\n if (args.length === 5) {\n tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));\n return (args[4] === 1) ?\n (jStat.studentt.cdf(-tscore, args[3]-1)) :\n (jStat.studentt.cdf(-tscore, args[3]-1)*2);\n }\n if (isNumber(args[1])) {\n tscore = Math.abs(args[0])\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1]-1)) :\n (jStat.studentt.cdf(-tscore, args[1]-1) * 2);\n }\n tscore = Math.abs(jStat.tscore(args[0], args[1]))\n return (args[2] == 1) ?\n (jStat.studentt.cdf(-tscore, args[1].length-1)) :\n (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);\n }\n});\n\njStat.extend(jStat.fn, {\n tscore: function tscore(value) {\n return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));\n },\n\n ttest: function ttest(value, sides) {\n return (sides === 1) ?\n (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :\n (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);\n }\n});\n\n// F Statistics\njStat.extend({\n // Paramter list is as follows:\n // (array1, array2, array3, ...)\n // or it is an array of arrays\n // array of arrays conversion\n anovafscore: function anovafscore() {\n var args = slice.call(arguments),\n expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;\n if (args.length === 1) {\n tmpargs = new Array(args[0].length);\n for (i = 0; i < args[0].length; i++) {\n tmpargs[i] = args[0][i];\n }\n args = tmpargs;\n }\n // Builds sample array\n sample = new Array();\n for (i = 0; i < args.length; i++) {\n sample = sample.concat(args[i]);\n }\n sampMean = jStat.mean(sample);\n // Computes the explained variance\n expVar = 0;\n for (i = 0; i < args.length; i++) {\n expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);\n }\n expVar /= (args.length - 1);\n // Computes unexplained variance\n unexpVar = 0;\n for (i = 0; i < args.length; i++) {\n sampSampMean = jStat.mean(args[i]);\n for (j = 0; j < args[i].length; j++) {\n unexpVar += Math.pow(args[i][j] - sampSampMean, 2);\n }\n }\n unexpVar /= (sample.length - args.length);\n return expVar / unexpVar;\n },\n\n // 2 different paramter setups\n // (array1, array2, array3, ...)\n // (anovafscore, df1, df2)\n anovaftest: function anovaftest() {\n var args = slice.call(arguments),\n df1, df2, n, i;\n if (isNumber(args[0])) {\n return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);\n }\n var anovafscore = jStat.anovafscore(args);\n df1 = args.length - 1;\n n = 0;\n for (i = 0; i < args.length; i++) {\n n = n + args[i].length;\n }\n df2 = n - df1 - 1;\n return 1 - jStat.centralF.cdf(anovafscore, df1, df2);\n },\n\n ftest: function ftest(fscore, df1, df2) {\n return 1 - jStat.centralF.cdf(fscore, df1, df2);\n }\n});\n\njStat.extend(jStat.fn, {\n anovafscore: function anovafscore() {\n return jStat.anovafscore(this.toArray());\n },\n\n anovaftes: function anovaftes() {\n var n = 0;\n var i;\n for (i = 0; i < this.length; i++) {\n n = n + this[i].length;\n }\n return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);\n }\n});\n\n// Tukey's range test\njStat.extend({\n // 2 parameter lists\n // (mean1, mean2, n1, n2, sd)\n // (array1, array2, sd)\n qscore: function qscore() {\n var args = slice.call(arguments);\n var mean1, mean2, n1, n2, sd;\n if (isNumber(args[0])) {\n mean1 = args[0];\n mean2 = args[1];\n n1 = args[2];\n n2 = args[3];\n sd = args[4];\n } else {\n mean1 = jStat.mean(args[0]);\n mean2 = jStat.mean(args[1]);\n n1 = args[0].length;\n n2 = args[1].length;\n sd = args[2];\n }\n return Math.abs(mean1 - mean2) / (sd * Math.sqrt((1 / n1 + 1 / n2) / 2));\n },\n\n // 3 different parameter lists:\n // (qscore, n, k)\n // (mean1, mean2, n1, n2, sd, n, k)\n // (array1, array2, sd, n, k)\n qtest: function qtest() {\n var args = slice.call(arguments);\n\n var qscore;\n if (args.length === 3) {\n qscore = args[0];\n args = args.slice(1);\n } else if (args.length === 7) {\n qscore = jStat.qscore(args[0], args[1], args[2], args[3], args[4]);\n args = args.slice(5);\n } else {\n qscore = jStat.qscore(args[0], args[1], args[2]);\n args = args.slice(3);\n }\n\n var n = args[0];\n var k = args[1];\n\n return 1 - jStat.tukey.cdf(qscore, k, n - k);\n },\n\n tukeyhsd: function tukeyhsd(arrays) {\n var sd = jStat.pooledstdev(arrays);\n var means = arrays.map(function (arr) {return jStat.mean(arr);});\n var n = arrays.reduce(function (n, arr) {return n + arr.length;}, 0);\n\n var results = [];\n for (var i = 0; i < arrays.length; ++i) {\n for (var j = i + 1; j < arrays.length; ++j) {\n var p = jStat.qtest(means[i], means[j], arrays[i].length, arrays[j].length, sd, n, arrays.length);\n results.push([[i, j], p]);\n }\n }\n\n return results;\n }\n});\n\n// Error Bounds\njStat.extend({\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n normalci: function normalci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *\n jStat.stdev(args[2]) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n // 2 different parameter setups\n // (value, alpha, sd, n)\n // (value, alpha, array)\n tci: function tci() {\n var args = slice.call(arguments),\n ans = new Array(2),\n change;\n if (args.length === 4) {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *\n args[2] / Math.sqrt(args[3]));\n } else {\n change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *\n jStat.stdev(args[2], true) / Math.sqrt(args[2].length));\n }\n ans[0] = args[0] - change;\n ans[1] = args[0] + change;\n return ans;\n },\n\n significant: function significant(pvalue, alpha) {\n return pvalue < alpha;\n }\n});\n\njStat.extend(jStat.fn, {\n normalci: function normalci(value, alpha) {\n return jStat.normalci(value, alpha, this.toArray());\n },\n\n tci: function tci(value, alpha) {\n return jStat.tci(value, alpha, this.toArray());\n }\n});\n\n// internal method for calculating the z-score for a difference of proportions test\nfunction differenceOfProportions(p1, n1, p2, n2) {\n if (p1 > 1 || p2 > 1 || p1 <= 0 || p2 <= 0) {\n throw new Error(\"Proportions should be greater than 0 and less than 1\")\n }\n var pooled = (p1 * n1 + p2 * n2) / (n1 + n2);\n var se = Math.sqrt(pooled * (1 - pooled) * ((1/n1) + (1/n2)));\n return (p1 - p2) / se;\n}\n\n// Difference of Proportions\njStat.extend(jStat.fn, {\n oneSidedDifferenceOfProportions: function oneSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 1);\n },\n\n twoSidedDifferenceOfProportions: function twoSidedDifferenceOfProportions(p1, n1, p2, n2) {\n var z = differenceOfProportions(p1, n1, p2, n2);\n return jStat.ztest(z, 2);\n }\n});\n\n}(jStat, Math));\njStat.models = (function(){\n function sub_regress(exog) {\n var var_count = exog[0].length;\n var modelList = jStat.arange(var_count).map(function(endog_index) {\n var exog_index =\n jStat.arange(var_count).filter(function(i){return i!==endog_index});\n return ols(jStat.col(exog, endog_index).map(function(x){ return x[0] }),\n jStat.col(exog, exog_index))\n });\n return modelList;\n }\n\n // do OLS model regress\n // exog have include const columns ,it will not generate it .In fact, exog is\n // \"design matrix\" look at\n //https://en.wikipedia.org/wiki/Design_matrix\n function ols(endog, exog) {\n var nobs = endog.length;\n var df_model = exog[0].length - 1;\n var df_resid = nobs-df_model - 1;\n var coef = jStat.lstsq(exog, endog);\n var predict =\n jStat.multiply(exog, coef.map(function(x) { return [x] }))\n .map(function(p) { return p[0] });\n var resid = jStat.subtract(endog, predict);\n var ybar = jStat.mean(endog);\n // constant cause problem\n // var SST = jStat.sum(endog.map(function(y) {\n // return Math.pow(y-ybar,2);\n // }));\n var SSE = jStat.sum(predict.map(function(f) {\n return Math.pow(f - ybar, 2);\n }));\n var SSR = jStat.sum(endog.map(function(y, i) {\n return Math.pow(y - predict[i], 2);\n }));\n var SST = SSE + SSR;\n var R2 = (SSE / SST);\n return {\n exog:exog,\n endog:endog,\n nobs:nobs,\n df_model:df_model,\n df_resid:df_resid,\n coef:coef,\n predict:predict,\n resid:resid,\n ybar:ybar,\n SST:SST,\n SSE:SSE,\n SSR:SSR,\n R2:R2\n };\n }\n\n // H0: b_I=0\n // H1: b_I!=0\n function t_test(model) {\n var subModelList = sub_regress(model.exog);\n //var sigmaHat=jStat.stdev(model.resid);\n var sigmaHat = Math.sqrt(model.SSR / (model.df_resid));\n var seBetaHat = subModelList.map(function(mod) {\n var SST = mod.SST;\n var R2 = mod.R2;\n return sigmaHat / Math.sqrt(SST * (1 - R2));\n });\n var tStatistic = model.coef.map(function(coef, i) {\n return (coef - 0) / seBetaHat[i];\n });\n var pValue = tStatistic.map(function(t) {\n var leftppf = jStat.studentt.cdf(t, model.df_resid);\n return (leftppf > 0.5 ? 1 - leftppf : leftppf) * 2;\n });\n var c = jStat.studentt.inv(0.975, model.df_resid);\n var interval95 = model.coef.map(function(coef, i) {\n var d = c * seBetaHat[i];\n return [coef - d, coef + d];\n })\n return {\n se: seBetaHat,\n t: tStatistic,\n p: pValue,\n sigmaHat: sigmaHat,\n interval95: interval95\n };\n }\n\n function F_test(model) {\n var F_statistic =\n (model.R2 / model.df_model) / ((1 - model.R2) / model.df_resid);\n var fcdf = function(x, n1, n2) {\n return jStat.beta.cdf(x / (n2 / n1 + x), n1 / 2, n2 / 2)\n }\n var pvalue = 1 - fcdf(F_statistic, model.df_model, model.df_resid);\n return { F_statistic: F_statistic, pvalue: pvalue };\n }\n\n function ols_wrap(endog, exog) {\n var model = ols(endog,exog);\n var ttest = t_test(model);\n var ftest = F_test(model);\n // Provide the Wherry / Ezekiel / McNemar / Cohen Adjusted R^2\n // Which matches the 'adjusted R^2' provided by R's lm package\n var adjust_R2 =\n 1 - (1 - model.R2) * ((model.nobs - 1) / (model.df_resid));\n model.t = ttest;\n model.f = ftest;\n model.adjust_R2 = adjust_R2;\n return model;\n }\n\n return { ols: ols_wrap };\n})();\n//To regress, simply build X matrix\n//(append column of 1's) using\n//buildxmatrix and build the Y\n//matrix using buildymatrix\n//(simply the transpose)\n//and run regress.\n\n\n\n//Regressions\n\njStat.extend({\n buildxmatrix: function buildxmatrix(){\n //Parameters will be passed in as such\n //(array1,array2,array3,...)\n //as (x1,x2,x3,...)\n //needs to be (1,x1,x2,x3,...)\n var matrixRows = new Array(arguments.length);\n for(var i=0;i<arguments.length;i++){\n var array = [1];\n matrixRows[i]= array.concat(arguments[i]);\n }\n return jStat(matrixRows);\n\n },\n\n builddxmatrix: function builddxmatrix() {\n //Paramters will be passed in as such\n //([array1,array2,...]\n var matrixRows = new Array(arguments[0].length);\n for(var i=0;i<arguments[0].length;i++){\n var array = [1]\n matrixRows[i]= array.concat(arguments[0][i]);\n }\n return jStat(matrixRows);\n\n },\n\n buildjxmatrix: function buildjxmatrix(jMat) {\n //Builds from jStat Matrix\n var pass = new Array(jMat.length)\n for(var i=0;i<jMat.length;i++){\n pass[i] = jMat[i];\n }\n return jStat.builddxmatrix(pass);\n\n },\n\n buildymatrix: function buildymatrix(array){\n return jStat(array).transpose();\n },\n\n buildjymatrix: function buildjymatrix(jMat){\n return jMat.transpose();\n },\n\n matrixmult: function matrixmult(A,B){\n var i, j, k, result, sum;\n if (A.cols() == B.rows()) {\n if(B.rows()>1){\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[k][j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n result = [];\n for (i = 0; i < A.rows(); i++) {\n result[i] = [];\n for (j = 0; j < B.cols(); j++) {\n sum = 0;\n for (k = 0; k < A.cols(); k++) {\n sum += A.toArray()[i][k] * B.toArray()[j];\n }\n result[i][j] = sum;\n }\n }\n return jStat(result);\n }\n },\n\n //regress and regresst to be fixed\n\n regress: function regress(jMatX,jMatY){\n //print(\"regressin!\");\n //print(jMatX.toArray());\n var innerinv = jStat.xtranspxinv(jMatX);\n //print(innerinv);\n var xtransp = jMatX.transpose();\n var next = jStat.matrixmult(jStat(innerinv),xtransp);\n return jStat.matrixmult(next,jMatY);\n\n },\n\n regresst: function regresst(jMatX,jMatY,sides){\n var beta = jStat.regress(jMatX,jMatY);\n\n var compile = {};\n compile.anova = {};\n var jMatYBar = jStat.jMatYBar(jMatX, beta);\n compile.yBar = jMatYBar;\n var yAverage = jMatY.mean();\n compile.anova.residuals = jStat.residuals(jMatY, jMatYBar);\n\n compile.anova.ssr = jStat.ssr(jMatYBar, yAverage);\n compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1);\n\n compile.anova.sse = jStat.sse(jMatY, jMatYBar);\n compile.anova.mse =\n compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.sst = jStat.sst(jMatY, yAverage);\n compile.anova.mst = compile.anova.sst / (jMatY.length - 1);\n\n compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst);\n if (compile.anova.r2 < 0) compile.anova.r2 = 0;\n\n compile.anova.fratio = compile.anova.msr / compile.anova.mse;\n compile.anova.pvalue =\n jStat.anovaftest(compile.anova.fratio,\n jMatX[0].length - 1,\n jMatY.length - (jMatX[0].length - 1) - 1);\n\n compile.anova.rmse = Math.sqrt(compile.anova.mse);\n\n compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst);\n if (compile.anova.r2adj < 0) compile.anova.r2adj = 0;\n\n compile.stats = new Array(jMatX[0].length);\n var covar = jStat.xtranspxinv(jMatX);\n var sds, ts, ps;\n\n for(var i=0; i<beta.length;i++){\n sds=Math.sqrt(compile.anova.mse * Math.abs(covar[i][i]));\n ts= Math.abs(beta[i] / sds);\n ps= jStat.ttest(ts, jMatY.length - jMatX[0].length - 1, sides);\n\n compile.stats[i]=[beta[i], sds, ts, ps];\n }\n\n compile.regress = beta;\n return compile;\n },\n\n xtranspx: function xtranspx(jMatX){\n return jStat.matrixmult(jMatX.transpose(),jMatX);\n },\n\n\n xtranspxinv: function xtranspxinv(jMatX){\n var inner = jStat.matrixmult(jMatX.transpose(),jMatX);\n var innerinv = jStat.inv(inner);\n return innerinv;\n },\n\n jMatYBar: function jMatYBar(jMatX, beta) {\n var yBar = jStat.matrixmult(jMatX, beta);\n return new jStat(yBar);\n },\n\n residuals: function residuals(jMatY, jMatYBar) {\n return jStat.matrixsubtract(jMatY, jMatYBar);\n },\n\n ssr: function ssr(jMatYBar, yAverage) {\n var ssr = 0;\n for(var i = 0; i < jMatYBar.length; i++) {\n ssr += Math.pow(jMatYBar[i] - yAverage, 2);\n }\n return ssr;\n },\n\n sse: function sse(jMatY, jMatYBar) {\n var sse = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sse += Math.pow(jMatY[i] - jMatYBar[i], 2);\n }\n return sse;\n },\n\n sst: function sst(jMatY, yAverage) {\n var sst = 0;\n for(var i = 0; i < jMatY.length; i++) {\n sst += Math.pow(jMatY[i] - yAverage, 2);\n }\n return sst;\n },\n\n matrixsubtract: function matrixsubtract(A,B){\n var ans = new Array(A.length);\n for(var i=0;i<A.length;i++){\n ans[i] = new Array(A[i].length);\n for(var j=0;j<A[i].length;j++){\n ans[i][j]=A[i][j]-B[i][j];\n }\n }\n return jStat(ans);\n }\n});\n // Make it compatible with previous version.\n jStat.jStat = jStat;\n\n return jStat;\n});\n","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js!./styles.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js!./styles.css\";\n export default content && content.locals ? content.locals : undefined;\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 DG from 'datagrok-api/dg';\nimport { sequenceChemSimilarity } from '../../monomer-works/monomer-utils';\nimport { splitAlignedSequences } from '../splitter';\nimport { SeqHandler } from '../seq-handler';\nexport var SCORE;\n(function (SCORE) {\n SCORE[\"IDENTITY\"] = \"identity\";\n SCORE[\"SIMILARITY\"] = \"similarity\";\n})(SCORE || (SCORE = {}));\n/** Performs transformations and sequence scoring.\n * @param {DG.DataFrame} table Table to attach results to.\n * @param {DG.Column<string>} col Sequences column to score. Must have Macromolecule semantic type.\n * @param {string} ref Reference sequence to score against.\n * @param {SCORE} scoring Scoring method.\n * @returns {DG.Column<number>} Scores column. */\nexport async function calculateScores(table, col, ref, scoring) {\n const splitSeqDf = splitAlignedSequences(col);\n const srcSh = SeqHandler.forColumn(col);\n const refCol = srcSh.getNewColumnFromList('ref', [ref]);\n const refUh = SeqHandler.forColumn(refCol);\n const refSplitted = refUh.getSplitted(0); // ref is at 0\n const scoresCol = scoring === SCORE.IDENTITY ? calculateIdentity(refSplitted, splitSeqDf) :\n scoring === SCORE.SIMILARITY ? await calculateSimilarity(refSplitted, splitSeqDf) : null;\n if (scoresCol === null)\n throw new Error(`In bio library: Unkown sequence scoring method: ${scoring}`);\n scoresCol.name = table.columns.getUnusedName(scoresCol.name);\n table.columns.add(scoresCol);\n return scoresCol;\n}\n/** Calculates identity scores as fraction of matching monomers on the same position.\n * @param {ISeqSplitted} reference Splitted reference sequence.\n * @param {DG.DataFrame} positionsDf Table which only contains position columns with semantic type Monomer.\n * @returns {DG.Column<number>} Scores column. */\nexport function calculateIdentity(reference, positionsDf) {\n const numPositions = positionsDf.columns.length;\n const positionCols = new Array(numPositions);\n const positionEmptyCategories = new Array(numPositions);\n const categoryIndexesTemplate = new Array(numPositions);\n for (let posIdx = 0; posIdx < numPositions; ++posIdx) {\n const posCol = positionsDf.columns.byIndex(posIdx);\n positionCols[posIdx] = posCol.getRawData();\n positionEmptyCategories[posIdx] = posCol.categories.indexOf('');\n categoryIndexesTemplate[posIdx] = posCol.categories.indexOf(reference.getOriginal(posIdx) ?? '');\n }\n const identityScoresCol = DG.Column.float('Identity', positionsDf.rowCount);\n const identityScoresData = identityScoresCol.getRawData();\n for (let rowIndex = 0; rowIndex < positionsDf.rowCount; ++rowIndex) {\n identityScoresData[rowIndex] = 0;\n for (let posIdx = 0; posIdx < reference.length; ++posIdx) {\n const categoryIndex = positionCols[posIdx][rowIndex];\n if (categoryIndex === categoryIndexesTemplate[posIdx])\n ++identityScoresData[rowIndex];\n }\n identityScoresData[rowIndex] /= reference.length;\n }\n return identityScoresCol;\n}\n/** Calculates similarity scores as sum of monomer fingerprint similarities on the same position.\n * @param {ISeqSplitted} reference Splitted reference sequence.\n * @param {DG.DataFrame} positionsDf Table which only contains position columns with semantic type Monomer.\n * @return {DG.Column<number>} Scores column. */\nexport async function calculateSimilarity(reference, positionsDf) {\n const monomerColumns = positionsDf.columns.toList();\n const scoresCol = await sequenceChemSimilarity(monomerColumns, reference);\n return scoresCol;\n}\n//# sourceMappingURL=scoring.js.map","export var DimReductionMethods;\n(function (DimReductionMethods) {\n DimReductionMethods[\"UMAP\"] = \"UMAP\";\n DimReductionMethods[\"T_SNE\"] = \"t-SNE\";\n})(DimReductionMethods || (DimReductionMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxtQkFHWDtBQUhELFdBQVksbUJBQW1CO0lBQzNCLG9DQUFhLENBQUE7SUFDYixzQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpbVJlZHVjdGlvbk1ldGhvZHN7XG4gICAgVU1BUCA9ICdVTUFQJyxcbiAgICBUX1NORSA9ICd0LVNORSdcbn07XG4iXX0=","function euclideanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `;\n}\n;\nfunction manhattanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `;\n}\nexport var WEBGSLAGGREGATION;\n(function (WEBGSLAGGREGATION) {\n WEBGSLAGGREGATION[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n WEBGSLAGGREGATION[\"MANHATTAN\"] = \"MANHATTAN\";\n})(WEBGSLAGGREGATION || (WEBGSLAGGREGATION = {}));\nexport const WEBGSLAGGREGATIONFUNCTIONS = {\n [WEBGSLAGGREGATION.EUCLIDEAN]: euclideanAggregationWgsl,\n [WEBGSLAGGREGATION.MANHATTAN]: manhattanAggregationWgsl\n};\n//# sourceMappingURL=webGPU-aggregation.js.map","/* eslint-disable max-len */\n// in all the functions below, the variables a and b are assumed to be arrays of uint32/f32\n//values which are infered from the code this chunk is injected into\n// also, we have access to computeInfo struct, which contains the following fields:\n// computeInfo.entrySizes: array of arrays of u32 containing the sizes of the entries\n// other fields are specific to the distance function should be injected from the main script that calls this function,\n// and should be available in the supplementaryInfo struct\n// like the similarity matrix for monomer chemical distance.\n// the getProcessInfo function should return correct buffer allocation mechanism for the supplementaryInfo,\n// for every entry list\n// the maxDistance variable is also assumed to be available in the\n// scope of the function, in case of knn it is the distance in the last postion of knn on this index,\n// in case of sparse matrix, it can be just the threshold for the distance.\n// hamming distance for sequnences of uint32 arrays of max length ${maxArraySize}\nexport function webGPUHamming(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${_maxArraySize};\n `;\n}\nexport function webGPUMonomerChemicalDistance(_maxArraySize, entryIndex) {\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${entryIndex}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${_maxArraySize};\n `;\n}\nexport function webGPULevenstein(maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${maxArraySize + 1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `;\n}\nexport function webGPUNeedlemanWunsch(maxArraySize, entryIndex) {\n // version of the levenshtain where the cost of substitution is customizable\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // and gapOpenPenalty, gapExtensionPenalty\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${maxArraySize + 1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${maxArraySize + 1}u>;\n var horizontalGaps: array<u32, ${maxArraySize + 1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${entryIndex};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${entryIndex};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${entryIndex}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `;\n}\nexport function webGPUEuclidean(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `;\n}\nexport function webGPUManhattan(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `;\n}\nexport function webGPUOneHotDistance(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `;\n}\nexport function webGPUNumericDistance(_maxArraySize, entryIndex) {\n // we assume that range${entryIndex} is available in the supplementaryInfo struct\n return `\n let range = suppInfo.range${entryIndex};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `;\n}\n// tanimoto distance for uint32 arrays of length ${maxArraySize}\nexport function webGPUTanimotoBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `;\n}\nexport function webGPUAsymmetricBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `;\n}\nexport function webGPUCosineBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `;\n}\nexport function webGPUSokalBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `;\n}\nexport var WEBGPUDISTANCE;\n(function (WEBGPUDISTANCE) {\n WEBGPUDISTANCE[\"HAMMING\"] = \"Hamming\";\n WEBGPUDISTANCE[\"EUCLIDEAN\"] = \"Euclidean\";\n WEBGPUDISTANCE[\"MANHATTAN\"] = \"Manhattan\";\n WEBGPUDISTANCE[\"TANIMOTO\"] = \"Tanimoto\";\n WEBGPUDISTANCE[\"LEVENSTEIN\"] = \"Levenshtein\";\n WEBGPUDISTANCE[\"NEEDLEMAN_WUNSCH\"] = \"Needlemann-Wunsch\";\n WEBGPUDISTANCE[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n WEBGPUDISTANCE[\"SOKAL\"] = \"Sokal\";\n WEBGPUDISTANCE[\"COSINE\"] = \"Cosine\";\n WEBGPUDISTANCE[\"ASYMMETRIC\"] = \"Asymmetric\";\n WEBGPUDISTANCE[\"Difference\"] = \"Difference\";\n WEBGPUDISTANCE[\"OneHot\"] = \"One-Hot\";\n})(WEBGPUDISTANCE || (WEBGPUDISTANCE = {}));\nexport const webGPUFunctions = {\n [WEBGPUDISTANCE.HAMMING]: webGPUHamming,\n [WEBGPUDISTANCE.EUCLIDEAN]: webGPUEuclidean,\n [WEBGPUDISTANCE.MANHATTAN]: webGPUManhattan,\n [WEBGPUDISTANCE.TANIMOTO]: webGPUTanimotoBitArray,\n [WEBGPUDISTANCE.LEVENSTEIN]: webGPULevenstein,\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: webGPUNeedlemanWunsch,\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: webGPUMonomerChemicalDistance,\n [WEBGPUDISTANCE.SOKAL]: webGPUSokalBitArray,\n [WEBGPUDISTANCE.COSINE]: webGPUCosineBitArray,\n [WEBGPUDISTANCE.ASYMMETRIC]: webGPUAsymmetricBitArray,\n [WEBGPUDISTANCE.Difference]: webGPUNumericDistance,\n [WEBGPUDISTANCE.OneHot]: webGPUOneHotDistance\n};\nexport const distanceFunctionComplexity = {\n [WEBGPUDISTANCE.HAMMING]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.EUCLIDEAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.MANHATTAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.TANIMOTO]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.SOKAL]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.COSINE]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.ASYMMETRIC]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.LEVENSTEIN]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: (maxEntrySize) => Math.ceil(maxEntrySize / 25),\n [WEBGPUDISTANCE.Difference]: (_maxEntrySize) => 1,\n [WEBGPUDISTANCE.OneHot]: (_maxEntrySize) => Math.ceil(_maxEntrySize / 40),\n};\nexport const TypeSupportedDistances = {\n [\"STRING\" /* WGPUENTRYTYPE.STRING */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.OneHot]),\n [\"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"NUMBER\" /* WGPUENTRYTYPE.NUMBER */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */]: new Set([WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC])\n};\n//# sourceMappingURL=webGPU-multicol-distances.js.map","export var MatrixMatrixOpType;\n(function (MatrixMatrixOpType) {\n MatrixMatrixOpType[\"ADD\"] = \"ADD\";\n MatrixMatrixOpType[\"SUB\"] = \"SUB\";\n MatrixMatrixOpType[\"MULT\"] = \"MULT\";\n})(MatrixMatrixOpType || (MatrixMatrixOpType = {}));\nexport var MatrixOpType;\n(function (MatrixOpType) {\n MatrixOpType[\"SQUARE\"] = \"SQUARE\";\n MatrixOpType[\"INVERSE\"] = \"INVERSE\";\n MatrixOpType[\"TRANSPOSE\"] = \"TRANSPOSE\";\n MatrixOpType[\"NORM\"] = \"NORM\";\n MatrixOpType[\"COLUMN_NORM\"] = \"COLUMN_NORM\";\n})(MatrixOpType || (MatrixOpType = {}));\nexport var MatrixScalarOpType;\n(function (MatrixScalarOpType) {\n MatrixScalarOpType[\"SCALARMULT\"] = \"SCALARMULT\";\n MatrixScalarOpType[\"SCALARADD\"] = \"SCALARADD\";\n MatrixScalarOpType[\"SCALARPOW\"] = \"SCALARPOW\";\n})(MatrixScalarOpType || (MatrixScalarOpType = {}));\n//# sourceMappingURL=types.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n const tag = toString.call(value);\n return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport { Subject } from 'rxjs';\nimport BitArray from './bit-array';\nexport var ScatterPlotCurrentLineStyle;\n(function (ScatterPlotCurrentLineStyle) {\n ScatterPlotCurrentLineStyle[\"none\"] = \"none\";\n ScatterPlotCurrentLineStyle[\"bold\"] = \"bold\";\n ScatterPlotCurrentLineStyle[\"dashed\"] = \"dashed\";\n})(ScatterPlotCurrentLineStyle || (ScatterPlotCurrentLineStyle = {}));\nexport class ScatterPlotLinesRenderer {\n get currentLineId() {\n return this._currentLineIdx;\n }\n set currentLineId(id) {\n if (id !== this._currentLineIdx) {\n this._currentLineIdx = id;\n this.sp.render(this.ctx);\n }\n }\n set linesToRender(lines) {\n this.updateLines(lines);\n this.sp.render(this.ctx);\n }\n set linesVisibility(visibility) {\n this.visibility = visibility;\n this.sp.render(this.ctx);\n }\n constructor(sp, xAxis, yAxis, lines, currentLineStyle = ScatterPlotCurrentLineStyle.none) {\n var _a;\n this._currentLineIdx = -1;\n this.lineClicked = new Subject();\n this.lineHover = new Subject();\n this.mouseOverLineId = -1;\n this.arrowWidth = 15;\n this.sp = sp;\n this.xAxisCol = this.sp.dataFrame.columns.byName(xAxis);\n this.yAxisCol = this.sp.dataFrame.columns.byName(yAxis);\n this.canvas = this.sp.getInfo()['canvas'];\n this.ctx = this.canvas.getContext('2d');\n this.currentLineStyle = currentLineStyle;\n this.updateLines(lines);\n this.visibility = (_a = lines.visibility) !== null && _a !== void 0 ? _a : new BitArray(this.lines.from.length);\n if (!lines.visibility)\n this.visibility.setAll(true, false);\n if (lines.arrowSize)\n this.arrowWidth = lines.arrowSize;\n this.canvas.onmousedown = (event) => {\n if (this.mouseOverLineId !== -1)\n this.lineClicked.next({ x: event.clientX, y: event.clientY, id: this.mouseOverLineId, event: event });\n };\n this.canvas.onmousemove = (event) => {\n this.mouseOverLineId = this.checkCoordsOnLine(event.offsetX, event.offsetY);\n if (this.mouseOverLineId !== -1)\n this.lineHover.next({ x: event.clientX, y: event.clientY, id: this.mouseOverLineId, event: event });\n };\n sp.onEvent('d4-before-draw-scene')\n .subscribe((_) => {\n this.renderLines();\n });\n }\n updateLines(lines) {\n this.lines = lines;\n this.multipleLinesCounts = new Uint8Array(this.lines.from.length);\n if (!lines.skipMultiLineCalculation)\n this.createMultiLinesIndices();\n else\n this.multipleLinesCounts.fill(0);\n }\n renderLines() {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\n const spLook = this.sp.getOptions().look;\n const individualLineStyles = this.lines.colors || this.lines.width || this.lines.opacities || this.lines.drawArrowsArr;\n if (!individualLineStyles) {\n this.ctx.lineWidth = (_a = this.lines.width) !== null && _a !== void 0 ? _a : 1;\n this.ctx.strokeStyle = `rgba(${(_b = this.lines.color) !== null && _b !== void 0 ? _b : '0,128,0'},${(_c = this.lines.opacity) !== null && _c !== void 0 ? _c : 1})`;\n }\n const markerSizeCol = spLook['sizeColumnName'] ? this.sp.dataFrame.col(spLook['sizeColumnName']) : null;\n const filter = this.sp.dataFrame.filter;\n for (let i = 0; i < this.lines.from.length; i++) {\n if (filter.get(this.lines.from[i]) && filter.get(this.lines.to[i]) && this.visibility.getBit(i)) {\n let lineLen = 0;\n const { sizeFrom, sizeTo } = this.getMarkersSizes(spLook, markerSizeCol, i);\n const pointFrom = this.sp.worldToScreen(this.xAxisCol.get(this.lines.from[i]), this.yAxisCol.get(this.lines.from[i]));\n let aX = pointFrom === null || pointFrom === void 0 ? void 0 : pointFrom.x;\n let aY = pointFrom === null || pointFrom === void 0 ? void 0 : pointFrom.y;\n const pointTo = this.sp.worldToScreen(this.xAxisCol.get(this.lines.to[i]), this.yAxisCol.get(this.lines.to[i]));\n let bX = pointTo === null || pointTo === void 0 ? void 0 : pointTo.x;\n let bY = pointTo === null || pointTo === void 0 ? void 0 : pointTo.y;\n const minAxis = Math.min(this.sp.viewBox.width, this.sp.viewBox.height);\n this.ctx.beginPath();\n if (aX && aY && bX && bY && Math.hypot(bX - aX, bY - aY) / minAxis > 0.01) {\n if (individualLineStyles) {\n const color = ((_d = this.lines.colors) === null || _d === void 0 ? void 0 : _d[i]) ? (_e = this.lines.colors) === null || _e === void 0 ? void 0 : _e[i] : '0,128,0';\n const opacity = ((_f = this.lines.opacities) === null || _f === void 0 ? void 0 : _f[i]) ? (_g = this.lines.opacities) === null || _g === void 0 ? void 0 : _g[i] : 1;\n this.ctx.strokeStyle = `rgba(${color},${opacity})`;\n this.ctx.lineWidth = ((_h = this.lines.widths) === null || _h === void 0 ? void 0 : _h[i]) ? (_j = this.lines.widths) === null || _j === void 0 ? void 0 : _j[i] : 1;\n }\n if (i === this._currentLineIdx)\n this.toggleCurrentLineStyle(true);\n const multiLines = this.multipleLinesCounts[i];\n let controlPoint = null;\n if (multiLines) {\n lineLen = this.getLineLength(aX, aY, bX, bY);\n const startPointWithMarker = this.getPointOnDistance(aX, aY, bX, bY, sizeTo, lineLen);\n const endtPointWithMarker = this.getPointOnDistance(bX, bY, aX, aY, sizeFrom, lineLen);\n aX = startPointWithMarker.x;\n aY = startPointWithMarker.y;\n bX = endtPointWithMarker.x;\n bY = endtPointWithMarker.y;\n controlPoint = this.lines.from[i] > this.lines.to[i] ?\n this.findControlPoint(multiLines, aX, aY, bX, bY, i) :\n this.findControlPoint(multiLines, bX, bY, aX, aY, i);\n this.ctx.moveTo(aX, aY);\n this.ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, bX, bY);\n }\n else {\n this.ctx.moveTo(aX, aY);\n this.ctx.lineTo(bX, bY);\n }\n if ((_k = this.lines.drawArrows) !== null && _k !== void 0 ? _k : (_l = this.lines.drawArrowsArr) === null || _l === void 0 ? void 0 : _l.getBit(i)) {\n if (!lineLen)\n lineLen = this.getLineLength(aX, aY, bX, bY);\n if (lineLen > this.arrowWidth) {\n const arrowPoint = !multiLines ? this.getPointOnDistance(aX, aY, bX, bY, sizeTo, lineLen) : null;\n const arrowCPX = multiLines ? controlPoint.x : aX;\n const arrowCPY = multiLines ? controlPoint.y : aY;\n this.canvasArrow(this.ctx, (_m = arrowPoint === null || arrowPoint === void 0 ? void 0 : arrowPoint.x) !== null && _m !== void 0 ? _m : aX, (_o = arrowPoint === null || arrowPoint === void 0 ? void 0 : arrowPoint.y) !== null && _o !== void 0 ? _o : aY, arrowCPX, arrowCPY);\n }\n }\n this.ctx.stroke();\n this.ctx.closePath();\n if (i === this._currentLineIdx)\n this.toggleCurrentLineStyle(false);\n }\n }\n }\n this.fillLeftBottomRect();\n }\n toggleCurrentLineStyle(flag) {\n switch (this.currentLineStyle) {\n case ScatterPlotCurrentLineStyle.bold: {\n flag ? this.ctx.lineWidth += 2 : this.ctx.lineWidth -= 2;\n break;\n }\n case ScatterPlotCurrentLineStyle.dashed: {\n flag ? this.ctx.setLineDash([5, 5]) : this.ctx.setLineDash([]);\n break;\n }\n default:\n return;\n }\n }\n getMarkersSizes(spLook, markerSizeCol, i) {\n let sizeFrom = 3;\n let sizeTo = 3;\n if (markerSizeCol) {\n sizeFrom = (spLook.markerMinSize + (spLook.markerMaxSize - spLook.markerMinSize) * markerSizeCol.scale(this.lines.from[i])) / 2;\n sizeTo = (spLook.markerMinSize + (spLook.markerMaxSize - spLook.markerMinSize) * markerSizeCol.scale(this.lines.to[i])) / 2;\n }\n else if (spLook.markerDefaultSize) {\n sizeFrom = spLook.markerDefaultSize / 2;\n sizeTo = spLook.markerDefaultSize / 2;\n }\n return { sizeFrom, sizeTo };\n }\n fillLeftBottomRect() {\n const rect = new Path2D();\n rect.rect(this.sp.yAxisBox.minX, this.sp.yAxisBox.maxY, this.sp.yAxisBox.width, this.sp.xAxisBox.height);\n this.ctx.fillStyle = `white`;\n this.ctx.beginPath();\n this.ctx.fill(rect);\n this.ctx.closePath();\n }\n createMultiLinesIndices() {\n const arrayIdxsBitArray = new BitArray(this.lines.from.length);\n arrayIdxsBitArray.setAll(true);\n for (let i = -1; (i = arrayIdxsBitArray.findNext(i)) !== -1;) {\n const firstLineIdx = i;\n const p1 = this.lines.from[firstLineIdx];\n const p2 = this.lines.to[firstLineIdx];\n let linesPerPair = 1;\n for (let j = i; (j = arrayIdxsBitArray.findNext(j)) !== -1;) {\n const pointToCompare1 = this.lines.from[j];\n const pointToCompare2 = this.lines.to[j];\n if (pointToCompare1 === p1 && pointToCompare2 === p2 ||\n pointToCompare2 === p1 && pointToCompare1 === p2) {\n this.multipleLinesCounts[j] = ++linesPerPair;\n arrayIdxsBitArray.setBit(j, false, false);\n }\n }\n if (linesPerPair > 1)\n this.multipleLinesCounts[firstLineIdx] = 1;\n arrayIdxsBitArray.setBit(i, false, false);\n }\n }\n checkCoordsOnLine(x, y) {\n let candidateIdx = -1;\n let minDist = null;\n let dist = null;\n const spLook = this.sp.getOptions().look;\n const markerSizeCol = spLook['sizeColumnName'] ? this.sp.dataFrame.col(spLook['sizeColumnName']) : null;\n const filter = this.sp.dataFrame.filter;\n for (let i = 0; i < this.lines.from.length; i++) {\n if (filter.get(this.lines.from[i]) && filter.get(this.lines.to[i]) && this.visibility.getBit(i)) {\n const { sizeFrom, sizeTo } = this.getMarkersSizes(spLook, markerSizeCol, i);\n const pFrom = this.sp.worldToScreen(this.xAxisCol.get(this.lines.from[i]), this.yAxisCol.get(this.lines.from[i]));\n const pTo = this.sp.worldToScreen(this.xAxisCol.get(this.lines.to[i]), this.yAxisCol.get(this.lines.to[i]));\n if (this.multipleLinesCounts[i]) {\n const len = this.getLineLength(pFrom.x, pFrom.y, pTo.x, pTo.y);\n const fromMarker = this.getPointOnDistance(pFrom.x, pFrom.y, pTo.x, pTo.y, sizeTo, len);\n const toMarker = this.getPointOnDistance(pTo.x, pTo.y, pFrom === null || pFrom === void 0 ? void 0 : pFrom.x, pFrom === null || pFrom === void 0 ? void 0 : pFrom.y, sizeFrom, len);\n const controlPoint = this.lines.from[i] > this.lines.to[i] ?\n this.findControlPoint(this.multipleLinesCounts[i], fromMarker.x, fromMarker.y, toMarker.x, toMarker.y, i) :\n this.findControlPoint(this.multipleLinesCounts[i], toMarker.x, toMarker.y, fromMarker.x, fromMarker.y, i);\n dist = this.calculateDistToCurveLine(i, x, y, fromMarker, toMarker, controlPoint);\n }\n else {\n dist = this.calculateDistToStraightLine(x, y, pFrom, pTo);\n }\n if ((!minDist && dist !== null && dist < 5) || minDist && dist !== null && dist < minDist) {\n minDist = dist;\n candidateIdx = i;\n }\n }\n }\n return candidateIdx;\n }\n calculateDistToStraightLine(x, y, p1, p2) {\n /* calculating coordinates of a rect around a line. If cursor coords are outside this rect - assume that\n point is not on line and do not calculate distance to line */\n const xMin = Math.min(p1.x, p2.x);\n const xMax = Math.max(p1.x, p2.x);\n const yMin = Math.min(p1.y, p2.y);\n const yMax = Math.max(p1.y, p2.y);\n //adding a couple of pixels to increase the width/height of the rect\n const threshold = 2;\n return x >= xMin - threshold && x <= xMax + threshold && y >= yMin - threshold && y <= yMax + threshold ?\n this.distToStraightLineSegment(x, y, p1, p2) :\n null;\n }\n distToStraightLineSegment(x, y, p1, p2) {\n const dist = (x1, y1, x2, y2) => Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);\n const l = dist(p1.x, p1.y, p2.x, p2.y);\n if (l == 0)\n return dist(x, y, p1.x, p1.y);\n let t = ((x - p1.x) * (p2.x - p1.x) + (y - p1.y) * (p2.y - p1.y)) / l;\n t = Math.max(0, Math.min(1, t));\n return dist(x, y, p1.x + t * (p2.x - p1.x), p1.y + t * (p2.y - p1.y));\n }\n calculateDistToCurveLine(i, x, y, p1, p2, pc) {\n /* calculating coordinates of a rect around a line. If cursor coords are outside this shape - assume that\n point is not on line and do not calculate distance to line */\n const xMin = Math.min(p1.x, p2.x, pc.x);\n const xMax = Math.max(p1.x, p2.x, pc.x);\n const yMin = Math.min(p1.y, p2.y, pc.y);\n const yMax = Math.max(p1.y, p2.y, pc.y);\n //adding a couple of pixels to increase the width/height of the rect\n const threshold = 2;\n if (x >= xMin - threshold && x <= xMax + threshold && y >= yMin - threshold && y <= yMax + threshold) {\n const w = xMax - xMin;\n const h = yMax - yMin;\n return this.calculateDistToCurveInRect(x, y, p1, pc, p2, w, h);\n }\n return null;\n }\n calculateDistToCurveInRect(x, y, p0, p1, p2, w, h) {\n const stepLen = 3;\n const stepsNum = Math.floor((w + h) / stepLen);\n const deltaT = 1 / stepsNum;\n const arrX = new Uint32Array(stepsNum);\n const arrY = new Uint32Array(stepsNum);\n const maxHW = new Uint32Array(stepsNum);\n let minSumHW = null;\n const candidateIdxs = new BitArray(stepsNum);\n for (let i = 0; i < arrX.length; i++) {\n const t = i * deltaT;\n const xOnCurve = Math.pow((1 - t), 2) * p0.x + 2 * t * (1 - t) * p1.x + Math.pow(t, 2) * p2.x;\n const yOnCurve = Math.pow((1 - t), 2) * p0.y + 2 * t * (1 - t) * p1.y + Math.pow(t, 2) * p2.y;\n const rectW = Math.abs(x - xOnCurve);\n const rectH = Math.abs(y - yOnCurve);\n const sumHW = rectW + rectH;\n if (!minSumHW || minSumHW > sumHW)\n minSumHW = sumHW;\n maxHW[i] = Math.max(rectW, rectH);\n arrX[i] = xOnCurve;\n arrY[i] = yOnCurve;\n }\n for (let i = 0; i < arrX.length; i++) {\n if (maxHW[i] < minSumHW)\n candidateIdxs.setBit(i, true, false);\n }\n let minDist = null;\n for (let j = -1; (j = candidateIdxs.findNext(j)) !== -1;) {\n const dist = Math.hypot((arrX[j] - x), (arrY[j] - y));\n if (!minDist || minDist > dist)\n minDist = dist;\n }\n return minDist;\n }\n getLineLength(p1x, p1y, p2x, p2y) {\n return Math.sqrt(Math.pow(p2x - p1x, 2) + Math.pow(p2y - p1y, 2));\n }\n getPointOnDistance(p1x, p1y, p2x, p2y, distance, length) {\n const dx = (p2x - p1x) / length;\n const dy = (p2y - p1y) / length;\n const p3x = p2x - distance * dx;\n const p3y = p2y - distance * dy;\n return new DG.Point(p3x, p3y);\n }\n findControlPoint(idx, x1, y1, x2, y2, i) {\n const midX = x1 + (x2 - x1) / 2;\n const midY = y1 + (y2 - y1) / 2;\n let dx = midX - x1;\n let dy = midY - y1;\n const dist = Math.sqrt(dx * dx + dy * dy);\n dx /= dist;\n dy /= dist;\n const perpendicularLen = 50 * Math.ceil(idx / 2);\n return idx % 2 === 0 ?\n new DG.Point(midX + (perpendicularLen / 2) * dy, midY - (perpendicularLen / 2) * dx) :\n new DG.Point(midX - (perpendicularLen / 2) * dy, midY + (perpendicularLen / 2) * dx);\n }\n canvasArrow(path, arrowEndX, arrowEndY, quadX, quadY) {\n const arrowAngle = Math.atan2(quadX - arrowEndX, quadY - arrowEndY) + Math.PI;\n path.moveTo(arrowEndX - (this.arrowWidth * Math.sin(arrowAngle - Math.PI / 10)), arrowEndY - (this.arrowWidth * Math.cos(arrowAngle - Math.PI / 10)));\n path.lineTo(arrowEndX, arrowEndY);\n path.lineTo(arrowEndX - (this.arrowWidth * Math.sin(arrowAngle + Math.PI / 10)), arrowEndY - (this.arrowWidth * Math.cos(arrowAngle + Math.PI / 10)));\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWxpbmVzLW9uLXNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVuZGVyLWxpbmVzLW9uLXNwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBRW5DLE1BQU0sQ0FBTixJQUFZLDJCQUlYO0FBSkQsV0FBWSwyQkFBMkI7SUFDbkMsNENBQWEsQ0FBQTtJQUNiLDRDQUFhLENBQUE7SUFDYixnREFBaUIsQ0FBQTtBQUNyQixDQUFDLEVBSlcsMkJBQTJCLEtBQTNCLDJCQUEyQixRQUl0QztBQThCRCxNQUFNLE9BQU8sd0JBQXdCO0lBZ0JuQyxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksYUFBYSxDQUFDLEVBQVU7UUFDMUIsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsS0FBa0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLFVBQW9CO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJ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LFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQzdFLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnLi9iaXQtYXJyYXknO1xuXG5leHBvcnQgZW51bSBTY2F0dGVyUGxvdEN1cnJlbnRMaW5lU3R5bGUge1xuICAgIG5vbmUgPSAnbm9uZScsXG4gICAgYm9sZCA9ICdib2xkJyxcbiAgICBkYXNoZWQgPSAnZGFzaGVkJ1xufVxuXG50eXBlIE1hcmtlclNpemUgPSB7XG4gICAgc2l6ZUZyb206IG51bWJlcixcbiAgICBzaXplVG86IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBNb3VzZU92ZXJMaW5lRXZlbnQgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBpZDogbnVtYmVyO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50XG59XG5cbmV4cG9ydCB0eXBlIElMaW5lU2VyaWVzID0ge1xuICAgIGZyb206IFVpbnQzMkFycmF5O1xuICAgIHRvOiBVaW50MzJBcnJheTtcbiAgICBjb2xvcj86IHN0cmluZzsgLy8gY29tbW9uIGNvbG9yLiBVc2UgW2NvbG9yc10gaWYgeW91IG5lZWQgaW5kaXZpZHVhbCBjb2xvcnMgcGVyIGxpbmVcbiAgICBjb2xvcnM/OiBzdHJpbmdbXTsgLy8gbGluZSBjb2xvcnMuIElmIHRoZXkgYXJlIHRoZSBzYW1lIGZvciB0aGUgc2VyaWVzLCB1c2UgW2NvbG9yXSBpbnN0ZWFkLlxuICAgIHdpZHRoPzogbnVtYmVyOyAvLyBjb21tb24gd2lkdGguIFVzZSBbY29sb3JzXSBpZiB5b3UgbmVlZCBpbmRpdmlkdWFsIHdpZHRocyBwZXIgbGluZVxuICAgIHdpZHRocz86IEZsb2F0MzJBcnJheTsgLy8gbGluZSB3aWR0aHMuIElmIHRoZXkgYXJlIHRoZSBzYW1lIGZvciB0aGUgc2VyaWVzLCB1c2UgW3dpZHRoXSBpbnN0ZWFkLlxuICAgIG9wYWNpdHk/OiBudW1iZXI7IC8vIGNvbW1vbiBvcGFjaXR5LiBVc2UgW29wYWNpdGllc10gaWYgeW91IG5lZWQgaW5kaXZpZHVhbCBvcGFjaXRpZXMgcGVyIGxpbmVcbiAgICBvcGFjaXRpZXM/OiBGbG9hdDMyQXJyYXk7IC8vIGxpbmUgb3BhY2l0aWVzLiBJZiB0aGV5IGFyZSB0aGUgc2FtZSBmb3IgdGhlIHNlcmllcywgdXNlIFtvcGFjaXR5XSBpbnN0ZWFkXG4gICAgZHJhd0Fycm93cz86IGJvb2xlYW47IC8vIGNvbW1vbiBwYXJhbWV0ZXIgdG8gZHJhdyBhcnJvd3MuIFVzZSBbZHJhd0Fycm93c0Fycl0gaWYgeW91IG5lZWQgdG8gZHJhdyBhcnJvd3Mgbm90IGZvciBlYWNoIGxpbmVcbiAgICBkcmF3QXJyb3dzQXJyPzogQml0QXJyYXk7IC8vIGluZGl2aWR1YWwgcGFyYW1ldGVyIGZvciBlYWNoIGxpbmUuIElmIHRoZXkgYXJlIHRoZSBzYW1lIGZvciB0aGUgc2VyaWVzLCB1c2UgW2RyYXdBcnJvd3NdIGluc3RlYWRcbiAgICB2aXNpYmlsaXR5PzogQml0QXJyYXk7IC8vIGluZGl2aWR1YWwgcGFyYW1ldGVyIGZvciBlYWNoIGxpbmUuIFNldCBiaXQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgbGluZVxuICAgIGFycm93U2l6ZT86IG51bWJlcjsgLy8gY29tbW9uIGZvciBhbGwgYXJyb3dzXG4gICAgc2tpcE11bHRpTGluZUNhbGN1bGF0aW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjYXR0ZXJQbG90TGluZXNSZW5kZXJlciB7XG4gIHNwOiBERy5TY2F0dGVyUGxvdFZpZXdlcjtcbiAgeEF4aXNDb2w6IERHLkNvbHVtbjtcbiAgeUF4aXNDb2w6IERHLkNvbHVtbjtcbiAgX2N1cnJlbnRMaW5lSWR4ID0gLTE7XG4gIGxpbmVzITogSUxpbmVTZXJpZXM7XG4gIGxpbmVDbGlja2VkID0gbmV3IFN1YmplY3Q8TW91c2VPdmVyTGluZUV2ZW50PigpO1xuICBsaW5lSG92ZXIgPSBuZXcgU3ViamVjdDxNb3VzZU92ZXJMaW5lRXZlbnQ+KCk7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBtb3VzZU92ZXJMaW5lSWQgPSAtMTtcbiAgbXVsdGlwbGVMaW5lc0NvdW50cyE6IFVpbnQ4QXJyYXk7XG4gIHZpc2liaWxpdHk6IEJpdEFycmF5O1xuICBjdXJyZW50TGluZVN0eWxlOiBTY2F0dGVyUGxvdEN1cnJlbnRMaW5lU3R5bGU7XG4gIGFycm93V2lkdGggPSAxNTtcblxuICBnZXQgY3VycmVudExpbmVJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TGluZUlkeDtcbiAgfVxuXG4gIHNldCBjdXJyZW50TGluZUlkKGlkOiBudW1iZXIpIHtcbiAgICBpZiAoaWQgIT09IHRoaXMuX2N1cnJlbnRMaW5lSWR4KSB7XG4gICAgICB0aGlzLl9jdXJyZW50TGluZUlkeCA9IGlkO1xuICAgICAgdGhpcy5zcC5yZW5kZXIodGhpcy5jdHgpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBsaW5lc1RvUmVuZGVyKGxpbmVzOiBJTGluZVNlcmllcykge1xuICAgIHRoaXMudXBkYXRlTGluZXMobGluZXMpO1xuICAgIHRoaXMuc3AucmVuZGVyKHRoaXMuY3R4KTtcbiAgfVxuXG4gIHNldCBsaW5lc1Zpc2liaWxpdHkodmlzaWJpbGl0eTogQml0QXJyYXkpIHtcbiAgICB0aGlzLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5O1xuICAgIHRoaXMuc3AucmVuZGVyKHRoaXMuY3R4KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNwOiBERy5TY2F0dGVyUGxvdFZpZXdlciwgeEF4aXM6IHN0cmluZywgeUF4aXM6IHN0cmluZywgbGluZXM6IElMaW5lU2VyaWVzLFxuICAgIGN1cnJlbnRMaW5lU3R5bGUgPSBTY2F0dGVyUGxvdEN1cnJlbnRMaW5lU3R5bGUubm9uZSkge1xuICAgIHRoaXMuc3AgPSBzcDtcbiAgICB0aGlzLnhBeGlzQ29sID0gdGhpcy5zcC5kYXRhRnJhbWUhLmNvbHVtbnMuYnlOYW1lKHhBeGlzKTtcbiAgICB0aGlzLnlBeGlzQ29sID0gdGhpcy5zcC5kYXRhRnJhbWUhLmNvbHVtbnMuYnlOYW1lKHlBeGlzKTtcbiAgICB0aGlzLmNhbnZhcyA9IHRoaXMuc3AuZ2V0SW5mbygpWydjYW52YXMnXTtcbiAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHRoaXMuY3VycmVudExpbmVTdHlsZSA9IGN1cnJlbnRMaW5lU3R5bGU7XG4gICAgdGhpcy51cGRhdGVMaW5lcyhsaW5lcyk7XG4gICAgdGhpcy52aXNpYmlsaXR5ID0gbGluZXMudmlzaWJpbGl0eSA/PyBuZXcgQml0QXJyYXkodGhpcy5saW5lcy5mcm9tLmxlbmd0aCk7XG4gICAgaWYgKCFsaW5lcy52aXNpYmlsaXR5KVxuICAgICAgdGhpcy52aXNpYmlsaXR5LnNldEFsbCh0cnVlLCBmYWxzZSk7XG4gICAgaWYgKGxpbmVzLmFycm93U2l6ZSlcbiAgICAgIHRoaXMuYXJyb3dXaWR0aCA9IGxpbmVzLmFycm93U2l6ZTtcblxuICAgIHRoaXMuY2FudmFzLm9ubW91c2Vkb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5tb3VzZU92ZXJMaW5lSWQgIT09IC0xKVxuICAgICAgICB0aGlzLmxpbmVDbGlja2VkLm5leHQoe3g6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFksIGlkOiB0aGlzLm1vdXNlT3ZlckxpbmVJZCwgZXZlbnQ6IGV2ZW50fSk7XG4gICAgfTtcblxuICAgIHRoaXMuY2FudmFzLm9ubW91c2Vtb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm1vdXNlT3ZlckxpbmVJZCA9IHRoaXMuY2hlY2tDb29yZHNPbkxpbmUoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgICBpZiAodGhpcy5tb3VzZU92ZXJMaW5lSWQgIT09IC0xKVxuICAgICAgICB0aGlzLmxpbmVIb3Zlci5uZXh0KHt4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCBpZDogdGhpcy5tb3VzZU92ZXJMaW5lSWQsIGV2ZW50OiBldmVudH0pO1xuICAgIH07XG5cbiAgICBzcC5vbkV2ZW50KCdkNC1iZWZvcmUtZHJhdy1zY2VuZScpXG4gICAgICAuc3Vic2NyaWJlKChfOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJMaW5lcygpO1xuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVMaW5lcyhsaW5lczogSUxpbmVTZXJpZXMpIHtcbiAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5saW5lcy5mcm9tLmxlbmd0aCk7XG4gICAgaWYgKCFsaW5lcy5za2lwTXVsdGlMaW5lQ2FsY3VsYXRpb24pXG4gICAgICB0aGlzLmNyZWF0ZU11bHRpTGluZXNJbmRpY2VzKCk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzLmZpbGwoMCk7XG4gIH1cblxuICByZW5kZXJMaW5lcygpOiB2b2lkIHtcbiAgICBjb25zdCBzcExvb2sgPSB0aGlzLnNwLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIGNvbnN0IGluZGl2aWR1YWxMaW5lU3R5bGVzID0gdGhpcy5saW5lcy5jb2xvcnMgfHwgdGhpcy5saW5lcy53aWR0aCB8fCB0aGlzLmxpbmVzLm9wYWNpdGllcyB8fCB0aGlzLmxpbmVzLmRyYXdBcnJvd3NBcnI7XG4gICAgaWYgKCFpbmRpdmlkdWFsTGluZVN0eWxlcykge1xuICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gdGhpcy5saW5lcy53aWR0aCA/PyAxO1xuICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBgcmdiYSgke3RoaXMubGluZXMuY29sb3IgPz8gJzAsMTI4LDAnfSwke3RoaXMubGluZXMub3BhY2l0eSA/PyAxfSlgO1xuICAgIH1cbiAgICBjb25zdCBtYXJrZXJTaXplQ29sID0gc3BMb29rWydzaXplQ29sdW1uTmFtZSddID8gdGhpcy5zcC5kYXRhRnJhbWUuY29sKHNwTG9va1snc2l6ZUNvbHVtbk5hbWUnXSkgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuc3AuZGF0YUZyYW1lLmZpbHRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMuZnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpbHRlci5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSAmJiBmaWx0ZXIuZ2V0KHRoaXMubGluZXMudG9baV0pICYmIHRoaXMudmlzaWJpbGl0eS5nZXRCaXQoaSkpIHtcbiAgICAgICAgbGV0IGxpbmVMZW4gPSAwO1xuICAgICAgICBjb25zdCB7c2l6ZUZyb20sIHNpemVUb30gPSB0aGlzLmdldE1hcmtlcnNTaXplcyhzcExvb2ssIG1hcmtlclNpemVDb2wsIGkpO1xuICAgICAgICBjb25zdCBwb2ludEZyb20gPSB0aGlzLnNwLndvcmxkVG9TY3JlZW4odGhpcy54QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSwgdGhpcy55QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSk7XG4gICAgICAgIGxldCBhWCA9IHBvaW50RnJvbT8ueDtcbiAgICAgICAgbGV0IGFZID0gcG9pbnRGcm9tPy55O1xuICAgICAgICBjb25zdCBwb2ludFRvID0gdGhpcy5zcC53b3JsZFRvU2NyZWVuKHRoaXMueEF4aXNDb2wuZ2V0KHRoaXMubGluZXMudG9baV0pLCB0aGlzLnlBeGlzQ29sLmdldCh0aGlzLmxpbmVzLnRvW2ldKSk7XG4gICAgICAgIGxldCBiWCA9IHBvaW50VG8/Lng7XG4gICAgICAgIGxldCBiWSA9IHBvaW50VG8/Lnk7XG4gICAgICAgIGNvbnN0IG1pbkF4aXMgPSBNYXRoLm1pbih0aGlzLnNwLnZpZXdCb3gud2lkdGgsIHRoaXMuc3Audmlld0JveC5oZWlnaHQpO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKGFYICYmIGFZICYmIGJYICYmIGJZICYmIE1hdGguaHlwb3QoYlghIC0gYVghLCBiWSEgLSBhWSEpIC8gbWluQXhpcyA+IDAuMDEpIHtcbiAgICAgICAgICBpZiAoaW5kaXZpZHVhbExpbmVTdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5saW5lcy5jb2xvcnM/LltpXSA/IHRoaXMubGluZXMuY29sb3JzPy5baV0gOiAnMCwxMjgsMCc7XG4gICAgICAgICAgICBjb25zdCBvcGFjaXR5ID0gdGhpcy5saW5lcy5vcGFjaXRpZXM/LltpXSA/IHRoaXMubGluZXMub3BhY2l0aWVzPy5baV0gOiAxO1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBgcmdiYSgke2NvbG9yfSwke29wYWNpdHl9KWA7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB0aGlzLmxpbmVzLndpZHRocz8uW2ldID8gdGhpcy5saW5lcy53aWR0aHM/LltpXSA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSB0aGlzLl9jdXJyZW50TGluZUlkeClcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ3VycmVudExpbmVTdHlsZSh0cnVlKTtcbiAgICAgICAgICBjb25zdCBtdWx0aUxpbmVzID0gdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzW2ldO1xuICAgICAgICAgIGxldCBjb250cm9sUG9pbnQ6IERHLlBvaW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgaWYgKG11bHRpTGluZXMpIHtcbiAgICAgICAgICAgIGxpbmVMZW4gPSB0aGlzLmdldExpbmVMZW5ndGgoYVgsIGFZLCBiWCwgYlkpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb2ludFdpdGhNYXJrZXIgPSB0aGlzLmdldFBvaW50T25EaXN0YW5jZShhWCwgYVksIGJYLCBiWSwgc2l6ZVRvLCBsaW5lTGVuKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZHRQb2ludFdpdGhNYXJrZXIgPSB0aGlzLmdldFBvaW50T25EaXN0YW5jZShiWCwgYlksIGFYLCBhWSwgc2l6ZUZyb20sIGxpbmVMZW4pO1xuICAgICAgICAgICAgYVggPSBzdGFydFBvaW50V2l0aE1hcmtlci54O1xuICAgICAgICAgICAgYVkgPSBzdGFydFBvaW50V2l0aE1hcmtlci55O1xuICAgICAgICAgICAgYlggPSBlbmR0UG9pbnRXaXRoTWFya2VyLng7XG4gICAgICAgICAgICBiWSA9IGVuZHRQb2ludFdpdGhNYXJrZXIueTtcbiAgICAgICAgICAgIGNvbnRyb2xQb2ludCA9IHRoaXMubGluZXMuZnJvbVtpXSA+IHRoaXMubGluZXMudG9baV0gP1xuICAgICAgICAgICAgICB0aGlzLmZpbmRDb250cm9sUG9pbnQobXVsdGlMaW5lcywgYVgsIGFZLCBiWCwgYlksIGkpIDpcbiAgICAgICAgICAgICAgdGhpcy5maW5kQ29udHJvbFBvaW50KG11bHRpTGluZXMsIGJYLCBiWSwgYVgsIGFZLCBpKTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lm1vdmVUbyhhWCEsIGFZISk7XG4gICAgICAgICAgICB0aGlzLmN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgYlgsIGJZKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKGFYISwgYVkhKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyhiWCwgYlkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5saW5lcy5kcmF3QXJyb3dzID8/IHRoaXMubGluZXMuZHJhd0Fycm93c0Fycj8uZ2V0Qml0KGkpKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVMZW4pXG4gICAgICAgICAgICAgIGxpbmVMZW4gPSB0aGlzLmdldExpbmVMZW5ndGgoYVgsIGFZLCBiWCwgYlkpO1xuICAgICAgICAgICAgaWYgKGxpbmVMZW4gPiB0aGlzLmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXJyb3dQb2ludCA9ICFtdWx0aUxpbmVzID8gdGhpcy5nZXRQb2ludE9uRGlzdGFuY2UoYVgsIGFZLCBiWCwgYlksIHNpemVUbywgbGluZUxlbikgOiBudWxsO1xuICAgICAgICAgICAgICBjb25zdCBhcnJvd0NQWCA9IG11bHRpTGluZXMgPyBjb250cm9sUG9pbnQhLnggOiBhWDtcbiAgICAgICAgICAgICAgY29uc3QgYXJyb3dDUFkgPSBtdWx0aUxpbmVzID8gY29udHJvbFBvaW50IS55IDogYVk7XG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzQXJyb3codGhpcy5jdHgsIGFycm93UG9pbnQ/LnggPz8gYVgsIGFycm93UG9pbnQ/LnkgPz8gYVksIGFycm93Q1BYLCBhcnJvd0NQWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgIGlmIChpID09PSB0aGlzLl9jdXJyZW50TGluZUlkeClcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ3VycmVudExpbmVTdHlsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5maWxsTGVmdEJvdHRvbVJlY3QoKTtcbiAgfVxuXG4gIHRvZ2dsZUN1cnJlbnRMaW5lU3R5bGUoZmxhZzogYm9vbGVhbikge1xuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50TGluZVN0eWxlKSB7XG4gICAgICBjYXNlIFNjYXR0ZXJQbG90Q3VycmVudExpbmVTdHlsZS5ib2xkOiB7XG4gICAgICAgIGZsYWcgPyB0aGlzLmN0eC5saW5lV2lkdGggKz0gMiA6IHRoaXMuY3R4LmxpbmVXaWR0aCAtPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2NhdHRlclBsb3RDdXJyZW50TGluZVN0eWxlLmRhc2hlZDoge1xuICAgICAgICBmbGFnID8gdGhpcy5jdHguc2V0TGluZURhc2goWzUsIDVdKSA6IHRoaXMuY3R4LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgZ2V0TWFya2Vyc1NpemVzKHNwTG9vazogYW55LCBtYXJrZXJTaXplQ29sOiBERy5Db2x1bW4gfCBudWxsLCBpOiBudW1iZXIpOiBNYXJrZXJTaXplIHtcbiAgICBsZXQgc2l6ZUZyb20gPSAzO1xuICAgIGxldCBzaXplVG8gPSAzO1xuICAgIGlmIChtYXJrZXJTaXplQ29sKSB7XG4gICAgICBzaXplRnJvbSA9IChzcExvb2subWFya2VyTWluU2l6ZSArIChzcExvb2subWFya2VyTWF4U2l6ZSAtIHNwTG9vay5tYXJrZXJNaW5TaXplKSAqIG1hcmtlclNpemVDb2wuc2NhbGUodGhpcy5saW5lcy5mcm9tW2ldKSkgLyAyO1xuICAgICAgc2l6ZVRvID0gKHNwTG9vay5tYXJrZXJNaW5TaXplICsgKHNwTG9vay5tYXJrZXJNYXhTaXplIC0gc3BMb29rLm1hcmtlck1pblNpemUpICogbWFya2VyU2l6ZUNvbC5zY2FsZSh0aGlzLmxpbmVzLnRvW2ldKSkgLyAyO1xuICAgIH0gZWxzZSBpZiAoc3BMb29rLm1hcmtlckRlZmF1bHRTaXplKSB7XG4gICAgICBzaXplRnJvbSA9IHNwTG9vay5tYXJrZXJEZWZhdWx0U2l6ZSAvIDI7XG4gICAgICBzaXplVG8gPSBzcExvb2subWFya2VyRGVmYXVsdFNpemUgLyAyO1xuICAgIH1cbiAgICByZXR1cm4ge3NpemVGcm9tLCBzaXplVG99O1xuICB9XG5cblxuICBmaWxsTGVmdEJvdHRvbVJlY3QoKSB7XG4gICAgY29uc3QgcmVjdCA9IG5ldyBQYXRoMkQoKTtcbiAgICByZWN0LnJlY3QodGhpcy5zcC55QXhpc0JveC5taW5YLCB0aGlzLnNwLnlBeGlzQm94Lm1heFksIHRoaXMuc3AueUF4aXNCb3gud2lkdGgsIHRoaXMuc3AueEF4aXNCb3guaGVpZ2h0KTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBgd2hpdGVgO1xuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY3R4LmZpbGwocmVjdCk7XG4gICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gIH1cblxuICBjcmVhdGVNdWx0aUxpbmVzSW5kaWNlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhcnJheUlkeHNCaXRBcnJheSA9IG5ldyBCaXRBcnJheSh0aGlzLmxpbmVzLmZyb20ubGVuZ3RoKTtcbiAgICBhcnJheUlkeHNCaXRBcnJheS5zZXRBbGwodHJ1ZSk7XG4gICAgZm9yIChsZXQgaSA9IC0xOyAoaSA9IGFycmF5SWR4c0JpdEFycmF5LmZpbmROZXh0KGkpKSAhPT0gLTE7KSB7XG4gICAgICBjb25zdCBmaXJzdExpbmVJZHggPSBpO1xuICAgICAgY29uc3QgcDEgPSB0aGlzLmxpbmVzLmZyb21bZmlyc3RMaW5lSWR4XTtcbiAgICAgIGNvbnN0IHAyID0gdGhpcy5saW5lcy50b1tmaXJzdExpbmVJZHhdO1xuICAgICAgbGV0IGxpbmVzUGVyUGFpciA9IDE7XG4gICAgICBmb3IgKGxldCBqID0gaTsgKGogPSBhcnJheUlkeHNCaXRBcnJheS5maW5kTmV4dChqKSkgIT09IC0xOykge1xuICAgICAgICBjb25zdCBwb2ludFRvQ29tcGFyZTEgPSB0aGlzLmxpbmVzLmZyb21bal07XG4gICAgICAgIGNvbnN0IHBvaW50VG9Db21wYXJlMiA9IHRoaXMubGluZXMudG9bal07XG4gICAgICAgIGlmIChwb2ludFRvQ29tcGFyZTEgPT09IHAxICYmIHBvaW50VG9Db21wYXJlMiA9PT0gcDIgfHxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRUb0NvbXBhcmUyID09PSBwMSAmJiBwb2ludFRvQ29tcGFyZTEgPT09IHAyKSB7XG4gICAgICAgICAgdGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzW2pdID0gKytsaW5lc1BlclBhaXI7XG4gICAgICAgICAgYXJyYXlJZHhzQml0QXJyYXkuc2V0Qml0KGosIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsaW5lc1BlclBhaXIgPiAxKVxuICAgICAgICB0aGlzLm11bHRpcGxlTGluZXNDb3VudHNbZmlyc3RMaW5lSWR4XSA9IDE7XG4gICAgICBhcnJheUlkeHNCaXRBcnJheS5zZXRCaXQoaSwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0Nvb3Jkc09uTGluZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGNhbmRpZGF0ZUlkeCA9IC0xO1xuICAgIGxldCBtaW5EaXN0ID0gbnVsbDtcbiAgICBsZXQgZGlzdCA9IG51bGw7XG4gICAgY29uc3Qgc3BMb29rID0gdGhpcy5zcC5nZXRPcHRpb25zKCkubG9vaztcbiAgICBjb25zdCBtYXJrZXJTaXplQ29sID0gc3BMb29rWydzaXplQ29sdW1uTmFtZSddID8gdGhpcy5zcC5kYXRhRnJhbWUuY29sKHNwTG9va1snc2l6ZUNvbHVtbk5hbWUnXSkgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuc3AuZGF0YUZyYW1lLmZpbHRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMuZnJvbS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpbHRlci5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSAmJiBmaWx0ZXIuZ2V0KHRoaXMubGluZXMudG9baV0pICYmIHRoaXMudmlzaWJpbGl0eS5nZXRCaXQoaSkpIHtcbiAgICAgICAgY29uc3Qge3NpemVGcm9tLCBzaXplVG99ID0gdGhpcy5nZXRNYXJrZXJzU2l6ZXMoc3BMb29rLCBtYXJrZXJTaXplQ29sLCBpKTtcbiAgICAgICAgY29uc3QgcEZyb20gPSB0aGlzLnNwLndvcmxkVG9TY3JlZW4odGhpcy54QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSwgdGhpcy55QXhpc0NvbC5nZXQodGhpcy5saW5lcy5mcm9tW2ldKSk7XG4gICAgICAgIGNvbnN0IHBUbyA9IHRoaXMuc3Aud29ybGRUb1NjcmVlbih0aGlzLnhBeGlzQ29sLmdldCh0aGlzLmxpbmVzLnRvW2ldKSwgdGhpcy55QXhpc0NvbC5nZXQodGhpcy5saW5lcy50b1tpXSkpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZUxpbmVzQ291bnRzW2ldKSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gdGhpcy5nZXRMaW5lTGVuZ3RoKHBGcm9tLngsIHBGcm9tLnksIHBUby54LCBwVG8ueSk7XG4gICAgICAgICAgY29uc3QgZnJvbU1hcmtlciA9IHRoaXMuZ2V0UG9pbnRPbkRpc3RhbmNlKHBGcm9tLngsIHBGcm9tLnksIHBUby54LCBwVG8ueSwgc2l6ZVRvLCBsZW4pO1xuICAgICAgICAgIGNvbnN0IHRvTWFya2VyID0gdGhpcy5nZXRQb2ludE9uRGlzdGFuY2UocFRvLngsIHBUby55LCBwRnJvbT8ueCwgcEZyb20/LnksIHNpemVGcm9tLCBsZW4pO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2xQb2ludCA9IHRoaXMubGluZXMuZnJvbVtpXSA+IHRoaXMubGluZXMudG9baV0gP1xuICAgICAgICAgICAgdGhpcy5maW5kQ29udHJvbFBvaW50KHRoaXMubXVsdGlwbGVMaW5lc0NvdW50c1tpXSwgZnJvbU1hcmtlci54LCBmcm9tTWFya2VyLnksIHRvTWFya2VyLngsIHRvTWFya2VyLnksIGkpIDpcbiAgICAgICAgICAgIHRoaXMuZmluZENvbnRyb2xQb2ludCh0aGlzLm11bHRpcGxlTGluZXNDb3VudHNbaV0sIHRvTWFya2VyLngsIHRvTWFya2VyLnksIGZyb21NYXJrZXIueCwgZnJvbU1hcmtlci55LCBpKTtcbiAgICAgICAgICBkaXN0ID0gdGhpcy5jYWxjdWxhdGVEaXN0VG9DdXJ2ZUxpbmUoaSwgeCwgeSwgZnJvbU1hcmtlciwgdG9NYXJrZXIsIGNvbnRyb2xQb2ludCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlzdCA9IHRoaXMuY2FsY3VsYXRlRGlzdFRvU3RyYWlnaHRMaW5lKHgsIHksIHBGcm9tLCBwVG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIW1pbkRpc3QgJiYgZGlzdCAhPT0gbnVsbCAmJiBkaXN0IDwgNSkgfHwgbWluRGlzdCAmJiBkaXN0ICE9PSBudWxsICYmIGRpc3QgPCBtaW5EaXN0KSB7XG4gICAgICAgICAgbWluRGlzdCA9IGRpc3Q7XG4gICAgICAgICAgY2FuZGlkYXRlSWR4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlSWR4O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlzdFRvU3RyYWlnaHRMaW5lKHg6IG51bWJlciwgeTogbnVtYmVyLCBwMTogREcuUG9pbnQsIHAyOiBERy5Qb2ludCk6IG51bWJlciB8IG51bGwge1xuICAgIC8qIGNhbGN1bGF0aW5nIGNvb3JkaW5hdGVzIG9mIGEgcmVjdCBhcm91bmQgYSBsaW5lLiBJZiBjdXJzb3IgY29vcmRzIGFyZSBvdXRzaWRlIHRoaXMgcmVjdCAtIGFzc3VtZSB0aGF0XG4gICAgICAgIHBvaW50IGlzIG5vdCBvbiBsaW5lIGFuZCBkbyBub3QgY2FsY3VsYXRlIGRpc3RhbmNlIHRvIGxpbmUgKi9cbiAgICBjb25zdCB4TWluID0gTWF0aC5taW4ocDEueCwgcDIueCk7XG4gICAgY29uc3QgeE1heCA9IE1hdGgubWF4KHAxLngsIHAyLngpO1xuICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1pbihwMS55LCBwMi55KTtcbiAgICBjb25zdCB5TWF4ID0gTWF0aC5tYXgocDEueSwgcDIueSk7XG5cbiAgICAvL2FkZGluZyBhIGNvdXBsZSBvZiBwaXhlbHMgdG8gaW5jcmVhc2UgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgcmVjdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG4gICAgcmV0dXJuIHggPj0geE1pbiAtIHRocmVzaG9sZCAmJiB4IDw9IHhNYXggKyB0aHJlc2hvbGQgJiYgeSA+PSB5TWluIC0gdGhyZXNob2xkICYmIHkgPD0geU1heCArIHRocmVzaG9sZCA/XG4gICAgICB0aGlzLmRpc3RUb1N0cmFpZ2h0TGluZVNlZ21lbnQoeCwgeSwgcDEsIHAyKSA6XG4gICAgICBudWxsO1xuICB9XG5cbiAgZGlzdFRvU3RyYWlnaHRMaW5lU2VnbWVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgcDE6IERHLlBvaW50LCBwMjogREcuUG9pbnQpIHtcbiAgICBjb25zdCBkaXN0ID0gKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpID0+IE1hdGgucG93KCh4MSAtIHgyKSwgMikgKyBNYXRoLnBvdygoeTEgLSB5MiksIDIpO1xuICAgIGNvbnN0IGwgPSBkaXN0KHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgIGlmIChsID09IDApIHJldHVybiBkaXN0KHgsIHksIHAxLngsIHAxLnkpO1xuICAgIGxldCB0ID0gKCh4IC0gcDEueCkgKiAocDIueCAtIHAxLngpICsgKHkgLSBwMS55KSAqIChwMi55IC0gcDEueSkpIC8gbDtcbiAgICB0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpO1xuICAgIHJldHVybiBkaXN0KHgsIHksIHAxLnggKyB0ICogKHAyLnggLSBwMS54KSwgcDEueSArIHQgKiAocDIueSAtIHAxLnkpKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpc3RUb0N1cnZlTGluZShpOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyLCBwMTogREcuUG9pbnQsIHAyOiBERy5Qb2ludCxcbiAgICBwYzogREcuUG9pbnQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAvKiBjYWxjdWxhdGluZyBjb29yZGluYXRlcyBvZiBhIHJlY3QgYXJvdW5kIGEgbGluZS4gSWYgY3Vyc29yIGNvb3JkcyBhcmUgb3V0c2lkZSB0aGlzIHNoYXBlIC0gYXNzdW1lIHRoYXRcbiAgICAgICAgcG9pbnQgaXMgbm90IG9uIGxpbmUgYW5kIGRvIG5vdCBjYWxjdWxhdGUgZGlzdGFuY2UgdG8gbGluZSAqL1xuICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1pbihwMS54LCBwMi54LCBwYy54KTtcbiAgICBjb25zdCB4TWF4ID0gTWF0aC5tYXgocDEueCwgcDIueCwgcGMueCk7XG4gICAgY29uc3QgeU1pbiA9IE1hdGgubWluKHAxLnksIHAyLnksIHBjLnkpO1xuICAgIGNvbnN0IHlNYXggPSBNYXRoLm1heChwMS55LCBwMi55LCBwYy55KTtcblxuICAgIC8vYWRkaW5nIGEgY291cGxlIG9mIHBpeGVscyB0byBpbmNyZWFzZSB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSByZWN0XG4gICAgY29uc3QgdGhyZXNob2xkID0gMjtcbiAgICBpZiAoeCA+PSB4TWluIC0gdGhyZXNob2xkICYmIHggPD0geE1heCArIHRocmVzaG9sZCAmJiB5ID49IHlNaW4gLSB0aHJlc2hvbGQgJiYgeSA8PSB5TWF4ICsgdGhyZXNob2xkKSB7XG4gICAgICBjb25zdCB3ID0geE1heCAtIHhNaW47XG4gICAgICBjb25zdCBoID0geU1heCAtIHlNaW47XG4gICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVEaXN0VG9DdXJ2ZUluUmVjdCh4LCB5LCBwMSwgcGMsIHAyLCB3LCBoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjYWxjdWxhdGVEaXN0VG9DdXJ2ZUluUmVjdCh4OiBudW1iZXIsIHk6IG51bWJlciwgcDA6IERHLlBvaW50LCBwMTogREcuUG9pbnQsIHAyOiBERy5Qb2ludCxcbiAgICB3OiBudW1iZXIsIGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RlcExlbiA9IDM7XG4gICAgY29uc3Qgc3RlcHNOdW0gPSBNYXRoLmZsb29yKCh3ICsgaCkgLyBzdGVwTGVuKTtcbiAgICBjb25zdCBkZWx0YVQgPSAxIC8gc3RlcHNOdW07XG4gICAgY29uc3QgYXJyWCA9IG5ldyBVaW50MzJBcnJheShzdGVwc051bSk7XG4gICAgY29uc3QgYXJyWSA9IG5ldyBVaW50MzJBcnJheShzdGVwc051bSk7XG4gICAgY29uc3QgbWF4SFcgPSBuZXcgVWludDMyQXJyYXkoc3RlcHNOdW0pO1xuICAgIGxldCBtaW5TdW1IVzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY2FuZGlkYXRlSWR4cyA9IG5ldyBCaXRBcnJheShzdGVwc051bSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJYLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0ID0gaSAqIGRlbHRhVDtcbiAgICAgIGNvbnN0IHhPbkN1cnZlID0gTWF0aC5wb3coKDEgLSB0KSwgMikgKiBwMC54ICsgMiAqIHQgKiAoMSAtIHQpICogcDEueCArIE1hdGgucG93KHQsIDIpICogcDIueDtcbiAgICAgIGNvbnN0IHlPbkN1cnZlID0gTWF0aC5wb3coKDEgLSB0KSwgMikgKiBwMC55ICsgMiAqIHQgKiAoMSAtIHQpICogcDEueSArIE1hdGgucG93KHQsIDIpICogcDIueTtcbiAgICAgIGNvbnN0IHJlY3RXID0gTWF0aC5hYnMoeCAtIHhPbkN1cnZlKTtcbiAgICAgIGNvbnN0IHJlY3RIID0gTWF0aC5hYnMoeSAtIHlPbkN1cnZlKTtcbiAgICAgIGNvbnN0IHN1bUhXID0gcmVjdFcgKyByZWN0SDtcbiAgICAgIGlmICghbWluU3VtSFcgfHwgbWluU3VtSFcgPiBzdW1IVylcbiAgICAgICAgbWluU3VtSFcgPSBzdW1IVztcbiAgICAgIG1heEhXW2ldID0gTWF0aC5tYXgocmVjdFcsIHJlY3RIKTtcbiAgICAgIGFyclhbaV0gPSB4T25DdXJ2ZTtcbiAgICAgIGFycllbaV0gPSB5T25DdXJ2ZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJYLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF4SFdbaV0gPCBtaW5TdW1IVyEpXG4gICAgICAgIGNhbmRpZGF0ZUlkeHMuc2V0Qml0KGksIHRydWUsIGZhbHNlKTtcbiAgICB9XG4gICAgbGV0IG1pbkRpc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IGogPSAtMTsgKGogPSBjYW5kaWRhdGVJZHhzLmZpbmROZXh0KGopKSAhPT0gLTE7KSB7XG4gICAgICBjb25zdCBkaXN0ID0gTWF0aC5oeXBvdCgoYXJyWFtqXSAtIHgpLCAoYXJyWVtqXSAtIHkpKTtcbiAgICAgIGlmICghbWluRGlzdCB8fCBtaW5EaXN0ID4gZGlzdClcbiAgICAgICAgbWluRGlzdCA9IGRpc3Q7XG4gICAgfVxuICAgIHJldHVybiBtaW5EaXN0ITtcbiAgfVxuXG4gIGdldExpbmVMZW5ndGgocDF4OiBudW1iZXIsIHAxeTogbnVtYmVyLCBwMng6IG51bWJlciwgcDJ5OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocDJ4IC0gcDF4LCAyKSArIE1hdGgucG93KHAyeSAtIHAxeSwgMikpO1xuICB9XG5cbiAgZ2V0UG9pbnRPbkRpc3RhbmNlKHAxeDogbnVtYmVyLCBwMXk6IG51bWJlciwgcDJ4OiBudW1iZXIsIHAyeTogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IERHLlBvaW50IHtcbiAgICBjb25zdCBkeCA9IChwMnggLSBwMXgpIC8gbGVuZ3RoO1xuICAgIGNvbnN0IGR5ID0gKHAyeSAtIHAxeSkgLyBsZW5ndGg7XG4gICAgY29uc3QgcDN4ID0gcDJ4IC0gZGlzdGFuY2UgKiBkeDtcbiAgICBjb25zdCBwM3kgPSBwMnkgLSBkaXN0YW5jZSAqIGR5O1xuXG4gICAgcmV0dXJuIG5ldyBERy5Qb2ludChwM3gsIHAzeSk7XG4gIH1cblxuICBmaW5kQ29udHJvbFBvaW50KGlkeDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBpPzogbnVtYmVyKTogREcuUG9pbnQge1xuICAgIGNvbnN0IG1pZFggPSB4MSArICh4MiAtIHgxKSAvIDI7XG4gICAgY29uc3QgbWlkWSA9IHkxICsgKHkyIC0geTEpIC8gMjtcbiAgICBsZXQgZHggPSBtaWRYIC0geDE7XG4gICAgbGV0IGR5ID0gbWlkWSAtIHkxO1xuICAgIGNvbnN0IGRpc3QgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIGR4IC89IGRpc3Q7XG4gICAgZHkgLz0gZGlzdDtcbiAgICBjb25zdCBwZXJwZW5kaWN1bGFyTGVuID0gNTAgKiBNYXRoLmNlaWwoaWR4IC8gMik7XG4gICAgcmV0dXJuIGlkeCAlIDIgPT09IDAgP1xuICAgICAgbmV3IERHLlBvaW50KG1pZFggKyAocGVycGVuZGljdWxhckxlbiAvIDIpICogZHksIG1pZFkgLSAocGVycGVuZGljdWxhckxlbiAvIDIpICogZHgpIDpcbiAgICAgIG5ldyBERy5Qb2ludChtaWRYIC0gKHBlcnBlbmRpY3VsYXJMZW4gLyAyKSAqIGR5LCBtaWRZICsgKHBlcnBlbmRpY3VsYXJMZW4gLyAyKSAqIGR4KTtcbiAgfVxuXG4gIGNhbnZhc0Fycm93KHBhdGg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYXJyb3dFbmRYOiBudW1iZXIsIGFycm93RW5kWTogbnVtYmVyLCBxdWFkWDogbnVtYmVyLCBxdWFkWTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgYXJyb3dBbmdsZSA9IE1hdGguYXRhbjIocXVhZFggLSBhcnJvd0VuZFgsIHF1YWRZIC0gYXJyb3dFbmRZKSArIE1hdGguUEk7XG4gICAgcGF0aC5tb3ZlVG8oYXJyb3dFbmRYIC0gKHRoaXMuYXJyb3dXaWR0aCAqIE1hdGguc2luKGFycm93QW5nbGUgLSBNYXRoLlBJIC8gMTApKSxcbiAgICAgIGFycm93RW5kWSAtICh0aGlzLmFycm93V2lkdGggKiBNYXRoLmNvcyhhcnJvd0FuZ2xlIC0gTWF0aC5QSSAvIDEwKSkpO1xuICAgIHBhdGgubGluZVRvKGFycm93RW5kWCwgYXJyb3dFbmRZKTtcbiAgICBwYXRoLmxpbmVUbyhhcnJvd0VuZFggLSAodGhpcy5hcnJvd1dpZHRoICogTWF0aC5zaW4oYXJyb3dBbmdsZSArIE1hdGguUEkgLyAxMCkpLFxuICAgICAgYXJyb3dFbmRZIC0gKHRoaXMuYXJyb3dXaWR0aCAqIE1hdGguY29zKGFycm93QW5nbGUgKyBNYXRoLlBJIC8gMTApKSk7XG4gIH1cbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ==","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {\n monomerToShort,\n NOTATION,\n pickUpPalette,\n TAGS as bioTAGS,\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {calculateScores, SCORE} from '@datagrok-libraries/bio/src/utils/macromolecule/scoring';\nimport {Options} from '@datagrok-libraries/utils/src/type-declarations';\nimport {DistanceMatrix} from '@datagrok-libraries/ml/src/distance-matrix';\nimport {BitArrayMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {TAGS as _treeTAGS} from '@datagrok-libraries/bio/src/trees';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\nimport wu from 'wu';\nimport * as rxjs from 'rxjs';\nimport $ from 'cash-dom';\n\nimport * as C from './utils/constants';\nimport {COLUMN_NAME, COLUMNS_NAMES} from './utils/constants';\nimport * as type from './utils/types';\nimport {PeptidesSettings} from './utils/types';\nimport {\n areParametersEqual,\n calculateSelected,\n getSelectionBitset,\n highlightMonomerPosition,\n initSelection,\n modifySelection,\n mutationCliffsToMaskInfo,\n scaleActivity,\n} from './utils/misc';\nimport {ISARViewer, MonomerPosition, MostPotentResidues, SARViewer} from './viewers/sar-viewer';\nimport * as CR from './utils/cell-renderer';\nimport {mutationCliffsWidget} from './widgets/mutation-cliffs';\nimport {getDistributionWidget, PeptideViewer} from './widgets/distribution';\nimport {CLUSTER_TYPE, ILogoSummaryTable, LogoSummaryTable, LST_PROPERTIES} from './viewers/logo-summary';\nimport {getSettingsDialog} from './widgets/settings';\nimport {_package} from './package';\nimport {calculateMonomerPositionStatistics} from './utils/algorithms';\nimport {getSelectionWidget} from './widgets/selection';\n\nimport {MmDistanceFunctionsNames}\n from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport {ITSNEOptions, IUMAPOptions}\n from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reducer';\nimport {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';\nimport {showMonomerTooltip} from './utils/tooltips';\nimport {AggregationColumns, MonomerPositionStats} from './utils/statistics';\nimport {splitAlignedSequences} from '@datagrok-libraries/bio/src/utils/splitter';\nimport {getDbscanWorker} from '@datagrok-libraries/math';\nimport {markovCluster} from '@datagrok-libraries/ml/src/MCL/clustering-view';\nimport {DistanceAggregationMethods} from '@datagrok-libraries/ml/src/distance-matrix/types';\nimport {ClusterMaxActivityViewer, IClusterMaxActivity} from './viewers/cluster-max-activity-viewer';\nimport {MCL_OPTIONS_TAG, MCLSerializableOptions} from '@datagrok-libraries/ml/src/MCL';\n\nexport enum VIEWER_TYPE {\n MONOMER_POSITION = 'Monomer-Position',\n MOST_POTENT_RESIDUES = 'Most Potent Residues',\n LOGO_SUMMARY_TABLE = 'Logo Summary Table',\n DENDROGRAM = 'Dendrogram',\n CLUSTER_MAX_ACTIVITY = 'Active peptide selection',\n}\n\nexport type CachedWebLogoTooltip = { bar: string, tooltip: HTMLDivElement | null };\n\n/**\n * Peptides model class\n * Controls analysis settings and initialization, collaborative filtering and property panel.\n */\nexport class PeptidesModel {\n // Tag for storing model instance in DataFrame temp\n static modelName = 'peptidesModel';\n\n // Prevents firing bitset changed event if not initialized\n isBitsetChangedInitialized = false;\n // Prevents overriding user selection\n isUserChangedSelection = true;\n\n df: DG.DataFrame;\n _dm: DistanceMatrix | null = null;\n // Prevents redundant intialization\n isInitialized = false;\n // Prevents duplicating ribbon\n isRibbonSet = false;\n // Cached stats for WebLogo selection for efficient rendering\n webLogoSelectedMonomers: type.SelectionStats = {};\n // WebLogo bounds used for interactivity (e.g. tooltips, selection)\n webLogoBounds: CR.WebLogoBounds = {};\n // Cached WebLogo tooltip. Because tooltip is requested for each mouse movement, it is cached unless mouse entered\n // bounds of other monomer in WebLogo\n cachedWebLogoTooltip: CachedWebLogoTooltip = {bar: '', tooltip: null};\n // Prevents from redundant grid processing\n _layoutEventInitialized = false;\n // Stores subscriptions to remove after analysis is closed\n subs: rxjs.Subscription[] = [];\n // Prevents from redundant unhilight operation\n isHighlighting: boolean = false;\n // Fires bitset changed to properly render selection in scroller bar\n controlFire: boolean = false;\n // Indicates the source of accordion construction\n accordionSource: VIEWER_TYPE | null = null;\n // sequence space viewer\n _sequenceSpaceViewer: DG.ScatterPlotViewer | null = null;\n //MCL viewer\n _mclViewer: DG.ScatterPlotViewer | null = null;\n /**\n * @param {DG.DataFrame}dataFrame - DataFrame to use for analysis\n */\n private constructor(dataFrame: DG.DataFrame) {\n this.df = dataFrame;\n }\n\n // Monomer-Position statistics cache\n _monomerPositionStats: MonomerPositionStats | null = null;\n\n /**\n * @return {MonomerPositionStats} - Monomer-Position statistics\n */\n get monomerPositionStats(): MonomerPositionStats | null {\n if (this._monomerPositionStats !== null)\n return this._monomerPositionStats;\n\n\n const scaledActivityColumn = this.getScaledActivityColumn();\n if (this.positionColumns === null || scaledActivityColumn === null)\n return null;\n\n\n this._monomerPositionStats ??= calculateMonomerPositionStatistics(scaledActivityColumn,\n this.df.filter, this.positionColumns);\n return this._monomerPositionStats;\n }\n\n // Analysis Table View\n _analysisView?: DG.TableView;\n\n /**\n * @return {DG.TableView}- Analysis table view\n */\n get analysisView(): DG.TableView {\n if (this._analysisView === undefined) {\n this._analysisView = wu(grok.shell.tableViews).find(({dataFrame}) => dataFrame?.getTag(DG.TAGS.ID) === this.id);\n if (typeof this._analysisView === 'undefined')\n this._analysisView = grok.shell.addTableView(this.df);\n }\n\n if (this.df.getTag(C.TAGS.MULTIPLE_VIEWS) !== '1' && !this._layoutEventInitialized)\n grok.shell.v = this._analysisView;\n\n\n this._analysisView.grid.invalidate();\n return this._analysisView;\n }\n\n // Peptides analysis settings\n _settings: type.PeptidesSettings | null = null;\n _sequenceSpaceCols: string[] = [];\n _mclCols: string[] = [];\n\n /**\n * @return {type.PeptidesSettings}- Peptides analysis settings\n */\n get settings(): type.PeptidesSettings | null {\n const settingsStr = this.df.getTag(C.TAGS.SETTINGS);\n if (settingsStr == null)\n return null;\n\n\n this._settings ??= JSON.parse(settingsStr);\n return this._settings!;\n }\n\n /**\n * @param {type.PartialPeptidesSettings} s - Peptides analysis settings\n */\n set settings(s: type.PartialPeptidesSettings) {\n const newSettingsEntries = Object.entries(s) as ([keyof type.PeptidesSettings, never])[];\n // Holds updated settings categories\n const oldSeqSpaceOptions: Partial<type.SequenceSpaceParams> =\n Object.assign({}, this.settings?.sequenceSpaceParams ?? {});\n const updateVars: Set<string> = new Set();\n for (const [key, value] of newSettingsEntries) {\n this.settings![key] = value;\n switch (key) {\n case 'activityColumnName':\n case 'activityScaling':\n updateVars.add('activity');\n updateVars.add('stats');\n break;\n case 'showDendrogram':\n updateVars.add('dendrogram');\n break;\n case 'showClusterMaxActivity':\n updateVars.add('clusterMaxActivity');\n break;\n case 'showSequenceSpace':\n updateVars.add('showSequenceSpace');\n break;\n case 'showLogoSummaryTable':\n updateVars.add('logoSummaryTable');\n break;\n case 'showMonomerPosition':\n updateVars.add('monomerPosition');\n break;\n case 'showMostPotentResidues':\n updateVars.add('mostPotentResidues');\n break;\n case 'columns':\n updateVars.add('columns');\n break;\n case 'sequenceSpaceParams':\n updateVars.add('sequenceSpaceParams');\n break;\n case 'mclSettings':\n updateVars.add('mclSettings');\n break;\n }\n }\n // Write updated settings\n this.df.setTag('settings', JSON.stringify(this._settings));\n if (!this.isInitialized)\n return;\n\n if (updateVars.has('sequenceSpaceParams')) {\n const newSeqSpaceOptions = this.settings!.sequenceSpaceParams!;\n if (!Object.entries(newSeqSpaceOptions).some(([key, value]) =>\n oldSeqSpaceOptions[key as keyof type.SequenceSpaceParams] !== value && key !== 'epsilon' &&\n key !== 'minPts' && key !== 'clusterEmbeddings')) {\n updateVars.delete('sequenceSpaceParams');\n if (this.settings!.sequenceSpaceParams.clusterEmbeddings)\n updateVars.add('clusterParams');\n }\n }\n if (updateVars.has('sequenceSpaceParams'))\n updateVars.delete('clusterParams');\n\n // Apply new settings\n for (const variable of updateVars) {\n switch (variable) {\n case 'activity':\n this.createScaledCol();\n break;\n case 'stats':\n this.webLogoSelection = initSelection(this.positionColumns!);\n this.webLogoBounds = {};\n this.cachedWebLogoTooltip = {\n bar: '',\n tooltip: null,\n };\n // Invalidate monomer-position statistics. The next time it gets accessed with getter, it will be recalculated\n this._monomerPositionStats = null;\n break;\n case 'dendrogram':\n this.settings!.showDendrogram ? this.addDendrogram() : this.closeViewer(VIEWER_TYPE.DENDROGRAM);\n break;\n case 'clusterMaxActivity':\n this.settings!.showClusterMaxActivity ? this.addClusterMaxActivityViewer() :\n this.closeViewer(VIEWER_TYPE.CLUSTER_MAX_ACTIVITY);\n break;\n case 'logoSummaryTable':\n this.settings!.showLogoSummaryTable ? this.addLogoSummaryTable() :\n this.closeViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE);\n break;\n case 'monomerPosition':\n this.settings!.showMonomerPosition ? this.addMonomerPosition() :\n this.closeViewer(VIEWER_TYPE.MONOMER_POSITION);\n break;\n case 'mostPotentResidues':\n this.settings!.showMostPotentResidues ? this.addMostPotentResidues() :\n this.closeViewer(VIEWER_TYPE.MOST_POTENT_RESIDUES);\n break;\n case 'columns':\n const lst = this.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable;\n lst._viewerGrid = null;\n lst._logoSummaryTable = null;\n lst.render();\n const mpr = this.findViewer(VIEWER_TYPE.MOST_POTENT_RESIDUES) as LogoSummaryTable;\n mpr._viewerGrid = null;\n mpr.render();\n break;\n case 'sequenceSpaceParams':\n case 'showSequenceSpace':\n if (this.settings!.showSequenceSpace)\n this.addSequenceSpace({clusterEmbeddings: this.settings!.sequenceSpaceParams?.clusterEmbeddings});\n break;\n case 'clusterParams':\n this.clusterEmbeddings();\n break;\n case 'mclSettings':\n this.addMCLClusters();\n break;\n }\n }\n }\n\n // Current Monomer-Position selection that came from WebLogo in header\n _webLogoSelection: type.Selection | null = null;\n\n /**\n * @return {type.Selection} - Current Monomer-Position selection that came from WebLogo in header\n */\n get webLogoSelection(): type.Selection {\n const tagSelection = this.df.getTag(`${C.SUFFIXES.WL}${C.TAGS.INVARIANT_MAP_SELECTION}`);\n this._webLogoSelection ??= tagSelection === null && this.positionColumns !== null ?\n initSelection(this.positionColumns) : JSON.parse(tagSelection ?? `{}`);\n return this._webLogoSelection!;\n }\n\n /**\n * @param {type.Selection} selection - Current Monomer-Position selection that came from WebLogo in header\n */\n set webLogoSelection(selection: type.Selection) {\n this._webLogoSelection = selection;\n this.df.setTag(`${C.SUFFIXES.WL}${C.TAGS.INVARIANT_MAP_SELECTION}`, JSON.stringify(selection));\n this.fireBitsetChanged(null);\n this.analysisView.grid.invalidate();\n }\n\n /**\n * @return {DG.Column} - Array of columns that represent monomers at specific position in sequences\n */\n get positionColumns(): DG.Column<string>[] | null {\n const positionColumns = wu(this.df.columns.byTags({[C.TAGS.POSITION_COL]: `${true}`})).toArray();\n if (positionColumns.length === 0)\n return null;\n\n\n return positionColumns;\n }\n\n /**\n * @return {string} - DataFrame ID\n */\n get id(): string {\n return this.df.getTag(DG.TAGS.ID)!;\n }\n\n /**\n * @return {string} - Sequence alphabet\n */\n get alphabet(): string {\n const col = this.df.getCol(this.settings!.sequenceColumnName);\n return col.getTag(bioTAGS.alphabet);\n }\n\n /**\n * Creates an instance of PeptidesModel or returns existing if present\n * @param {DG.DataFrame} dataFrame - DataFrame to use for analysis\n * @return {PeptidesModel} - PeptidesModel instance\n */\n static getInstance(dataFrame: DG.DataFrame): PeptidesModel {\n if (dataFrame.columns.contains(C.COLUMNS_NAMES.ACTIVITY_SCALED) &&\n !dataFrame.columns.contains(C.COLUMNS_NAMES.ACTIVITY))\n dataFrame.getCol(C.COLUMNS_NAMES.ACTIVITY_SCALED).name = C.COLUMNS_NAMES.ACTIVITY;\n\n\n dataFrame.temp[PeptidesModel.modelName] ??= new PeptidesModel(dataFrame);\n return dataFrame.temp[PeptidesModel.modelName] as PeptidesModel;\n }\n\n /**\n * Modifies WebLogo selection. If shift and ctrl keys are both pressed, it removes WebLogo from\n * selection. If only shift key is pressed, it adds WebLogo to selection. If only ctrl key is pressed, it\n * changes WebLogo presence in selection. If none of the keys is pressed, it sets the WebLogo as the\n * only selected one.\n * @param {type.SelectionItem} monomerPosition - cluster to modify selection with.\n * @param {type.SelectionOptions} options - selection options.\n * @param {boolean} notify - flag indicating if bitset changed event should fire.\n */\n modifyWebLogoSelection(monomerPosition: type.SelectionItem, options: type.SelectionOptions = {\n shiftPressed: false,\n ctrlPressed: false,\n }, notify: boolean = true): void {\n if (notify)\n this.webLogoSelection = modifySelection(this.webLogoSelection, monomerPosition, options);\n else\n this._webLogoSelection = modifySelection(this.webLogoSelection, monomerPosition, options);\n }\n\n /**\n * @return {DG.BitSet} - Bitset of visible selection\n */\n getVisibleSelection(): DG.BitSet {\n return this.df.selection.clone().and(this.df.filter);\n }\n\n /**\n * @return {DG.Accordion | null} - Accordion with analysis info based on current selection\n */\n createAccordion(): DG.Accordion | null {\n const trueModel: PeptidesModel | undefined = grok.shell.t?.temp[PeptidesModel.modelName];\n if (!trueModel)\n return null;\n\n\n const acc = ui.accordion('Peptides analysis panel');\n acc.root.style.width = '100%';\n const filterAndSelectionBs = trueModel.getVisibleSelection();\n const filteredTitlePart = trueModel.df.filter.anyFalse ? ` among ${trueModel.df.filter.trueCount} filtered` :\n '';\n const getSelectionString = (selection: type.Selection): string => {\n const selectedMonomerPositions: string[] = [];\n for (const [pos, monomerList] of Object.entries(selection)) {\n for (const monomer of monomerList)\n selectedMonomerPositions.push(`${pos}:${monomer}`);\n }\n return selectedMonomerPositions.join(', ');\n };\n\n // Logo Summary Table viewer selection overview\n const trueLSTViewer = trueModel.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable | null;\n const selectionDescription: HTMLElement[] = [];\n const selectedClusters: string = (trueLSTViewer === null ? [] :\n trueLSTViewer.clusterSelection[CLUSTER_TYPE.ORIGINAL].concat(trueLSTViewer.clusterSelection[CLUSTER_TYPE.CUSTOM]))\n .join(', ');\n if (selectedClusters.length !== 0) {\n selectionDescription.push(ui.h1('Logo summary table selection'));\n selectionDescription.push(ui.divText(`Selected clusters: ${selectedClusters}`));\n }\n\n // Monomer-Position viewer selection overview\n const trueMPViewer = trueModel.findViewer(VIEWER_TYPE.MONOMER_POSITION) as MonomerPosition | null;\n const selectedMonomerPositions = getSelectionString(trueMPViewer?.invariantMapSelection ?? {});\n const selectedMutationCliffs = getSelectionString(trueMPViewer?.mutationCliffsSelection ?? {});\n if (selectedMonomerPositions.length !== 0 || selectedMutationCliffs.length !== 0)\n selectionDescription.push(ui.h1('Monomer-Position viewer selection'));\n\n\n if (selectedMonomerPositions.length !== 0)\n selectionDescription.push(ui.divText(`Selected monomer-positions: ${selectedMonomerPositions}`));\n\n\n if (selectedMutationCliffs.length !== 0)\n selectionDescription.push(ui.divText(`Selected mutation cliffs pairs: ${selectedMutationCliffs}`));\n\n\n // Most Potent Residues viewer selection overview\n const trueMPRViewer = trueModel.findViewer(VIEWER_TYPE.MOST_POTENT_RESIDUES) as MostPotentResidues | null;\n const selectedMPRMonomerPositions = getSelectionString(trueMPRViewer?.mutationCliffsSelection ?? {});\n if (selectedMPRMonomerPositions.length !== 0) {\n selectionDescription.push(ui.h1('Most Potent Residues viewer selection'));\n selectionDescription.push(ui.divText(`Selected monomer-positions: ${selectedMPRMonomerPositions}`));\n }\n\n // WebLogo selection overview\n const selectedMonomers = getSelectionString(trueModel.webLogoSelection);\n if (selectedMonomers.length !== 0) {\n selectionDescription.push(ui.h1('WebLogo selection'));\n selectionDescription.push(ui.divText(`Selected monomers: ${selectedMonomers}`));\n }\n\n const descritionsHost = ui.div(ui.divV(selectionDescription));\n acc.addTitle(ui.divV([\n ui.h1(`${filterAndSelectionBs.trueCount} selected rows${filteredTitlePart}`),\n descritionsHost,\n ], 'css-gap-small'));\n\n if (filterAndSelectionBs.anyTrue) {\n acc.addPane('Actions', () => {\n try {\n const newView = ui.label('New view');\n $(newView).addClass('d4-link-action');\n newView.onclick = (): string => trueModel.createNewView();\n newView.onmouseover = (ev): void =>\n ui.tooltip.show('Creates a new view from current selection', ev.clientX + 5, ev.clientY + 5);\n if (trueLSTViewer === null)\n return ui.divV([newView]);\n\n\n const newCluster = ui.label('New cluster');\n $(newCluster).addClass('d4-link-action');\n newCluster.onclick = (): void => {\n if (trueLSTViewer === null)\n throw new Error('Logo summary table viewer is not found');\n\n\n trueLSTViewer.clusterFromSelection();\n };\n newCluster.onmouseover = (ev): void =>\n ui.tooltip.show('Creates a new cluster from selection', ev.clientX + 5, ev.clientY + 5);\n\n const removeCluster = ui.label('Remove cluster');\n $(removeCluster).addClass('d4-link-action');\n removeCluster.onclick = (): void => {\n const lstViewer = trueModel.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable | null;\n if (lstViewer === null)\n throw new Error('Logo summary table viewer is not found');\n\n\n lstViewer.removeCluster();\n };\n removeCluster.onmouseover = (ev): void =>\n ui.tooltip.show('Removes currently selected custom cluster', ev.clientX + 5, ev.clientY + 5);\n removeCluster.style.visibility = trueLSTViewer.clusterSelection[CLUSTER_TYPE.CUSTOM].length === 0 ? 'hidden' :\n 'visible';\n\n return ui.divV([newView, newCluster, removeCluster]);\n } catch (e) {\n const errorDiv = ui.divText('Error in Actions');\n ui.tooltip.bind(errorDiv, String(e));\n return errorDiv;\n }\n }, true);\n }\n\n // Get the source of the bitset change and find viewers that share the same parameters as source\n let requestSource: SARViewer | LogoSummaryTable | PeptidesSettings | null = trueModel.settings;\n const viewers: (PeptideViewer | PeptidesSettings | null)[] = [trueMPViewer, trueMPRViewer, trueLSTViewer]\n .filter((v) => {\n if (v === null)\n return false;\n\n\n if (v.type !== this.accordionSource)\n return true;\n\n\n requestSource = v;\n return false;\n });\n\n if (requestSource === null)\n throw new Error('PeptidesError: Model is the source of accordion but is not initialized');\n\n\n if (requestSource !== trueModel.settings)\n viewers.push(trueModel.settings);\n\n\n const notEmpty = (v: PeptideViewer | PeptidesSettings | null): v is PeptideViewer | PeptidesSettings =>\n v !== null && areParametersEqual(requestSource!, v) && (v !== trueModel.settings || trueModel.isInitialized);\n const panelDataSources = viewers.filter(notEmpty);\n panelDataSources.push(requestSource);\n const combinedBitset: DG.BitSet | null = DG.BitSet.create(trueModel.df.rowCount);\n for (const panelDataSource of panelDataSources) {\n const bitset =\n (panelDataSource === this.settings) ? getSelectionBitset(this.webLogoSelection, this.monomerPositionStats!) :\n (panelDataSource instanceof LogoSummaryTable) ?\n getSelectionBitset(panelDataSource.clusterSelection, panelDataSource.clusterStats) :\n (panelDataSource instanceof SARViewer) ?\n getSelectionBitset(panelDataSource.mutationCliffsSelection,\n mutationCliffsToMaskInfo(panelDataSource.mutationCliffs ?? new Map(), trueModel.df.rowCount)) :\n null;\n if (bitset !== null)\n combinedBitset.or(bitset);\n\n\n if (panelDataSource instanceof MonomerPosition) {\n const invariantMapSelectionBitset = getSelectionBitset(panelDataSource.invariantMapSelection,\n panelDataSource.monomerPositionStats);\n if (invariantMapSelectionBitset !== null)\n combinedBitset.or(invariantMapSelectionBitset);\n }\n }\n\n const sarViewer = requestSource as any as SARViewer | LogoSummaryTable;\n if (requestSource !== trueModel.settings && !(sarViewer instanceof LogoSummaryTable) &&\n sarViewer.mutationCliffs != null) {\n // MC and Selection are left\n acc.addPane('Mutation Cliffs pairs', () => mutationCliffsWidget(trueModel.df, {\n mutationCliffs: sarViewer.mutationCliffs!,\n mutationCliffsSelection: sarViewer.mutationCliffsSelection,\n gridColumns: trueModel.analysisView.grid.columns,\n sequenceColumnName: sarViewer.sequenceColumnName,\n positionColumns: sarViewer.positionColumns,\n activityCol: sarViewer.getScaledActivityColumn(),\n }).root, true);\n }\n const isModelSource = requestSource === trueModel.settings;\n const totalMonomerPositionSelection = isModelSource ? this.webLogoSelection :\n (requestSource instanceof MonomerPosition) ? requestSource.invariantMapSelection : {};\n const clusterSelection = (requestSource instanceof LogoSummaryTable) ? requestSource.clusterSelection :\n trueLSTViewer?.clusterSelection ?? {};\n acc.addPane('Distribution', () => {\n try {\n return getDistributionWidget(trueModel.df, {\n peptideSelection: combinedBitset,\n columns: isModelSource ? trueModel.settings!.columns ?? {} :\n (requestSource as PeptideViewer).getAggregationColumns(),\n activityCol: isModelSource ? trueModel.getScaledActivityColumn()! :\n (requestSource as PeptideViewer).getScaledActivityColumn(),\n monomerPositionSelection: totalMonomerPositionSelection,\n clusterSelection: clusterSelection,\n clusterColName: trueLSTViewer?.clustersColumnName,\n });\n } catch (e) {\n const errorDiv = ui.divText('Error in Distribution');\n ui.tooltip.bind(errorDiv, String(e));\n return errorDiv;\n }\n }, true);\n const areObjectsEqual = (o1?: AggregationColumns | null, o2?: AggregationColumns | null): boolean => {\n if (o1 == null || o2 == null)\n return false;\n\n\n for (const [key, value] of Object.entries(o1)) {\n if (value !== o2[key])\n return false;\n }\n return true;\n };\n acc.addPane('Selection', () => {\n try {\n return getSelectionWidget(trueModel.df, {\n positionColumns: isModelSource ? trueModel.positionColumns! :\n (requestSource as SARViewer | LogoSummaryTable).positionColumns,\n columns: isModelSource ? trueModel.settings!.columns ?? {} :\n (requestSource as SARViewer | LogoSummaryTable).getAggregationColumns(),\n activityColumn: isModelSource ? trueModel.getScaledActivityColumn()! :\n (requestSource as SARViewer | LogoSummaryTable).getScaledActivityColumn(),\n gridColumns: trueModel.analysisView.grid.columns,\n colorPalette: pickUpPalette(trueModel.df.getCol(isModelSource ? trueModel.settings!.sequenceColumnName :\n (requestSource as SARViewer | LogoSummaryTable).sequenceColumnName)),\n tableSelection: trueModel.getCombinedSelection(),\n isAnalysis: trueModel.settings !== null && (isModelSource ||\n areObjectsEqual(trueModel.settings.columns, (requestSource as PeptideViewer).getAggregationColumns())),\n });\n } catch (e) {\n const errorDiv = ui.divText('Error in Selection');\n ui.tooltip.bind(errorDiv, String(e));\n return errorDiv;\n }\n }, true);\n return acc;\n }\n\n /**\n * @param {boolean} isFiltered - Whether to return filtered activity column\n * @return {DG.Column<number> | null} - Scaled activity column\n */\n getScaledActivityColumn(isFiltered: boolean = false): DG.Column<number> | null {\n const scaledActivityColumn = this.df.col(C.COLUMNS_NAMES.ACTIVITY);\n if (isFiltered && scaledActivityColumn !== null) {\n return DG.DataFrame.fromColumns([scaledActivityColumn]).clone(this.df.filter)\n .getCol(scaledActivityColumn.name) as DG.Column<number>;\n }\n return scaledActivityColumn as DG.Column<number> | null;\n }\n\n /**\n * Sets grid properties such as column semtypes, visibility, order, width, renderers and tooltips\n */\n updateGrid(): void {\n this.joinDataFrames();\n this.createScaledCol();\n this.webLogoBounds = {};\n\n const cellRendererOptions: CR.WebLogoCellRendererOptions = {\n selectionCallback: (monomerPosition: type.SelectionItem, options: type.SelectionOptions): void =>\n this.modifyWebLogoSelection(monomerPosition, options),\n unhighlightCallback: (): void => this.unhighlight(),\n colorPalette: () => pickUpPalette(this.df.getCol(this.settings!.sequenceColumnName)),\n webLogoBounds: () => this.webLogoBounds,\n cachedWebLogoTooltip: () => this.cachedWebLogoTooltip,\n highlightCallback: (mp: type.SelectionItem, df: DG.DataFrame, mpStats: MonomerPositionStats): void =>\n highlightMonomerPosition(mp, df, mpStats),\n isSelectionTable: false,\n headerSelectedMonomers: () => this.webLogoSelectedMonomers,\n };\n if (this.monomerPositionStats === null || this.positionColumns === null)\n throw new Error('PeptidesError: Could not updage grid: monomerPositionStats or positionColumns are null');\n\n\n CR.setWebLogoRenderer(this.analysisView.grid, this.monomerPositionStats, this.positionColumns,\n this.getScaledActivityColumn()!, cellRendererOptions);\n if (!this._layoutEventInitialized) {\n grok.events.onViewLayoutApplied.subscribe((layout) => {\n if (layout.view.id === this.analysisView.id)\n this.updateGrid();\n });\n this._layoutEventInitialized = true;\n }\n\n this.setTooltips();\n this.setBitsetCallback();\n this.setGridProperties();\n }\n\n /**\n * Splits sequences and adds position columns to this.df.\n */\n joinDataFrames(): void {\n // append splitSeqDf columns to source table and make sure columns are not added more than once\n const name = this.df.name;\n const cols = this.df.columns;\n const splitSeqDf = splitAlignedSequences(this.df.getCol(this.settings!.sequenceColumnName));\n const positionColumns = splitSeqDf.columns.names();\n for (const colName of positionColumns) {\n let col = this.df.col(colName);\n const newCol = splitSeqDf.getCol(colName);\n if (col !== null)\n cols.remove(colName);\n\n\n const newColCat = newCol.categories;\n const newColData = newCol.getRawData();\n col = cols.addNew(newCol.name, newCol.type).init((i) => newColCat[newColData[i]]);\n col.setTag(C.TAGS.ANALYSIS_COL, `${true}`);\n col.setTag(C.TAGS.POSITION_COL, `${true}`);\n CR.setMonomerRenderer(col, this.alphabet);\n }\n this.df.name = name;\n }\n\n /**\n * Creates scaled activity column\n */\n createScaledCol(): void {\n const sourceGrid = this.analysisView.grid;\n const scaledCol = scaleActivity(this.df.getCol(this.settings!.activityColumnName),\n this.settings!.activityScaling);\n //TODO: make another func\n this.df.columns.replace(COLUMNS_NAMES.ACTIVITY, scaledCol);\n\n sourceGrid.columns.setOrder([scaledCol.name]);\n }\n\n /**\n * Resets rows highlighting\n */\n unhighlight(): void {\n if (!this.isHighlighting)\n return;\n\n\n this.df.rows.highlight(null);\n this.isHighlighting = false;\n }\n\n /**\n * Sets tooltips to analysis grid\n */\n setTooltips(): void {\n this.analysisView.grid.onCellTooltip((cell, x, y) => {\n if (cell.isColHeader && cell.tableColumn?.semType === C.SEM_TYPES.MONOMER)\n return true;\n\n\n if (!(cell.isTableCell && cell.tableColumn?.semType === C.SEM_TYPES.MONOMER))\n return false;\n\n\n showMonomerTooltip(cell.cell.value, x, y);\n return true;\n });\n }\n\n /**\n * Builds total analysis selection that comes from viewers and components\n * @return {DG.BitSet} - Total analysis selection\n */\n getCombinedSelection(): DG.BitSet {\n const combinedSelection = new BitArray(this.df.rowCount, false);\n // Invariant map selection\n const addInvariantMapSelection = (selection: type.Selection, stats: MonomerPositionStats | null): void => {\n for (const [position, monomerList] of Object.entries(selection)) {\n for (const monomer of monomerList) {\n const positionStats = stats?.[position];\n if (typeof positionStats === 'undefined')\n continue;\n\n\n const monomerPositionStats = positionStats[monomer];\n if (typeof monomerPositionStats === 'undefined')\n continue;\n\n\n combinedSelection.or(monomerPositionStats.mask);\n }\n }\n };\n\n addInvariantMapSelection(this.webLogoSelection, this.monomerPositionStats);\n const mpViewer = this.findViewer(VIEWER_TYPE.MONOMER_POSITION) as MonomerPosition | null;\n addInvariantMapSelection(mpViewer?.invariantMapSelection ?? {}, mpViewer?.monomerPositionStats ?? null);\n\n // Mutation cliffs selection\n const addMutationCliffsSelection = (selection: type.Selection, mc: type.MutationCliffs | null): void => {\n for (const [position, monomerList] of Object.entries(selection)) {\n for (const monomer of monomerList) {\n const substitutions = mc?.get(monomer)?.get(position) ?? null;\n if (substitutions === null)\n continue;\n\n\n for (const [key, value] of substitutions.entries()) {\n combinedSelection.setTrue(key);\n for (const v of value)\n combinedSelection.setTrue(v);\n }\n }\n }\n };\n addMutationCliffsSelection(mpViewer?.mutationCliffsSelection ?? {}, mpViewer?.mutationCliffs ?? null);\n\n const mprViewer = this.findViewer(VIEWER_TYPE.MOST_POTENT_RESIDUES) as MostPotentResidues | null;\n addMutationCliffsSelection(mprViewer?.mutationCliffsSelection ?? {}, mprViewer?.mutationCliffs ?? null);\n\n // Cluster selection\n const lstViewer = this.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable | null;\n for (const clustType of Object.keys(lstViewer?.clusterSelection ?? {})) {\n for (const clust of lstViewer!.clusterSelection[clustType] ?? []) {\n const clusterStats = lstViewer!.clusterStats[clustType as CLUSTER_TYPE][clust];\n combinedSelection.or(clusterStats.mask);\n }\n }\n\n return DG.BitSet.fromBytes(combinedSelection.buffer.buffer, combinedSelection.length);\n }\n\n\n /**\n * Sets selection and filter changed callbacks\n */\n setBitsetCallback(): void {\n if (this.isBitsetChangedInitialized)\n return;\n\n\n const selection = this.df.selection;\n const filter = this.df.filter;\n\n const showAccordion = (): void => {\n try {\n const acc = this.createAccordion();\n if (acc === null)\n return;\n\n\n grok.shell.o = acc.root;\n } catch (e) {\n console.error(e);\n }\n };\n\n selection.onChanged.subscribe(() => {\n if (this.controlFire) {\n this.controlFire = false;\n return;\n }\n try {\n if (!this.isUserChangedSelection)\n selection.copyFrom(this.getCombinedSelection(), false);\n } catch (e) {\n _package.logger.debug('Peptides: Error on selection changed');\n _package.logger.debug(e as string);\n } finally {\n showAccordion();\n }\n });\n\n filter.onChanged.subscribe(() => {\n try {\n if (this.controlFire) {\n this.controlFire = false;\n return;\n }\n const lstViewer = this.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable | null;\n if (lstViewer !== null && typeof lstViewer.model !== 'undefined') {\n lstViewer._logoSummaryTable = lstViewer.createLogoSummaryTable() ?? lstViewer._logoSummaryTable;\n lstViewer._viewerGrid = lstViewer.createLogoSummaryTableGrid() ?? lstViewer._viewerGrid;\n lstViewer.render();\n }\n } catch (e) {\n _package.logger.debug('Peptides: Error on filter changed');\n _package.logger.debug(e as string);\n } finally {\n showAccordion();\n }\n });\n\n this.isBitsetChangedInitialized = true;\n }\n\n /**\n * Fires bitset changed event and rebuilds accordion in context panel\n * @param {VIEWER_TYPE | null} source - Source of bitset changed event\n * @param {boolean} fireFilterChanged - Whether to fire filter changed event\n */\n fireBitsetChanged(source: VIEWER_TYPE | null, fireFilterChanged: boolean = false): void {\n this.accordionSource = source;\n if (!this.isBitsetChangedInitialized)\n this.setBitsetCallback();\n\n\n this.isUserChangedSelection = false;\n this.df.selection.fireChanged();\n if (fireFilterChanged)\n this.df.filter.fireChanged();\n\n\n // Fire bitset changed event again to update UI\n this.controlFire = true;\n this.df.selection.fireChanged();\n if (fireFilterChanged)\n this.df.filter.fireChanged();\n\n\n this.isUserChangedSelection = true;\n this.webLogoSelectedMonomers = calculateSelected(this.df);\n }\n\n /**\n * Sets grid properties such\n * @param {DG.IGridSettings} props - Grid properties\n */\n // @ts-ignore TODO: fix after api update\n setGridProperties(props?: DG.IGridSettings): void {\n const sourceGrid = this.analysisView.grid;\n const sourceGridProps = sourceGrid.props;\n sourceGridProps.allowColSelection = props?.allowColSelection ?? false;\n sourceGridProps.allowEdit = props?.allowEdit ?? false;\n sourceGridProps.showReadOnlyNotifications = props?.showReadOnlyNotifications ?? false;\n sourceGridProps.showCurrentRowIndicator = props?.showCurrentRowIndicator ?? false;\n const positionCols = this.positionColumns;\n if (positionCols === null)\n throw new Error('PeptidesError: Could not set grid properties: positionColumns are null');\n\n\n let maxWidth = 10;\n const canvasContext = sourceGrid.canvas.getContext('2d');\n if (canvasContext === null)\n throw new Error('PeptidesError: Could not set grid properties: canvas context is null');\n\n\n for (const positionCol of positionCols) {\n // Longest category\n const maxCategory = monomerToShort(positionCol.categories.reduce((a, b) => a.length > b.length ? a : b), 6);\n // Measure text width of longest category\n const width = Math.ceil(canvasContext.measureText(maxCategory).width);\n maxWidth = Math.max(maxWidth, width);\n }\n\n const posCols = positionCols.map((col) => col.name);\n for (let colIdx = 1; colIdx < this.analysisView.grid.columns.length; ++colIdx) {\n const gridCol = this.analysisView.grid.columns.byIndex(colIdx);\n if (gridCol === null)\n throw new Error(`PeptidesError: Could not get analysis view: grid column with index '${colIdx}' is null`);\n else if (gridCol.column === null) {\n throw new Error(`PeptidesError: Could not get analysis view: grid column with index '${colIdx}' has null ` +\n `column`);\n }\n gridCol.visible = posCols.includes(gridCol.column.name) || (gridCol.column.name === C.COLUMNS_NAMES.ACTIVITY);\n }\n\n setTimeout(() => {\n for (const positionCol of positionCols) {\n const gridCol = sourceGrid.col(positionCol.name);\n if (gridCol === null)\n throw new Error(`PeptidesError: Could not set column width: grid column '${positionCol.name}' is null`);\n\n\n gridCol.width = maxWidth + 15;\n }\n }, 100);\n }\n\n /**\n * Closes peptides viewer\n * @param {VIEWER_TYPE} viewerType - Viewer type to close\n */\n closeViewer(viewerType: VIEWER_TYPE): void {\n const viewer = this.findViewer(viewerType);\n viewer?.detach();\n viewer?.close();\n }\n\n /**\n * Finds viewer node in the analysis view\n * @param {VIEWER_TYPE} viewerType - Viewer type to find\n * @return {DG.DockNode | null} - Viewer node or null if not found\n */\n findViewerNode(viewerType: VIEWER_TYPE): DG.DockNode | null {\n for (const node of this.analysisView.dockManager.rootNode.children) {\n if (node.container.containerElement.innerHTML.includes(viewerType))\n return node;\n }\n return null;\n }\n\n /**\n * Adds Dendrogram viewer to the analysis view\n * @return {Promise<void>}\n */\n async addDendrogram(): Promise<void> {\n const pi = DG.TaskBarProgressIndicator.create('Calculating distance matrix...');\n try {\n // const pepColValues: string[] = this.df.getCol(this.settings!.sequenceColumnName).toList();\n // this._dm ??=\n //new DistanceMatrix(await createDistanceMatrixWorker(pepColValues, StringMetricsNames.Levenshtein));\n // const leafCol = this.df.col('~leaf-id') ?? this.df.columns.addNewString('~leaf-id').init((i) => i.toString());\n // const treeHelper: ITreeHelper = getTreeHelperInstance();\n // // treeHelper.\n // const treeNode = await treeHelper.hierarchicalClusteringByDistance(this._dm, 'ward');\n\n // this.df.setTag(treeTAGS.NEWICK, treeHelper.toNewick(treeNode));\n // const leafOrdering = treeHelper.getLeafList(treeNode).map((leaf) => parseInt(leaf.name));\n // this.analysisView.grid.setRowOrder(leafOrdering);\n // const dendrogramViewer =\n //await this.df.plot.fromType('Dendrogram', {nodeColumnName: leafCol.name}) as DG.JsViewer;\n\n // this.analysisView.dockManager.dock(dendrogramViewer, DG.DOCK_TYPE.LEFT, null, 'Dendrogram', 0.25);\n const dFunc = DG.Func.find({package: 'Dendrogram', name: 'hierarchicalClustering'})[0];\n if (!dFunc || dFunc.inputs.length !== 4)\n throw new Error('Correct dendrogram function is not found');\n await dFunc.apply({\n df: this.df, colNameList: [this.settings!.sequenceColumnName],\n distance: 'euclidean', linkage: 'complete',\n });\n } catch (e) {\n _package.logger.error(e as string);\n } finally {\n pi.close();\n }\n }\n\n /**\n * Analysis initializer\n * @param {PeptidesSettings} settings - Analysis settings\n */\n init(settings: type.PeptidesSettings): void {\n if (this.isInitialized)\n return;\n\n\n this.settings = settings;\n this.isInitialized = true;\n\n if (!this.isRibbonSet && this.df.getTag(C.TAGS.MULTIPLE_VIEWS) !== '1') {\n //TODO: don't pass model, pass parameters instead\n const settingsButton = ui.iconFA('wrench', () => getSettingsDialog(this), 'Peptides analysis settings');\n this.analysisView.setRibbonPanels([[settingsButton]], false);\n this.isRibbonSet = true;\n this.updateGrid();\n }\n\n this.subs.push(grok.events.onAccordionConstructed.subscribe((acc) => {\n if (!(grok.shell.o instanceof DG.SemanticValue || (grok.shell.o instanceof DG.Column &&\n this.df.columns.toList().includes(grok.shell.o))))\n return;\n\n\n const actionsPane = acc.getPane('Actions');\n const actionsHost = $(actionsPane.root).find('.d4-flex-col');\n const calculateIdentity = ui.label('Calculate identity');\n calculateIdentity.classList.add('d4-link-action');\n ui.tooltip.bind(calculateIdentity,\n 'Adds a column with fractions of matching monomers against sequence in the current row');\n calculateIdentity.onclick = (): void => {\n const seqCol = this.df.getCol(this.settings!.sequenceColumnName);\n calculateScores(this.df, seqCol, seqCol.get(this.df.currentRowIdx), SCORE.IDENTITY)\n .then((col: DG.Column<number>) => col.setTag(C.TAGS.IDENTITY_TEMPLATE, seqCol.get(this.df.currentRowIdx)))\n .catch((e) => _package.logger.debug(e));\n };\n actionsHost.append(ui.span([calculateIdentity], 'd4-markdown-row'));\n\n const calculateSimilarity = ui.label('Calculate similarity');\n calculateSimilarity.classList.add('d4-link-action');\n ui.tooltip.bind(calculateSimilarity,\n 'Adds a column with sequence similarity scores against sequence in the current row');\n calculateSimilarity.onclick = (): void => {\n const seqCol = this.df.getCol(this.settings!.sequenceColumnName);\n calculateScores(this.df, seqCol, seqCol.get(this.df.currentRowIdx), SCORE.SIMILARITY)\n .then((col: DG.Column<number>) => col.setTag(C.TAGS.SIMILARITY_TEMPLATE, seqCol.get(this.df.currentRowIdx)))\n .catch((e) => _package.logger.debug(e));\n };\n actionsHost.append(ui.span([calculateSimilarity], 'd4-markdown-row'));\n }));\n\n this.subs.push(grok.events.onViewRemoved.subscribe((view) => {\n if (view.id === this.analysisView.id)\n this.subs.forEach((v) => v.unsubscribe());\n\n\n grok.log.debug(`Peptides: view ${view.name} removed`);\n }));\n //@ts-ignore\n this.subs.push(grok.events.onTableRemoved.subscribe((table: DG.DataFrame) => {\n if (table.id === this.df.id)\n this.subs.forEach((v) => v.unsubscribe());\n\n\n grok.log.debug(`Peptides: table ${table.name} removed`);\n }));\n this.subs.push(grok.events.onProjectClosed.subscribe((project: DG.Project) => {\n if (project.id === grok.shell.project.id)\n this.subs.forEach((v) => v.unsubscribe());\n\n\n grok.log.debug(`Peptides: project ${project.name} closed`);\n }));\n\n this.fireBitsetChanged(null, true);\n\n this.analysisView.grid.invalidate();\n }\n\n /**\n * Finds viewer by type\n * @param {VIEWER_TYPE} viewerType - Viewer type to find\n * @return {DG.Viewer | null} - Viewer or null if not found\n */\n findViewer(viewerType: VIEWER_TYPE): DG.Viewer | null {\n return wu(this.analysisView.viewers).find((v) => v.type === viewerType) || null;\n }\n\n /**\n * Adds Logo Summary Table viewer to the analysis view\n * @param {ILogoSummaryTable} [viewerProperties] - Viewer properties\n */\n async addLogoSummaryTable(viewerProperties?: ILogoSummaryTable): Promise<void> {\n viewerProperties ??= {\n sequenceColumnName: this.settings!.sequenceColumnName,\n clustersColumnName: wu(this.df.columns.categorical).next().value,\n activityColumnName: this.settings!.activityColumnName,\n activityScaling: this.settings!.activityScaling,\n };\n const logoSummaryTable = await this.df.plot\n .fromType(VIEWER_TYPE.LOGO_SUMMARY_TABLE, viewerProperties) as LogoSummaryTable;\n this.analysisView.dockManager.dock(logoSummaryTable, DG.DOCK_TYPE.RIGHT, null, VIEWER_TYPE.LOGO_SUMMARY_TABLE);\n\n logoSummaryTable.viewerGrid.invalidate();\n }\n\n async addClusterMaxActivityViewer(viewerProperties?: IClusterMaxActivity): Promise<void> {\n const potentialClusterCol = this._mclCols?.find((colName) => colName.toLowerCase().startsWith('cluster (mcl)')) ??\n (this.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable | null)?.clustersColumnName ??\n this._sequenceSpaceCols?.find((colName) => colName.toLowerCase().startsWith('cluster'));\n viewerProperties ??= {\n activityColumnName: this.settings!.activityColumnName,\n clusterColumnName: potentialClusterCol ?? wu(this.df.columns.categorical).next().value?.name,\n activityTarget: C.ACTIVITY_TARGET.HIGH,\n connectivityColumnName: this._mclCols.find((colName) => colName.toLowerCase().startsWith('connectivity')),\n clusterSizeThreshold: 20,\n activityThreshold: 1000,\n };\n const _clusterMaxActivity = await this.df.plot\n .fromType(VIEWER_TYPE.CLUSTER_MAX_ACTIVITY, viewerProperties) as ClusterMaxActivityViewer;\n const lstNode = this.findViewerNode(VIEWER_TYPE.LOGO_SUMMARY_TABLE) ?? null;\n this.analysisView.dockManager.dock(_clusterMaxActivity, lstNode ? DG.DOCK_TYPE.DOWN: DG.DOCK_TYPE.RIGHT,\n lstNode, VIEWER_TYPE.CLUSTER_MAX_ACTIVITY);\n }\n\n /**\n * Adds Monomer-Position viewer to the analysis view\n * @param {ISARViewer} [viewerProperties] - Viewer properties\n */\n async addMonomerPosition(viewerProperties?: ISARViewer): Promise<void> {\n viewerProperties ??= {\n maxMutations: 1,\n activityScaling: this.settings!.activityScaling,\n activityColumnName: this.settings!.activityColumnName,\n sequenceColumnName: this.settings!.sequenceColumnName,\n minActivityDelta: 0,\n activityTarget: C.ACTIVITY_TARGET.HIGH,\n };\n const monomerPosition = await this.df.plot\n .fromType(VIEWER_TYPE.MONOMER_POSITION, viewerProperties) as MonomerPosition;\n const mostPotentResidues = this.findViewer(VIEWER_TYPE.MOST_POTENT_RESIDUES) as MostPotentResidues | null;\n const dm = this.analysisView.dockManager;\n const [dockType, refNode, ratio] = mostPotentResidues === null ? [DG.DOCK_TYPE.DOWN, null, undefined] :\n [DG.DOCK_TYPE.LEFT, this.findViewerNode(VIEWER_TYPE.MOST_POTENT_RESIDUES), 0.7];\n dm.dock(monomerPosition, dockType, refNode, VIEWER_TYPE.MONOMER_POSITION, ratio);\n }\n\n /**\n * Adds Most Potent Residues viewer to the analysis view\n * @param {ISARViewer}[viewerProperties] - Viewer properties\n */\n async addMostPotentResidues(viewerProperties?: ISARViewer): Promise<void> {\n viewerProperties ??= {\n activityScaling: this.settings!.activityScaling,\n activityColumnName: this.settings!.activityColumnName,\n sequenceColumnName: this.settings!.sequenceColumnName,\n minActivityDelta: 0,\n maxMutations: 1,\n activityTarget: C.ACTIVITY_TARGET.HIGH,\n };\n const mostPotentResidues =\n await this.df.plot.fromType(VIEWER_TYPE.MOST_POTENT_RESIDUES, viewerProperties) as MostPotentResidues;\n const monomerPosition = this.findViewer(VIEWER_TYPE.MONOMER_POSITION) as MonomerPosition | null;\n const dm = this.analysisView.dockManager;\n const [dockType, refNode, ratio] = monomerPosition === null ? [DG.DOCK_TYPE.DOWN, null, undefined] :\n [DG.DOCK_TYPE.RIGHT, this.findViewerNode(VIEWER_TYPE.MONOMER_POSITION), 0.3];\n dm.dock(mostPotentResidues, dockType, refNode, VIEWER_TYPE.MOST_POTENT_RESIDUES, ratio);\n }\n\n /**\n * Creates new view from analysis dataframe selection, and adds LogoSummaryTable to it\n * @return {string} - New view id\n */\n createNewView(): string {\n const rowMask = this.getVisibleSelection();\n const newDf = this.df.clone(rowMask);\n for (const [tag, value] of newDf.tags)\n newDf.setTag(tag, tag === C.TAGS.SETTINGS ? value : '');\n\n\n newDf.name = 'Peptides Multiple Views';\n newDf.setTag(C.TAGS.MULTIPLE_VIEWS, '1');\n\n const view = grok.shell.addTableView(newDf);\n const lstViewer = this.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable | null;\n if (lstViewer != null) {\n view.addViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE, {\n [`${LST_PROPERTIES.SEQUENCE}${COLUMN_NAME}`]: lstViewer.sequenceColumnName,\n [`${LST_PROPERTIES.ACTIVITY}${COLUMN_NAME}`]: lstViewer.activityColumnName,\n [LST_PROPERTIES.ACTIVITY_SCALING]: lstViewer.activityScaling,\n [LST_PROPERTIES.WEB_LOGO_MODE]: lstViewer.webLogoMode,\n [LST_PROPERTIES.MEMBERS_RATIO_THRESHOLD]: lstViewer.membersRatioThreshold,\n [`${LST_PROPERTIES.CLUSTERS}${COLUMN_NAME}`]: lstViewer.clustersColumnName,\n });\n }\n\n return newDf.getTag(DG.TAGS.ID)!;\n }\n\n private async clusterEmbeddings(): Promise<void> {\n if (!this._sequenceSpaceCols || this._sequenceSpaceCols.length === 0) {\n grok.shell.warning('Embeddings columns are not initialized');\n return;\n }\n const embeddingColNames = this._sequenceSpaceCols.filter((colName) => colName.toLowerCase().startsWith('embed_'));\n if (embeddingColNames.length !== 2) {\n grok.shell.warning(`Found ${embeddingColNames.length} embeddings columns, expected 2`);\n return;\n }\n const oldClusterCol = this._sequenceSpaceCols.filter((colName) => colName.toLowerCase().startsWith('cluster'));\n if (oldClusterCol.length > 0)\n this.df.columns.remove(oldClusterCol[0]);\n const embed1 = this.df.getCol(embeddingColNames[0]).getRawData() as Float32Array;\n const embed2 = this.df.getCol(embeddingColNames[1]).getRawData() as Float32Array;\n const epsilon = this.settings!.sequenceSpaceParams!.epsilon ?? 0.01;\n const minPts = this.settings!.sequenceSpaceParams!.minPts ?? 4;\n const clusterRes = await getDbscanWorker(embed1, embed2, epsilon, minPts);\n const newClusterName = this.df.columns.getUnusedName('Cluster (DBSCAN)');\n const clusterCol = this.df.columns.addNewString(newClusterName);\n clusterCol.init((i) => clusterRes[i].toString());\n if (this._sequenceSpaceViewer !== null)\n this._sequenceSpaceViewer.props.colorColumnName = clusterCol.name;\n\n this._sequenceSpaceCols = [embeddingColNames[0], embeddingColNames[1], clusterCol.name];\n const gridCol = this.analysisView.grid.col(clusterCol.name);\n gridCol && (gridCol.visible = false);\n }\n\n async addMCLClusters(): Promise<void> {\n if (this._mclViewer !== null) {\n try {\n this._mclViewer?.detach();\n this._mclViewer?.close();\n } catch (_) {}\n }\n if (this._mclCols.length !== 0)\n this._mclCols.forEach((col) => this.df.columns.remove(col));\n this._mclCols = [];\n const seqCol = this.df.getCol(this.settings!.sequenceColumnName!);\n this.settings!.mclSettings ??= new type.MCLSettings();\n const mclParams = this.settings?.mclSettings;\n let counter = 0;\n const addedColCount = 5; // embedx, embedy, cluster, cluster size and connectivity count\n const columnAddedSub = this.df.onColumnsAdded.subscribe((colArgs: DG.ColumnsArgs) => {\n for (const col of colArgs.columns) {\n if ((col.name.toLowerCase().startsWith('embed') ||\n col.name.toLowerCase().startsWith('cluster') ||\n col.name.toLowerCase().startsWith('connectivity')) && col.name.toLowerCase().includes('mcl')) {\n const gridCol = this.analysisView.grid.col(col.name);\n if (gridCol == null || this._mclCols.includes(col.name))\n continue;\n\n gridCol.visible = false;\n this._mclCols.push(col.name);\n counter++;\n }\n }\n if (counter === addedColCount)\n columnAddedSub.unsubscribe();\n });\n const mclAdditionSub = grok.events.onViewerAdded.subscribe((info) => {\n try {\n const v = info.args.viewer as DG.ScatterPlotViewer;\n if (v.type === DG.VIEWER.SCATTER_PLOT) {\n if (this._sequenceSpaceViewer && this.analysisView.dockManager.findNode(this._sequenceSpaceViewer.root)) {\n const rootNode = this.analysisView.dockManager.findNode(this._sequenceSpaceViewer.root);\n setTimeout(() => {\n this.analysisView.dockManager.dock(v, DG.DOCK_TYPE.FILL, rootNode);\n });\n }\n mclAdditionSub.unsubscribe();\n }\n } catch (e) {\n console.error(e);\n }\n });\n\n const bioPreprocessingFunc = DG.Func.find({package: 'Bio', name: 'macromoleculePreprocessingFunction'})[0];\n const mclViewer = await markovCluster(\n this.df, [seqCol], [mclParams!.distanceF], [1],\n DistanceAggregationMethods.MANHATTAN, [bioPreprocessingFunc], [{\n gapOpen: mclParams!.gapOpen, gapExtend: mclParams!.gapExtend,\n fingerprintType: mclParams!.fingerprintType,\n }], mclParams!.threshold, mclParams!.maxIterations, false/** TODO, add webgpu controll */, mclParams!.inflation,\n );\n mclAdditionSub.unsubscribe();\n if (mclViewer?.sc) {\n const serializedOptions: string = JSON.stringify({\n cols: [seqCol].map((col) => col.name),\n metrics: [mclParams!.distanceF],\n weights: [1],\n aggregationMethod: DistanceAggregationMethods.MANHATTAN,\n preprocessingFuncs: [bioPreprocessingFunc].map((func) => func?.name ?? null),\n preprocessingFuncArgs: [{\n gapOpen: mclParams!.gapOpen, gapExtend: mclParams!.gapExtend,\n fingerprintType: mclParams!.fingerprintType,\n }],\n threshold: mclParams!.threshold,\n maxIterations: mclParams!.maxIterations,\n useWebGPU: false,\n inflate: mclParams!.inflation,\n } satisfies MCLSerializableOptions);\n this.df.setTag(MCL_OPTIONS_TAG, serializedOptions);\n\n\n //@ts-ignore\n mclViewer.sc.props['initializationFunction'] = 'EDA:MCLInitializationFunction';\n this._mclViewer = mclViewer?.sc ?? null;\n }\n }\n\n /**\n * Adds Sequence Space viewer to the analysis view\n */\n async addSequenceSpace(settings: {clusterEmbeddings?: boolean, clusterCol?: DG.Column | null} = {}): Promise<void> {\n if (this._sequenceSpaceViewer !== null) {\n try {\n this._sequenceSpaceViewer?.detach();\n this._sequenceSpaceViewer?.close();\n } catch (_) {}\n }\n if (this._sequenceSpaceCols.length !== 0)\n this._sequenceSpaceCols.forEach((col) => this.df.columns.remove(col));\n this._sequenceSpaceCols = [];\n let seqCol = this.df.getCol(this.settings!.sequenceColumnName!);\n const sh = SeqHandler.forColumn(seqCol);\n const isHelm = sh.isHelm();\n if (isHelm) {\n try {\n grok.shell.warning('Column is in HELM notation. Sequences space will linearize sequences from position 0 ' +\n 'prior to analysis');\n const linearCol = sh.convert(NOTATION.SEPARATOR, '/');\n const newName = this.df.columns.getUnusedName(`Separator(${seqCol.name})`);\n linearCol.name = newName;\n this.df.columns.add(linearCol, true);\n this.analysisView.grid.col(newName)!.visible = false;\n seqCol = linearCol;\n } catch (e) {\n grok.shell.error('Error on converting HELM notation to linear notation');\n grok.shell.error(e as string);\n return;\n }\n }\n const clusterEmbeddings = !settings.clusterCol && !!settings.clusterEmbeddings;\n const seqSpaceSettings = this.settings?.sequenceSpaceParams ??\n new type.SequenceSpaceParams(clusterEmbeddings);\n seqSpaceSettings.clusterEmbeddings = clusterEmbeddings;\n const seqSpaceParams: {\n table: DG.DataFrame,\n molecules: DG.Column,\n methodName: DimReductionMethods,\n similarityMetric: BitArrayMetrics | MmDistanceFunctionsNames,\n plotEmbeddings: boolean,\n sparseMatrixThreshold?: number,\n clusterEmbeddings?: boolean,\n options?: (IUMAPOptions | ITSNEOptions) & Options\n } =\n {\n table: this.df,\n molecules: seqCol,\n methodName: DimReductionMethods.UMAP,\n similarityMetric: seqSpaceSettings.distanceF,\n plotEmbeddings: true,\n options: {'bypassLargeDataWarning': true, 'dbScanEpsilon': seqSpaceSettings.epsilon,\n 'dbScanMinPts': seqSpaceSettings.minPts, 'randomSeed': '1',\n 'preprocessingFuncArgs': {\n gapOpen: seqSpaceSettings.gapOpen, gapExtend: seqSpaceSettings.gapExtend,\n fingerprintType: seqSpaceSettings.fingerprintType,\n },\n },\n clusterEmbeddings: seqSpaceSettings.clusterEmbeddings,\n };\n\n // Use counter to unsubscribe when 2 columns are hidden\n let counter = 0;\n const addedColCount = seqSpaceSettings.clusterEmbeddings ? 3 : 2;\n const columnAddedSub = this.df.onColumnsAdded.subscribe((colArgs: DG.ColumnsArgs) => {\n for (const col of colArgs.columns) {\n if (col.name.toLowerCase().startsWith('embed_') ||\n ( seqSpaceSettings.clusterEmbeddings && col.name.toLowerCase().startsWith('cluster'))) {\n const gridCol = this.analysisView.grid.col(col.name);\n if (gridCol == null || this._sequenceSpaceCols.includes(col.name))\n continue;\n\n gridCol.visible = false;\n this._sequenceSpaceCols.push(col.name);\n counter++;\n }\n }\n if (counter === addedColCount)\n columnAddedSub.unsubscribe();\n });\n\n const seqSpaceAdditionSub = grok.events.onViewerAdded.subscribe((info) => {\n try {\n const v = info.args.viewer as DG.ScatterPlotViewer;\n if (v.type === DG.VIEWER.SCATTER_PLOT) {\n if (this._mclViewer && this.analysisView.dockManager.findNode(this._mclViewer.root)) {\n const rootNode = this.analysisView.dockManager.findNode(this._mclViewer.root);\n setTimeout(() => {\n this.analysisView.dockManager.dock(v, DG.DOCK_TYPE.FILL, rootNode);\n });\n }\n seqSpaceAdditionSub.unsubscribe();\n }\n } catch (e) {\n console.error(e);\n }\n });\n const seqSpaceViewer: DG.ScatterPlotViewer | undefined =\n await grok.functions.call('Bio:sequenceSpaceTopMenu', seqSpaceParams);\n seqSpaceAdditionSub.unsubscribe();\n if (!(seqSpaceViewer instanceof DG.ScatterPlotViewer))\n return;\n\n\n if (!seqSpaceSettings.clusterEmbeddings && !settings.clusterCol) { // color by activity if no clusters\n seqSpaceViewer.props.colorColumnName = this.getScaledActivityColumn()!.name;\n }\n seqSpaceViewer.props.showXSelector = false;\n seqSpaceViewer.props.showYSelector = false;\n if (settings.clusterCol)\n seqSpaceViewer.props.colorColumnName = settings.clusterCol.name;\n this._sequenceSpaceViewer = seqSpaceViewer;\n seqSpaceViewer.onContextMenu.subscribe((menu) => {\n try {\n menu.item('Modify Sequence space parameters', () => {\n getSettingsDialog(this);\n });\n } catch (e) {\n }\n });\n }\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport wu from 'wu';\nimport {addExpandIcon} from '../utils/misc';\nimport {setWebLogoRenderer, WebLogoBounds, WebLogoCellRendererOptions} from '../utils/cell-renderer';\nimport {CachedWebLogoTooltip, SelectionItem} from '../utils/types';\nimport {TooltipOptions} from '../utils/tooltips';\nimport {calculateMonomerPositionStatistics} from '../utils/algorithms';\nimport {AggregationColumns} from '../utils/statistics';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\n\nexport type SelectionWidgetOptions = {\n tableSelection: DG.BitSet, gridColumns: DG.GridColumnList, positionColumns: DG.Column<string>[],\n activityColumn: DG.Column<number>, columns: AggregationColumns, colorPalette: SeqPalette, isAnalysis: boolean,\n};\n\n/**\n * Creates selection grid with WebLogo rendered in its header.\n * @param table - table with selected sequences.\n * @param options - options for selection widget.\n * @return - selection grid.\n */\nexport function getSelectionWidget(table: DG.DataFrame, options: SelectionWidgetOptions): HTMLElement {\n if (options.tableSelection.trueCount === 0)\n return ui.divText('No compounds selected');\n\n\n const newTable = DG.DataFrame.create(table.rowCount);\n newTable.name = 'Selected compounds';\n newTable.filter.copyFrom(options.tableSelection);\n const numericalCols = wu(table.columns.numerical);\n for (let gridColIdx = 1; gridColIdx < options.gridColumns.length; gridColIdx++) {\n const gridCol = options.gridColumns.byIndex(gridColIdx)!;\n if (!gridCol.visible)\n continue;\n\n\n const sourceCol = gridCol.column!;\n if (sourceCol.type === DG.COLUMN_TYPE.BOOL)\n continue;\n\n\n const sourceColRawData = sourceCol.getRawData();\n const sourceColCategories = sourceCol.categories;\n const getValue = numericalCols\n .some((col) => col.name === sourceCol.name) ? (i: number): number => sourceColRawData[i] :\n (i: number): string => sourceColCategories[sourceColRawData[i]];\n const col = sourceCol.name === options.activityColumn.name ?\n newTable.columns.addNewFloat(gridCol.name).init((i) => getValue(i)) :\n newTable.columns.addNewVirtual(gridCol.name, (i) => getValue(i), sourceCol.type as DG.TYPE);\n for (const [tag, value] of sourceCol.tags)\n col.setTag(tag, value);\n }\n const grid = newTable.plot.grid();\n grid.props.showRowHeader = false;\n grid.root.style.maxWidth = '100%';\n\n DG.debounce(ui.onSizeChanged(grid.root), 50).subscribe((_) => {\n const panel = grid.root.parentElement;\n if (panel?.parentElement?.classList.contains('panel-content')) {\n grid.root.style.height = 'calc(100% - 20px)';\n grid.root.style.width = 'calc(100% - 20px)';\n grid.root.style.position = 'absolute';\n grid.root.style.right = '10px';\n grid.root.style.top = '10px';\n }\n });\n\n addExpandIcon(grid);\n\n const gridHost = ui.box(grid.root);\n gridHost.style.marginLeft = '0px';\n setTimeout(() => {\n for (let gridColIdx = 1; gridColIdx < options.gridColumns.length; gridColIdx++) {\n const originalGridCol = options.gridColumns.byIndex(gridColIdx)!;\n if (!originalGridCol.visible)\n continue;\n\n\n if (!grid.col(originalGridCol.name))\n continue;\n\n\n grid.col(originalGridCol.name)!.width = originalGridCol.width;\n }\n }, 500);\n\n const mpStats = calculateMonomerPositionStatistics(options.activityColumn, newTable.filter,\n options.positionColumns, {isFiltered: newTable.filter.anyTrue || newTable.filter.anyFalse});\n\n const cachedWebLogoTooltip: () => CachedWebLogoTooltip = () => {\n return {bar: '', tooltip: null};\n };\n const webLogoBounds: () => WebLogoBounds = () => {\n return {};\n };\n const cellRendererOptions: WebLogoCellRendererOptions = {\n isSelectionTable: true, cachedWebLogoTooltip, webLogoBounds,\n colorPalette: () => options.colorPalette,\n };\n const tooltipOptions: TooltipOptions = {x: 0, y: 0, monomerPosition: {} as SelectionItem, mpStats};\n\n if (options.isAnalysis) {\n setWebLogoRenderer(grid, mpStats, options.positionColumns, options.activityColumn, cellRendererOptions,\n tooltipOptions);\n }\n\n return gridHost;\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};\n/** Calculates Clusters based on dbscan algorithm in wasm.\n * @param embedX - embeddings x location.\n * @param embedY - embeddings y location.\n * @param minPts - minimum number of points in a cluster.\n * @param epsilon - epsilon.\n * @returns array with cluster indexes.\n */\nexport function getDbscanWorker(embedX, embedY, epsilon, minPts) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(function (resolve, reject) {\n const worker = new Worker(new URL('./clustering-worker', import.meta.url));\n worker.postMessage({ embedX, embedY, minPts, epsilon });\n worker.onmessage = ({ data: { error, clusters } }) => {\n worker.terminate();\n error ? reject(error) : resolve(clusters);\n };\n });\n });\n}\n//# sourceMappingURL=dbscan-worker-creator.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport { createMCLWorker } from './index';\nimport { ScatterPlotCurrentLineStyle, ScatterPlotLinesRenderer } from '@datagrok-libraries/utils/src/render-lines-on-sp';\nexport async function markovCluster(df, cols, metrics, weights, aggregationMethod, preprocessingFuncs, preprocessingFuncArgs, threshold = 80, maxIterations = 10, useWebGPU = false, inflate = 2, scp) {\n const scatterPlotProps = {\n showXAxis: false,\n showYAxis: false,\n showXSelector: false,\n showYSelector: false,\n };\n const tv = grok.shell.tableView(df.name) ?? grok.shell.addTableView(df);\n const sc = scp ?? tv.scatterPlot({ ...scatterPlotProps, title: 'MCL' });\n ui.setUpdateIndicator(sc.root, true);\n const distanceFnArgs = [];\n const encodedColEntries = [];\n for (let i = 0; i < preprocessingFuncs.length; ++i) {\n const pf = preprocessingFuncs[i];\n if (pf) {\n const colInputName = pf.inputs[0].name;\n const metricInputName = pf.inputs[1].name;\n const { entries, options } = await pf.apply({ [colInputName]: cols[i], [metricInputName]: metrics[i],\n ...(preprocessingFuncArgs[i] ?? {}) });\n encodedColEntries.push({ entries, options });\n distanceFnArgs.push(options ?? {});\n }\n else {\n const entries = cols[i].toList();\n const options = {};\n encodedColEntries.push({ entries, options });\n distanceFnArgs.push(options);\n }\n }\n const mclWorker = createMCLWorker(encodedColEntries.map((it) => it.entries), threshold, weights, aggregationMethod, metrics, distanceFnArgs, maxIterations, useWebGPU, inflate);\n const terminateSub = grok.events.onViewerClosed.subscribe((args) => {\n if (args.args.viewer?.props?.title === sc.props.title && sc.type === args.args?.viewer?.type) {\n terminateSub.unsubscribe();\n mclWorker.terminate();\n }\n });\n const res = await mclWorker.promise;\n if (!res)\n return;\n const clusterColName = df.columns.getUnusedName('Cluster (MCL)');\n const emberdXColName = df.columns.getUnusedName('EmbedX (MCL)');\n const emberdYColName = df.columns.getUnusedName('EmbedY (MCL)');\n const clustersCounter = {};\n res.clusters.forEach((c) => {\n if (!clustersCounter[c])\n clustersCounter[c] = 0;\n clustersCounter[c]++;\n });\n const connectivity = new Uint32Array(res.embedX.length);\n for (let i = 0; i < res.is.length; i++) {\n connectivity[res.is[i]]++;\n connectivity[res.js[i]]++;\n }\n const clusterCounterColName = df.columns.getUnusedName('Cluster size (MCL)');\n const connectivityColName = df.columns.getUnusedName('Connectivity (MCL)');\n const embedXCol = df.columns.addNewFloat(emberdXColName);\n embedXCol.init((i) => res.embedX[i]);\n const embedYCol = df.columns.addNewFloat(emberdYColName);\n embedYCol.init((i) => res.embedY[i]);\n const clusterCol = df.columns.addNewString(clusterColName);\n clusterCol.init((i) => res.clusters[i].toString());\n const clusterCounterCol = df.columns.addNewInt(clusterCounterColName);\n clusterCounterCol.init((i) => clustersCounter[res.clusters[i]]);\n const connectivityCol = df.columns.addNewInt(connectivityColName);\n connectivityCol.init((i) => connectivity[i]);\n // df.columns.addNewFloat(emberdXColName).init((i) => res.embedX[i]);\n // df.columns.addNewFloat(emberdYColName).init((i) => res.embedY[i]);\n // df.columns.addNewInt(clusterCounterColName).init((i) => clustersCounter[res.clusters[i]]);\n // df.columns.addNewString(clusterColName).init((i) => res.clusters[i].toString());\n sc.props.xColumnName = emberdXColName;\n sc.props.yColumnName = emberdYColName;\n sc.props.colorColumnName = clusterColName;\n sc.props.markerDefaultSize = 5;\n terminateSub.unsubscribe();\n // const sc = tv.scatterPlot({x: emberdXColName, y: emberdYColName});\n // sc.props.colorColumnName = clusterColName;\n // sc.props.markerDefaultSize = 5;\n const _scLines = new ScatterPlotLinesRenderer(sc, emberdXColName, emberdYColName, { from: res.is, to: res.js, drawArrows: false, opacity: 0.3, skipMultiLineCalculation: true }, ScatterPlotCurrentLineStyle.none);\n ui.setUpdateIndicator(sc.root, false);\n // sc.close();\n // const scLinesViewer = new ScatterPlotWithLines(sc, res.is, res.js, emberdXColName, emberdYColName);\n // tv.addViewer(scLinesViewer);\n return { sc, embedXCol, embedYCol, clusterCol, clusterCounterCol, connectivityCol };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmluZy12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2x1c3RlcmluZy12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd0QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBQywyQkFBMkIsRUFBRSx3QkFBd0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBZ0J2SCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsRUFBZ0IsRUFBRSxJQUFpQixFQUFFLE9BQXVCLEVBQzVELE9BQWlCLEVBQUUsaUJBQTRDLEVBQUUsa0JBQWtELEVBQ25ILHFCQUE0QixFQUFFLFlBQW9CLEVBQUUsRUFBRSxnQkFBd0IsRUFBRSxFQUNoRixZQUFxQixLQUFLLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLEdBQTBCO0lBRTNFLE1BQU0sZ0JBQWdCLEdBQUc7UUFDdkIsU0FBUyxFQUFFLEtBQUs7UUFDaEIsU0FBUyxFQUFFLEtBQUs7UUFDaEIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsYUFBYSxFQUFFLEtBQUs7S0FDckIsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV4RSxNQUFNLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFDLEdBQUcsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFFdEUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckMsTUFBTSxjQUFjLEdB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QUUsR0FBRyxDQUFDLEVBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFDLEVBQ3pHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLGNBQWM7SUFDZCxzR0FBc0c7SUFDdEcsK0JBQStCO0lBQy9CLE9BQU8sRUFBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFDLENBQUM7QUFDcEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7Y3JlYXRlTUNMV29ya2VyfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7U2NhdHRlclBsb3RDdXJyZW50TGluZVN0eWxlLCBTY2F0dGVyUGxvdExpbmVzUmVuZGVyZXJ9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3JlbmRlci1saW5lcy1vbi1zcCc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge1ByZXByb2Nlc3NGdW5jdGlvblJldHVyblR5cGV9IGZyb20gJy4uL2Z1bmN0aW9uRWRpdG9ycy9kaW1lbnNpb25hbGl0eS1yZWR1Y3Rpb24tZWRpdG9yJztcbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuXG5cbmV4cG9ydCB0eXBlIE1DTENsdXN0ZXJWaWV3ZXJSZXN1bHQgPSB7XG4gIHNjOiBERy5TY2F0dGVyUGxvdFZpZXdlcjtcbiAgZW1iZWRYQ29sOiBERy5Db2x1bW47XG4gIGVtYmVkWUNvbDogREcuQ29sdW1uO1xuICBjbHVzdGVyQ29sOiBERy5Db2x1bW47XG4gIGNsdXN0ZXJDb3VudGVyQ29sOiBERy5Db2x1bW47XG4gIGNvbm5lY3Rpdml0eUNvbDogREcuQ29sdW1uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFya292Q2x1c3RlcihcbiAgZGY6IERHLkRhdGFGcmFtZSwgY29sczogREcuQ29sdW1uW10sIG1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIHByZXByb2Nlc3NpbmdGdW5jczogKERHLkZ1bmMgfCBudWxsIHwgdW5kZWZpbmVkKVtdLFxuICBwcmVwcm9jZXNzaW5nRnVuY0FyZ3M6IGFueVtdLCB0aHJlc2hvbGQ6IG51bWJlciA9IDgwLCBtYXhJdGVyYXRpb25zOiBudW1iZXIgPSAxMCxcbiAgdXNlV2ViR1BVOiBib29sZWFuID0gZmFsc2UsIGluZmxhdGU6IG51bWJlciA9IDIsIHNjcD86IERHLlNjYXR0ZXJQbG90Vmlld2VyXG4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IE1DTENsdXN0ZXJWaWV3ZXJSZXN1bHQ+IHtcbiAgY29uc3Qgc2NhdHRlclBsb3RQcm9wcyA9IHtcbiAgICBzaG93WEF4aXM6IGZhbHNlLFxuICAgIHNob3dZQXhpczogZmFsc2UsXG4gICAgc2hvd1hTZWxlY3RvcjogZmFsc2UsXG4gICAgc2hvd1lTZWxlY3RvcjogZmFsc2UsXG4gIH07XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC50YWJsZVZpZXcoZGYubmFtZSkgPz8gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuXG4gIGNvbnN0IHNjID0gc2NwID8/IHR2LnNjYXR0ZXJQbG90KHsuLi5zY2F0dGVyUGxvdFByb3BzLCB0aXRsZTogJ01DTCd9KTtcblxuICB1aS5zZXRVcGRhdGVJbmRpY2F0b3Ioc2Mucm9vdCwgdHJ1ZSk7XG4gIGNvbnN0IGRpc3RhbmNlRm5BcmdzOiBPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgZW5jb2RlZENvbEVudHJpZXM6IFByZXByb2Nlc3NGdW5jdGlvblJldHVyblR5cGVbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXByb2Nlc3NpbmdGdW5jcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHBmID0gcHJlcHJvY2Vzc2luZ0Z1bmNzW2ldO1xuICAgIGlmIChwZikge1xuICAgICAgY29uc3QgY29sSW5wdXROYW1lID0gcGYuaW5wdXRzWzBdLm5hbWU7XG4gICAgICBjb25zdCBtZXRyaWNJbnB1dE5hbWUgPSBwZi5pbnB1dHNbMV0ubmFtZTtcbiAgICAgIGNvbnN0IHtlbnRyaWVzLCBvcHRpb25zfTogUHJlcHJvY2Vzc0Z1bmN0aW9uUmV0dXJuVHlwZSA9XG4gICAgICAgICAgICAgICAgYXdhaXQgcGYuYXBwbHkoe1tjb2xJbnB1dE5hbWVdOiBjb2xzW2ldLCBbbWV0cmljSW5wdXROYW1lXTogbWV0cmljc1tpXSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcmVwcm9jZXNzaW5nRnVuY0FyZ3NbaV0gPz8ge30pfSk7XG4gICAgICBlbmNvZGVkQ29sRW50cmllcy5wdXNoKHtlbnRyaWVzLCBvcHRpb25zfSk7XG4gICAgICBkaXN0YW5jZUZuQXJncy5wdXNoKG9wdGlvbnMgPz8ge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gY29sc1tpXS50b0xpc3QoKTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgIGVuY29kZWRDb2xFbnRyaWVzLnB1c2goe2VudHJpZXMsIG9wdGlvbnN9KTtcbiAgICAgIGRpc3RhbmNlRm5BcmdzLnB1c2gob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWNsV29ya2VyID0gY3JlYXRlTUNMV29ya2VyKGVuY29kZWRDb2xFbnRyaWVzLm1hcCgoaXQpID0+IGl0LmVudHJpZXMpLFxuICAgIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QsIG1ldHJpY3MsIGRpc3RhbmNlRm5BcmdzLCBtYXhJdGVyYXRpb25zLCB1c2VXZWJHUFUsIGluZmxhdGUpO1xuXG4gIGNvbnN0IHRlcm1pbmF0ZVN1YiA9IGdyb2suZXZlbnRzLm9uVmlld2VyQ2xvc2VkLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgIGlmIChhcmdzLmFyZ3Mudmlld2VyPy5wcm9wcz8udGl0bGUgPT09IHNjLnByb3BzLnRpdGxlICYmIHNjLnR5cGUgPT09IGFyZ3MuYXJncz8udmlld2VyPy50eXBlKSB7XG4gICAgICB0ZXJtaW5hdGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIG1jbFdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCByZXMgPSBhd2FpdCBtY2xXb3JrZXIucHJvbWlzZTtcbiAgaWYgKCFyZXMpXG4gICAgcmV0dXJuO1xuICBjb25zdCBjbHVzdGVyQ29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZSgnQ2x1c3RlciAoTUNMKScpO1xuICBjb25zdCBlbWJlcmRYQ29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZSgnRW1iZWRYIChNQ0wpJyk7XG4gIGNvbnN0IGVtYmVyZFlDb2xOYW1lID0gZGYuY29sdW1ucy5nZXRVbnVzZWROYW1lKCdFbWJlZFkgKE1DTCknKTtcbiAgY29uc3QgY2x1c3RlcnNDb3VudGVyOiB7W186IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgcmVzLmNsdXN0ZXJzLmZvckVhY2goKGMpID0+IHtcbiAgICBpZiAoIWNsdXN0ZXJzQ291bnRlcltjXSkgY2x1c3RlcnNDb3VudGVyW2NdID0gMDtcbiAgICBjbHVzdGVyc0NvdW50ZXJbY10rKztcbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpdml0eSA9IG5ldyBVaW50MzJBcnJheShyZXMuZW1iZWRYLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29ubmVjdGl2aXR5W3Jlcy5pc1tpXV0rKztcbiAgICBjb25uZWN0aXZpdHlbcmVzLmpzW2ldXSsrO1xuICB9XG4gIGNvbnN0IGNsdXN0ZXJDb3VudGVyQ29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZSgnQ2x1c3RlciBzaXplIChNQ0wpJyk7XG4gIGNvbnN0IGNvbm5lY3Rpdml0eUNvbE5hbWUgPSBkZi5jb2x1bW5zLmdldFVudXNlZE5hbWUoJ0Nvbm5lY3Rpdml0eSAoTUNMKScpO1xuXG4gIGNvbnN0IGVtYmVkWENvbCA9IGRmLmNvbHVtbnMuYWRkTmV3RmxvYXQoZW1iZXJkWENvbE5hbWUpO1xuICBlbWJlZFhDb2wuaW5pdCgoaSkgPT4gcmVzLmVtYmVkWFtpXSk7XG4gIGNvbnN0IGVtYmVkWUNvbCA9IGRmLmNvbHVtbnMuYWRkTmV3RmxvYXQoZW1iZXJkWUNvbE5hbWUpO1xuICBlbWJlZFlDb2wuaW5pdCgoaSkgPT4gcmVzLmVtYmVkWVtpXSk7XG4gIGNvbnN0IGNsdXN0ZXJDb2wgPSBkZi5jb2x1bW5zLmFkZE5ld1N0cmluZyhjbHVzdGVyQ29sTmFtZSk7XG4gIGNsdXN0ZXJDb2wuaW5pdCgoaSkgPT4gcmVzLmNsdXN0ZXJzW2ldLnRvU3RyaW5nKCkpO1xuICBjb25zdCBjbHVzdGVyQ291bnRlckNvbCA9IGRmLmNvbHVtbnMuYWRkTmV3SW50KGNsdXN0ZXJDb3VudGVyQ29sTmFtZSk7XG4gIGNsdXN0ZXJDb3VudGVyQ29sLmluaXQoKGkpID0+IGNsdXN0ZXJzQ291bnRlcltyZXMuY2x1c3RlcnNbaV1dKTtcbiAgY29uc3QgY29ubmVjdGl2aXR5Q29sID0gZGYuY29sdW1ucy5hZGROZXdJbnQoY29ubmVjdGl2aXR5Q29sTmFtZSk7XG4gIGNvbm5lY3Rpdml0eUNvbC5pbml0KChpKSA9PiBjb25uZWN0aXZpdHlbaV0pO1xuXG4gIC8vIGRmLmNvbHVtbnMuYWRkTmV3RmxvYXQoZW1iZXJkWENvbE5hbWUpLmluaXQoKGkpID0+IHJlcy5lbWJlZFhbaV0pO1xuICAvLyBkZi5jb2x1bW5zLmFkZE5ld0Zsb2F0KGVtYmVyZFlDb2xOYW1lKS5pbml0KChpKSA9PiByZXMuZW1iZWRZW2ldKTtcbiAgLy8gZGYuY29sdW1ucy5hZGROZXdJbnQoY2x1c3RlckNvdW50ZXJDb2xOYW1lKS5pbml0KChpKSA9PiBjbHVzdGVyc0NvdW50ZXJbcmVzLmNsdXN0ZXJzW2ldXSk7XG4gIC8vIGRmLmNvbHVtbnMuYWRkTmV3U3RyaW5nKGNsdXN0ZXJDb2xOYW1lKS5pbml0KChpKSA9PiByZXMuY2x1c3RlcnNbaV0udG9TdHJpbmcoKSk7XG4gIHNjLnByb3BzLnhDb2x1bW5OYW1lID0gZW1iZXJkWENvbE5hbWU7XG4gIHNjLnByb3BzLnlDb2x1bW5OYW1lID0gZW1iZXJkWUNvbE5hbWU7XG4gIHNjLnByb3BzLmNvbG9yQ29sdW1uTmFtZSA9IGNsdXN0ZXJDb2xOYW1lO1xuICBzYy5wcm9wcy5tYXJrZXJEZWZhdWx0U2l6ZSA9IDU7XG4gIHRlcm1pbmF0ZVN1Yi51bnN1YnNjcmliZSgpO1xuICAvLyBjb25zdCBzYyA9IHR2LnNjYXR0ZXJQbG90KHt4OiBlbWJlcmRYQ29sTmFtZSwgeTogZW1iZXJkWUNvbE5hbWV9KTtcbiAgLy8gc2MucHJvcHMuY29sb3JDb2x1bW5OYW1lID0gY2x1c3RlckNvbE5hbWU7XG4gIC8vIHNjLnByb3BzLm1hcmtlckRlZmF1bHRTaXplID0gNTtcbiAgY29uc3QgX3NjTGluZXMgPSBuZXcgU2NhdHRlclBsb3RMaW5lc1JlbmRlcmVyKHNjLCBlbWJlcmRYQ29sTmFtZSwgZW1iZXJkWUNvbE5hbWUsXG4gICAge2Zyb206IHJlcy5pcyBhcyBhbnksIHRvOiByZXMuanMgYXMgYW55LCBkcmF3QXJyb3dzOiBmYWxzZSwgb3BhY2l0eTogMC4zLCBza2lwTXVsdGlMaW5lQ2FsY3VsYXRpb246IHRydWV9LFxuICAgIFNjYXR0ZXJQbG90Q3VycmVudExpbmVTdHlsZS5ub25lKTtcbiAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHNjLnJvb3QsIGZhbHNlKTtcbiAgLy8gc2MuY2xvc2UoKTtcbiAgLy8gY29uc3Qgc2NMaW5lc1ZpZXdlciA9IG5ldyBTY2F0dGVyUGxvdFdpdGhMaW5lcyhzYywgcmVzLmlzLCByZXMuanMsIGVtYmVyZFhDb2xOYW1lLCBlbWJlcmRZQ29sTmFtZSk7XG4gIC8vIHR2LmFkZFZpZXdlcihzY0xpbmVzVmlld2VyKTtcbiAgcmV0dXJuIHtzYywgZW1iZWRYQ29sLCBlbWJlZFlDb2wsIGNsdXN0ZXJDb2wsIGNsdXN0ZXJDb3VudGVyQ29sLCBjb25uZWN0aXZpdHlDb2x9O1xufVxuXG4iXX0=","export * from './marcov-cluster';\nexport * from './types';\nexport function createMCLWorker(data, threshold, weights, aggregationMethod, distanceFns, distanceFnArgs, maxIterations = 10, useWebGPU = false, inflate = 2) {\n const worker = new Worker(new URL('mcl-worker', import.meta.url));\n worker.postMessage({ data, threshold, weights, aggregationMethod, distanceFns,\n distanceFnArgs, maxIterations, useWebGPU, inflate });\n let resolveF;\n const promise = new Promise((resolve, reject) => {\n resolveF = resolve;\n worker.onmessage = (event) => {\n setTimeout(() => worker.terminate(), 100);\n resolve(event.data.res);\n };\n worker.onerror = (event) => {\n setTimeout(() => worker.terminate(), 100);\n reject(event);\n };\n });\n const terminate = () => {\n try {\n resolveF(null);\n worker.terminate();\n }\n catch (e) {\n console.error(e);\n }\n };\n return { promise, terminate };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsU0FBUyxDQUFDO0FBRXhCLE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBYSxFQUFFLFNBQWlCLEVBQzlELE9BQWlCLEVBQUUsaUJBQTRDLEVBQy9ELFdBQTJCLEVBQUUsY0FBcUIsRUFBRSxnQkFBd0IsRUFBRSxFQUM5RSxZQUFxQixLQUFLLEVBQUUsVUFBa0IsQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXO1FBQzFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUd0QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQixRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNyQixJQUFJLENBQUM7WUFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixPQUFPLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbWFyY292LWNsdXN0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNQ0xXb3JrZXIoZGF0YTogYW55W11bXSwgdGhyZXNob2xkOiBudW1iZXIsXG4gIHdlaWdodHM6IG51bWJlcltdLCBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCxcbiAgZGlzdGFuY2VGbnM6IEtub3duTWV0cmljc1tdLCBkaXN0YW5jZUZuQXJnczogYW55W10sIG1heEl0ZXJhdGlvbnM6IG51bWJlciA9IDEwLFxuICB1c2VXZWJHUFU6IGJvb2xlYW4gPSBmYWxzZSwgaW5mbGF0ZTogbnVtYmVyID0gMikge1xuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKG5ldyBVUkwoJ21jbC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgd29ya2VyLnBvc3RNZXNzYWdlKHtkYXRhLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaXN0YW5jZUZucyxcbiAgICBkaXN0YW5jZUZuQXJncywgbWF4SXRlcmF0aW9ucywgdXNlV2ViR1BVLCBpbmZsYXRlfSk7XG4gIGxldCByZXNvbHZlRjogRnVuY3Rpb247XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx7XG4gICAgY2x1c3RlcnM6IG51bWJlcltdLCBlbWJlZFg6IEZsb2F0MzJBcnJheSwgZW1iZWRZOiBGbG9hdDMyQXJyYXksXG4gICAgIGlzOiBVaW50MzJBcnJheSwganM6IFVpbnQzMkFycmF5XG4gICAgfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZUYgPSByZXNvbHZlO1xuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHdvcmtlci50ZXJtaW5hdGUoKSwgMTAwKTtcbiAgICAgICAgcmVzb2x2ZShldmVudC5kYXRhLnJlcyk7XG4gICAgICB9O1xuICAgICAgd29ya2VyLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3b3JrZXIudGVybWluYXRlKCksIDEwMCk7XG4gICAgICAgIHJlamVjdChldmVudCk7XG4gICAgICB9O1xuICAgIH0pO1xuICBjb25zdCB0ZXJtaW5hdGUgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVGKG51bGwpO1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge3Byb21pc2UsIHRlcm1pbmF0ZX07XG59XG4iXX0=","export const MCLMethodName = 'MCL';\nexport const MCL_OPTIONS_TAG = 'MCL_OPTIONS';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBZW5DLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5cbmV4cG9ydCB0eXBlIE1DTE9wdGlvbnMgPSB7XG4gICAgZXhwYW5kRmFjdG9yOiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9uczogbnVtYmVyLFxuICAgIGluZmxhdGVGYWN0b3I6IG51bWJlcixcbiAgICBtdWx0RmFjdG9yOiBudW1iZXIsXG59XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeE9iamVjdCA9IHtbXzogbnVtYmVyXToge1tfOiBudW1iZXJdOiBudW1iZXJ9fTtcblxuZXhwb3J0IGNvbnN0IE1DTE1ldGhvZE5hbWUgPSAnTUNMJztcblxuZXhwb3J0IHR5cGUgTUNMU2VyaWFsaXphYmxlT3B0aW9ucyA9IHtcbiAgICBjb2xzOiBzdHJpbmdbXTtcbiAgICBtZXRyaWNzOiBLbm93bk1ldHJpY3NbXTtcbiAgICB3ZWlnaHRzOiBudW1iZXJbXTtcbiAgICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZDtcbiAgICBwcmVwcm9jZXNzaW5nRnVuY3M6IChzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKVtdO1xuICAgIHByZXByb2Nlc3NpbmdGdW5jQXJnczogYW55W107XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgbWF4SXRlcmF0aW9uczogbnVtYmVyO1xuICAgIHVzZVdlYkdQVTogYm9vbGVhbjtcbiAgICBpbmZsYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBNQ0xfT1BUSU9OU19UQUcgPSAnTUNMX09QVElPTlMnO1xuIl19","\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!./u2.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!./u2.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 ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport $ from 'cash-dom';\nimport './u2.css';\nexport var u2;\n(function (u2) {\n /** */\n let panels;\n (function (panels) {\n /** Vertically positioned items */\n function vert(items) {\n return ui.divV(items.map((item) => ui.render(item)), { classes: 'u2-panel' });\n }\n panels.vert = vert;\n /** Horizontally positioned items */\n function horz(items) {\n return ui.divH(items.map((item) => ui.render(item)), { classes: 'u2-panel' });\n }\n panels.horz = horz;\n })(panels = u2.panels || (u2.panels = {}));\n function appHeader(header) {\n const icon = ui.iconImage('', header.iconPath);\n $(icon).addClass('ui-app-header-icon').css('margin-right', '20px');\n return panels.horz([\n icon,\n panels.vert([\n ui.markdown(header.description),\n header.learnMoreUrl ? ui.link('Learn more', header.learnMoreUrl) : null\n ])\n ]);\n }\n u2.appHeader = appHeader;\n let tools;\n (function (tools) {\n /** Executes {@link func} while showing the \"running\" indicator on {@link root}.\n * Handles and logs exceptions. */\n function runAsync(root, func) {\n return __awaiter(this, void 0, void 0, function* () {\n ui.setUpdateIndicator(root, true);\n try {\n return yield func();\n }\n catch (e) {\n grok.log.error(e);\n }\n finally {\n ui.setUpdateIndicator(root, false);\n }\n });\n }\n tools.runAsync = runAsync;\n })(tools = u2.tools || (u2.tools = {}));\n})(u2 || (u2 = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidTIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3pCLE9BQU8sVUFBVSxDQUFDO0FBR2xCLE1BQU0sS0FBVyxFQUFFLENBc0RsQjtBQXRERCxXQUFpQixFQUFFO0lBRWpCLE1BQU07SUFDTixJQUFpQixNQUFNLENBWXRCO0lBWkQsV0FBaUIsTUFBTTtRQUVyQixrQ0FBa0M7UUFDbEMsU0FBZ0IsSUFBSSxDQUFDLEtBQVk7WUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFGZSxXQUFJLE9BRW5CLENBQUE7UUFFRCxvQ0FBb0M7UUFDcEMsU0FBZ0IsSUFBSSxDQUFDLEtBQVk7WUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFGZSxXQUFJLE9BRW5CLENBQUE7SUFFSCxDQUFDLEVBWmdCLE1BQU0sR0FBTixTQUFNLEtBQU4sU0FBTSxRQVl0QjtJQVFELFNBQWdCLFNBQVMsQ0FBQyxNQUFnQjtRQUN4QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbkUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ3hFLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBWGUsWUFBUyxZQVd4QixDQUFBO0lBR0QsSUFBaUIsS0FBSyxDQWdCckI7SUFoQkQsV0FBaUIsS0FBSztRQUVwQjswQ0FDa0M7UUFDbEMsU0FBc0IsUUFBUSxDQUFJLElBQWlCLEVBQUUsSUFBc0I7O2dCQUN6RSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJO29CQUNGLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDckI7Z0JBQ0QsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBVyxDQUFDLENBQUM7aUJBQzdCO3dCQUNPO29CQUNOLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3BDO1lBQ0gsQ0FBQztTQUFBO1FBWHFCLGNBQVEsV0FXN0IsQ0FBQTtJQUNILENBQUMsRUFoQmdCLEtBQUssR0FBTCxRQUFLLEtBQUwsUUFBSyxRQWdCckI7QUFDSCxDQUFDLEVBdERnQixFQUFFLEtBQUYsRUFBRSxRQXNEbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgJCBmcm9tICdjYXNoLWRvbSc7XG5pbXBvcnQgJy4vdTIuY3NzJztcblxuXG5leHBvcnQgbmFtZXNwYWNlIHUyIHtcblxuICAvKiogKi9cbiAgZXhwb3J0IG5hbWVzcGFjZSBwYW5lbHMge1xuXG4gICAgLyoqIFZlcnRpY2FsbHkgcG9zaXRpb25lZCBpdGVtcyAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiB2ZXJ0KGl0ZW1zOiBhbnlbXSk6IEhUTUxFbGVtZW50IHtcbiAgICAgIHJldHVybiB1aS5kaXZWKGl0ZW1zLm1hcCgoaXRlbSkgPT4gdWkucmVuZGVyKGl0ZW0pKSwgeyBjbGFzc2VzOiAndTItcGFuZWwnfSk7XG4gICAgfVxuXG4gICAgLyoqIEhvcml6b250YWxseSBwb3NpdGlvbmVkIGl0ZW1zICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGhvcnooaXRlbXM6IGFueVtdKTogSFRNTEVsZW1lbnQge1xuICAgICAgcmV0dXJuIHVpLmRpdkgoaXRlbXMubWFwKChpdGVtKSA9PiB1aS5yZW5kZXIoaXRlbSkpLCB7IGNsYXNzZXM6ICd1Mi1wYW5lbCd9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgSUFwcEluZm8ge1xuICAgIGljb25QYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBsZWFybk1vcmVVcmw/OiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXBwSGVhZGVyKGhlYWRlcjogSUFwcEluZm8pOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25JbWFnZSgnJywgaGVhZGVyLmljb25QYXRoKTtcbiAgICAkKGljb24pLmFkZENsYXNzKCd1aS1hcHAtaGVhZGVyLWljb24nKS5jc3MoJ21hcmdpbi1yaWdodCcsICcyMHB4Jyk7XG5cbiAgICByZXR1cm4gcGFuZWxzLmhvcnooW1xuICAgICAgaWNvbixcbiAgICAgIHBhbmVscy52ZXJ0KFtcbiAgICAgICAgdWkubWFya2Rvd24oaGVhZGVyLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgaGVhZGVyLmxlYXJuTW9yZVVybCA/IHVpLmxpbmsoJ0xlYXJuIG1vcmUnLCBoZWFkZXIubGVhcm5Nb3JlVXJsKSA6IG51bGxcbiAgICAgIF0pXG4gICAgXSk7XG4gIH1cblxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgdG9vbHMge1xuXG4gICAgLyoqIEV4ZWN1dGVzIHtAbGluayBmdW5jfSB3aGlsZSBzaG93aW5nIHRoZSBcInJ1bm5pbmdcIiBpbmRpY2F0b3Igb24ge0BsaW5rIHJvb3R9LlxuICAgICAqIEhhbmRsZXMgYW5kIGxvZ3MgZXhjZXB0aW9ucy4gKi9cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXN5bmM8VD4ocm9vdDogSFRNTEVsZW1lbnQsIGZ1bmM6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICAgIHVpLnNldFVwZGF0ZUluZGljYXRvcihyb290LCB0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBncm9rLmxvZy5lcnJvcihlIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHtcbiAgICAgICAgdWkuc2V0VXBkYXRlSW5kaWNhdG9yKHJvb3QsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs.operators;","/* eslint-disable max-len */\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {PeptidesModel, VIEWER_TYPE} from '../model';\nimport {Options} from '@datagrok-libraries/utils/src/type-declarations';\nimport {ACTIVITY_TARGET, COLUMN_NAME, COLUMNS_NAMES} from '../utils/constants';\nimport wu from 'wu';\nimport $ from 'cash-dom';\nimport * as rxjs from 'rxjs';\nimport {filter} from 'rxjs/operators';\nexport const enum ClusterMaxActivityProps {\n CLUSTER_COLUMN = 'cluster',\n ACTIVITY_COLUMN = 'activity',\n CONNECTIVITY_COLUMN = 'connectivity',\n COLOR_COLUMN = 'color',\n CLUSTER_SIZE_THRESHOLD = 'clusterSizeThreshold',\n ACTIVITY_THRESHOLD = 'activityThreshold',\n}\n\nexport interface IClusterMaxActivity {\n clusterColumnName: string;\n activityColumnName: string;\n connectivityColumnName?: string;\n colorColumnName?: string;\n activityTarget: ACTIVITY_TARGET;\n clusterSizeThreshold: number;\n activityThreshold: number;\n}\n\n\nexport class ClusterMaxActivityViewer extends DG.JsViewer implements IClusterMaxActivity {\n _titleHost = ui.divText(VIEWER_TYPE.CLUSTER_MAX_ACTIVITY, {id: 'pep-viewer-title', style: {marginRight: 'auto'}});\n _selsectIcon: HTMLElement = ui.div();\n clusterColumnName: string;\n activityColumnName: string;\n colorColumnName: string;\n connectivityColumnName?: string | undefined;\n activityTarget: ACTIVITY_TARGET = ACTIVITY_TARGET.HIGH;\n _scViewer?: DG.ScatterPlotViewer | null;\n viewerError: string = '';\n renderTimeout: NodeJS.Timeout | number | null = null;\n renderDebounceTime = 500;\n clusterSizeThreshold: number;\n activityThreshold: number;\n static clusterSizeColName = '~cluster.size' as const;\n static maxActivityInClusterColName = '~max.activity.for.cluster' as const;\n static maxConnectivityInClusterColName = '~max.connectivity.for.cluster' as const;\n static synSelectionColName = 'Syn Selection' as const;\n static maxActivityLabel = 'Max Activity' as const;\n static maxConnectivityLabel = 'Max Connectivity' as const;\n private scFilterQuery = `\\$\\{${ClusterMaxActivityViewer.maxActivityInClusterColName}\\} == 1` as const;\n private selectionSubscription: rxjs.Subscription | null = null;\n private linesDrawSubscription: rxjs.Subscription | null = null;\n get scViewer(): DG.ScatterPlotViewer | null {\n if (!this._scViewer)\n this._scViewer = this.createSCViewer();\n return this._scViewer;\n }\n constructor() {\n super();\n this.clusterColumnName = this.column(ClusterMaxActivityProps.CLUSTER_COLUMN, {nullable: false});\n this.activityColumnName = this.column(ClusterMaxActivityProps.ACTIVITY_COLUMN, {nullable: false});\n this.colorColumnName = this.column(ClusterMaxActivityProps.COLOR_COLUMN,\n {nullable: true, defaultValue: null});\n this.activityTarget = this.string(\n 'activityTarget', ACTIVITY_TARGET.HIGH, {choices: [ACTIVITY_TARGET.HIGH, ACTIVITY_TARGET.LOW]},\n ) as ACTIVITY_TARGET;\n this.clusterSizeThreshold = this.int(ClusterMaxActivityProps.CLUSTER_SIZE_THRESHOLD, 20);\n this.activityThreshold = this.int(ClusterMaxActivityProps.ACTIVITY_THRESHOLD, 1000);\n this.connectivityColumnName = this.column(ClusterMaxActivityProps.CONNECTIVITY_COLUMN, {nullable: true});\n }\n\n /**\n * Returns PeptidesModel instance that belongs to the attached dataframe.\n * @return - PeptidesModel instance.\n */\n get model(): PeptidesModel {\n return PeptidesModel.getInstance(this.dataFrame);\n }\n\n private createSCViewer(): DG.ScatterPlotViewer | null {\n // @ts-ignore TODO: fix after api update\n const scatterPlotProps: Partial<DG.IScatterPlotSettings> & Options = {\n showXAxis: true,\n showYAxis: true,\n showXSelector: false,\n showYSelector: false,\n showColorSelector: false,\n xAxisType: DG.AxisType.logarithmic,\n yAxisType: DG.AxisType.logarithmic,\n invertYAxis: this.activityTarget === ACTIVITY_TARGET.LOW,\n xColumnName: ClusterMaxActivityViewer.clusterSizeColName,\n markerType: 'circle',\n markerDefaultSize: 10,\n showSizeSelector: false,\n };\n if (this.clusterColumnName == null || this.activityColumnName == null ||\n !this.dataFrame.columns.contains(this.clusterColumnName) ||\n !this.dataFrame.columns.contains(this.activityColumnName)\n ) {\n this.viewerError = 'Please set valid cluster and activity columns';\n return null;\n }\n const activityCol = this.dataFrame.columns.byName(this.activityColumnName);\n const clusterCol = this.dataFrame.columns.byName(this.clusterColumnName);\n const connectivityCol = this.connectivityColumnName != null ?\n this.dataFrame.columns.byName(this.connectivityColumnName) : null;\n const numericColTypes: DG.ColumnType[] =\n [DG.COLUMN_TYPE.FLOAT, DG.COLUMN_TYPE.INT, DG.COLUMN_TYPE.BIG_INT, DG.COLUMN_TYPE.QNUM];\n if (!numericColTypes.includes(activityCol.type)) {\n this.viewerError = 'Activity column should be numeric';\n return null;\n }\n const clusterSizeCol = this.dataFrame.columns.getOrCreate(ClusterMaxActivityViewer.clusterSizeColName,\n DG.TYPE.INT, this.dataFrame.rowCount);\n const clusterSizeMap: {[key: number | string]: number} = {};\n for (let i = 0; i < this.dataFrame.rowCount; i++) {\n const cluster: string | number = clusterCol.get(i);\n if (cluster == null)\n continue;\n clusterSizeMap[cluster] = (clusterSizeMap[cluster] ?? 0) + 1;\n }\n\n clusterSizeCol.init((i) => clusterCol.isNone(i) ? null : clusterSizeMap[clusterCol.get(i)] ?? null);\n\n if (activityCol.stats.min <= 0)\n scatterPlotProps.yAxisType = DG.AxisType.linear;\n\n // create a new column to store max activity for each cluster size\n const maxActivityIndexPerClusterMap: {[key: number]: number} = {};\n const maxConnectivityIndexPerClusterMap: {[key: number]: number} = {};\n for (let i = 0; i < this.dataFrame.rowCount; i++) {\n const cluster: number | null = clusterCol.get(i);\n if (cluster == null || clusterCol.isNone(i) || activityCol.isNone(i))\n continue;\n const activity: number = activityCol.get(i);\n const prevMaxActivityIndex = maxActivityIndexPerClusterMap[cluster];\n if (prevMaxActivityIndex == null || prevMaxActivityIndex == undefined)\n maxActivityIndexPerClusterMap[cluster] = i;\n else {\n if (activity > activityCol.get(prevMaxActivityIndex) && this.activityTarget === ACTIVITY_TARGET.HIGH)\n maxActivityIndexPerClusterMap[cluster] = i;\n else if (activity < activityCol.get(prevMaxActivityIndex) && this.activityTarget === ACTIVITY_TARGET.LOW)\n maxActivityIndexPerClusterMap[cluster] = i;\n }\n if (connectivityCol) {\n const connectivity: number = connectivityCol.get(i);\n const prevMaxConnectivityIndex = maxConnectivityIndexPerClusterMap[cluster];\n if (prevMaxConnectivityIndex == null || prevMaxConnectivityIndex == undefined)\n maxConnectivityIndexPerClusterMap[cluster] = i;\n else {\n if (connectivity > connectivityCol.get(prevMaxConnectivityIndex))\n maxConnectivityIndexPerClusterMap[cluster] = i;\n }\n }\n }\n\n const maxAtivityInClusterSizeCol = this.dataFrame.columns.getOrCreate(\n ClusterMaxActivityViewer.maxActivityInClusterColName, DG.COLUMN_TYPE.INT, this.dataFrame.rowCount);\n maxAtivityInClusterSizeCol.init((i) => {\n if (clusterCol.isNone(i))\n return 0;\n return i === maxActivityIndexPerClusterMap[clusterCol.get(i)] ? 1 : 0;\n });\n\n const maxConnectivityInClusterSizeCol = this.dataFrame.columns.getOrCreate(\n ClusterMaxActivityViewer.maxConnectivityInClusterColName, DG.COLUMN_TYPE.INT, this.dataFrame.rowCount);\n maxConnectivityInClusterSizeCol.init((i) => {\n if (clusterCol.isNone(i))\n return 0;\n return i === maxConnectivityIndexPerClusterMap[clusterCol.get(i)] ? 1 : 0;\n });\n\n const synSelectionCol = this.dataFrame.columns.getOrCreate(\n ClusterMaxActivityViewer.synSelectionColName, DG.TYPE.STRING, this.dataFrame.rowCount);\n\n synSelectionCol.init((i) => {\n if (clusterCol.isNone(i))\n return null;\n let r: string | null = null;\n if (i === maxActivityIndexPerClusterMap[clusterCol.get(i)])\n r = ClusterMaxActivityViewer.maxActivityLabel;\n if (connectivityCol && i === maxConnectivityIndexPerClusterMap[clusterCol.get(i)])\n r = r ? `${r}, ${ClusterMaxActivityViewer.maxConnectivityLabel}` : ClusterMaxActivityViewer.maxConnectivityLabel;\n return r;\n });\n\n scatterPlotProps.xColumnName = ClusterMaxActivityViewer.clusterSizeColName;\n scatterPlotProps.yColumnName = this.activityColumnName;\n scatterPlotProps.filter = this.scFilterQuery;\n this.viewerError = '';\n const sc = DG.Viewer.scatterPlot(this.dataFrame, scatterPlotProps);\n\n if (this.selectionSubscription)\n this.selectionSubscription.unsubscribe();\n this.selectionSubscription = sc.onDataEvent.pipe(filter((e) => e.type == 'd4-select')).subscribe((e) => {\n const indexes = e.bitset?.getSelectedIndexes() ?? [];\n const currentSelection = this.dataFrame.selection;\n const filterBitset = DG.BitSet.create(this.dataFrame.rowCount, (i) => maxAtivityInClusterSizeCol.get(i) == 1);\n filterBitset.and(currentSelection);\n for (let i = 0; i < indexes.length; i++) {\n const index = indexes[i];\n const cluster = clusterCol.get(index);\n if (clusterCol.isNone(index))\n continue;\n filterBitset.set(index, true);\n if (maxConnectivityIndexPerClusterMap[cluster] != null)\n filterBitset.set(maxConnectivityIndexPerClusterMap[cluster], true);\n }\n filterBitset.fireChanged();\n const filteredIndexes = filterBitset.getSelectedIndexes();\n for (const i of filteredIndexes) {\n const cluster = clusterCol.get(i);\n if (cluster == null)\n continue;\n if (maxConnectivityIndexPerClusterMap[cluster] != null)\n filterBitset.set(maxConnectivityIndexPerClusterMap[cluster], true);\n }\n setTimeout(() => {\n this.dataFrame.selection.copyFrom(filterBitset, true);\n setTimeout(() => {\n if (this.model)\n this.model.createAccordion();\n }, 200);\n }, 200);\n });\n\n const selectTopQuadrants = (): void => {\n const selectionBitset = DG.BitSet.create(this.dataFrame.rowCount);\n Object.entries(maxActivityIndexPerClusterMap).forEach(([cluster, index]) => {\n if (cluster == null || index == null)\n return;\n const clusterInt = parseInt(cluster);\n const activity = activityCol.get(index);\n const clusterSize = clusterSizeMap[clusterInt] ?? clusterSizeMap[cluster];\n if (activity < this.activityThreshold && clusterSize < this.clusterSizeThreshold)\n return;\n selectionBitset.set(index, true, false);\n if (maxConnectivityIndexPerClusterMap[clusterInt] != null)\n selectionBitset.set(maxConnectivityIndexPerClusterMap[clusterInt], true, false);\n });\n selectionBitset.fireChanged();\n this.dataFrame.selection.copyFrom(selectionBitset, true);\n };\n\n this._selsectIcon = ui.iconSvg('select-all', () => {\n selectTopQuadrants();\n }, 'Select 3 Active quadrants');\n this._selsectIcon.style.cursor = 'pointer';\n this._selsectIcon.style.marginRight = '5px';\n selectTopQuadrants();\n if (this.linesDrawSubscription)\n this.linesDrawSubscription.unsubscribe();\n this.linesDrawSubscription = sc.onBeforeDrawScene.subscribe(() => {\n const canvas = sc.getInfo().canvas;\n const ctx: CanvasRenderingContext2D = canvas.getContext('2d');\n const viewPort = sc.viewport;\n const startPointHor = sc.worldToScreen(viewPort.x, this.activityThreshold);\n const startPointVer = sc.worldToScreen(this.clusterSizeThreshold, viewPort.y);\n const endPointHor = sc.worldToScreen(viewPort.x + viewPort.width, this.activityThreshold);\n const endPointVer = sc.worldToScreen(this.clusterSizeThreshold, viewPort.y + viewPort.height);\n ctx.beginPath();\n ctx.strokeStyle = 'rgb(0,0,0)';\n ctx.lineWidth = 1;\n ctx.moveTo(startPointHor.x, startPointHor.y);\n ctx.lineTo(endPointHor.x, endPointHor.y);\n ctx.moveTo(startPointVer.x, startPointVer.y);\n ctx.lineTo(endPointVer.x, endPointVer.y);\n ctx.stroke();\n ctx.closePath();\n });\n\n return sc;\n }\n\n onTableAttached(): void {\n super.onTableAttached();\n const activityCol: DG.Column | null = this.dataFrame?.col(COLUMNS_NAMES.ACTIVITY) ??\n wu(this.dataFrame?.columns.numerical).next()?.value;\n if (activityCol != null)\n this.getProperty(`${ClusterMaxActivityProps.ACTIVITY_COLUMN}${COLUMN_NAME}`)?.set(this, activityCol.name);\n\n const clusterCol: DG.Column | null = wu(this.dataFrame?.columns.categorical).next()?.value;\n if (clusterCol != null)\n this.getProperty(`${ClusterMaxActivityProps.CLUSTER_COLUMN}${COLUMN_NAME}`)?.set(this, clusterCol.name);\n\n const connectivityCol: DG.Column | null = wu(this.dataFrame?.columns.numerical).next()?.value;\n if (connectivityCol != null)\n this.getProperty(`${ClusterMaxActivityProps.CONNECTIVITY_COLUMN}${COLUMN_NAME}`)?.set(this, connectivityCol.name);\n\n this.render();\n\n this.dataFrame?.onDataChanged.subscribe(() => {\n this.render();\n });\n }\n\n render(): void {\n if (this.renderTimeout)\n clearTimeout(this.renderTimeout);\n this.renderTimeout = setTimeout(() => {\n if (!this.dataFrame)\n return;\n $(this.root).empty();\n const scViewer = this.scViewer;\n if (scViewer == null) {\n this.root.appendChild(ui.divText(this.viewerError ?? 'Error creating scatter plot'));\n return;\n }\n const clusterSizeLabel = ui.div('Cluster Size', {style: {\n alignSelf: 'center',\n color: 'var(--grey-6)',\n marginBottom: '5px'},\n });\n const maxActivityLabel = ui.div(\n this.activityTarget === ACTIVITY_TARGET.HIGH ? 'Maximum Activity' : 'Minimum Activity', {style: {\n color: 'var(--grey-6)',\n alignSelf: 'center',\n textOrientation: 'mixed',\n writingMode: 'tb',\n transform: 'rotate(180deg)',\n marginLeft: '5px',\n }});\n scViewer.props.colorColumnName = this.colorColumnName ?? null;\n\n this.root.appendChild(\n ui.divH([\n maxActivityLabel,\n ui.divV([\n ui.divH([this._titleHost, this._selsectIcon], {\n style: {\n alignSelf: 'center',\n lineHeight: 'normal',\n width: '100%',\n },\n }),\n scViewer.root,\n clusterSizeLabel,\n ], {style: {flexGrow: '1'},\n }),\n ]),\n );\n scViewer.root.style.width = '100%';\n //this.root.appendChild(scViewer.root);\n setTimeout(() => {\n scViewer.props.filter = this.scFilterQuery;\n scViewer.invalidateCanvas();\n }, 100);\n }, this.renderDebounceTime);\n }\n\n onPropertyChanged(property: DG.Property | null): void {\n super.onPropertyChanged(property);\n if (property?.name !== `${ClusterMaxActivityProps.COLOR_COLUMN}${COLUMN_NAME}`)\n this._scViewer = null;\n this.render();\n }\n}\n\n","/* Do not change these import lines. Datagrok will import API library in exactly the same manner */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {View} from 'datagrok-api/dg';\n\nimport {analyzePeptidesUI} from './widgets/peptides';\nimport {manualAlignmentWidget} from './widgets/manual-alignment';\nimport {MonomerPosition, MostPotentResidues} from './viewers/sar-viewer';\nimport {getTreeHelper, ITreeHelper} from '@datagrok-libraries/bio/src/trees/tree-helper';\nimport {LogoSummaryTable} from './viewers/logo-summary';\nimport {MonomerWorks} from '@datagrok-libraries/bio/src/monomer-works/monomer-works';\nimport {PeptidesModel} from './model';\nimport {macromoleculeSarFastaDemoUI} from './demo/fasta';\nimport {u2} from '@datagrok-libraries/utils/src/u2';\nimport {ClusterMaxActivityViewer} from './viewers/cluster-max-activity-viewer';\nimport {LSTPieChartRenderer} from './utils/cell-renderer';\n\nlet monomerWorks: MonomerWorks | null = null;\nlet treeHelper: ITreeHelper;\n\nexport const _package = new DG.Package();\n\nexport function getMonomerWorksInstance(): MonomerWorks | null {\n return monomerWorks;\n}\n\nexport function getTreeHelperInstance(): ITreeHelper {\n return treeHelper;\n}\n\n//tags: init\nexport async function initPeptides(): Promise<void> {\n try {\n monomerWorks ??= new MonomerWorks(await grok.functions.call('Bio:getBioLib'));\n treeHelper ??= await getTreeHelper();\n } catch (e) {\n grok.log.error(e as string);\n }\n}\n\nasync function openDemoData(chosenFile: string): Promise<void> {\n const pi = DG.TaskBarProgressIndicator.create('Loading Peptides');\n const path = _package.webRoot + 'files/' + chosenFile;\n const peptides = await grok.data.loadTable(path);\n peptides.name = 'Peptides';\n const view = grok.shell.addTableView(peptides);\n view.name = 'PeptidesView';\n grok.shell.windows.showProperties = true;\n pi.close();\n}\n\n//name: Peptides\n//tags: app\n//output: view v\nexport function Peptides(): DG.View {\n const appHeader = u2.appHeader({\n iconPath: _package.getIconUrl(),\n learnMoreUrl: 'https://github.com/datagrok-ai/public/blob/master/help/domains/bio/peptides.md',\n description:\n '- Automatically recognizes peptides in your data\\n' +\n '- Invariant map and mutation cliffs\\n' +\n '- Logo plots to explore sequence composition\\n' +\n '- Hierarchical clustering\\n' +\n '- Sequence space to analyze clustering and activity cliffs\\n' +\n '- Finds statistically significant changes in activity for monomer/positions\\n',\n });\n\n const windows = grok.shell.windows;\n windows.showToolbox = false;\n windows.showHelp = false;\n windows.showProperties = false;\n\n const view = View.create();\n view.name = 'Peptides';\n ui.appendAll(view.root, [\n appHeader,\n ui.divH([\n ui.button('Simple demo', () => openDemoData('aligned.csv'), ''),\n ui.button('Complex demo', () => openDemoData('aligned_2.csv'), ''),\n ui.button('HELM demo', () => openDemoData('aligned_3.csv'), ''),\n ]),\n ]);\n return view;\n}\n\n//top-menu: Bio | Analyze | SAR...\n//name: Bio Peptides\nexport function peptidesDialog(): DG.Dialog {\n const analyzeObject = analyzePeptidesUI(grok.shell.t);\n const dialog = ui.dialog('Analyze Peptides').add(analyzeObject.host).onOK(async () => {\n const startSuccess = analyzeObject.callback();\n if (!startSuccess)\n dialog.show();\n });\n return dialog.show();\n}\n\n//name: testInitFunctionPeptides\n//input: viewer v\nexport async function testInitFunctionPeptides(v: DG.Viewer): Promise<void> {\n grok.shell.info('Test init function for Peptides package');\n grok.shell.info('Viewer name: ' + v.dataFrame.name);\n await new Promise<void>((r) => setTimeout(r, 1000));\n}\n\n//name: Peptides\n//tags: panel, widgets\n//input: column col {semType: Macromolecule}\n//output: widget result\nexport function peptidesPanel(col: DG.Column): DG.Widget {\n const analyzeObject = analyzePeptidesUI(col.dataFrame, col);\n return new DG.Widget(analyzeObject.host);\n}\n\n//name: Monomer-Position\n//description: Peptides Monomer-Position Viewer\n//tags: viewer\n//meta.icon: files/icons/peptide-sar-viewer.svg\n//output: viewer result\nexport function monomerPosition(): MonomerPosition {\n return new MonomerPosition();\n}\n\n//name: Most Potent Residues\n//description: Peptides Most Potent Residues Viewer\n//tags: viewer\n//meta.icon: files/icons/peptide-sar-vertical-viewer.svg\n//output: viewer result\nexport function mostPotentResidues(): MostPotentResidues {\n return new MostPotentResidues();\n}\n\n//name: Logo Summary Table\n//tags: viewer\n//meta.icon: files/icons/logo-summary-viewer.svg\n//output: viewer result\nexport function logoSummaryTable(): LogoSummaryTable {\n return new LogoSummaryTable();\n}\n\n//name: Active peptide selection\n//tags: viewer\n//output: viewer result\nexport function clusterMaxActivity(): ClusterMaxActivityViewer {\n return new ClusterMaxActivityViewer();\n}\n\n//name: Manual Alignment\n//tags: panel, widgets\n//input: string _monomer {semType: Monomer}\n//output: widget result\nexport function manualAlignment(_monomer: string): DG.Widget {\n //TODO: recalculate Molfile and Molecule panels on sequence update\n const df = grok.shell.t;\n const model: PeptidesModel | null = df?.temp[PeptidesModel.modelName];\n if (!model)\n return new DG.Widget(ui.divText('Manual alignment works with peptides analysis'));\n\n\n const col = df.getCol(model.settings!.sequenceColumnName!);\n return manualAlignmentWidget(col, df);\n}\n\n// --- Demo ---\n//name: Macromolecule SAR Analysis\n//description: Macromolecule SAR Analysis demo on peptide sequences in FASTA format\n//meta.demoPath: Bioinformatics | Macromolecule SAR Analysis\n//meta.isDemoScript: False\nexport async function macromoleculeSarFastaDemo(): Promise<void> {\n return macromoleculeSarFastaDemoUI();\n}\n\n//name: LST Pie Chart\n//tags: cellRenderer\n//meta.cellType: lst-pie-chart\n//meta.gridChart: true\n//output: grid_cell_renderer result\nexport function lstPiechartCellRenderer(): LSTPieChartRenderer {\n return new LSTPieChartRenderer();\n}\n","import * as DG from 'datagrok-api/dg';\nexport async function getTreeHelper() {\n const treeHelperPackageName = 'Dendrogram';\n const funcList = DG.Func.find({ package: treeHelperPackageName, name: 'getTreeHelper' });\n if (funcList.length === 0)\n throw new Error(`Package \"${treeHelperPackageName}\" must be installed for TreeHelper.`);\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=tree-helper.js.map","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\nimport '../styles.css';\nimport {PeptidesModel} from '../model';\nimport {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\n\n/**\n * Allows to edit sequence and apply changes to the table and analysis.\n * @param alignedSequenceCol Aligned sequence column\n * @param currentDf Working table\n * @return Widget for manual sequence alignment\n */\nexport function manualAlignmentWidget(alignedSequenceCol: DG.Column<string>, currentDf: DG.DataFrame): DG.Widget {\n const sequenceInput = ui.textInput('', alignedSequenceCol.get(currentDf.currentRowIdx)!);\n $(sequenceInput.root).addClass('pep-textinput');\n\n const applyChangesBtn = ui.button('Apply', async () => {\n const sh = SeqHandler.forColumn(alignedSequenceCol);\n const newSequence = sequenceInput.value;\n const splitSequence = sh.split(newSequence);\n const affectedRowIndex = currentDf.currentRowIdx;\n alignedSequenceCol.set(affectedRowIndex, newSequence);\n for (let i = 0; i < splitSequence.length; i++) {\n const part = splitSequence.getCanonical(i);\n if (currentDf.col(i.toString()) !== null)\n currentDf.set(i.toString(), affectedRowIndex, part);\n }\n const temp = grok.shell.o;\n grok.shell.o = null;\n\n const peptidesController = PeptidesModel.getInstance(currentDf);\n peptidesController.updateGrid();\n\n setTimeout(() => {\n grok.shell.o = temp;\n }, 100);\n }, 'Apply changes');\n\n const resetBtn = ui.button(ui.iconFA('redo'),\n () => sequenceInput.value = alignedSequenceCol.get(currentDf.currentRowIdx)!, 'Reset');\n $(resetBtn).addClass('pep-snippet-editor-icon pep-reset-icon');\n\n return new DG.Widget(ui.divV([resetBtn, sequenceInput.root, applyChangesBtn], 'pep-textarea-box'));\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../package';\nimport {startAnalysis} from '../widgets/peptides';\nimport * as C from '../utils/constants';\nimport {scaleActivity} from '../utils/misc';\nimport {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {PeptidesModel} from '../model';\nimport {delay} from '@datagrok-libraries/utils/src/test';\n\nexport async function macromoleculeSarFastaDemoUI(): Promise<void> {\n grok.shell.windows.showContextPanel = true;\n const alignedSequenceCol = 'AlignedSequence';\n const simpleActivityColName = 'IC50';\n const simpleTable = DG.DataFrame.fromCsv(await _package.files.readAsText('aligned.csv'));\n grok.shell.addTableView(simpleTable);\n await delay(0);\n const simpleActivityCol = simpleTable.getCol(simpleActivityColName);\n const simpleAlignedSeqCol = simpleTable.getCol(alignedSequenceCol);\n simpleAlignedSeqCol.semType = DG.SEMTYPE.MACROMOLECULE;\n simpleAlignedSeqCol.setTag(C.TAGS.ALPHABET, ALPHABET.PT);\n simpleAlignedSeqCol.setTag(DG.TAGS.UNITS, NOTATION.FASTA);\n simpleAlignedSeqCol.setTag(bioTAGS.aligned, ALIGNMENT.SEQ_MSA);\n const simpleScaledCol = scaleActivity(simpleActivityCol, C.SCALING_METHODS.MINUS_LG);\n const clustersCol = DG.Column.string('Cluster', simpleTable.rowCount).init('0');\n const alignedCol: DG.Column<string> = await grok.functions.call('Bio:alignSequences', {\n sequenceCol: simpleAlignedSeqCol,\n clustersCol,\n });\n const model: PeptidesModel = await startAnalysis(simpleActivityCol, alignedCol, null, simpleTable, simpleScaledCol,\n C.SCALING_METHODS.MINUS_LG) as PeptidesModel;\n model.modifyWebLogoSelection({monomerOrCluster: 'D', positionOrClusterType: '13'});\n}\n","import * as type from './types';\nimport {MutationCliffsOptions} from './algorithms';\n\nexport type ParallelMutationReturnType = {\n pos: string[],\n seq1Idxs: Uint32Array,\n seq2Idxs: Uint32Array,\n}\n\nexport class ParallelMutationCliffs {\n private _workers: Worker[];\n private _workerCount: number;\n\n constructor() {\n const threadCount = navigator.hardwareConcurrency;\n this._workerCount = Math.max(threadCount - 2, 1);\n this._workers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('../workers/mutation-cliffs-worker', import.meta.url)));\n }\n\n public async calc(activityArray: type.RawData, monomerInfoArray: type.RawColumn[],\n options: MutationCliffsOptions = {}): Promise<type.MutationCliffs> {\n const substitutionsInfo: type.MutationCliffs = new Map();\n try {\n const currentTargetIdx = options.targetCol?.cat!.indexOf(options.currentTarget!) ?? -1;\n\n const len = activityArray.length;\n const promises = new Array<Promise<ParallelMutationReturnType>>(this._workerCount);\n const matSize = len * (len - 1) / 2; // size of reduced upper triangular matrix\n this._workerCount = Math.min(this._workerCount, matSize);\n const chunkSize = matSize / this._workerCount;\n // monomerInfoArray[m].cat and targetCol can contain some function from datagrok-api,\n //which the worker can't serialize and fails. so we need to remove it\n monomerInfoArray.forEach((monomerInfo) => {\n monomerInfo.cat = monomerInfo.cat?.slice();\n });\n options.targetCol?.cat && (options.targetCol.cat = options.targetCol.cat.slice());\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = Math.floor(idx * chunkSize);\n const endIdx = idx === this._workerCount - 1 ? matSize : Math.floor((idx + 1) * chunkSize);\n this._workers[idx].postMessage(\n {startIdx, endIdx, activityArray, monomerInfoArray, settings: options, currentTargetIdx});\n this._workers[idx].onmessage = ({data: {pos, seq1Idxs, seq2Idxs, error}}): void => {\n if (error) {\n this._workers[idx]?.terminate();\n rejectWorker(error);\n } else {\n this._workers[idx].terminate();\n resolveWorker({pos, seq1Idxs, seq2Idxs});\n }\n };\n });\n }\n\n const results = await Promise.all(promises);\n const monomerPositionsMap = new Map<string, number>();\n monomerInfoArray.forEach((monomerInfo, i) => {\n monomerPositionsMap.set(monomerInfo.name, i);\n });\n results.filter(Boolean).forEach((result) => {\n for (let i = 0; i < result.pos.length; i++) {\n //getting monomers from monomerInfoArray by position\n const monomerPos = monomerPositionsMap.get(result.pos[i])!;\n const monomer1Cat = monomerInfoArray[monomerPos].rawData[result.seq1Idxs[i]];\n const monomer1 = monomerInfoArray[monomerPos].cat![monomer1Cat];\n const monomer2Cat = monomerInfoArray[monomerPos].rawData[result.seq2Idxs[i]];\n const monomer2 = monomerInfoArray[monomerPos].cat![monomer2Cat];\n\n // filling map\n if (!substitutionsInfo.has(monomer1))\n substitutionsInfo.set(monomer1, new Map());\n if (!substitutionsInfo.has(monomer2))\n substitutionsInfo.set(monomer2, new Map());\n const position1Map = substitutionsInfo.get(monomer1)!;\n const position2Map = substitutionsInfo.get(monomer2)!;\n if (!position1Map.has(result.pos[i]))\n position1Map.set(result.pos[i], new Map());\n if (!position2Map.has(result.pos[i]))\n position2Map.set(result.pos[i], new Map());\n const indexes1Map = position1Map.get(result.pos[i])!;\n const indexes2Map = position2Map.get(result.pos[i])!;\n if (!indexes1Map.has(result.seq1Idxs[i]))\n indexes1Map.set(result.seq1Idxs[i], []);\n if (!indexes2Map.has(result.seq2Idxs[i]))\n indexes2Map.set(result.seq2Idxs[i], []);\n const indexes1 = indexes1Map.get(result.seq1Idxs[i])!;\n const indexes2 = indexes2Map.get(result.seq2Idxs[i])!;\n (indexes1 as number[]).push(result.seq2Idxs[i]);\n (indexes2 as number[]).push(result.seq1Idxs[i]);\n }\n });\n } catch (error) {\n this.terminate();\n console.error(error);\n }\n return substitutionsInfo;\n }\n\n public terminate(): void {\n this._workers?.forEach((worker) => {\n try {\n worker?.terminate();\n } catch (error) {\n console.error(error);\n }\n });\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as C from './constants';\nimport * as type from './types';\nimport {ParallelMutationCliffs} from './parallel-mutation-cliffs';\nimport {CLUSTER_TYPE} from '../viewers/logo-summary';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {\n ClusterStats,\n ClusterTypeStats,\n getStats,\n MonomerPositionStats,\n PositionStats,\n StatsItem,\n SummaryStats,\n} from './statistics';\n\nexport type MutationCliffsOptions = {\n maxMutations?: number,\n minActivityDelta?: number,\n targetCol?: type.RawColumn | null,\n currentTarget?: string | null\n};\n\n/**\n * Finds mutation cliffs in the set of sequences.\n * @param activityArray - Activity column raw data.\n * @param monomerInfoArray - Split sequence raw columns.\n * @param options - Options for the mutation cliffs algorithm.\n * @return - Mutation cliffs map.\n */\nexport async function findMutations(activityArray: type.RawData, monomerInfoArray: type.RawColumn[],\n options: MutationCliffsOptions = {}): Promise<type.MutationCliffs> {\n const nCols = monomerInfoArray.length;\n if (nCols === 0)\n throw new Error(`PepAlgorithmError: Couldn't find any column of semType '${C.SEM_TYPES.MONOMER}'`);\n\n\n options.minActivityDelta ??= 0;\n options.maxMutations ??= 1;\n const mutationCliffsService = new ParallelMutationCliffs();\n const substitutionsInfo = await mutationCliffsService.calc(activityArray, monomerInfoArray, options);\n mutationCliffsService.terminate();\n return substitutionsInfo;\n}\n\n/**\n * Calculates statistics for mutation cliffs, used for mutation cliffst table (coloring, tooltips, distribution...)\n * @param cliffs - mutation cliffs data\n * @param activityArray - array of activities\n *\n */\nexport function calculateCliffsStatistics(\n cliffs: type.MutationCliffs, activityArray: type.RawData,\n): type.MutationCliffStats {\n const res: type.MutationCliffStats['stats'] = new Map();\n let minDiff = 999999; let maxDiff = -999999; let minCount = 2; let maxCount = 2;\n for (const monomer of cliffs.keys()) {\n const monomerStatsMap: Map<string, StatsItem> = new Map();\n res.set(monomer, monomerStatsMap);\n // monomer substitutions map from mutations cliffs\n const monomerSubMap = cliffs.get(monomer)!;\n for (const position of monomerSubMap.keys()) {\n const subMap = monomerSubMap.get(position)!;\n const mask = new BitArray(activityArray.length, false);\n if (subMap.size === 0)\n continue;\n for (const index of subMap.keys()) {\n mask.setFast(index, true);\n const toIndexes = subMap.get(index)!;\n toIndexes.forEach((i) => mask.setFast(i, true));\n }\n const stats = getStats(activityArray, mask);\n minDiff = Math.min(minDiff, stats.meanDifference);\n maxDiff = Math.max(maxDiff, stats.meanDifference);\n minCount = Math.min(minCount, stats.count);\n maxCount = Math.max(maxCount, stats.count);\n monomerStatsMap.set(position, stats);\n }\n }\n return {stats: res, minDiff, maxDiff, minCount, maxCount};\n}\n\n\n/**\n * Calculates statistics for each monomer position.\n * @param activityCol - Activity column.\n * @param filter - Dataframe filter to consider.\n * @param positionColumns - Position columns containing monomers.\n * @param [options] - Options for the algorithm.\n * @param [options.isFiltered] - Whether the dataframe is filtered.\n * @param [options.columns] - Columns to consider when calculating statistics.\n * @return - Statistics for each monomer position.\n */\nexport function calculateMonomerPositionStatistics(activityCol: DG.Column<number>, filter: DG.BitSet,\n positionColumns: DG.Column<string>[], options: {\n isFiltered?: boolean,\n columns?: string[]\n } = {}): MonomerPositionStats {\n options.isFiltered ??= false;\n const monomerPositionObject = {general: {}} as MonomerPositionStats & { general: SummaryStats };\n let activityColData: Float64Array = activityCol.getRawData() as Float64Array;\n let sourceDfLen = activityCol.length;\n\n if (options.isFiltered) {\n sourceDfLen = filter.trueCount;\n const tempActivityData = new Float64Array(sourceDfLen);\n const selectedIndexes = filter.getSelectedIndexes();\n for (let i = 0; i < sourceDfLen; ++i)\n tempActivityData[i] = activityColData[selectedIndexes[i]];\n\n\n activityColData = tempActivityData;\n positionColumns = DG.DataFrame.fromColumns(positionColumns).clone(filter).columns.toList();\n }\n options.columns ??= positionColumns.map((col) => col.name);\n\n for (const posCol of positionColumns) {\n if (!options.columns.includes(posCol.name))\n continue;\n\n\n const posColData = posCol.getRawData();\n const posColCateogries = posCol.categories;\n const currentPositionObject = {general: {}} as PositionStats & { general: SummaryStats };\n\n for (let categoryIndex = 0; categoryIndex < posColCateogries.length; ++categoryIndex) {\n const monomer = posColCateogries[categoryIndex];\n if (monomer === '')\n continue;\n\n\n const boolArray: boolean[] = new Array(sourceDfLen).fill(false);\n for (let i = 0; i < sourceDfLen; ++i) {\n if (posColData[i] === categoryIndex)\n boolArray[i] = true;\n }\n const bitArray = BitArray.fromValues(boolArray);\n const stats = bitArray.allFalse || bitArray.allTrue ?\n {count: sourceDfLen, meanDifference: 0, ratio: 1.0, pValue: null, mask: bitArray, mean: activityCol.stats.avg} :\n getStats(activityColData, bitArray);\n currentPositionObject[monomer] = stats;\n getSummaryStats(currentPositionObject.general, stats);\n }\n monomerPositionObject[posCol.name] = currentPositionObject;\n getSummaryStats(monomerPositionObject.general, null, currentPositionObject.general);\n }\n return monomerPositionObject;\n}\n\n/**\n * Calculates summary statistics for the monomer position statistics such as maximum and minimum values for each\n * statistic in general and on each position.\n * @param genObj - Object to store the summary statistics to.\n * @param stats - Statistics for a single monomer position.\n * @param summaryStats - Summary statistics for all monomer positions.\n */\nexport function getSummaryStats(genObj: SummaryStats, stats: StatsItem | null = null,\n summaryStats: SummaryStats | null = null): void {\n if (stats === null && summaryStats === null)\n throw new Error(`MonomerPositionStatsError: either stats or summaryStats must be present`);\n\n\n const possibleMaxCount = stats?.count ?? summaryStats!.maxCount;\n genObj.maxCount ??= possibleMaxCount;\n if (genObj.maxCount < possibleMaxCount)\n genObj.maxCount = possibleMaxCount;\n\n\n const possibleMinCount = stats?.count ?? summaryStats!.minCount;\n genObj.minCount ??= possibleMinCount;\n if (genObj.minCount > possibleMinCount)\n genObj.minCount = possibleMinCount;\n\n\n const possibleMaxMeanDifference = stats?.meanDifference ?? summaryStats!.maxMeanDifference;\n genObj.maxMeanDifference ??= possibleMaxMeanDifference;\n if (genObj.maxMeanDifference < possibleMaxMeanDifference)\n genObj.maxMeanDifference = possibleMaxMeanDifference;\n\n\n const possibleMinMeanDifference = stats?.meanDifference ?? summaryStats!.minMeanDifference;\n genObj.minMeanDifference ??= possibleMinMeanDifference;\n if (genObj.minMeanDifference > possibleMinMeanDifference)\n genObj.minMeanDifference = possibleMinMeanDifference;\n\n\n if (!isNaN(stats?.pValue ?? NaN)) {\n const possibleMaxPValue = stats?.pValue ?? summaryStats!.maxPValue;\n genObj.maxPValue ??= possibleMaxPValue;\n if (genObj.maxPValue < possibleMaxPValue)\n genObj.maxPValue = possibleMaxPValue;\n\n\n const possibleMinPValue = stats?.pValue ?? summaryStats!.minPValue;\n genObj.minPValue ??= possibleMinPValue;\n if (genObj.minPValue > possibleMinPValue)\n genObj.minPValue = possibleMinPValue;\n }\n\n const possibleMaxRatio = stats?.ratio ?? summaryStats!.maxRatio;\n genObj.maxRatio ??= possibleMaxRatio;\n if (genObj.maxRatio < possibleMaxRatio)\n genObj.maxRatio = possibleMaxRatio;\n\n\n const possibleMinRatio = stats?.ratio ?? summaryStats!.minRatio;\n genObj.minRatio ??= possibleMinRatio;\n if (genObj.minRatio > possibleMinRatio)\n genObj.minRatio = possibleMinRatio;\n}\n\n/**\n * Calculates statistics for each cluster type.\n * @param df - Dataframe containing the clusters column.\n * @param clustersColumnName - Name of the original clusters column.\n * @param customClusters - Array of custom clusters columns names.\n * @param activityCol - Activity column.\n * @return - Statistics for each cluster type.\n */\nexport function calculateClusterStatistics(df: DG.DataFrame, clustersColumnName: string,\n customClusters: DG.Column<boolean>[], activityCol: DG.Column<number>): ClusterTypeStats {\n const rowCount = df.rowCount;\n const origClustCol = df.getCol(clustersColumnName);\n const origClustColData = origClustCol.getRawData();\n const origClustColCat = origClustCol.categories;\n const origClustMasks: BitArray[] = Array.from({length: origClustColCat.length},\n () => new BitArray(rowCount, false));\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx)\n origClustMasks[origClustColData[rowIdx]].setTrue(rowIdx);\n\n\n const customClustMasks = customClusters.map(\n (v) => BitArray.fromUint32Array(rowCount, v.getRawData() as Uint32Array));\n const customClustColNamesList = customClusters.map((v) => v.name);\n\n const activityColData = activityCol.getRawData() as Float64Array;\n\n const origClustStats: ClusterStats = {};\n const customClustStats: ClusterStats = {};\n\n for (const clustType of Object.values(CLUSTER_TYPE)) {\n const masks = clustType === CLUSTER_TYPE.ORIGINAL ? origClustMasks : customClustMasks;\n const clustNames = clustType === CLUSTER_TYPE.ORIGINAL ? origClustColCat : customClustColNamesList;\n const resultStats = clustType === CLUSTER_TYPE.ORIGINAL ? origClustStats : customClustStats;\n for (let maskIdx = 0; maskIdx < masks.length; ++maskIdx) {\n const mask = masks[maskIdx];\n resultStats[clustNames[maskIdx]] = mask.allTrue || mask.allFalse ?\n {count: mask.length, meanDifference: 0, ratio: 1.0, pValue: null, mask: mask, mean: activityCol.stats.avg} :\n getStats(activityColData, mask);\n }\n }\n\n const resultStats = {} as ClusterTypeStats;\n resultStats[CLUSTER_TYPE.ORIGINAL] = origClustStats;\n resultStats[CLUSTER_TYPE.CUSTOM] = customClustStats;\n return resultStats;\n}\n","/* eslint-disable max-len */\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as C from './constants';\nimport * as type from './types';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {monomerToShort} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {calculateMonomerPositionStatistics} from './algorithms';\nimport * as rxjs from 'rxjs';\nimport {showTooltipAt, TooltipOptions} from './tooltips';\nimport {MonomerPositionStats, MonomerPositionStatsCache, PositionStats} from './statistics';\nimport {CLUSTER_TYPE} from '../viewers/logo-summary';\nimport {MonomerPosition, MostPotentResidues, SARViewer} from '../viewers/sar-viewer';\n\n/**\n * Renders cell selection border.\n * @param canvasContext - Canvas context.\n * @param bounds - Cell bounds.\n */\nexport function renderCellSelection(canvasContext: CanvasRenderingContext2D, bounds: DG.Rect): void {\n canvasContext.strokeStyle = DG.Color.toHtml(DG.Color.selectedRows);\n canvasContext.lineWidth = 3;\n canvasContext.strokeRect(bounds.x + 1, bounds.y + 1, bounds.width - 1, bounds.height - 1);\n}\n\n/**\n * Sets amino acid residue cell renderer to the specified column.\n * @param col - Column to set renderer to.\n * @param alphabet - Sequence alphabet.\n */\nexport function setMonomerRenderer(col: DG.Column, alphabet: string): void {\n col.semType = C.SEM_TYPES.MONOMER;\n col.setTag(DG.TAGS.CELL_RENDERER, C.SEM_TYPES.MONOMER);\n col.setTag(C.TAGS.ALPHABET, alphabet);\n}\n\n/**\n * Renders mutation cliffs cell.\n * @param canvasContext - Canvas context.\n * @param currentMonomer - Current monomer.\n * @param currentPosition - Current position.\n * @param viewer - Viewer that requested rendering.\n * @param bounds - Cell bounds.\n */\nexport function renderMutationCliffCell(canvasContext: CanvasRenderingContext2D, currentMonomer: string,\n currentPosition: string, viewer: SARViewer, bounds: DG.Rect): void {\n const halfWidth = bounds.width / 2;\n const midX = Math.ceil(bounds.x + 1 + halfWidth);\n const midY = Math.ceil(bounds.y + 1 + bounds.height / 2);\n const maxRadius = 0.9 * halfWidth / 2; // Fill at most 90% of the half of the cell width\n // render most potent residues cells according to the p-value (color) and mean difference (size)\n if (viewer instanceof MostPotentResidues) {\n const positionStats = viewer.monomerPositionStats[currentPosition];\n const pVal = positionStats![currentMonomer]!.pValue;\n const currentMeanDifference = positionStats![currentMonomer]!.meanDifference;\n\n // Transform p-value to increase intensity for smaller values and decrease for larger values\n const maxPValComplement = 1 - positionStats!.general.maxPValue;\n const minPValComplement = 1 - positionStats!.general.minPValue;\n const pValCentering = Math.min(maxPValComplement, minPValComplement);\n const centeredMaxPValComplement = maxPValComplement - pValCentering;\n const centeredMinPValComplement = minPValComplement - pValCentering;\n const centeredPValLimit = Math.max(centeredMaxPValComplement, centeredMinPValComplement);\n const pValComplement = pVal === null ? 0 : 1 - pVal - pValCentering;\n\n const x = currentMeanDifference >= 0 ? pValComplement : -pValComplement;\n const coef = DG.Color.toHtml(pVal === null ? DG.Color.lightLightGray :\n DG.Color.scaleColor(x, -centeredPValLimit, centeredPValLimit, 255));\n\n\n const maxMeanDifference = Math.max(Math.abs(viewer.monomerPositionStats.general.minMeanDifference),\n viewer.monomerPositionStats.general.maxMeanDifference);\n const rCoef = Math.abs(currentMeanDifference) / maxMeanDifference;\n\n const radius = Math.floor(maxRadius * rCoef);\n\n\n canvasContext.beginPath();\n canvasContext.fillStyle = coef;\n canvasContext.arc(midX - halfWidth / 2, midY, radius < 3 || pVal === null ? 3 : radius, 0, Math.PI * 2, true);\n canvasContext.closePath();\n canvasContext.fill();\n } else if (viewer instanceof MonomerPosition && viewer.mutationCliffs && viewer.cliffStats) {\n const maxCount = viewer.cliffStats.maxCount;\n const minDiff = viewer.cliffStats.minDiff;\n const maxDiff = viewer.cliffStats.maxDiff;\n const stats = viewer.cliffStats?.stats?.get(currentMonomer)?.get(currentPosition);\n if (stats) {\n const count = stats.count;\n const diff = stats.meanDifference;\n const radius = Math.floor(Math.abs((count / Math.max(maxCount, 2))) * maxRadius);\n const diffScalingFactor = Math.max(Math.abs(minDiff), Math.abs(maxDiff));\n const colorCoef = DG.Color.toHtml(diff === null ? DG.Color.lightLightGray :\n DG.Color.scaleColor(diff, -diffScalingFactor, diffScalingFactor, 255));\n canvasContext.beginPath();\n canvasContext.fillStyle = colorCoef;\n canvasContext.arc(midX - halfWidth / 2, midY, radius < 3 || count == 0 ? 3 : radius, 0, Math.PI * 2, true);\n canvasContext.closePath();\n canvasContext.fill();\n }\n }\n\n canvasContext.textBaseline = 'middle';\n canvasContext.textAlign = 'end';\n canvasContext.fillStyle = '#606060';\n canvasContext.font = '13px Roboto, Roboto Local, sans-serif';\n canvasContext.shadowBlur = 5;\n canvasContext.shadowColor = DG.Color.toHtml(DG.Color.white);\n const uniqueValues = new Set<number>();\n const substitutions = viewer.mutationCliffs?.get(currentMonomer)?.get(currentPosition)?.entries() ?? null;\n if (substitutions !== null) {\n for (const [key, value] of substitutions) {\n uniqueValues.add(key);\n for (const val of value)\n uniqueValues.add(val);\n }\n }\n if (uniqueValues.size !== 0)\n canvasContext.fillText(uniqueValues.size.toString(), midX + halfWidth - 5, midY, halfWidth - 5);\n\n\n const monomerSelection = viewer.mutationCliffsSelection[currentPosition];\n if (monomerSelection && monomerSelection.includes(currentMonomer))\n renderCellSelection(canvasContext, bounds);\n}\n\n/**\n * Renders invariant map cell.\n * @param canvasContext - Canvas context.\n * @param currentMonomer - Current monomer.\n * @param currentPosition - Current position.\n * @param invariantMapSelection - Invariant map selection.\n * @param cellValue - Cell value.\n * @param bounds - Cell bounds.\n * @param color - Cell color.\n */\n\nfunction setAlpha(color: number, alpha: number): number {\n return (color & 0x00ffffff | (alpha << 24)) >>> 0;\n}\nexport function renderInvariantMapCell(canvasContext: CanvasRenderingContext2D, currentMonomer: string,\n currentPosition: string, invariantMapSelection: type.Selection, cellValue: number, bounds: DG.Rect,\n color: number): void {\n //FIXME: This is a hack, because `color` value sometimes comes incomplete. E.g. we found that here `color` value is\n // 255 and its contrast color would be black, which is not visible on blue (color code) background. The full number\n // is actually 4278190335.\n color = DG.Color.fromHtml(DG.Color.toHtml(setAlpha(color, 255)));\n canvasContext.fillStyle = DG.Color.toHtml(color);\n canvasContext.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);\n canvasContext.font = '13px Roboto, Roboto Local, sans-serif';\n canvasContext.textAlign = 'center';\n canvasContext.textBaseline = 'middle';\n canvasContext.fillStyle = DG.Color.toHtml(DG.Color.getContrastColor(color));\n canvasContext.fillText(cellValue.toString(), bounds.x + (bounds.width / 2), bounds.y + (bounds.height / 2),\n bounds.width);\n\n const monomerSelection = invariantMapSelection[currentPosition];\n if (monomerSelection && monomerSelection.includes(currentMonomer))\n renderCellSelection(canvasContext, bounds);\n}\n\n/**\n * Renders logo summary table cell.\n * @param canvasContext - Canvas context.\n * @param cellValue - Cell value.\n * @param clusterSelection - Cluster selection.\n * @param bounds - Cell bounds.\n */\nexport function renderLogoSummaryCell(canvasContext: CanvasRenderingContext2D, cellValue: string,\n clusterSelection: type.Selection, bounds: DG.Rect): void {\n canvasContext.font = '13px Roboto, Roboto Local, sans-serif';\n canvasContext.textAlign = 'center';\n canvasContext.textBaseline = 'middle';\n canvasContext.fillStyle = '#000';\n canvasContext.fillText(cellValue.toString(), bounds.x + (bounds.width / 2), bounds.y + (bounds.height / 2),\n bounds.width);\n\n if (clusterSelection[CLUSTER_TYPE.CUSTOM].includes(cellValue) ||\n clusterSelection[CLUSTER_TYPE.ORIGINAL].includes(cellValue))\n renderCellSelection(canvasContext, bounds);\n}\n\n/**\n * Renders WebLogo in a cell.\n * @param ctx - Canvas context.\n * @param bounds - Cell bounds.\n * @param stats - Position statistics.\n * @param position - Position name.\n * @param sortedOrder - Monomers order to render.\n * @param rowCount - Total dataframe rows count.\n * @param cp - Color palette.\n * @param [monomerSelectionStats] - Monomer selection statistics.\n * @param [drawOptions] - Drawing options.\n * @return - WebLogo monomer bounds.\n */\nexport function drawLogoInBounds(ctx: CanvasRenderingContext2D, bounds: DG.Rect, stats: PositionStats, position: string,\n sortedOrder: string[], rowCount: number, cp: SeqPalette, monomerSelectionStats: {\n [monomer: string]: number\n } = {},\n drawOptions: type.DrawOptions = {}): { [monomer: string]: DG.Rect } {\n const pr = window.devicePixelRatio;\n drawOptions.symbolStyle ??= '16px Roboto, Roboto Local, sans-serif';\n drawOptions.upperLetterHeight ??= 12.2;\n drawOptions.upperLetterAscent ??= 0.25;\n drawOptions.marginVertical ??= 1;\n drawOptions.marginHorizontal ??= 1;\n drawOptions.selectionWidth ??= 2;\n drawOptions.textHeight ??= 13;\n drawOptions.headerStyle ??= `bold ${drawOptions.textHeight * pr}px Roboto, Roboto Local, sans-serif`;\n\n const totalSpace = (sortedOrder.length - 1) * drawOptions.upperLetterAscent; // Total space between letters\n let currentY = (bounds.y + drawOptions.marginVertical) * pr;\n const barHeight = (bounds.height - 2 * drawOptions.marginVertical - totalSpace - 1.25 * drawOptions.textHeight) * pr;\n\n const xSelection = (bounds.x + drawOptions.marginHorizontal) * pr;\n const selectionWidth = Math.max(drawOptions.selectionWidth * pr, 0.05 * bounds.width * pr);\n const leftShift = drawOptions.marginHorizontal * 2 + drawOptions.selectionWidth;\n const barWidth = (bounds.width - (leftShift + drawOptions.marginHorizontal)) * pr;\n const xStart = (bounds.x + leftShift) * pr;\n\n const monomerBounds: { [monomer: string]: DG.Rect } = {};\n for (const monomer of sortedOrder) {\n const monomerHeight = barHeight * (stats[monomer]!.count / rowCount);\n const selectionHeight = barHeight * ((monomerSelectionStats[monomer] ?? 0) / rowCount);\n monomerBounds[monomer] = new DG.Rect(xStart / pr, currentY / pr, barWidth / pr, monomerHeight / pr);\n\n ctx.resetTransform();\n if (monomer !== '-' && monomer !== '') {\n const monomerTxt = monomerToShort(monomer, 5);\n const mTm: TextMetrics = ctx.measureText(monomerTxt);\n\n if (selectionHeight > 0) {\n // Filling selection\n ctx.lineWidth = selectionWidth;\n ctx.line(xSelection, currentY, xSelection, currentY + selectionHeight, DG.Color.rowSelection);\n }\n\n ctx.fillStyle = cp.get(monomer) ?? cp.get('other');\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n ctx.font = drawOptions.symbolStyle;\n // Hacks to scale uppercase characters to target rectangle\n const widthTransform = barWidth / mTm.width;\n const heightTransform = monomerHeight / drawOptions.upperLetterHeight;\n ctx.setTransform(widthTransform, 0, 0, heightTransform, xStart, currentY);\n ctx.fillText(monomerTxt, 0, 0, mTm.width);\n }\n currentY += monomerHeight + drawOptions.upperLetterAscent * pr;\n }\n\n // Drawing column header\n ctx.resetTransform();\n ctx.fillStyle = DG.Color.toHtml(DG.Color.black);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'top';\n ctx.font = drawOptions.headerStyle;\n ctx.fillText(position, (bounds.x + bounds.width / 2) * pr, (bounds.y + bounds.height - drawOptions.textHeight) * pr);\n\n return monomerBounds;\n}\n\nexport type WebLogoCellRendererOptions = {\n isSelectionTable?: boolean,\n headerSelectedMonomers?: () => type.SelectionStats,\n webLogoBounds: () => WebLogoBounds,\n cachedWebLogoTooltip: () => type.CachedWebLogoTooltip,\n colorPalette: () => SeqPalette,\n unhighlightCallback?: () => void,\n highlightCallback?: (mp: type.SelectionItem, dataFrame: DG.DataFrame, stats: MonomerPositionStats) => void,\n selectionCallback?: (monomerPosition: type.SelectionItem, options: type.SelectionOptions) => void,\n};\nexport type WebLogoBounds = { [position: string]: { [monomer: string]: DG.Rect } };\n\n/**\n * Sets WebLogo renderer.\n * @param grid - Grid to set renderer to.\n * @param monomerPositionStats - Monomer position statistics.\n * @param positionColumns - Position columns.\n * @param activityCol - Activity column.\n * @param options - Cell renderer options.\n * @param tooltipOptions - Tooltip options.\n */\nexport function setWebLogoRenderer(grid: DG.Grid, monomerPositionStats: MonomerPositionStats,\n positionColumns: DG.Column<string>[], activityCol: DG.Column<number>, options: WebLogoCellRendererOptions,\n tooltipOptions: TooltipOptions = {\n x: 0, y: 0, mpStats: {} as MonomerPositionStats,\n monomerPosition: {} as type.SelectionItem,\n }): void {\n options.isSelectionTable ??= false;\n if (Object.keys(tooltipOptions.mpStats).length == 0)\n tooltipOptions.mpStats = monomerPositionStats;\n\n\n if (options.isSelectionTable && (!options.webLogoBounds || !options.cachedWebLogoTooltip)) {\n throw new Error('Peptides: Cannot set WebLogo renderer for selection table without `headerSelectedMonomers`, ' +\n '`webLogoBounds` and `cachedWebLogoTooltip` options.');\n }\n\n const df = grid.dataFrame;\n grid.setOptions({'colHeaderHeight': 130});\n const headerRenderer = (gcArgs: DG.GridCellRenderArgs): void => {\n const ctx = gcArgs.g;\n const bounds = gcArgs.bounds;\n const col = gcArgs.cell.tableColumn;\n\n ctx.save();\n try {\n ctx.beginPath();\n ctx.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n ctx.clip();\n\n //TODO: optimize\n if (gcArgs.cell.isColHeader && col?.semType === C.SEM_TYPES.MONOMER) {\n const isDfFiltered = df.filter.anyFalse;\n let stats: PositionStats | undefined;\n if (isDfFiltered) {\n const cache: MonomerPositionStatsCache = df.temp[C.TAGS.M_P_STATS_CACHE] ?? {};\n const colCache = cache?.[col.name];\n const dfFilterBuffer = df.filter.getBuffer();\n if (cache && colCache && colCache.filter.length === dfFilterBuffer.length &&\n colCache.filter.every((v, i) => v === dfFilterBuffer[i]))\n stats = colCache.stats[col.name];\n else {\n const fullStats = calculateMonomerPositionStatistics(activityCol, df.filter, positionColumns, {\n isFiltered: true,\n columns: [col.name],\n });\n stats = fullStats[col.name];\n cache[col.name] = {filter: df.filter.getBuffer(), stats: fullStats, selection: df.selection.getBuffer()};\n }\n df.temp[C.TAGS.M_P_STATS_CACHE] = cache;\n } else if (options.isSelectionTable) {\n stats = calculateMonomerPositionStatistics(activityCol, df.filter, positionColumns, {\n isFiltered: true,\n columns: [col.name],\n })[col.name];\n } else\n stats = monomerPositionStats[col.name];\n\n\n if (!stats)\n return;\n\n\n //TODO: precalc on stats creation\n const sortedStatsOrder = Object.keys(stats).sort((a, b) => {\n if (a === '' || a === '-')\n return +1;\n else if (b === '' || b === '-')\n return -1;\n\n\n return 0;\n }).filter((v) => v !== 'general');\n\n options.webLogoBounds()![col.name] = drawLogoInBounds(ctx, bounds, stats, col.name,\n sortedStatsOrder, df.filter.trueCount, options.colorPalette(),\n options.headerSelectedMonomers ? options.headerSelectedMonomers()[col.name] : {});\n gcArgs.preventDefault();\n }\n } catch (e) {\n console.warn(`PeptidesHeaderLogoError: couldn't render WebLogo for column \\`${col!.name}\\`. ` +\n `See original error below.`);\n console.warn(e);\n } finally {\n ctx.restore();\n }\n };\n grid.onCellRender.subscribe((gcArgs) => headerRenderer(gcArgs));\n\n const eventAction = (ev: MouseEvent): void => {\n const cell = grid.hitTest(ev.offsetX, ev.offsetY);\n if (cell?.isColHeader && cell.tableColumn?.semType === C.SEM_TYPES.MONOMER) {\n const monomerPosition = findWebLogoMonomerPosition(cell, ev, (options.webLogoBounds()));\n if (monomerPosition === null) {\n if (!options.isSelectionTable && options.unhighlightCallback != null)\n options.unhighlightCallback();\n\n\n return;\n }\n tooltipOptions.monomerPosition = monomerPosition;\n requestWebLogoAction(ev, monomerPosition, df, activityCol, options, tooltipOptions);\n if (!options.isSelectionTable && options.highlightCallback != null)\n options.highlightCallback(monomerPosition, df, monomerPositionStats);\n }\n };\n\n // The following events makes the barchart interactive\n rxjs.fromEvent<MouseEvent>(grid.overlay, 'mousemove').subscribe((mouseMove: MouseEvent) => eventAction(mouseMove));\n rxjs.fromEvent<MouseEvent>(grid.overlay, 'click').subscribe((mouseMove: MouseEvent) => eventAction(mouseMove));\n}\n\n/**\n * Handles WebLogoAction action.\n * @param ev - Mouse event.\n * @param monomerPosition - Monomer-position object.\n * @param df - Dataframe with WebLogo in header.\n * @param activityCol - Activity column.\n * @param options - WebLogo cell renderer options.\n * @param tooltipOptions - Tooltip options.\n */\nfunction requestWebLogoAction(ev: MouseEvent, monomerPosition: type.SelectionItem, df: DG.DataFrame,\n activityCol: DG.Column<number>, options: WebLogoCellRendererOptions, tooltipOptions: TooltipOptions): void {\n if (ev.type === 'click' && !options.isSelectionTable && options.selectionCallback != null)\n options.selectionCallback(monomerPosition, {shiftPressed: ev.shiftKey, ctrlPressed: ev.ctrlKey});\n else {\n const bar = `${monomerPosition.positionOrClusterType} = ${monomerPosition.monomerOrCluster}`;\n if (options.cachedWebLogoTooltip()!.bar === bar)\n ui.tooltip.show(options.cachedWebLogoTooltip()!.tooltip!, ev.clientX, ev.clientY);\n else {\n options.cachedWebLogoTooltip()!.bar = bar;\n tooltipOptions.x = ev.clientX;\n tooltipOptions.y = ev.clientY;\n tooltipOptions.monomerPosition = monomerPosition;\n options.cachedWebLogoTooltip()!.tooltip = showTooltipAt(df, activityCol, [], tooltipOptions);\n }\n }\n}\n\n/**\n * Finds monomer-position pair in a grid cell with WebLogo render.\n * @param cell - Grid cell to look for monomer-position pair.\n * @param ev - Mouse event.\n * @param webLogoBounds - Monomer bounds in WebLogo position.\n * @return - Monomer-position pair.\n */\nfunction findWebLogoMonomerPosition(cell: DG.GridCell, ev: MouseEvent, webLogoBounds: WebLogoBounds,\n): type.SelectionItem | null {\n const barCoords = webLogoBounds[cell.tableColumn!.name];\n if (!barCoords)\n return null;\n for (const [monomer, coords] of Object.entries(barCoords)) {\n const isIntersectingX = ev.offsetX >= coords.x && ev.offsetX <= coords.x + coords.width;\n const isIntersectingY = ev.offsetY >= coords.y && ev.offsetY <= coords.y + coords.height;\n if (isIntersectingX && isIntersectingY)\n return {monomerOrCluster: monomer, positionOrClusterType: cell.tableColumn!.name};\n }\n\n return null;\n}\n\n\n/**\n * Renderer for LST pie chart cell\n *\n */\n\nexport class LSTPieChartRenderer extends DG.GridCellRenderer {\n get name(): string {return 'LST Pie Chart';}\n\n get cellType(): string {return 'lst-pie-chart';}\n\n get defaultWidth(): number | null {return 80;}\n\n get defaultHeight(): number | null {return 80;}\n\n colorCacheKey = 'lst-pie-chart-color-cache'; // key for temp storage of category number cache\n categoryNumberCache(col: DG.Column): {[_: string]: number} {\n if (!col.temp[this.colorCacheKey])\n col.temp[this.colorCacheKey] = {};\n return col.temp[this.colorCacheKey] as {[_: string]: number};\n };\n\n HoverTempKey = 'lst-pie-chart-hovered-sector'; // key for temp storage of hovered sector\n hoverSeparator = ',,,,,'; // separator for hovered sector\n\n getPrevHoveredSector(col: DG.Column): string | null {\n return col.temp[this.HoverTempKey] as string;\n }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n const prev = this.getPrevHoveredSector(gridCell.cell.column);\n const beforeReturn = (): void => {\n gridCell.cell.column.temp[this.HoverTempKey] = null;\n ui.tooltip.hide();\n\n if (prev !== null)\n gridCell.grid.invalidate();\n };\n\n const value = gridCell.cell.value;\n if (!value) {\n beforeReturn();\n return;\n }\n const vectorX = e.offsetX - gridCell.bounds.midX;\n const vectorY = e.offsetY - gridCell.bounds.midY;\n const distance = Math.sqrt(vectorX * vectorX + vectorY * vectorY);\n const atan2 = Math.atan2(vectorY, vectorX);\n const angle = atan2 < 0 ? atan2 + 2 * Math.PI : atan2;\n if (distance > Math.min(gridCell.bounds.width, gridCell.bounds.height) / 2 - 2) {\n beforeReturn();\n return;\n }\n\n let JSONData: {[_: string]: number};\n try {\n JSONData = JSON.parse(value);\n } catch (e) {\n beforeReturn();\n return;\n }\n\n const angles = new Float64Array(Object.keys(JSONData).length + 1);\n const totalCount = Object.values(JSONData).reduce((a, b) => a + b, 0);\n angles[Object.keys(JSONData).length] = Math.PI * 2;\n let angleAccum = 0;\n let i = 0;\n for (const val of Object.values(JSONData)) {\n angles[i++] = angleAccum;\n const angleAdd = 2 * Math.PI * val / totalCount;\n angleAccum += angleAdd;\n }\n\n let hitCategory = -1;\n for (let i = 0; i < angles.length - 1; i++) {\n if (angle >= angles[i] && angle < angles[i + 1]) {\n hitCategory = i;\n break;\n }\n }\n if (hitCategory === -1) {\n beforeReturn();\n return;\n }\n const hitCategoryName = Object.keys(JSONData)[hitCategory];\n const hitCategoryValue = JSONData[hitCategoryName];\n const percentage = (hitCategoryValue / totalCount * 100).toFixed(2);\n ui.tooltip.show(ui.h1(`${hitCategoryName}: ${hitCategoryValue} (${percentage}%)`), e.x + 16, e.y +\n 16);\n const hoverTemp = gridCell.cell.rowIndex.toString() + this.hoverSeparator + hitCategoryName;\n gridCell.cell.column.temp[this.HoverTempKey] = hoverTemp;\n if (prev !== hoverTemp)\n gridCell.grid.invalidate();\n }\n\n render(\n g: CanvasRenderingContext2D,\n x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, _cellStyle: DG.GridCellStyle,\n ): void {\n const df = gridCell.cell.dataFrame;\n const box = new DG.Rect(x, y, w, h).fitSquare().inflate(-2, -2);\n if (w < 5 || h < 5 || !df) return;\n const value = gridCell.cell.value;\n g.clearRect(x, y, w, h);\n if (!value) return;\n\n let JSONData: {[_: string]: number};\n try {\n JSONData = JSON.parse(value);\n } catch (e) {\n return;\n }\n\n const totalCount = Object.values(JSONData).reduce((a, b) => a + b, 0);\n\n let angleAccum = 0;\n\n const alphas = Object.fromEntries(Object.keys(JSONData).map((key) => [key, 255]));\n\n const hoverTemp = gridCell.cell.column.temp[this.HoverTempKey] as string;\n if (hoverTemp && hoverTemp.split(this.hoverSeparator).length === 2) {\n const [rowIdx, category] = hoverTemp.split(this.hoverSeparator);\n if (rowIdx === gridCell.cell.rowIndex.toString()) {\n for (const [key, _] of Object.entries(JSONData))\n alphas[key] = 100;\n alphas[category] = 255;\n }\n }\n\n const radius = Math.min(w, h) / 2.2;\n\n for (const [key, val] of Object.entries(JSONData)) {\n const angle = 2 * Math.PI * val / totalCount;\n g.beginPath();\n g.moveTo(box.midX, box.midY);\n g.arc(box.midX, box.midY, radius, angleAccum, angleAccum + angle);\n angleAccum += angle;\n const colorCache = this.categoryNumberCache(gridCell.cell.column);\n if (!colorCache[key]) {\n colorCache[key] = Object.keys(colorCache).length; // cache category number keys, so that colors are consistent\n gridCell.cell.column.temp[this.colorCacheKey] = colorCache;\n }\n g.fillStyle = DG.Color.toHtml(\n DG.Color.setAlpha(DG.Color.getCategoricalColor(colorCache[key]), alphas[key]),\n );\n g.fill();\n g.strokeStyle = DG.Color.toRgb(DG.Color.lightGray);\n g.stroke();\n\n\n // text rendering\n const text = key;\n // g.font = '10px Arial'; // Adjust font size and family as needed\n g.fillStyle = DG.Color.toRgb(DG.Color.white);\n g.font = '9px Arial';\n const textWidth = g.measureText(text).width;\n\n const middleAngle = angleAccum - (angle / 2);\n\n // get the best position for the text\n for (let textRadiusMult = 0.8; textRadiusMult >= 0.4; textRadiusMult -= 0.05) {\n const textRadius = radius * textRadiusMult;\n const textX = box.midX + Math.cos(middleAngle) * textRadius;\n const textY = box.midY + Math.sin(middleAngle) * textRadius;\n\n // perform pseudo hit test to check if text fits in the pie slice\n const leftPart = textX - textWidth / 2 - 2;\n const rightPart = textX + textWidth / 2 + 2;\n\n const isTextInside = [[leftPart, textY], [rightPart, textY]]\n .every((point) => {\n const d = Math.sqrt((point[0] - box.midX) ** 2 + (point[1] - box.midY) ** 2);\n const at = Math.atan2(point[1] - box.midY, point[0] - box.midX);\n const a = at < 0 ? at + 2 * Math.PI : at;\n return d < radius - 2 && a > angleAccum - angle && a < angleAccum;\n });\n\n if (isTextInside) {\n g.fillText(text, textX, textY);\n break;\n }\n }\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\n\nexport enum COLUMNS_NAMES {\n SPLIT_COL = '~split',\n ACTIVITY = 'Activity',\n // Deprecated, used for backward compatibility with 1.16.0\n ACTIVITY_SCALED = 'Scaled activity',\n MONOMER = 'AAR',\n POSITION = 'Pos',\n P_VALUE = 'pValue',\n MEAN_DIFFERENCE = 'Mean difference',\n COUNT = 'Count',\n RATIO = 'Ratio',\n MEAN = 'Mean',\n}\n\nexport enum LST_COLUMN_NAMES {\n MEMBERS = 'Members',\n WEB_LOGO = 'WebLogo',\n DISTRIBUTION = 'Distribution',\n MEAN_DIFFERENCE = 'Mean difference',\n P_VALUE = 'P-Value',\n RATIO = 'Ratio',\n CLUSTER = 'Cluster',\n}\n\nexport enum TAGS {\n MONOMER = 'monomer',\n POSITION = 'pos',\n SEPARATOR = 'separator',\n SELECTION = 'selection',\n MUTATION_CLIFFS_SELECTION = 'mutationCliffsSelection',\n ALPHABET = 'alphabet',\n FILTER = 'filter',\n INVARIANT_MAP_SELECTION = 'invariantMapSelection',\n SAR_MODE = 'sarMode',\n CLUSTER_SELECTION = 'clusterSelection',\n VISIBLE = 'visible',\n SETTINGS = 'settings',\n CUSTOM_CLUSTER = 'customCluster',\n // UUID = 'pep-uuid',\n MONOMER_POSITION_MODE = 'monomerPositionMode',\n MULTIPLE_VIEWS = 'isMultipleViews',\n IDENTITY_TEMPLATE = 'Identity template',\n SIMILARITY_TEMPLATE = 'Similarity template',\n ANALYSIS_COL = 'isAnalysisCol',\n POSITION_COL = 'isPositionCol',\n M_P_STATS_CACHE = '.MPStatsCache',\n INVARIANT_MAP_COLOR_CACHE = '.InvariantMapColorCache',\n}\n\nexport enum SEM_TYPES {\n MONOMER = 'Monomer',\n MACROMOLECULE_DIFFERENCE = 'MacromoleculeDifference',\n}\n\nexport const COLUMN_NAME = 'ColumnName';\n\nexport enum SCALING_METHODS {\n NONE = 'none',\n LG = 'lg',\n MINUS_LG = '-lg',\n}\n\nexport enum ACTIVITY_TARGET {\n HIGH = 'High',\n LOW = 'Low',\n}\n\nexport enum SUFFIXES {\n LST = 'lst-', // Logo Summary Table\n MP = 'mp-', // Monomer Position\n MPR = 'mpr-', // Most Potent Residues\n WL = 'wl-', // Web Logo\n}\n\nexport const AGGREGATION_TYPES = Object.values(DG.AGG)\n .filter((it) => ![DG.AGG.FIRST, DG.AGG.KEY, DG.AGG.PIVOT, DG.AGG.SELECTED_ROWS_COUNT].includes(it));\n\nexport const AGG_STATS_MAPPING: {[key: string]: string} = {\n [DG.AGG.TOTAL_COUNT]: 'totalCount',\n [DG.AGG.VALUE_COUNT]: 'valueCount',\n [DG.AGG.UNIQUE_COUNT]: 'uniqueCount',\n [DG.AGG.MISSING_VALUE_COUNT]: 'missingValueCount',\n [DG.AGG.MIN]: 'min',\n [DG.AGG.MAX]: 'max',\n [DG.AGG.SUM]: 'sum',\n [DG.AGG.MED]: 'med',\n [DG.AGG.AVG]: 'avg',\n [DG.AGG.STDEV]: 'stdev',\n [DG.AGG.VARIANCE]: 'variance',\n [DG.AGG.SKEW]: 'skew',\n [DG.AGG.KURT]: 'kurt',\n [DG.AGG.Q1]: 'q1',\n [DG.AGG.Q2]: 'q2',\n [DG.AGG.Q3]: 'q3',\n};\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as C from './constants';\nimport * as type from './types';\nimport {PeptidesSettings} from './types';\nimport {StringDictionary} from '@datagrok-libraries/utils/src/type-declarations';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {AggregationColumns, MasksInfo, MonomerPositionStats, PositionStats} from './statistics';\nimport {PeptideViewer} from '../widgets/distribution';\nimport wu from 'wu';\n\n/**\n * Gets seprator for sequence column.\n * @param col - Macromolecule column.\n * @return - Separator symbol.\n */\nexport function getSeparator(col: DG.Column<string>): string {\n return col.getTag(C.TAGS.SEPARATOR) ?? '';\n}\n\n/**\n * Scales activity column values.\n * @param activityCol - Activity column.\n * @param scaling - Scaling method.\n * @return - Scaled activity column.\n */\nexport function scaleActivity(activityCol: DG.Column<number>, scaling: C.SCALING_METHODS = C.SCALING_METHODS.NONE,\n): DG.Column<number> {\n let formula = (x: number): number => x;\n switch (scaling) {\n case C.SCALING_METHODS.NONE:\n break;\n case C.SCALING_METHODS.LG:\n formula = (x: number): number => Math.log10(x);\n break;\n case C.SCALING_METHODS.MINUS_LG:\n formula = (x: number): number => -Math.log10(x);\n break;\n default:\n throw new Error(`ScalingError: method \\`${scaling}\\` is not available.`);\n }\n const activityColData = activityCol.getRawData();\n const scaledCol: DG.Column<number> = DG.Column.float(C.COLUMNS_NAMES.ACTIVITY, activityCol.length)\n .init((i) => {\n const val = activityColData[i];\n return val === DG.FLOAT_NULL || val === DG.INT_NULL ? val : formula(val);\n });\n scaledCol.setTag(C.TAGS.ANALYSIS_COL, `${true}`);\n scaledCol.setTag(DG.TAGS.FORMULA, scaling);\n return scaledCol;\n}\n\n//TODO: optimize\n/**\n * Calculates number of selected monomers for each position.\n * @param df - Dataframe with position columns.\n * @return - Object with number of selected monomers for each position.\n */\nexport function calculateSelected(df: DG.DataFrame): type.SelectionStats {\n const monomerColumns: DG.Column<string>[] = df.columns.bySemTypeAll(C.SEM_TYPES.MONOMER);\n const selectedObj: type.SelectionStats = {};\n const selectedIndexes = df.filter.clone().and(df.selection).getSelectedIndexes();\n for (const idx of selectedIndexes) {\n for (const col of monomerColumns) {\n const monomer = col.get(idx);\n if (!monomer)\n continue;\n\n\n selectedObj[col.name] ??= {};\n selectedObj[col.name][monomer] ??= 0;\n selectedObj[col.name][monomer] += 1;\n }\n }\n\n return selectedObj;\n}\n\n/**\n * Extracts raw data from column.\n * @param col - Column.\n * @return - Object with column name, categories and raw data.\n */\nexport function extractColInfo(col: DG.Column<string>): type.RawColumn {\n return {\n name: col.name,\n cat: col.categories,\n rawData: col.getRawData(),\n };\n}\n\nexport enum SPLIT_CATEGORY {\n SELECTION = 'Selection',\n ALL = 'All',\n PEPTIDES_SELECTION = 'Peptides selection',\n}\n\nexport type DistributionLabelMap = { [key in SPLIT_CATEGORY]?: string };\n\n/**\n * Creates a panel to plot activity distribution.\n * @param hist - Histogram viewer.\n * @param statsMap - Object with statistics names and values.\n * @param labelMap - Mapping object for distribution labels.\n * @return - Panel with distribution plot and statistics.\n */\n// @ts-ignore TODO: fix after api update\nexport function getDistributionPanel(hist: DG.Viewer<DG.IHistogramSettings>, statsMap: StringDictionary,\n labelMap: DistributionLabelMap = {}): HTMLDivElement {\n const splitCol = hist.dataFrame.getCol(C.COLUMNS_NAMES.SPLIT_COL);\n const labels = [];\n const categories = splitCol.categories as SPLIT_CATEGORY[];\n const rawData = splitCol.getRawData();\n for (let categoryIdx = 0; categoryIdx < categories.length; ++categoryIdx) {\n if (!Object.values(SPLIT_CATEGORY).includes(categories[categoryIdx]))\n continue;\n\n\n const color = DG.Color.toHtml(splitCol.meta.colors.getColor(rawData.indexOf(categoryIdx)));\n const label = ui.label(labelMap[categories[categoryIdx]] ?? categories[categoryIdx], {style: {color}});\n labels.push(label);\n }\n\n const result = ui.divV([ui.divV(labels), hist.root, ui.tableFromMap(statsMap)]);\n hist.root.style.maxHeight = '75px';\n return result;\n}\n\n/**\n * Creates a table to plot activity distribution.\n * @param activityCol - Activity column.\n * @param selection - Selection bitset.\n * @param [peptideSelection] - Peptide selection bitset.\n * @return - Dataframe with activity distribution.\n */\nexport function getDistributionTable(activityCol: DG.Column<number>, selection: DG.BitSet, peptideSelection?: DG.BitSet,\n): DG.DataFrame {\n const selectionMismatch = peptideSelection?.clone().xor(selection).anyTrue ?? false;\n const rowCount = activityCol.length;\n const activityColData = activityCol.getRawData();\n const activityData = new Float32Array(rowCount + selection.trueCount +\n (selectionMismatch ? (peptideSelection?.trueCount ?? 0) : 0));\n const categories: string[] = new Array(activityData.length);\n\n for (let i = 0, j = 0, k = 0; i < rowCount; ++i) {\n const isSelected = selection.get(i);\n activityData[i] = activityColData[i];\n categories[i] = isSelected ? SPLIT_CATEGORY.SELECTION : SPLIT_CATEGORY.ALL;\n if (isSelected) {\n activityData[rowCount + j] = activityColData[i];\n categories[rowCount + j] = SPLIT_CATEGORY.ALL;\n ++j;\n }\n if (selectionMismatch && peptideSelection?.get(i)) {\n activityData[rowCount + selection.trueCount + k] = activityColData[i];\n categories[rowCount + selection.trueCount + k] = SPLIT_CATEGORY.PEPTIDES_SELECTION;\n ++k;\n }\n }\n\n const splitCol = DG.Column.fromStrings(C.COLUMNS_NAMES.SPLIT_COL, categories);\n const categoryOrder = [SPLIT_CATEGORY.ALL, SPLIT_CATEGORY.SELECTION];\n if (selectionMismatch)\n categoryOrder.push(SPLIT_CATEGORY.PEPTIDES_SELECTION);\n\n\n splitCol.setCategoryOrder(categoryOrder);\n splitCol.meta.colors.setCategorical();\n return DG.DataFrame.fromColumns([DG.Column.fromFloat32Array(C.COLUMNS_NAMES.ACTIVITY, activityData), splitCol]);\n}\n\n/**\n * Adds expand in full screen icon to the grid.\n * @param grid - Grid to add expand icon to.\n */\nexport function addExpandIcon(grid: DG.Grid): void {\n const fullscreenIcon = ui.iconFA('expand-alt', () => {\n const fullscreenGrid = grid.dataFrame.plot.grid();\n setGridProps(fullscreenGrid, false);\n fullscreenGrid.root.style.height = '100%';\n const pairsFullscreenDialog = ui.dialog(grid.dataFrame.name);\n pairsFullscreenDialog.add(fullscreenGrid.root);\n pairsFullscreenDialog.showModal(true);\n fullscreenGrid.invalidate();\n });\n grid.root.appendChild(fullscreenIcon);\n fullscreenIcon.style.position = 'absolute';\n fullscreenIcon.style.right = '0px';\n fullscreenIcon.style.top = '0px';\n fullscreenIcon.style.visibility = 'hidden';\n grid.root.addEventListener('mouseenter', (_) => {\n fullscreenIcon.style.visibility = 'visible';\n });\n grid.root.addEventListener('mouseleave', (_) => {\n fullscreenIcon.style.visibility = 'hidden';\n });\n}\n\nexport function addExpandIconsToGridPair(grids: DG.Grid[], name: string, onCloseFunc?: Function): void {\n //const host = ui.divV([], {style: {height: '100%'}});\n grids.forEach((grid) => {\n const fullscreenIcon = ui.iconFA('expand-alt', () => {\n const fullscreenGrids = grids.map((g) => {\n const out = g;\n setGridProps(out, false);\n return out;\n });\n //setGridProps(fullscreenGrid, false);\n //fullscreenGrid.root.style.height = '100%';\n const pairsFullscreenDialog = ui.dialog(name);\n const host = ui.divV([], {style: {height: '100%'}});\n pairsFullscreenDialog.add(host);\n fullscreenGrids.forEach((g) => {\n host.appendChild(ui.h1(g.dataFrame.name));\n host.appendChild(g.root);\n });\n //pairsFullscreenDialog.add(fullscreenGrid.root);\n pairsFullscreenDialog.showModal(true);\n pairsFullscreenDialog.onClose.subscribe(() => {\n onCloseFunc?.();\n });\n //fullscreenGrid.invalidate();\n fullscreenGrids.forEach((g) => g.invalidate());\n });\n grid.root.appendChild(fullscreenIcon);\n fullscreenIcon.style.position = 'absolute';\n fullscreenIcon.style.right = '0px';\n fullscreenIcon.style.top = '0px';\n fullscreenIcon.style.visibility = 'hidden';\n grid.root.addEventListener('mouseenter', (_) => {\n fullscreenIcon.style.visibility = 'visible';\n });\n grid.root.addEventListener('mouseleave', (_) => {\n fullscreenIcon.style.visibility = 'hidden';\n });\n });\n}\n\nexport function addExpandIconGen(dialogName: string,\n root: HTMLElement, mouseOverRoot: HTMLElement, onClickElementFunc: () => HTMLElement,\n): void {\n const fullScreenIcon = ui.iconFA('expand-alt', () => {\n const fullScreenElement = onClickElementFunc();\n const fullScreenDialog = ui.dialog(dialogName);\n fullScreenDialog.add(fullScreenElement);\n fullScreenDialog.showModal(true);\n }, 'Expand to full screen');\n fullScreenIcon.style.marginLeft = 'auto';\n fullScreenIcon.style.marginRight = '15px';\n mouseOverRoot.addEventListener('mouseenter', () => {\n fullScreenIcon.style.visibility = 'visible';\n });\n mouseOverRoot.addEventListener('mouseleave', () => {\n fullScreenIcon.style.visibility = 'hidden';\n });\n root.appendChild(fullScreenIcon);\n}\n\n/**\n * Sets common properties for grid in property panel.\n * @param grid - Grid to set properties to.\n * @param autosize - Flag whether to autosize grid.\n */\nexport function setGridProps(grid: DG.Grid, autosize: boolean = true): void {\n grid.props.allowEdit = false;\n grid.props.showReadOnlyNotifications = false;\n grid.props.allowRowSelection = false;\n grid.props.allowBlockSelection = false;\n grid.props.allowColSelection = false;\n grid.props.showRowHeader = false;\n grid.props.showCurrentRowIndicator = false;\n grid.root.style.width = '100%';\n grid.root.style.maxWidth = '100%';\n if (autosize)\n grid.autoSize(1000, 175, 0, 0, true);\n}\n\n/**\n * Checks whether selection is empty.\n * @param selection - Selection object.\n * @return - Flag whether selection is empty.\n */\nexport function isSelectionEmpty(selection: type.Selection): boolean {\n for (const selectionList of Object.values(selection)) {\n if (selectionList.length !== 0)\n return false;\n }\n return true;\n}\n\n/**\n * Modifies selection based on pressed keys. If shift and ctrl keys are both pressed, it removes item from selection.\n * If only shift key is pressed, it adds item to selection. If only ctrl key is pressed, it changes item\n * presence in selection. If none of the keys is pressed, it sets item as the only selected one.\n * @param selection - Selection object.\n * @param clusterOrMonomerPosition - Selection item object.\n * @param options - Selection options object.\n * @return - Modified selection object.\n */\nexport function modifySelection(selection: type.Selection, clusterOrMonomerPosition: type.SelectionItem,\n options: type.SelectionOptions): type.Selection {\n const monomerList = selection[clusterOrMonomerPosition.positionOrClusterType];\n const monomerIndex = monomerList.indexOf(clusterOrMonomerPosition.monomerOrCluster);\n if (options.shiftPressed && options.ctrlPressed) {\n if (monomerIndex !== -1)\n monomerList.splice(monomerIndex, 1);\n } else if (options.ctrlPressed) {\n if (monomerIndex === -1)\n monomerList.push(clusterOrMonomerPosition.monomerOrCluster);\n else\n monomerList.splice(monomerIndex, 1);\n } else if (options.shiftPressed) {\n if (monomerIndex === -1)\n monomerList.push(clusterOrMonomerPosition.monomerOrCluster);\n } else {\n const selectionKeys = Object.keys(selection);\n selection = {};\n for (const posOrClustType of selectionKeys) {\n selection[posOrClustType] = [];\n if (posOrClustType === clusterOrMonomerPosition.positionOrClusterType)\n selection[posOrClustType].push(clusterOrMonomerPosition.monomerOrCluster);\n }\n }\n return selection;\n}\n\n/**\n * Highlights rows containing monomer-position in the dataframe.\n * @param monomerPosition - Monomer-position item object.\n * @param dataFrame - Dataframe to highlight rows in.\n * @param monomerPositionStats - Object with statistics for monomer-positions.\n */\nexport function highlightMonomerPosition(monomerPosition: type.SelectionItem, dataFrame: DG.DataFrame,\n monomerPositionStats: MonomerPositionStats): void {\n if (!dataFrame) return;\n const bitArray = new BitArray(dataFrame.rowCount);\n if (monomerPosition.positionOrClusterType === C.COLUMNS_NAMES.MONOMER) {\n const positionStats = Object.values(monomerPositionStats);\n for (const posStat of positionStats) {\n const monomerPositionStats = (posStat as PositionStats)[monomerPosition.monomerOrCluster];\n if (typeof monomerPositionStats !== 'undefined')\n bitArray.or(monomerPositionStats.mask);\n }\n } else {\n const positionStats = monomerPositionStats[monomerPosition.positionOrClusterType];\n if (typeof positionStats !== 'undefined') {\n const monomerPositionStats = positionStats[monomerPosition.monomerOrCluster];\n if (typeof monomerPositionStats !== 'undefined')\n bitArray.or(monomerPositionStats.mask);\n }\n }\n\n dataFrame.rows.highlight((i) => bitArray.getBit(i));\n}\n\n/**\n * Initializes selection object.\n * @param positionColumns - Array of position columns.\n * @return - Initialized selection object.\n */\nexport function initSelection(positionColumns: DG.Column<string>[]): type.Selection {\n const tempSelection: type.Selection = {};\n for (const posCol of positionColumns)\n tempSelection[posCol.name] = [];\n\n\n return tempSelection;\n}\n\n/**\n * Gets selection bitset.\n * @param selection - Selection object.\n * @param stats - Object with monomer-position or cluster masks.\n * @return - Selection bitset.\n */\nexport function getSelectionBitset(selection: type.Selection, stats: MasksInfo): DG.BitSet | null {\n let combinedBitset: BitArray | null = null;\n const selectionEntries = Object.entries(selection);\n for (const [positionOrClusterType, selected] of selectionEntries) {\n const statsType = stats[positionOrClusterType];\n for (const monomerOrCluster of selected) {\n const statsItem = statsType[monomerOrCluster];\n if (!statsItem) continue;\n combinedBitset ??= new BitArray(statsItem.mask.length, false);\n combinedBitset!.or(statsItem.mask);\n }\n }\n\n return (combinedBitset != null) ? DG.BitSet.fromBytes(combinedBitset!.buffer.buffer, combinedBitset!.length) : null;\n}\n\n/**\n * Checks if viewer parameters are equal.\n * @param o1 - First viewer or settings object.\n * @param o2 - Second viewer or settings object.\n * @return - Flag whether viewer parameters are equal.\n */\nexport function areParametersEqual(o1: PeptideViewer | PeptidesSettings, o2: PeptideViewer | PeptidesSettings,\n): boolean {\n return o1.sequenceColumnName === o2.sequenceColumnName && o1.activityColumnName === o2.activityColumnName &&\n o1.activityScaling === o2.activityScaling;\n}\n\n/**\n * Converts mutation cliffs to masks info.\n * @param mutationCliffs - Mutation Cliffs map.\n * @param rowCount - Number of rows in dataframe.\n * @return - Object with monomer-position masks.\n */\nexport function mutationCliffsToMaskInfo(mutationCliffs: type.MutationCliffs, rowCount: number): MasksInfo {\n const result: MasksInfo = {};\n for (const [position, monomerMap] of mutationCliffs) {\n for (const [monomer, indexMap] of monomerMap) {\n result[monomer] ??= {};\n const bitArray = new BitArray(rowCount, false);\n for (const [index, indexList] of indexMap) {\n bitArray.setTrue(index);\n for (const i of indexList)\n bitArray.setTrue(i);\n }\n result[monomer][position] = {mask: bitArray};\n }\n }\n return result;\n}\n\n/**\n * Gets combined aggregation columns.\n * @param viewerSelectedColNames - Array of selected columns in viewer properties.\n * @param aggColsViewer - Object with aggregation columns from viewer properties.\n * @param aggColsModel - Object with aggregation columns from analysis settings.\n * @return - Array of combined aggregation columns.\n */\nexport function getTotalAggColumns(df: DG.DataFrame, viewerSelectedColNames: string[],\n aggColsViewer: AggregationColumns, aggColsModel?: AggregationColumns): [string, DG.AggregationType][] {\n const aggColsEntries = Object.entries(aggColsViewer);\n const aggColsEntriesFromSettings = !aggColsModel ? [] : Object.entries(aggColsModel)\n .filter((it) => !viewerSelectedColNames.includes(it[0]) || aggColsViewer[it[0]] !== it[1]);\n\n return aggColsEntries.concat(aggColsEntriesFromSettings)\n .filter((it) => df.columns.contains(it[0]) && df.col(it[0])!.matches('numerical'));\n}\n\n/**\n * Checks if dataframe is applicable for analysis. To be applicable, dataframe must contain at least one macromolecule\n * column, at least one numerical column for activity and at least two rows.\n * @param table - Dataframe to check.\n * @param minRows - Minimum number of rows in dataframe.\n * @return - Flag whether dataframe is applicable for analysis.\n */\nexport function isApplicableDataframe(table: DG.DataFrame, minRows: number = 2): boolean {\n return table.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE).length > 0 &&\n wu(table.columns.numerical).toArray().length > 0 && table.rowCount >= minRows;\n}\n\nexport function debounce<T extends Array<any>, K>(f: (...args: T) => Promise<K>, timeout: number = 500,\n): (...args: T) => Promise<K> {\n let timer: NodeJS.Timeout | number | undefined;\n return async (...args: T) => {\n return new Promise<K>((resolve) => {\n clearTimeout(timer);\n timer = setTimeout(() => resolve(f(...args)), timeout);\n });\n };\n}\n","import * as DG from 'datagrok-api/dg';\nimport {tTest} from '@datagrok-libraries/statistics/src/tests';\nimport {RawData} from './types';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {StringDictionary} from '@datagrok-libraries/utils/src/type-declarations';\nimport {ClusterType} from '../viewers/logo-summary';\nimport {AGG_STATS_MAPPING} from './constants';\n\nexport type StatsItem = {\n count: number,\n pValue: number | null,\n meanDifference: number,\n ratio: number,\n mask: BitArray,\n mean: number,\n};\n\nexport type PositionStats = { [monomer: string]: StatsItem } & { general: SummaryStats };\nexport type MonomerPositionStats = { [position: string]: PositionStats } & { general: SummaryStats };\nexport type CacheItem = { filter: Int32Array, stats: MonomerPositionStats, selection: Int32Array };\nexport type MonomerPositionStatsCache = { [colName: string]: CacheItem };\nexport type ClusterStats = { [cluster: string]: StatsItem };\nexport type ClusterTypeStats = { [clusterType in ClusterType]: ClusterStats };\nexport type MasksInfo = {\n [monomerOrCluster: string]: { [positionOrClusterType: string | ClusterType]: { mask: BitArray } }\n};\n\nexport type SummaryStats = {\n minCount: number, maxCount: number,\n minMeanDifference: number, maxMeanDifference: number,\n minPValue: number, maxPValue: number,\n minRatio: number, maxRatio: number,\n minMean: number, maxMean: number,\n};\n\nexport const getAggregatedColName = (aggF: string, colName: string): string => `${aggF}(${colName})`;\nexport type AggregationColumns = { [col: string]: DG.AggregationType };\n\n/**\n * Returns statistics for the given activity data and bit array.\n * @param data - Activity data to calculate statistics for.\n * @param bitArray - Bit array to use for the calculation.\n * @return - Statistics for the given data and bit array.\n */\nexport function getStats(data: RawData | number[], bitArray: BitArray): StatsItem {\n if (data.length !== bitArray.length && data.some((v, i) => i >= bitArray.length ? v !== 0 : false))\n throw new Error('PeptidesError: Data and bit array have different lengths');\n\n\n if (bitArray.trueCount() === 0)\n throw new Error('PeptidesError: One of the samples is empty');\n\n\n const selected = new Float32Array(bitArray.trueCount());\n const rest = new Float32Array(bitArray.falseCount());\n\n let selectedIndex = 0;\n let restIndex = 0;\n for (let i = 0; i < bitArray.length; ++i) {\n if (bitArray.getBit(i))\n selected[selectedIndex++] = data[i];\n else\n rest[restIndex++] = data[i];\n }\n\n const selectedMean = selected.reduce((a, b) => a + b, 0) / selected.length;\n if (selected.length === 1 || rest.length === 1) {\n const restMean = rest.reduce((a, b) => a + b, 0) / rest.length;\n return {\n count: selected.length,\n pValue: null,\n mean: selectedMean,\n meanDifference: selectedMean - restMean,\n ratio: selected.length / (bitArray.length),\n mask: bitArray,\n };\n }\n\n const testResult = tTest(selected, rest);\n const currentMeanDiff = testResult['Mean difference']!;\n return {\n count: selected.length,\n pValue: testResult[currentMeanDiff >= 0 ? 'p-value more' : 'p-value less'],\n mean: selectedMean,\n meanDifference: currentMeanDiff,\n ratio: selected.length / (bitArray.length),\n mask: bitArray,\n };\n}\n\n/**\n * Returns statistics for the given activity data and bit array.\n * @param col - Column to get aggregated value for.\n * @param agg - Aggregation type to use.\n * @param [mask] - BitSet to use for the calculation.\n * @return - Aggregated value.\n */\nexport function getAggregatedValue(col: DG.Column<number>, agg: DG.AggregationType, mask?: DG.BitSet): number {\n const mappedAgg = AGG_STATS_MAPPING[agg];\n const stat = DG.Stats.fromColumn(col, mask);\n if (!(mappedAgg in stat))\n throw new Error(`Aggregation type ${mappedAgg} is not supported`);\n\n\n //@ts-ignore: this is a hack to avoid using switch to access the getters\n return stat[mappedAgg] as number;\n}\n\n/**\n * Calculate aggregated values for the given columns.\n * @param df - Data frame to get aggregated values from.\n * @param columns - Columns to get aggregated values for.\n * @param options - Options to use.\n * @param [options.filterDf] - Whether to use dataframe filter.\n * @param [options.mask] - BitSet to use for the calculation.\n * @param options.fractionDigits - Number of fraction digits to use.\n * @return - Mapping object with aggregated column values.\n */\nexport function getAggregatedColumnValues(df: DG.DataFrame, columns: [string, DG.AggregationType][],\n options: { filterDf?: boolean, mask?: DG.BitSet, fractionDigits?: number } = {}): StringDictionary {\n options.filterDf ??= false;\n options.fractionDigits ??= 3;\n\n const filteredDf = options.filterDf && df.filter.anyFalse ? df.clone(df.filter) : df;\n\n const colResults: StringDictionary = {};\n for (const [colName, aggFn] of columns) {\n const newColName = getAggregatedColName(aggFn, colName);\n const value = getAggregatedValue(filteredDf.getCol(colName), aggFn, options.mask);\n colResults[newColName] = value.toFixed(options.fractionDigits);\n }\n return colResults;\n}\n\n/**\n * Gets aggregated column values from the given dataframe at the row index.\n * @param df - Data frame to get aggregated values from.\n * @param idx - Row index to get aggregated values for.\n * @param columns - Columns to get aggregated values for.\n * @param options - Aggregated columns options.\n * @param [options.fractionDigits] - Number of fraction digits to use.\n * @return - Mapping object with aggregated column values.\n */\nexport function getAggregatedColumnValuesFromDf(df: DG.DataFrame, idx: number,\n columns: [string, DG.AggregationType][], options: { fractionDigits?: number }): StringDictionary {\n options.fractionDigits ??= 3;\n const colResults: StringDictionary = {};\n for (const [colName, aggFn] of columns) {\n const newColName = getAggregatedColName(aggFn, colName);\n const value = df.get(newColName, idx);\n colResults[newColName] = value.toFixed(options.fractionDigits);\n }\n return colResults;\n}\n\nexport function getStringColAggregatedJSON(df: DG.DataFrame, colName: string, mask?: DG.BitSet): string {\n const col = df.col(colName.substring(5, colName.length - 1)); // remove 'dist(' and ')'\n if (!col || !col.matches('categorical'))\n return '{}';\n mask ??= DG.BitSet.create(df.rowCount, () => true);\n const values = col.getRawData();\n const valueCounts = new Map<number, number>();\n for (let i = -1; (i = mask.findNext(i, true)) !== -1;)\n valueCounts.set(values[i], (valueCounts.get(values[i]) ?? 0) + 1);\n\n const resJSON: {[_: string]: number} = {};\n for (const [value, count] of valueCounts)\n resJSON[col.categories[value]] = count;\n return JSON.stringify(resJSON);\n}\n","//@ts-ignore: no types\nimport * as jStat from 'jstat';\nexport function tTest(sample1, sample2, devKnown = false, devEqual = false) {\n if (sample1.length <= 1 || sample2.length <= 1)\n throw new Error(`StatisticsError: Wrong sample size; expected at least 2, got ${Math.min(sample1.length, sample2.length)})`);\n const mean1 = jStat.mean(sample1);\n const mean2 = jStat.mean(sample2);\n const variance1 = jStat.variance(sample1);\n const variance2 = jStat.variance(sample2);\n const length1 = sample1.length;\n const length2 = sample2.length;\n let pMore;\n let pLess;\n let pTot;\n if (!devKnown) {\n if (!devEqual) {\n const sampleVariance1 = variance1 / length1;\n const sampleVariance2 = variance2 / length2;\n const criticalValue = (mean1 - mean2) / Math.sqrt(sampleVariance1 + sampleVariance2);\n const dof = Math.pow((sampleVariance1 + sampleVariance2), 2) /\n (Math.pow(sampleVariance1, 2) / (length1 - 1) + Math.pow(sampleVariance2, 2) / (length2 - 1));\n pLess = jStat.studentt.cdf(criticalValue, dof);\n pMore = 1 - pLess;\n pTot = 2 * (pLess < pMore ? pLess : pMore);\n }\n else {\n const dof = length1 + length2 - 2;\n const totalVariance = (variance1 * (length1 - 1) + variance2 * (length2 - 1)) / dof;\n const criticalValue = Math.sqrt(length1 * length2 / (length1 + length2)) * (mean1 - mean2) / totalVariance;\n pMore = 1 - jStat.studentt.cdf(criticalValue, dof);\n pLess = jStat.studentt.cdf(criticalValue, dof);\n pTot = 2 * (pLess < pMore ? pLess : pMore);\n }\n }\n else {\n const sampleVariance1 = variance1 / length1;\n const sampleVariance2 = variance2 / length2;\n const criticalValue = (mean1 - mean2) / Math.sqrt(sampleVariance1 + sampleVariance2);\n pLess = jStat.normal.pdf(criticalValue, 0, 1);\n pMore = 1 - pLess;\n pTot = 2 * (pLess < pMore ? pLess : pMore);\n }\n return { 'p-value': pTot, 'Mean difference': mean1 - mean2, 'p-value more': pMore, 'p-value less': pLess };\n}\nexport function uTest(x, y, continuity = true) {\n const xy = x.concat(y);\n const n1 = x.length;\n const n2 = y.length;\n const med1 = jStat.median(x);\n const med2 = jStat.median(y);\n const ranks = jStat.rank(xy);\n const R1 = jStat.sum(ranks.slice(0, n1));\n const U1 = R1 - n1 * (n1 + 1) / 2;\n const U2 = n1 * n2 - U1;\n const U = U1 > U2 ? U1 : U2;\n const mu = n1 * n2 / 2;\n const n = n1 + n2;\n const tieTerm = _tieTerm(ranks);\n const s = Math.sqrt(n1 * n2 / 12 * ((n + 1) - tieTerm / (n * (n - 1))));\n let numerator = U - mu;\n if (continuity)\n numerator -= 0.5;\n const z = numerator / s;\n const p = 2 * (1 - jStat.normal.cdf(z, 0, 1));\n return { 'p-value': p, 'Median difference': med1 - med2, 'p-value more': p, 'p-value less': p };\n}\nfunction _tieTerm(ranks) {\n const ties = {};\n ranks.forEach((num) => {\n ties[num] = (ties[num] || 0) + 1;\n });\n return jStat.sum(Object.values(ties));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzQkFBc0I7QUFDdEIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFZL0IsTUFBTSxVQUFVLEtBQUssQ0FBQyxPQUFtQixFQUFFLE9BQW1CLEVBQUUsUUFBUSxHQUFDLEtBQUssRUFBRSxRQUFRLEdBQUMsS0FBSztJQUM1RixJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQztRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUvSCxNQUFNLEtBQUssR0FBVyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFXLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxNQUFNLFNBQVMsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUUvQixJQUFJLEtBQUssQ0FBQztJQUNWLElBQUksS0FBSyxDQUFDO0lBQ1YsSUFBSSxJQUFJLENBQUM7SUFFVCxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE1BQU0sZUFBZSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDNUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUM1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O0lBQ3BCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDcEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFN0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRTVCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFbEIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUV2QixJQUFJLFVBQVU7UUFDWixTQUFTLElBQUksR0FBRyxDQUFDO0lBR25CLE1BQU0sQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5QyxPQUFPLEVBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBQyxDQUFDO0FBQ2hHLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFlO0lBQy9CLE1BQU0sSUFBSSxHQUE0QixFQUFFLENBQUM7SUFFekMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvL0B0cy1pZ25vcmU6IG5vIHR5cGVzXG5pbXBvcnQgKiBhcyBqU3RhdCBmcm9tICdqc3RhdCc7XG5cbnR5cGUgdGVzdFN0YXRzID0ge1xuICAncC12YWx1ZSc6IG51bWJlcixcbiAgJ01lYW4gZGlmZmVyZW5jZSc/OiBudW1iZXIsXG4gICdNZWRpYW4gZGlmZmVyZW5jZSc/OiBudW1iZXIsXG4gICdwLXZhbHVlIG1vcmUnOiBudW1iZXIsXG4gICdwLXZhbHVlIGxlc3MnOiBudW1iZXIsXG59O1xuXG50eXBlIFBvcHVsYXRpb24gPSBudW1iZXJbXSB8IEZsb2F0MzJBcnJheSB8IEludDMyQXJyYXk7XG5cbmV4cG9ydCBmdW5jdGlvbiB0VGVzdChzYW1wbGUxOiBQb3B1bGF0aW9uLCBzYW1wbGUyOiBQb3B1bGF0aW9uLCBkZXZLbm93bj1mYWxzZSwgZGV2RXF1YWw9ZmFsc2UpOiB0ZXN0U3RhdHMge1xuICBpZiAoc2FtcGxlMS5sZW5ndGggPD0gMSB8fCBzYW1wbGUyLmxlbmd0aCA8PSAxKVxuICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGlzdGljc0Vycm9yOiBXcm9uZyBzYW1wbGUgc2l6ZTsgZXhwZWN0ZWQgYXQgbGVhc3QgMiwgZ290ICR7TWF0aC5taW4oc2FtcGxlMS5sZW5ndGgsIHNhbXBsZTIubGVuZ3RoKX0pYCk7XG5cbiAgY29uc3QgbWVhbjE6IG51bWJlciA9IGpTdGF0Lm1lYW4oc2FtcGxlMSk7XG4gIGNvbnN0IG1lYW4yOiBudW1iZXIgPSBqU3RhdC5tZWFuKHNhbXBsZTIpO1xuICBjb25zdCB2YXJpYW5jZTE6IG51bWJlciA9IGpTdGF0LnZhcmlhbmNlKHNhbXBsZTEpO1xuICBjb25zdCB2YXJpYW5jZTI6IG51bWJlciA9IGpTdGF0LnZhcmlhbmNlKHNhbXBsZTIpO1xuICBjb25zdCBsZW5ndGgxID0gc2FtcGxlMS5sZW5ndGg7XG4gIGNvbnN0IGxlbmd0aDIgPSBzYW1wbGUyLmxlbmd0aDtcblxuICBsZXQgcE1vcmU7XG4gIGxldCBwTGVzcztcbiAgbGV0IHBUb3Q7XG5cbiAgaWYgKCFkZXZLbm93bikge1xuICAgIGlmICghZGV2RXF1YWwpIHtcbiAgICAgIGNvbnN0IHNhbXBsZVZhcmlhbmNlMSA9IHZhcmlhbmNlMSAvIGxlbmd0aDE7XG4gICAgICBjb25zdCBzYW1wbGVWYXJpYW5jZTIgPSB2YXJpYW5jZTIgLyBsZW5ndGgyO1xuICAgICAgY29uc3QgY3JpdGljYWxWYWx1ZSA9IChtZWFuMSAtIG1lYW4yKSAvIE1hdGguc3FydChzYW1wbGVWYXJpYW5jZTEgKyBzYW1wbGVWYXJpYW5jZTIpO1xuICAgICAgY29uc3QgZG9mID0gTWF0aC5wb3coKHNhbXBsZVZhcmlhbmNlMSArIHNhbXBsZVZhcmlhbmNlMiksIDIpIC9cbiAgICAgICAgKE1hdGgucG93KHNhbXBsZVZhcmlhbmNlMSwgMikgLyAobGVuZ3RoMSAtIDEpICsgTWF0aC5wb3coc2FtcGxlVmFyaWFuY2UyLCAyKSAvIChsZW5ndGgyIC0gMSkpO1xuXG4gICAgICBwTGVzcyA9IGpTdGF0LnN0dWRlbnR0LmNkZihjcml0aWNhbFZhbHVlLCBkb2YpO1xuICAgICAgcE1vcmUgPSAxIC0gcExlc3M7XG4gICAgICBwVG90ID0gMiAqIChwTGVzcyA8IHBNb3JlID8gcExlc3MgOiBwTW9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRvZiA9IGxlbmd0aDEgKyBsZW5ndGgyIC0gMjtcbiAgICAgIGNvbnN0IHRvdGFsVmFyaWFuY2UgPSAodmFyaWFuY2UxICogKGxlbmd0aDEgLSAxKSArIHZhcmlhbmNlMiAqIChsZW5ndGgyIC0gMSkpIC8gZG9mO1xuICAgICAgY29uc3QgY3JpdGljYWxWYWx1ZSA9IE1hdGguc3FydChsZW5ndGgxICogbGVuZ3RoMiAvIChsZW5ndGgxICsgbGVuZ3RoMikpICogKG1lYW4xIC0gbWVhbjIpIC8gdG90YWxWYXJpYW5jZTtcblxuICAgICAgcE1vcmUgPSAxIC0galN0YXQuc3R1ZGVudHQuY2RmKGNyaXRpY2FsVmFsdWUsIGRvZik7XG4gICAgICBwTGVzcyA9IGpTdGF0LnN0dWRlbnR0LmNkZihjcml0aWNhbFZhbHVlLCBkb2YpO1xuICAgICAgcFRvdCA9IDIgKiAocExlc3MgPCBwTW9yZSA/IHBMZXNzIDogcE1vcmUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzYW1wbGVWYXJpYW5jZTEgPSB2YXJpYW5jZTEgLyBsZW5ndGgxO1xuICAgIGNvbnN0IHNhbXBsZVZhcmlhbmNlMiA9IHZhcmlhbmNlMiAvIGxlbmd0aDI7XG4gICAgY29uc3QgY3JpdGljYWxWYWx1ZSA9IChtZWFuMSAtIG1lYW4yKSAvIE1hdGguc3FydChzYW1wbGVWYXJpYW5jZTEgKyBzYW1wbGVWYXJpYW5jZTIpO1xuXG4gICAgcExlc3MgPSBqU3RhdC5ub3JtYWwucGRmKGNyaXRpY2FsVmFsdWUsIDAsIDEpO1xuICAgIHBNb3JlID0gMSAtIHBMZXNzO1xuICAgIHBUb3QgPSAyICogKHBMZXNzIDwgcE1vcmUgPyBwTGVzcyA6IHBNb3JlKTtcbiAgfVxuICByZXR1cm4geydwLXZhbHVlJzogcFRvdCwgJ01lYW4gZGlmZmVyZW5jZSc6IG1lYW4xIC0gbWVhbjIsICdwLXZhbHVlIG1vcmUnOiBwTW9yZSwgJ3AtdmFsdWUgbGVzcyc6IHBMZXNzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVUZXN0KHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSwgY29udGludWl0eT10cnVlKTogdGVzdFN0YXRzIHtcbiAgY29uc3QgeHkgPSB4LmNvbmNhdCh5KTtcbiAgY29uc3QgbjEgPSB4Lmxlbmd0aDtcbiAgY29uc3QgbjIgPSB5Lmxlbmd0aDtcbiAgY29uc3QgbWVkMSA9IGpTdGF0Lm1lZGlhbih4KTtcbiAgY29uc3QgbWVkMiA9IGpTdGF0Lm1lZGlhbih5KTtcblxuICBjb25zdCByYW5rcyA9IGpTdGF0LnJhbmsoeHkpO1xuXG4gIGNvbnN0IFIxID0galN0YXQuc3VtKHJhbmtzLnNsaWNlKDAsIG4xKSk7XG4gIGNvbnN0IFUxID0gUjEgLSBuMSAqIChuMSArIDEpIC8gMjtcbiAgY29uc3QgVTIgPSBuMSAqIG4yIC0gVTE7XG4gIGNvbnN0IFUgPSBVMSA+IFUyID8gVTEgOiBVMjtcblxuICBjb25zdCBtdSA9IG4xICogbjIgLyAyO1xuICBjb25zdCBuID0gbjEgKyBuMjtcblxuICBjb25zdCB0aWVUZXJtID0gX3RpZVRlcm0ocmFua3MpO1xuICBjb25zdCBzID0gTWF0aC5zcXJ0KG4xICogbjIgLyAxMiAqICgobiArIDEpIC0gdGllVGVybSAvIChuKiAobiAtIDEpKSkpO1xuXG4gIGxldCBudW1lcmF0b3IgPSBVIC0gbXU7XG5cbiAgaWYgKGNvbnRpbnVpdHkpXG4gICAgbnVtZXJhdG9yIC09IDAuNTtcblxuXG4gIGNvbnN0IHogPSBudW1lcmF0b3IgLyBzO1xuXG4gIGNvbnN0IHAgPSAyICogKDEgLSBqU3RhdC5ub3JtYWwuY2RmKHosIDAsIDEpKTtcblxuICByZXR1cm4geydwLXZhbHVlJzogcCwgJ01lZGlhbiBkaWZmZXJlbmNlJzogbWVkMSAtIG1lZDIsICdwLXZhbHVlIG1vcmUnOiBwLCAncC12YWx1ZSBsZXNzJzogcH07XG59XG5cbmZ1bmN0aW9uIF90aWVUZXJtKHJhbmtzOiBudW1iZXJbXSk6IG51bWJlciB7XG4gIGNvbnN0IHRpZXM6IHtba2V5OiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG5cbiAgcmFua3MuZm9yRWFjaCgobnVtKSA9PiB7XG4gICAgdGllc1tudW1dID0gKHRpZXNbbnVtXSB8fCAwKSArIDE7XG4gIH0pO1xuXG4gIHJldHVybiBqU3RhdC5zdW0oT2JqZWN0LnZhbHVlcyh0aWVzKSk7XG59XG4iXX0=","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as type from './types';\nimport * as C from '../utils/constants';\n\nimport {getActivityDistribution, getStatsTableMap} from '../widgets/distribution';\nimport {getDistributionPanel, getDistributionTable} from './misc';\nimport {getMonomerWorksInstance} from '../package';\nimport {getAggregatedColumnValues, MonomerPositionStats} from './statistics';\nimport {StringDictionary} from '@datagrok-libraries/utils/src/type-declarations';\n\nexport type TooltipOptions = {\n fromViewer?: boolean, isMutationCliffs?: boolean, x: number, y: number, monomerPosition: type.SelectionItem,\n mpStats: MonomerPositionStats, aggrColValues?: StringDictionary,\n isMostPotentResidues?: boolean, cliffStats?: type.MutationCliffStats['stats']\n};\n\n/**\n * Shows monomer tooltip at the given coordinates.\n * @param monomer - Monomer symbol.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @return - Flag if the tooltip is shown.\n */\nexport function showMonomerTooltip(monomer: string, x: number, y: number): boolean {\n const tooltipElements: HTMLDivElement[] = [];\n const monomerName = monomer.toLowerCase();\n const mw = getMonomerWorksInstance();\n const mol = mw?.getCappedRotatedMonomer('PEPTIDE', monomer);\n\n if (mol) {\n tooltipElements.push(ui.div(monomerName));\n const options = {autoCrop: true, autoCropMargin: 0, suppressChiralText: true};\n tooltipElements.push(grok.chem.svgMol(mol, undefined, undefined, options));\n } else if (monomer !== '')\n tooltipElements.push(ui.div(monomer));\n else\n return true;\n\n\n ui.tooltip.show(ui.divV(tooltipElements), x, y);\n return true;\n}\n\n/**\n * Shows tooltip at the given coordinates.\n * @param df - Dataframe to show tooltip at.\n * @param activityCol - Activity column.\n * @param columns - Aggregation columns.\n * @param options - Tooltip options.\n * @return - Flag if the tooltip is shown.\n */\nexport function showTooltip(df: DG.DataFrame, activityCol: DG.Column<number>, columns: [string, DG.AggregationType][],\n options: TooltipOptions): boolean {\n options.fromViewer ??= false;\n options.isMutationCliffs ??= false;\n options.isMostPotentResidues ??= false;\n if (options.monomerPosition.positionOrClusterType === C.COLUMNS_NAMES.MONOMER)\n showMonomerTooltip(options.monomerPosition.monomerOrCluster, options.x, options.y);\n else\n showTooltipAt(df, activityCol, columns, options);\n\n\n return true;\n}\n\n//TODO: move out to viewer code\n/**\n * Shows dataframe tooltip at the given coordinates.\n * @param df - Dataframe to show tooltip at.\n * @param activityCol - Activity column.\n * @param columns - Aggregation columns.\n * @param options - Tooltip options.\n * @return - Tooltip element.\n */\nexport function showTooltipAt(df: DG.DataFrame, activityCol: DG.Column<number>, columns: [string, DG.AggregationType][],\n options: TooltipOptions): HTMLDivElement | null {\n options.fromViewer ??= false;\n options.isMutationCliffs ??= false;\n options.isMostPotentResidues ??= false;\n if (!options.cliffStats || !options.isMutationCliffs) {\n const stats = options\n .mpStats[options.monomerPosition.positionOrClusterType]![options.monomerPosition.monomerOrCluster];\n if (!stats?.count)\n return null;\n\n\n const mask = DG.BitSet.fromBytes(stats.mask.buffer.buffer, activityCol.length);\n const hist = getActivityDistribution(getDistributionTable(activityCol, mask), true);\n const tableMap = getStatsTableMap(stats);\n if (options.fromViewer) {\n tableMap['Mean difference'] = `${tableMap['Mean difference']}${options.isMostPotentResidues ? ' (size)' : ''}`;\n if (tableMap['p-value'])\n tableMap['p-value'] = `${tableMap['p-value']}${options.isMostPotentResidues ? ' (color)' : ''}`;\n }\n const aggregatedColMap = options.aggrColValues ?? getAggregatedColumnValues(df, columns, {mask: mask});\n const resultMap = {...tableMap, ...aggregatedColMap};\n const distroStatsElem = getDistributionPanel(hist, resultMap);\n ui.tooltip.show(distroStatsElem, options.x, options.y);\n return distroStatsElem;\n } else {\n const stats = options.cliffStats?.get(options.monomerPosition.monomerOrCluster)\n ?.get(options.monomerPosition.positionOrClusterType)\n ;\n if (!stats)\n return null;\n const mask = DG.BitSet.fromBytes(stats.mask.buffer.buffer, activityCol.length);\n const hist = getActivityDistribution(getDistributionTable(activityCol, mask), true);\n const tableMap = getStatsTableMap(stats);\n if (options.fromViewer) {\n tableMap['Mean difference'] = `${tableMap['Mean difference']}${' (Color)'}`;\n if (tableMap['Count'])\n tableMap['Count'] = `${tableMap['Count']}${' (Size)'}`;\n }\n const aggregatedColMap = options.aggrColValues ?? getAggregatedColumnValues(df, columns, {mask: mask});\n const resultMap = {...tableMap, ...aggregatedColMap};\n const distroStatsElem = getDistributionPanel(hist, resultMap);\n ui.tooltip.show(distroStatsElem, options.x, options.y);\n return distroStatsElem;\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport {ClusterType} from '../viewers/logo-summary';\nimport {SCALING_METHODS} from './constants';\nimport {AggregationColumns, StatsItem} from './statistics';\nimport {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\n\nexport type RawData = Int32Array | Uint32Array | Float32Array | Float64Array;\ntype MONOMER = string;\ntype POSITION = string;\ntype INDEX = number;\ntype INDEXES = number[] | UTypedArray;\nexport type UTypedArray = Uint8Array | Uint16Array | Uint32Array;\n//Monomer: (Position: (index: indexList))\nexport type MutationCliffs = Map<MONOMER, Map<POSITION, Map<INDEX, INDEXES>>>;\n//Monomer: (Position: (Stats))\nexport type MutationCliffStats = {\n stats: Map<MONOMER, Map<POSITION, StatsItem>>;\n minDiff: number; maxDiff: number; maxCount: number; minCount: number;\n};\nexport type Selection = { [positionOrClusterType: string | ClusterType]: string[] };\nexport type SelectionItem = { positionOrClusterType: string | ClusterType, monomerOrCluster: string };\nexport type SelectionStats = { [positionOrClusterType: string | ClusterType]: { [monomerOrCluster: string]: number } };\n\nexport interface PeptidesSettings {\n sequenceColumnName: string,\n activityColumnName: string,\n activityScaling: SCALING_METHODS,\n showMonomerPosition?: boolean,\n showMostPotentResidues?: boolean,\n showLogoSummaryTable?: boolean,\n showDendrogram?: boolean,\n showClusterMaxActivity?: boolean,\n showSequenceSpace?: boolean,\n columns?: AggregationColumns,\n sequenceSpaceParams: SequenceSpaceParams,\n mclSettings: MCLSettings,\n}\n\nexport class MCLSettings {\n maxIterations: number = 5;\n inflation: number = 1.4;\n threshold: number = 80;\n distanceF: MmDistanceFunctionsNames = MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH;\n gapOpen: number = 1;\n gapExtend: number = 0.6;\n fingerprintType: string = 'Morgan';\n}\n\nexport class SequenceSpaceParams {\n distanceF: MmDistanceFunctionsNames = MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH;\n gapOpen: number = 1;\n gapExtend: number = 0.6;\n clusterEmbeddings: boolean = true;\n epsilon: number = 0.01;\n minPts: number = 4;\n fingerprintType: string = 'Morgan';\n constructor(clusterEmbeddings?: boolean) {\n this.clusterEmbeddings = !!clusterEmbeddings;\n }\n}\n\nexport type PartialPeptidesSettings = Partial<PeptidesSettings>;\n\nexport type DrawOptions = {\n symbolStyle?: string,\n upperLetterHeight?: number,\n upperLetterAscent?: number,\n bounds?: DG.Rect,\n textAlign?: CanvasTextAlign,\n textBaseline?: CanvasTextBaseline,\n marginVertical?: number,\n marginHorizontal?: number,\n headerStyle?: string,\n textHeight?: number,\n selectionWidth?: number,\n};\n\nexport type RawColumn = { name: string, rawData: RawData, cat?: string[] };\n\nexport type SelectionOptions = { shiftPressed: boolean, ctrlPressed: boolean, notify?: boolean };\n\nexport type CachedWebLogoTooltip = { bar: string, tooltip: HTMLDivElement | null };\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\nimport {PeptidesModel, VIEWER_TYPE} from '../model';\nimport * as C from '../utils/constants';\nimport {COLUMN_NAME, SCALING_METHODS} from '../utils/constants';\nimport * as CR from '../utils/cell-renderer';\nimport {HorizontalAlignments, IWebLogoViewer, PositionHeight} from '@datagrok-libraries/bio/src/viewers/web-logo';\nimport {\n AggregationColumns,\n ClusterTypeStats,\n getAggregatedColumnValues,\n getAggregatedValue,\n getStats,\n getStringColAggregatedJSON,\n StatsItem,\n} from '../utils/statistics';\nimport wu from 'wu';\nimport {getActivityDistribution, getStatsTableMap} from '../widgets/distribution';\nimport {\n getDistributionPanel,\n getDistributionTable,\n getTotalAggColumns,\n isApplicableDataframe,\n modifySelection,\n scaleActivity,\n} from '../utils/misc';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport * as type from '../utils/types';\nimport {SelectionItem} from '../utils/types';\nimport {_package} from '../package';\nimport {calculateClusterStatistics} from '../utils/algorithms';\nimport {splitAlignedSequences} from '@datagrok-libraries/bio/src/utils/splitter';\nimport {SARViewer} from './sar-viewer';\n\nconst getAggregatedColName = (aggF: string, colName: string): string => `${aggF}(${colName})`;\n\nexport enum CLUSTER_TYPE {\n ORIGINAL = 'original',\n CUSTOM = 'custom',\n}\n\nexport type ClusterType = `${CLUSTER_TYPE}`;\n\nexport const enum LST_PROPERTIES {\n WEB_LOGO_MODE = 'webLogoMode',\n MEMBERS_RATIO_THRESHOLD = 'membersRatioThreshold',\n SEQUENCE = 'sequence',\n CLUSTERS = 'clusters',\n COLUMNS = 'columns',\n AGGREGATION = 'aggregation',\n ACTIVITY_SCALING = 'activityScaling',\n ACTIVITY = 'activity',\n}\n\nenum LST_CATEGORIES {\n GENERAL = 'General',\n STYLE = 'WebLogo',\n AGGREGATION = 'Aggregation',\n}\n\nexport interface ILogoSummaryTable {\n sequenceColumnName: string;\n clustersColumnName: string;\n activityColumnName: string;\n activityScaling: string;\n}\n\n/** LogoSummaryTable viewer shows per cluster information. */\nexport class LogoSummaryTable extends DG.JsViewer implements ILogoSummaryTable {\n _titleHost = ui.divText(VIEWER_TYPE.LOGO_SUMMARY_TABLE, {id: 'pep-viewer-title'});\n sequenceColumnName: string;\n clustersColumnName: string;\n webLogoMode: string;\n membersRatioThreshold: number;\n bitsets: DG.BitSet[] = [];\n keyPress: boolean = false;\n currentRowIndex: number | null = null;\n columns: string[];\n aggregation: string;\n activityColumnName: string;\n activityScaling: SCALING_METHODS;\n _scaledActivityColumn: DG.Column | null = null;\n\n /** Creates LogoSummaryTable properties. */\n constructor() {\n super();\n\n this.sequenceColumnName = this.column(LST_PROPERTIES.SEQUENCE,\n {\n category: LST_CATEGORIES.GENERAL,\n nullable: false,\n });\n this.clustersColumnName = this.column(LST_PROPERTIES.CLUSTERS,\n {\n category: LST_CATEGORIES.GENERAL,\n nullable: false,\n columnTypeFilter: DG.TYPE.CATEGORICAL,\n });\n this.activityColumnName = this.column(LST_PROPERTIES.ACTIVITY, {\n category: LST_CATEGORIES.GENERAL, nullable: false, columnTypeFilter: DG.TYPE.NUMERICAL,\n });\n this.activityScaling = this.string(LST_PROPERTIES.ACTIVITY_SCALING, C.SCALING_METHODS.NONE,\n {\n category: LST_CATEGORIES.GENERAL,\n choices: Object.values(C.SCALING_METHODS),\n }) as SCALING_METHODS;\n\n this.webLogoMode = this.string(LST_PROPERTIES.WEB_LOGO_MODE, PositionHeight.Entropy,\n {\n choices: [PositionHeight.full, PositionHeight.Entropy],\n category: LST_CATEGORIES.STYLE,\n });\n this.membersRatioThreshold = this.float(LST_PROPERTIES.MEMBERS_RATIO_THRESHOLD, 0.1,\n {\n min: 0,\n max: 1.0,\n category: LST_CATEGORIES.STYLE,\n });\n\n this.columns = this.columnList(LST_PROPERTIES.COLUMNS, [], {category: LST_CATEGORIES.AGGREGATION});\n this.aggregation = this.string(LST_PROPERTIES.AGGREGATION, DG.AGG.AVG,\n {\n category: LST_CATEGORIES.AGGREGATION,\n choices: C.AGGREGATION_TYPES,\n });\n }\n\n /**\n * Returns PeptidesModel instance that belongs to the attached dataframe.\n * @return - PeptidesModel instance.\n */\n get model(): PeptidesModel {\n return PeptidesModel.getInstance(this.dataFrame);\n }\n\n _viewerGrid: DG.Grid | null = null;\n\n /**\n * Returns LogoSummaryTable grid. Creates a new one if it is null.\n * @return - LogoSummaryTable grid.\n */\n get viewerGrid(): DG.Grid {\n this._viewerGrid ??= this.createLogoSummaryTableGrid();\n return this._viewerGrid;\n }\n\n _clusterStats: ClusterTypeStats | null = null;\n\n /**\n * Returns cluster statistics. Calculates it if it is null.\n * @return - cluster statistics.\n */\n get clusterStats(): ClusterTypeStats {\n this._clusterStats ??= calculateClusterStatistics(this.dataFrame, this.clustersColumnName,\n this.customClusters.toArray(), this.getScaledActivityColumn());\n return this._clusterStats;\n }\n\n _clusterSelection: type.Selection | null = null;\n\n /**\n * Returns cluster selection. Initializes it if it is null.\n * @return - cluster selection.\n */\n get clusterSelection(): type.Selection {\n const tagSelection = this.dataFrame.getTag(C.TAGS.CLUSTER_SELECTION);\n this._clusterSelection ??= tagSelection === null ? this.initClusterSelection({notify: false}) :\n JSON.parse(tagSelection);\n return this._clusterSelection!;\n }\n\n /**\n * Sets cluster selection.\n * @param selection - cluster selection.\n */\n set clusterSelection(selection: type.Selection) {\n this._clusterSelection = selection;\n this.dataFrame.setTag(C.TAGS.CLUSTER_SELECTION, JSON.stringify(selection));\n this.model.fireBitsetChanged(VIEWER_TYPE.LOGO_SUMMARY_TABLE);\n this.model.analysisView.grid.invalidate();\n }\n\n _logoSummaryTable: DG.DataFrame | null = null;\n\n /**\n * Returns LogoSummaryTable dataframe. Creates a new one if it is null.\n * @return - LogoSummaryTable dataframe.\n */\n get logoSummaryTable(): DG.DataFrame {\n this._logoSummaryTable ??= this.createLogoSummaryTable();\n return this._logoSummaryTable;\n }\n\n /**\n * Sets LogoSummaryTable dataframe.\n * @param df - LogoSummaryTable dataframe.\n */\n set logoSummaryTable(df: DG.DataFrame) {\n this._logoSummaryTable = df;\n }\n\n _positionColumns: DG.Column<string>[] | null = null;\n\n /**\n * Returns position columns. If position columns are not attached to LogoSummaryTable, it tries to get them from\n * other viewers or analysis (given that relevant parameters are the same), or creates own position columns.\n * @return - position columns.\n */\n get positionColumns(): DG.Column<string>[] {\n if (this._positionColumns != null)\n return this._positionColumns;\n\n\n const getSharedPositionColumns = (viewerType: VIEWER_TYPE): DG.Column<string>[] | null => {\n const viewer = this.model.findViewer(viewerType) as SARViewer | null;\n if (this.sequenceColumnName === viewer?.sequenceColumnName)\n return viewer._positionColumns;\n\n\n return null;\n };\n\n if (this.model.positionColumns != null && this.sequenceColumnName === this.model.settings?.sequenceColumnName)\n this._positionColumns = this.model.positionColumns;\n\n\n this._positionColumns ??= getSharedPositionColumns(VIEWER_TYPE.MONOMER_POSITION) ??\n getSharedPositionColumns(VIEWER_TYPE.MOST_POTENT_RESIDUES) ??\n splitAlignedSequences(this.dataFrame.getCol(this.sequenceColumnName)).columns.toList();\n return this._positionColumns!;\n }\n\n /**\n * Checks if cluster selection is empty.\n * @return - flag indicating if cluster selection is empty.\n */\n get isClusterSelectionEmpty(): boolean {\n const clusterSelectionCount =\n this.clusterSelection[CLUSTER_TYPE.ORIGINAL].length + this.clusterSelection[CLUSTER_TYPE.CUSTOM].length;\n return clusterSelectionCount === 0;\n }\n\n /**\n * Gets iterable over custom clusters columns.\n * @return - iterable over custom clusters columns.\n */\n get customClusters(): wu.WuIterable<DG.Column<boolean>> {\n const query: {\n [key: string]: string\n } = {};\n query[C.TAGS.CUSTOM_CLUSTER] = '1';\n return wu(this.dataFrame.columns.byTags(query));\n }\n\n /**\n * Gets scaled activity column.\n * @param isFiltered - flag indicating if only filtered rows should be taken into account.\n * @return - scaled activity column.\n */\n getScaledActivityColumn(isFiltered: boolean = false): DG.Column<number> {\n if (this.model.settings?.activityColumnName === this.activityColumnName &&\n this.model.settings?.activityScaling === this.activityScaling)\n this._scaledActivityColumn = this.model.getScaledActivityColumn(isFiltered);\n\n\n this._scaledActivityColumn ??= scaleActivity(this.dataFrame.getCol(this.activityColumnName),\n this.activityScaling);\n if (isFiltered) {\n return DG.DataFrame.fromColumns([this._scaledActivityColumn]).clone(this.dataFrame.filter)\n .getCol(this._scaledActivityColumn.name) as DG.Column<number>;\n }\n return this._scaledActivityColumn as DG.Column<number>;\n }\n\n /**\n * Gets a map of columns and aggregations.\n * @return - map of columns and aggregations.\n */\n getAggregationColumns(): AggregationColumns {\n return Object.fromEntries(this.columns.map((colName) => [colName, this.aggregation] as [string, DG.AGG])\n .filter(([colName, _]) => this.model.df.columns.contains(colName) &&\n this.model.df.col(colName)!.matches('numerical')));\n }\n\n /** Processes attached table and sets viewer properties. */\n onTableAttached(): void {\n super.onTableAttached();\n if (isApplicableDataframe(this.dataFrame)) {\n this.getProperty(`${LST_PROPERTIES.SEQUENCE}${COLUMN_NAME}`)\n ?.set(this, this.dataFrame.columns.bySemType(DG.SEMTYPE.MACROMOLECULE)!.name);\n this.getProperty(`${LST_PROPERTIES.ACTIVITY}${COLUMN_NAME}`)\n ?.set(this, wu(this.dataFrame.columns.numerical).next().value.name);\n this.getProperty(`${LST_PROPERTIES.CLUSTERS}${COLUMN_NAME}`)\n ?.set(this, wu(this.dataFrame.columns.categorical).next().value.name);\n } else {\n const msg = 'PeptidesError: dataframe is missing Macromolecule or numeric columns';\n grok.log.error(msg);\n grok.shell.warning(msg);\n }\n this.render();\n }\n\n /** Removes all the active subscriptions. */\n detach(): void {\n this.subs.forEach((sub) => sub.unsubscribe());\n }\n\n /** Renders Logo Summary Table body. */\n render(): void {\n $(this.root).empty();\n if (this.clustersColumnName == null || this.sequenceColumnName == null || this.activityColumnName == null) {\n this.root.appendChild(\n ui.divText('Please, select a sequence, cluster and activity columns in the viewer properties'));\n return;\n }\n\n if (!this.logoSummaryTable.filter.anyTrue) {\n const emptyDf = ui.divText('No clusters to satisfy the threshold. ' +\n 'Please, lower the threshold in viewer proeperties to include clusters');\n this.root.appendChild(ui.divV([this._titleHost, emptyDf]));\n return;\n }\n const expand = ui.iconFA('expand-alt', () => {\n const dialog = ui.dialog('Logo Summary Table');\n dialog.add(this.viewerGrid.root);\n dialog.onCancel(() => this.render());\n dialog.showModal(true);\n this.viewerGrid.invalidate();\n }, 'Show Logo Summary Table in full screen');\n $(expand).addClass('pep-help-icon');\n this.viewerGrid.root.style.width = 'auto';\n this.root.appendChild(ui.divV([\n ui.divH([this._titleHost, expand], {\n style: {\n alignSelf: 'center',\n lineHeight: 'normal',\n },\n }),\n this.viewerGrid.root,\n ]));\n this.viewerGrid.invalidate();\n }\n\n /**\n * Processes property changes.\n * @param property - changed property.\n */\n onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n let doRender = false;\n switch (property.name) {\n case LST_PROPERTIES.MEMBERS_RATIO_THRESHOLD:\n this.updateFilter();\n break;\n case `${LST_PROPERTIES.SEQUENCE}${COLUMN_NAME}`:\n this._viewerGrid = null;\n this._logoSummaryTable = null;\n doRender = true;\n break;\n case `${LST_PROPERTIES.CLUSTERS}${COLUMN_NAME}`:\n this._clusterStats = null;\n this._clusterSelection = null;\n this._viewerGrid = null;\n this._logoSummaryTable = null;\n doRender = true;\n break;\n case `${LST_PROPERTIES.ACTIVITY}${COLUMN_NAME}`:\n case LST_PROPERTIES.ACTIVITY_SCALING:\n this._scaledActivityColumn = null;\n this._viewerGrid = null;\n this._clusterStats = null;\n this._logoSummaryTable = null;\n doRender = true;\n break;\n case LST_PROPERTIES.COLUMNS:\n case LST_PROPERTIES.AGGREGATION:\n this._viewerGrid = null;\n this._logoSummaryTable = null;\n doRender = true;\n break;\n case LST_PROPERTIES.WEB_LOGO_MODE:\n this.viewerGrid.invalidate();\n }\n if (doRender)\n this.render();\n }\n\n /**\n * Initializes cluster selection.\n * @param options - initializatiion options.\n * @param options.notify - flag that indicates if bitset changed event should fire.\n * @return - cluster selection.\n */\n initClusterSelection(options: {\n notify?: boolean\n } = {}): type.Selection {\n options.notify ??= true;\n\n const newClusterSelection = {} as type.Selection;\n newClusterSelection[CLUSTER_TYPE.ORIGINAL] = [];\n newClusterSelection[CLUSTER_TYPE.CUSTOM] = [];\n if (options.notify)\n this.clusterSelection = newClusterSelection;\n else\n this._clusterSelection = newClusterSelection;\n\n\n return this.clusterSelection;\n }\n\n /**\n * Gets total viewer aggregated columns from viewer properties and analysis settings if applicable.\n * @return - total viewer aggregated columns.\n */\n getTotalViewerAggColumns(): [string, DG.AggregationType][] {\n const aggrCols = this.getAggregationColumns();\n return getTotalAggColumns(this.model.df, this.columns, aggrCols, this.model?.settings?.columns);\n }\n\n getStringAggregatedColumns(): string[] {\n return this.columns.filter((colName) => this.model.df.columns.contains(colName) &&\n this.model.df.col(colName)!.matches('categorical')).map((cn) => `dist(${cn})`);\n }\n\n /**\n * Creates LogoSummaryTable dataframe to be used in LogoSummaryTable grid.\n * @return - LogoSummaryTable dataframe.\n */\n createLogoSummaryTable(): DG.DataFrame {\n const clustersColName = this.clustersColumnName;\n const isDfFiltered = this.dataFrame.filter.anyFalse;\n const filteredDf = isDfFiltered ? this.dataFrame.clone(this.dataFrame.filter) : this.dataFrame;\n const filteredDfCols = filteredDf.columns;\n const filteredDfRowCount = filteredDf.rowCount;\n const activityColData = this.getScaledActivityColumn(isDfFiltered).getRawData();\n\n const filteredDfClustCol = filteredDf.getCol(clustersColName);\n const filteredDfClustColData = filteredDfClustCol.getRawData();\n const filteredDfClustColCat = filteredDfClustCol.categories;\n\n const query: {\n [key: string]: string\n } = {};\n query[C.TAGS.CUSTOM_CLUSTER] = '1';\n const customClustColList: DG.Column<boolean>[] = wu(filteredDfCols.byTags(query))\n .filter((c) => c.max > 0).toArray();\n\n const customLST = DG.DataFrame.create(customClustColList.length);\n const customLSTCols = customLST.columns;\n const customLSTClustCol = customLSTCols.addNewString(C.LST_COLUMN_NAMES.CLUSTER);\n\n const customMembersColData = customLSTCols.addNewInt(C.LST_COLUMN_NAMES.MEMBERS).getRawData();\n const customWebLogoCol = customLSTCols.addNewString(C.LST_COLUMN_NAMES.WEB_LOGO);\n const customDistCol = customLSTCols.addNewString(C.LST_COLUMN_NAMES.DISTRIBUTION);\n const customMDColData = customLSTCols.addNewFloat(C.LST_COLUMN_NAMES.MEAN_DIFFERENCE).getRawData();\n const customPValColData = customLSTCols.addNewFloat(C.LST_COLUMN_NAMES.P_VALUE).getRawData();\n const customRatioColData = customLSTCols.addNewFloat(C.LST_COLUMN_NAMES.RATIO).getRawData();\n\n let origLSTBuilder = filteredDf.groupBy([clustersColName]);\n const aggNumericColsEntries = this.getTotalViewerAggColumns();\n const aggStringColNames = this.getStringAggregatedColumns();\n const aggStringCols = aggStringColNames.map((colName) => customLSTCols.addNewString(colName));\n const aggNumericColNames = aggNumericColsEntries.map(([colName, aggFn]) => getAggregatedColName(aggFn, colName));\n const customAggRawCols = new Array(aggNumericColNames.length + aggStringColNames.length);\n const numericColAggEntries = aggNumericColsEntries.map(\n ([colName, aggFn]) => [filteredDf.getCol(colName), aggFn] as [DG.Column<number>, DG.AggregationType]);\n\n for (let aggIdx = 0; aggIdx < aggNumericColsEntries.length; ++aggIdx) {\n const [colName, aggFn] = aggNumericColsEntries[aggIdx];\n origLSTBuilder = origLSTBuilder.add(aggFn, colName, aggNumericColNames[aggIdx]);\n const customLSTAggCol = customLSTCols.addNewFloat(aggNumericColNames[aggIdx]);\n customAggRawCols[aggIdx] = customLSTAggCol.getRawData();\n }\n\n // BEGIN: fill LST part with custom clusters\n const customBitsets: DG.BitSet[] = new Array(customClustColList.length);\n\n for (let rowIdx = 0; rowIdx < customClustColList.length; ++rowIdx) {\n const customClustCol = customClustColList[rowIdx];\n customLSTClustCol.set(rowIdx, customClustCol.name);\n const bitArray = BitArray.fromUint32Array(filteredDfRowCount, customClustCol.getRawData() as Uint32Array);\n if (bitArray.allFalse)\n continue;\n\n\n const bsMask = DG.BitSet.fromBytes(bitArray.buffer.buffer, filteredDfRowCount);\n\n const stats: StatsItem = isDfFiltered ? getStats(activityColData, bitArray) :\n this.clusterStats[CLUSTER_TYPE.CUSTOM][customClustCol.name];\n\n customMembersColData[rowIdx] = stats.count;\n customBitsets[rowIdx] = bsMask;\n customMDColData[rowIdx] = stats.meanDifference;\n customPValColData[rowIdx] = stats.pValue ?? DG.FLOAT_NULL;\n customRatioColData[rowIdx] = stats.ratio;\n\n for (let aggColIdx = 0; aggColIdx < aggNumericColNames.length; ++aggColIdx) {\n const [col, aggFn] = numericColAggEntries[aggColIdx];\n customAggRawCols[aggColIdx][rowIdx] = getAggregatedValue(col, aggFn, bsMask);\n }\n for (let aggColIdx = aggNumericColNames.length; aggColIdx < customAggRawCols.length; ++aggColIdx) {\n const colName = aggStringColNames[aggColIdx - aggNumericColNames.length];\n aggStringCols[aggColIdx - aggNumericColNames.length]\n .set(rowIdx, getStringColAggregatedJSON(filteredDf, colName, bsMask));\n }\n }\n customWebLogoCol.setTag(DG.TAGS.CELL_RENDERER, 'html');\n customDistCol.setTag(DG.TAGS.CELL_RENDERER, 'html');\n // END\n\n // BEGIN: fill LST part with original clusters\n const origLST = origLSTBuilder.aggregate();\n const origLSTLen = origLST.rowCount;\n const origLSTCols = origLST.columns;\n let origLSTClustCol: DG.Column<string> = origLST.getCol(clustersColName);\n origLSTClustCol.name = C.LST_COLUMN_NAMES.CLUSTER;\n if (origLSTClustCol.type !== DG.COLUMN_TYPE.STRING) {\n origLST.columns.replace(origLSTClustCol, origLSTClustCol.convertTo(DG.COLUMN_TYPE.STRING));\n origLSTClustCol = origLST.getCol(origLSTClustCol.name);\n }\n\n\n const origLSTClustColCat = origLSTClustCol.categories;\n const origMembersColData = origLSTCols.addNewInt(C.LST_COLUMN_NAMES.MEMBERS).getRawData();\n const origWebLogoCol = origLSTCols.addNewString(C.LST_COLUMN_NAMES.WEB_LOGO);\n const origDistCol = origLSTCols.addNewString(C.LST_COLUMN_NAMES.DISTRIBUTION);\n const origMDColData = origLSTCols.addNewFloat(C.LST_COLUMN_NAMES.MEAN_DIFFERENCE).getRawData();\n const origPValColData = origLSTCols.addNewFloat(C.LST_COLUMN_NAMES.P_VALUE).getRawData();\n const origRatioColData = origLSTCols.addNewFloat(C.LST_COLUMN_NAMES.RATIO).getRawData();\n const origAggStringCols = aggStringColNames.map((colName) => origLSTCols.addNewString(colName));\n const origBitsets: DG.BitSet[] = new Array(origLSTLen);\n const origClustMasks = Array.from({length: origLSTLen},\n () => new BitArray(filteredDfRowCount, false));\n\n for (let rowIdx = 0; rowIdx < filteredDfRowCount; ++rowIdx) {\n const filteredClustName = filteredDfClustColCat[filteredDfClustColData[rowIdx]];\n const origClustIdx = origLSTClustColCat.indexOf(filteredClustName);\n origClustMasks[origClustIdx]?.setTrue(rowIdx);\n }\n\n for (let rowIdx = 0; rowIdx < origLSTLen; ++rowIdx) {\n const mask = origClustMasks[rowIdx];\n if (mask.allFalse)\n continue;\n\n\n const bsMask = DG.BitSet.fromBytes(mask.buffer.buffer, filteredDfRowCount);\n const stats = isDfFiltered ? getStats(activityColData, mask) :\n this.clusterStats[CLUSTER_TYPE.ORIGINAL][origLSTClustColCat[rowIdx]];\n for (let aggColIdx = 0; aggColIdx < aggStringColNames.length; ++aggColIdx) {\n const colName = aggStringColNames[aggColIdx];\n origAggStringCols[aggColIdx]\n .set(rowIdx, getStringColAggregatedJSON(filteredDf, colName, bsMask));\n }\n origMembersColData[rowIdx] = stats.count;\n origBitsets[rowIdx] = bsMask;\n origMDColData[rowIdx] = stats.meanDifference;\n origPValColData[rowIdx] = stats.pValue ?? DG.FLOAT_NULL;\n origRatioColData[rowIdx] = stats.ratio;\n }\n origWebLogoCol.setTag(DG.TAGS.CELL_RENDERER, 'html');\n origDistCol.setTag(DG.TAGS.CELL_RENDERER, 'html');\n // END\n\n // combine LSTs and create a grid\n const summaryTable = origLST.append(customLST);\n this.bitsets = origBitsets.concat(customBitsets);\n\n aggStringColNames.forEach((sn) => summaryTable.col(sn)!.semType = 'lst-pie-chart');\n\n return summaryTable;\n }\n\n /**\n * Builds LogoSummaryTable interactive grid.\n * @return - LogoSummaryTable grid.\n */\n createLogoSummaryTableGrid(): DG.Grid {\n const isDfFiltered = this.dataFrame.filter.anyFalse;\n const filteredDf = isDfFiltered ? this.dataFrame.clone(this.dataFrame.filter) : this.dataFrame;\n const aggColsEntries = this.getTotalViewerAggColumns();\n const aggColNames = aggColsEntries.map(([colName, aggFn]) => getAggregatedColName(aggFn, colName));\n\n const grid = this.logoSummaryTable.plot.grid();\n grid.sort([C.LST_COLUMN_NAMES.MEMBERS], [false]);\n this.updateFilter();\n const gridClustersCol = grid.col(C.LST_COLUMN_NAMES.CLUSTER)!;\n gridClustersCol.visible = true;\n grid.columns.setOrder([C.LST_COLUMN_NAMES.CLUSTER, C.LST_COLUMN_NAMES.MEMBERS,\n C.LST_COLUMN_NAMES.WEB_LOGO, ...this.getStringAggregatedColumns(),\n C.LST_COLUMN_NAMES.DISTRIBUTION, C.LST_COLUMN_NAMES.MEAN_DIFFERENCE,\n C.LST_COLUMN_NAMES.P_VALUE, C.LST_COLUMN_NAMES.RATIO, ...aggColNames]);\n grid.columns.rowHeader!.visible = false;\n grid.props.rowHeight = 55;\n\n const webLogoCache = new DG.LruCache<number, DG.Viewer & IWebLogoViewer>();\n // @ts-ignore TODO: fix after api update\n const distCache = new DG.LruCache<number, DG.Viewer<DG.IHistogramSettings>>();\n const maxSequenceLen = this.positionColumns.length;\n const webLogoGridCol = grid.columns.byName(C.LST_COLUMN_NAMES.WEB_LOGO)!;\n webLogoGridCol.cellType = 'html';\n webLogoGridCol.width = 350;\n const activityCol = this.getScaledActivityColumn(isDfFiltered);\n const pepCol: DG.Column<string> = filteredDf.getCol(this.sequenceColumnName);\n\n grid.onCellRender.subscribe(async (gridCellArgs) => {\n const gridCell = gridCellArgs.cell;\n const currentRowIdx = gridCell.tableRowIndex;\n if (!gridCell.isTableCell || currentRowIdx == null || currentRowIdx === -1)\n return;\n\n\n const canvasContext = gridCellArgs.g;\n const bound = gridCellArgs.bounds;\n canvasContext.save();\n canvasContext.beginPath();\n canvasContext.rect(bound.x, bound.y, bound.width, bound.height);\n canvasContext.clip();\n\n try {\n const height = Math.max(gridCell.bounds.height - 2, 0);\n const clusterBitSet = this.bitsets[currentRowIdx];\n\n if (gridCell.tableColumn?.name === C.LST_COLUMN_NAMES.CLUSTER) {\n CR.renderLogoSummaryCell(canvasContext, gridCell.cell.value, this.clusterSelection, bound);\n gridCellArgs.preventDefault();\n } else if (gridCell.tableColumn?.name === C.LST_COLUMN_NAMES.WEB_LOGO) {\n const positionWidth = Math.floor((gridCell.bounds.width - 2 - (4 * (maxSequenceLen - 1))) / maxSequenceLen);\n\n let viewer = webLogoCache.get(currentRowIdx);\n if (viewer !== undefined) {\n const viewerProps = viewer.getProperties();\n\n for (const prop of viewerProps) {\n if (prop.name === 'positionHeight' && prop.get(viewer) !== this.webLogoMode)\n prop.set(viewer, this.webLogoMode);\n else if (prop.name === 'positionWidth' && prop.get(viewer) !== positionWidth)\n prop.set(viewer, positionWidth);\n else if (prop.name === 'minHeight' && prop.get(viewer) !== height)\n prop.set(viewer, height);\n }\n const viewerRoot = $(viewer.root).css('height', `${height}px`);//;\n viewerRoot.children().first().css('overflow-y', 'hidden !important');\n } else {\n const webLogoTable = this.createWebLogoDf(pepCol, clusterBitSet);\n viewer = await webLogoTable.plot\n .fromType('WebLogo', {\n positionHeight: this.webLogoMode,\n horizontalAlignment: HorizontalAlignments.LEFT,\n maxHeight: 1000,\n minHeight: height,\n positionWidth: positionWidth,\n showPositionLabels: false,\n });\n webLogoCache.set(currentRowIdx, viewer);\n }\n viewer.root.style.height = `${height}px`;\n gridCell.element = viewer.root;\n gridCellArgs.preventDefault();\n } else if (gridCell.tableColumn?.name === C.LST_COLUMN_NAMES.DISTRIBUTION) {\n let viewer = distCache.get(currentRowIdx);\n if (viewer === undefined) {\n const distributionDf = getDistributionTable(activityCol, clusterBitSet);\n viewer = distributionDf.plot.histogram({\n filteringEnabled: false,\n valueColumnName: activityCol.name,\n splitColumnName: C.COLUMNS_NAMES.SPLIT_COL,\n legendVisibility: 'Never',\n showXAxis: false,\n showColumnSelector: false,\n showRangeSlider: false,\n showBinSelector: false,\n backColor: DG.Color.toHtml(DG.Color.white),\n xAxisHeight: 1,\n });\n viewer.root.style.width = 'auto';\n distCache.set(currentRowIdx, viewer);\n }\n viewer.root.style.height = `${height}px`;\n gridCell.element = viewer.root;\n gridCellArgs.preventDefault();\n }\n } finally {\n canvasContext.restore();\n }\n });\n grid.root.addEventListener('mouseleave', (_ev) => this.model.unhighlight());\n DG.debounce(grid.onCurrentCellChanged, 500).subscribe((gridCell) => {\n if (!gridCell.isTableCell)\n return;\n\n\n try {\n if (!this.keyPress || gridCell.tableColumn?.name !== C.LST_COLUMN_NAMES.CLUSTER)\n return;\n\n\n if (this.currentRowIndex !== null && this.currentRowIndex !== -1) {\n this.modifyClusterSelection(this.getCluster(grid.cell(C.LST_COLUMN_NAMES.CLUSTER, this.currentRowIndex)),\n {\n shiftPressed: true,\n ctrlPressed: true,\n }, false);\n }\n\n this.modifyClusterSelection(this.getCluster(gridCell), {\n shiftPressed: true,\n ctrlPressed: false,\n });\n grid.invalidate();\n } finally {\n this.keyPress = false;\n this.currentRowIndex = gridCell.gridRow;\n }\n });\n grid.root.addEventListener('keydown', (ev) => {\n this.keyPress = ev.key.startsWith('Arrow');\n if (this.keyPress)\n return;\n\n\n if (ev.key === 'Escape' || (ev.code === 'KeyA' && ev.shiftKey && ev.ctrlKey))\n this.initClusterSelection({notify: false});\n else if (ev.code === 'KeyA' && ev.ctrlKey) {\n for (let rowIdx = 0; rowIdx < this.logoSummaryTable.rowCount; ++rowIdx) {\n this.modifyClusterSelection(this.getCluster(grid.cell(C.LST_COLUMN_NAMES.CLUSTER, rowIdx)),\n {\n shiftPressed: true,\n ctrlPressed: false,\n }, false);\n }\n }\n this.model.fireBitsetChanged(VIEWER_TYPE.LOGO_SUMMARY_TABLE);\n grid.invalidate();\n });\n grid.root.addEventListener('click', (ev) => {\n const gridCell = grid.hitTest(ev.offsetX, ev.offsetY);\n if (!gridCell || !gridCell.isTableCell || gridCell.tableColumn?.name !== C.LST_COLUMN_NAMES.CLUSTER)\n return;\n\n\n const selection = this.getCluster(gridCell);\n this.modifyClusterSelection(selection, {\n shiftPressed: ev.shiftKey,\n ctrlPressed: ev.ctrlKey,\n });\n grid.invalidate();\n\n _package.files.readAsText('help/logo-summary-table.md').then((text) => {\n grok.shell.windows.help.showHelp(ui.markdown(text));\n }).catch((e) => grok.log.error(e));\n });\n grid.onCellTooltip((gridCell, x, y) => {\n if (!gridCell.isTableCell) {\n this.model.unhighlight();\n return true;\n }\n\n const cluster = this.getCluster(gridCell);\n this.highlightCluster(cluster);\n if (gridCell.tableColumn?.name === C.LST_COLUMN_NAMES.CLUSTER)\n this.showTooltip(cluster, x, y);\n\n\n return true;\n });\n\n const gridProps = grid.props;\n gridProps.allowEdit = false;\n gridProps.allowRowSelection = false;\n gridProps.allowBlockSelection = false;\n gridProps.allowColSelection = false;\n gridProps.showCurrentRowIndicator = false;\n gridProps.showReadOnlyNotifications = false;\n\n return grid;\n }\n\n /**\n * Highlights selected cluster.\n * @param cluster - cluster to highlight.\n */\n highlightCluster(cluster: type.SelectionItem): void {\n const bitArray = this.clusterStats[cluster.positionOrClusterType as ClusterType][cluster.monomerOrCluster].mask;\n this.dataFrame.rows.highlight((i) => bitArray.getBit(i));\n this.model.isHighlighting = true;\n }\n\n /**\n * Gets cluster from LogoSummaryTable grid cell.\n * @param gridCell - LogoSummaryTable grid cell.\n * @return - cluster.\n */\n getCluster(gridCell: DG.GridCell): SelectionItem {\n const clustName = this.logoSummaryTable.get(C.LST_COLUMN_NAMES.CLUSTER, gridCell.tableRowIndex!);\n const clustColCat = this.dataFrame.getCol(this.clustersColumnName).categories;\n return {\n positionOrClusterType: clustColCat.includes(clustName) ? CLUSTER_TYPE.ORIGINAL : CLUSTER_TYPE.CUSTOM,\n monomerOrCluster: clustName,\n };\n }\n\n /** Updates LogoSummaryTable filter. */\n updateFilter(): void {\n const memberstCol = this.logoSummaryTable.getCol(C.LST_COLUMN_NAMES.MEMBERS);\n const membersColData = memberstCol.getRawData();\n const maxCount = memberstCol.stats.max;\n const minMembers = Math.ceil(maxCount * this.membersRatioThreshold);\n this.logoSummaryTable.filter.init((i) => membersColData[i] > minMembers);\n }\n\n /** Creates a new cluster from current selection and adds to Logo Summary Table. */\n clusterFromSelection(): void {\n const currentSelection = this.model.getVisibleSelection();\n const viewerDfCols = this.logoSummaryTable.columns;\n const viewerDfColsLength = viewerDfCols.length;\n const newClusterVals = new Array(viewerDfCols.length);\n const activityScaledCol = this.getScaledActivityColumn();\n const bitArray = BitArray.fromString(currentSelection.toBinaryString());\n const stats = getStats(activityScaledCol.getRawData(), bitArray);\n\n this.bitsets.push(currentSelection.clone());\n\n const newClusterName = this.dataFrame.columns.getUnusedName('New Cluster');\n const aggregatedValues: {\n [colName: string]: number\n } = {};\n const stringAggregatedValues: {\n [colName: string]: string\n } = {};\n const aggColsEntries = this.getTotalViewerAggColumns();\n const aggStringColNames = this.getStringAggregatedColumns();\n for (const [colName, aggFn] of aggColsEntries) {\n const newColName = getAggregatedColName(aggFn, colName);\n const col = this.dataFrame.getCol(colName);\n aggregatedValues[newColName] = getAggregatedValue(col, aggFn, currentSelection);\n }\n\n for (const colName of aggStringColNames)\n stringAggregatedValues[colName] = getStringColAggregatedJSON(this.dataFrame, colName, currentSelection);\n\n\n for (let i = 0; i < viewerDfColsLength; ++i) {\n const col = viewerDfCols.byIndex(i);\n newClusterVals[i] = col.name === C.LST_COLUMN_NAMES.CLUSTER ? newClusterName :\n col.name === C.LST_COLUMN_NAMES.MEMBERS ? currentSelection.trueCount :\n col.name === C.LST_COLUMN_NAMES.WEB_LOGO ? null :\n col.name === C.LST_COLUMN_NAMES.DISTRIBUTION ? null :\n col.name === C.LST_COLUMN_NAMES.MEAN_DIFFERENCE ? stats.meanDifference :\n col.name === C.LST_COLUMN_NAMES.P_VALUE ? stats.pValue :\n col.name === C.LST_COLUMN_NAMES.RATIO ? stats.ratio :\n col.name in aggregatedValues ? aggregatedValues[col.name] :\n col.name in stringAggregatedValues ? stringAggregatedValues[col.name] :\n undefined;\n if (typeof newClusterVals[i] === 'undefined')\n _package.logger.warning(`PeptidesLSTWarn: value for column ${col.name} is undefined`);\n }\n this.logoSummaryTable.rows.addNew(newClusterVals);\n\n this.clusterStats[CLUSTER_TYPE.CUSTOM][newClusterName] = stats;\n this.addNewCluster(newClusterName);\n }\n\n /** Removes selected custom clusters from Logo Summary Table. */\n removeCluster(): void {\n const lss = this.clusterSelection[CLUSTER_TYPE.CUSTOM];\n\n // Names of the clusters to remove\n if (lss.length === 0) {\n grok.shell.warning('No custom clusters selected to be removed');\n return;\n }\n\n const viewerDfRows = this.logoSummaryTable.rows;\n const clustCol = this.logoSummaryTable.getCol(C.LST_COLUMN_NAMES.CLUSTER);\n const clustColCat = clustCol.categories;\n const dfCols = this.dataFrame.columns;\n\n for (const cluster of lss) {\n lss.splice(lss.indexOf(cluster), 1);\n dfCols.remove(cluster);\n delete this.clusterStats[CLUSTER_TYPE.CUSTOM][cluster];\n const clustIdx = clustColCat.indexOf(cluster);\n viewerDfRows.removeAt(clustIdx);\n this.bitsets.splice(clustIdx, 1);\n }\n\n clustCol.compact();\n\n this.clusterSelection[CLUSTER_TYPE.CUSTOM] = lss;\n this.render();\n }\n\n /**\n * Adds new cluster to the dataframe viewer attached to.\n * @param clusterName - cluster name.\n */\n addNewCluster(clusterName: string): void {\n const newClusterCol = DG.Column.fromBitSet(clusterName, this.model.getVisibleSelection());\n newClusterCol.setTag(C.TAGS.CUSTOM_CLUSTER, '1');\n newClusterCol.setTag(C.TAGS.ANALYSIS_COL, `${true}`);\n this.dataFrame.columns.add(newClusterCol);\n this.model.analysisView.grid.col(newClusterCol.name)!.visible = false;\n }\n\n /**\n * Modifies cluster selection. If shift and ctrl keys are both pressed, it removes cluster from selection.\n * If only shift key is pressed, it adds cluster to selection. If only ctrl key is pressed, it changes cluster\n * presence in selection. If none of the keys is pressed, it sets cluster as the only selected one.\n * @param cluster - cluster to modify selection with.\n * @param options - selection options.\n * @param notify - flag indicating if bitset changed event should fire.\n */\n modifyClusterSelection(cluster: type.SelectionItem, options: type.SelectionOptions = {\n shiftPressed: false,\n ctrlPressed: false,\n }, notify: boolean = true): void {\n if (notify)\n this.clusterSelection = modifySelection(this.clusterSelection, cluster, options);\n else\n this._clusterSelection = modifySelection(this.clusterSelection, cluster, options);\n }\n\n /**\n * Shows tooltip for a cluster.\n * @param cluster - cluster to show tooltip for.\n * @param x - x coordinate of the tooltip.\n * @param y - y coordinate of the tooltip.\n * @return - tooltip body.\n */\n showTooltip(cluster: SelectionItem, x: number, y: number): HTMLDivElement | null {\n const bs = this.dataFrame.filter;\n const filteredDf = bs.anyFalse ? this.dataFrame.clone(bs) : this.dataFrame;\n const rowCount = filteredDf.rowCount;\n const bitArray = new BitArray(rowCount, false);\n const activityCol = this.getScaledActivityColumn(bs.anyFalse);\n const activityColData = activityCol.getRawData();\n\n if (cluster.positionOrClusterType === CLUSTER_TYPE.ORIGINAL) {\n const origClustCol = filteredDf.getCol(this.clustersColumnName);\n const origClustColData = origClustCol.getRawData();\n const origClustColCategories = origClustCol.categories;\n const seekValue = origClustColCategories.indexOf(cluster.monomerOrCluster);\n\n for (let i = 0; i < rowCount; ++i) {\n if (origClustColData[i] === seekValue)\n bitArray.setTrue(i);\n }\n bitArray.incrementVersion();\n } else {\n const clustCol: DG.Column<boolean> = filteredDf.getCol(cluster.monomerOrCluster);\n bitArray.buffer = clustCol.getRawData() as Uint32Array;\n }\n\n const stats = bs.anyFalse ? getStats(activityColData, bitArray) :\n this.clusterStats[cluster.positionOrClusterType as ClusterType][cluster.monomerOrCluster];\n\n if (!stats.count)\n return null;\n\n\n const mask = DG.BitSet.fromBytes(bitArray.buffer.buffer, rowCount);\n const distributionTable = getDistributionTable(activityCol, mask);\n const hist = getActivityDistribution(distributionTable, true);\n const tableMap = getStatsTableMap(stats);\n const aggregatedColMap = getAggregatedColumnValues(this.dataFrame,\n this.getTotalViewerAggColumns(), {\n filterDf: true,\n mask: mask,\n });\n const resultMap: {\n [key: string]: any\n } = {...tableMap, ...aggregatedColMap};\n const tooltip = getDistributionPanel(hist, resultMap);\n\n ui.tooltip.show(tooltip, x, y);\n\n return tooltip;\n }\n\n /**\n * Creates a dataframe for WebLogo viewer.\n * @param pepCol - column with peptides.\n * @param mask - bitset to filter dataframe with.\n * @return - dataframe for WebLogo viewer.\n */\n createWebLogoDf(pepCol: DG.Column<string>, mask: DG.BitSet): DG.DataFrame {\n const newDf = DG.DataFrame.fromColumns([pepCol]);\n newDf.filter.copyFrom(mask);\n return newDf;\n }\n}\n","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\nimport * as C from '../utils/constants';\nimport {COLUMN_NAME} from '../utils/constants';\nimport * as CR from '../utils/cell-renderer';\nimport {PeptidesModel, VIEWER_TYPE} from '../model';\nimport wu from 'wu';\nimport * as type from '../utils/types';\nimport {MutationCliffs, PeptidesSettings, SelectionItem} from '../utils/types';\nimport {\n AggregationColumns,\n getAggregatedColName,\n getAggregatedColumnValuesFromDf,\n getAggregatedValue,\n MonomerPositionStats,\n PositionStats,\n StatsItem,\n} from '../utils/statistics';\nimport {_package} from '../package';\nimport {showTooltip} from '../utils/tooltips';\nimport {calculateCliffsStatistics, calculateMonomerPositionStatistics, findMutations, MutationCliffsOptions} from '../utils/algorithms';\nimport {\n debounce,\n extractColInfo,\n getTotalAggColumns,\n highlightMonomerPosition,\n initSelection,\n isApplicableDataframe,\n isSelectionEmpty,\n modifySelection,\n scaleActivity,\n} from '../utils/misc';\nimport {splitAlignedSequences} from '@datagrok-libraries/bio/src/utils/splitter';\nimport {LogoSummaryTable} from './logo-summary';\nimport {TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule/consts';\nimport {ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport enum SELECTION_MODE {\n MUTATION_CLIFFS = 'Mutation Cliffs',\n INVARIANT_MAP = 'Invariant Map',\n}\n\nexport enum SAR_PROPERTIES {\n SEQUENCE = 'sequence',\n ACTIVITY = 'activity',\n ACTIVITY_SCALING = 'activityScaling',\n TARGET = 'target',\n TARGET_CATEGORY = 'targetCategory',\n MIN_ACTIVITY_DELTA = 'minActivityDelta',\n MAX_MUTATIONS = 'maxMutations',\n COLUMNS = 'columns',\n AGGREGATION = 'aggregation',\n ACTIVITY_TARGET = 'activityTarget',\n}\n\nexport enum MONOMER_POSITION_PROPERTIES {\n COLOR = 'color',\n COLOR_AGGREGATION = 'colorAggregation',\n}\n\nexport enum PROPERTY_CATEGORIES {\n GENERAL = 'General',\n INVARIANT_MAP = 'Invariant Map',\n MUTATION_CLIFFS = 'Mutation Cliffs',\n AGGREGATION = 'Aggregation',\n}\n\nconst MUTATION_CLIFFS_CELL_WIDTH = 40;\nconst AAR_CELL_WIDTH = 30;\n\nexport interface ISARViewer {\n sequenceColumnName: string;\n activityColumnName: string;\n activityScaling: C.SCALING_METHODS;\n minActivityDelta: number;\n maxMutations: number;\n activityTarget: C.ACTIVITY_TARGET;\n}\n\n/** Abstract class for MonomerPosition and MostPotentResidues viewers. */\nexport abstract class SARViewer extends DG.JsViewer implements ISARViewer {\n keyPressed: boolean = false;\n sequenceColumnName: string;\n activityColumnName: string;\n activityScaling: C.SCALING_METHODS;\n columns: string[];\n aggregation: string;\n targetColumnName: string;\n targetCategory: string;\n minActivityDelta: number;\n maxMutations: number;\n _scaledActivityColumn: DG.Column | null = null;\n doRender: boolean = true;\n activityTarget: C.ACTIVITY_TARGET;\n mutationCliffsDebouncer: (\n activityArray: type.RawData, monomerInfoArray: type.RawColumn[], options?: MutationCliffsOptions\n ) => Promise<type.MutationCliffs>;\n\n /** Sets common properties for inheritor viewers. */\n protected constructor() {\n super();\n // General properties\n this.sequenceColumnName = this.column(SAR_PROPERTIES.SEQUENCE,\n {category: PROPERTY_CATEGORIES.GENERAL, semType: DG.SEMTYPE.MACROMOLECULE, nullable: false});\n this.activityColumnName = this.column(SAR_PROPERTIES.ACTIVITY,\n {category: PROPERTY_CATEGORIES.GENERAL, nullable: false});\n this.activityScaling = this.string(SAR_PROPERTIES.ACTIVITY_SCALING, C.SCALING_METHODS.NONE,\n {category: PROPERTY_CATEGORIES.GENERAL, choices: Object.values(C.SCALING_METHODS), nullable: false},\n ) as C.SCALING_METHODS;\n this.activityTarget = this.string(SAR_PROPERTIES.ACTIVITY_TARGET, C.ACTIVITY_TARGET.HIGH,\n {category: PROPERTY_CATEGORIES.GENERAL, choices: Object.values(C.ACTIVITY_TARGET), nullable: false},\n ) as C.ACTIVITY_TARGET;\n // Mutation Cliffs properties\n this.targetColumnName = this.column(SAR_PROPERTIES.TARGET, {category: PROPERTY_CATEGORIES.MUTATION_CLIFFS});\n this.targetCategory = this.string(SAR_PROPERTIES.TARGET_CATEGORY, null,\n {category: PROPERTY_CATEGORIES.MUTATION_CLIFFS, choices: []});\n this.minActivityDelta = this.float(SAR_PROPERTIES.MIN_ACTIVITY_DELTA, 0,\n {category: PROPERTY_CATEGORIES.MUTATION_CLIFFS, min: 0, max: 100});\n this.maxMutations = this.int(SAR_PROPERTIES.MAX_MUTATIONS, 1,\n {category: PROPERTY_CATEGORIES.MUTATION_CLIFFS, min: 1, max: 20});\n this.columns = this.columnList(SAR_PROPERTIES.COLUMNS, [], {category: PROPERTY_CATEGORIES.AGGREGATION});\n this.aggregation = this.string(SAR_PROPERTIES.AGGREGATION, DG.AGG.AVG,\n {category: PROPERTY_CATEGORIES.AGGREGATION, choices: C.AGGREGATION_TYPES});\n\n this.mutationCliffsDebouncer = debounce(\n async (activityArray: type.RawData, monomerInfoArray: type.RawColumn[], options?: MutationCliffsOptions) => {\n return await findMutations(activityArray, monomerInfoArray, options);\n });\n }\n\n _viewerGrid: DG.Grid | null = null;\n\n /**\n * Returns SARViewer grid. Creates a new one if it is null.\n * @return - SARViewer grid.\n */\n get viewerGrid(): DG.Grid {\n this._viewerGrid ??= this.createViewerGrid();\n return this._viewerGrid;\n }\n\n /**\n * Returns sequence column alphabet.\n * @return - sequence column alphabet.\n */\n get alphabet(): string {\n const col = this.dataFrame.getCol(this.sequenceColumnName);\n return col.getTag(bioTAGS.alphabet) ?? ALPHABET.UN;\n }\n\n /**\n * Returns PeptidesModel instance that belongs to the attached dataframe.\n * @return - PeptidesModel instance.\n */\n get model(): PeptidesModel {\n return PeptidesModel.getInstance(this.dataFrame);\n }\n\n _positionColumns: DG.Column<string>[] | null = null;\n\n /**\n * Returns position columns. If position columns are not attached to the viewer, it tries to get them from\n * other viewers or analysis (given that relevant parameters are the same), or creates own position columns.\n * @return - position columns.\n */\n get positionColumns(): DG.Column<string>[] {\n if (this._positionColumns != null)\n return this._positionColumns;\n\n\n const getSharedPositionColumns = (viewerType: VIEWER_TYPE): DG.Column<string>[] | null => {\n const viewer = this.model.findViewer(viewerType) as SARViewer | LogoSummaryTable | null;\n if (this.sequenceColumnName === viewer?.sequenceColumnName)\n return viewer._positionColumns;\n\n\n return null;\n };\n\n if (this.model.positionColumns != null && this.sequenceColumnName === this.model.settings?.sequenceColumnName)\n this._positionColumns = this.model.positionColumns;\n else if (this instanceof MonomerPosition)\n this._positionColumns = getSharedPositionColumns(VIEWER_TYPE.MOST_POTENT_RESIDUES);\n else if (this instanceof MostPotentResidues)\n this._positionColumns = getSharedPositionColumns(VIEWER_TYPE.MONOMER_POSITION);\n\n\n this._positionColumns ??= getSharedPositionColumns(VIEWER_TYPE.LOGO_SUMMARY_TABLE) ??\n splitAlignedSequences(this.dataFrame.getCol(this.sequenceColumnName)).columns.toList();\n return this._positionColumns!;\n }\n\n _monomerPositionStats: MonomerPositionStats | null = null;\n\n /**\n * Gets monomer-position statistics. If monomer-position statistics are not attached to the viewer, it tries to get\n * them from other viewers or analysis (given that relevant parameters are the same), or calculates own statistics.\n * @return - monomer-position statistics.\n */\n get monomerPositionStats(): MonomerPositionStats {\n if (this._monomerPositionStats != null)\n return this._monomerPositionStats;\n\n\n const isMonomerPositionStatsEqual = (other: SARViewer | PeptidesSettings | null): boolean =>\n this.sequenceColumnName === other?.sequenceColumnName &&\n this.activityColumnName === other?.activityColumnName &&\n this.activityScaling === other?.activityScaling;\n\n const getSharedStats = (viewerType: VIEWER_TYPE): MonomerPositionStats | null => {\n const viewer = this.model.findViewer(viewerType) as SARViewer | null;\n if (isMonomerPositionStatsEqual(viewer))\n return viewer!._monomerPositionStats;\n\n\n return null;\n };\n\n if (this.model.monomerPositionStats !== null && isMonomerPositionStatsEqual(this.model.settings))\n this._monomerPositionStats = this.model.monomerPositionStats;\n else if (this instanceof MonomerPosition)\n this._monomerPositionStats = getSharedStats(VIEWER_TYPE.MOST_POTENT_RESIDUES);\n else if (this instanceof MostPotentResidues)\n this._monomerPositionStats = getSharedStats(VIEWER_TYPE.MONOMER_POSITION);\n\n\n this._monomerPositionStats ??= calculateMonomerPositionStatistics(this.getScaledActivityColumn(),\n this.dataFrame.filter, this.positionColumns);\n return this._monomerPositionStats;\n }\n\n _mutationCliffs: type.MutationCliffs | null = null;\n _mutationCliffStats: type.MutationCliffStats | null = null;\n\n /**\n * Gets mutation cliffs. If mutation cliffs are not attached to the viewer, it tries to get them from other viewers,\n * or calculates its own.\n * @return - mutation cliffs.\n */\n get mutationCliffs(): type.MutationCliffs | null {\n if (this._mutationCliffs != null)\n return this._mutationCliffs;\n\n\n const isMutationCliffsEqual = (v1: SARViewer, v2: SARViewer | null): boolean =>\n v1.sequenceColumnName === v2?.sequenceColumnName &&\n v1.activityColumnName === v2.activityColumnName &&\n v1.activityScaling === v2.activityScaling &&\n v1.targetColumnName === v2?.targetColumnName &&\n v1.targetCategory === v2?.targetCategory &&\n v1.minActivityDelta === v2?.minActivityDelta &&\n v1.maxMutations === v2?.maxMutations;\n\n const getSharedMutationCliffs = (viewerType: VIEWER_TYPE): type.MutationCliffs | null => {\n const viewer = this.model.findViewer(viewerType) as SARViewer | null;\n if (isMutationCliffsEqual(this, viewer))\n return viewer!._mutationCliffs;\n\n\n return null;\n };\n\n if (this instanceof MonomerPosition)\n this._mutationCliffs = getSharedMutationCliffs(VIEWER_TYPE.MOST_POTENT_RESIDUES);\n else if (this instanceof MostPotentResidues)\n this._mutationCliffs = getSharedMutationCliffs(VIEWER_TYPE.MONOMER_POSITION);\n\n\n return this._mutationCliffs;\n }\n\n /**\n * Sets mutation cliffs.\n * @param mc - mutation cliffs to set.\n */\n set mutationCliffs(mc: type.MutationCliffs) {\n this._mutationCliffs = mc;\n this.viewerGrid.invalidate();\n }\n\n get cliffStats(): type.MutationCliffStats | null {\n if (!this._mutationCliffStats && this.mutationCliffs && this.activityColumnName &&\n this.sequenceColumnName && this.dataFrame.col(this.activityColumnName)) {\n const activityCol = this.dataFrame.col(this.activityColumnName)!;\n const activityData = activityCol.getRawData();\n this._mutationCliffStats = calculateCliffsStatistics(this.mutationCliffs, activityData);\n }\n return this._mutationCliffStats;\n }\n set cliffStats(stats: type.MutationCliffStats | null) {\n this._mutationCliffStats = stats;\n this.viewerGrid.invalidate;\n }\n\n _mutationCliffsSelection: type.Selection | null = null;\n\n /**\n * Gets mutation cliffs selection.\n * @return - mutation cliffs selection.\n */\n get mutationCliffsSelection(): type.Selection {\n const tagSuffix = this instanceof MonomerPosition ? C.SUFFIXES.MP : C.SUFFIXES.MPR;\n const tagSelection = this.dataFrame.getTag(`${tagSuffix}${C.TAGS.MUTATION_CLIFFS_SELECTION}`);\n this._mutationCliffsSelection ??= tagSelection === null ? initSelection(this.positionColumns) :\n JSON.parse(tagSelection);\n return this._mutationCliffsSelection!;\n }\n\n /**\n * Sets mutation cliffs selection.\n * @param selection - selection to set.\n */\n set mutationCliffsSelection(selection: type.Selection) {\n this._mutationCliffsSelection = selection;\n const tagSuffix = this instanceof MonomerPosition ? C.SUFFIXES.MP : C.SUFFIXES.MPR;\n this.dataFrame.setTag(`${tagSuffix}${C.TAGS.MUTATION_CLIFFS_SELECTION}`, JSON.stringify(selection));\n this.model.fireBitsetChanged(this instanceof MonomerPosition ? VIEWER_TYPE.MONOMER_POSITION :\n VIEWER_TYPE.MOST_POTENT_RESIDUES);\n\n const mpViewer = this.model.findViewer(VIEWER_TYPE.MONOMER_POSITION) as MonomerPosition | null;\n mpViewer?.viewerGrid.invalidate();\n const mprViewer = this.model.findViewer(VIEWER_TYPE.MOST_POTENT_RESIDUES) as MostPotentResidues | null;\n mprViewer?.viewerGrid.invalidate();\n\n this.model.analysisView.grid.invalidate();\n }\n\n /**\n * Gets scaled activity column.\n * @param isFiltered - flag indicating if only filtered rows should be taken into account.\n * @return - scaled activity column.\n */\n getScaledActivityColumn(isFiltered: boolean = false): DG.Column<number> {\n if (this.model.settings?.activityColumnName === this.activityColumnName &&\n this.model.settings?.activityScaling === this.activityScaling)\n this._scaledActivityColumn = this.model.getScaledActivityColumn(isFiltered);\n\n\n this._scaledActivityColumn ??= scaleActivity(this.dataFrame.getCol(this.activityColumnName),\n this.activityScaling);\n if (isFiltered) {\n return DG.DataFrame.fromColumns([this._scaledActivityColumn]).clone(this.dataFrame.filter)\n .getCol(this._scaledActivityColumn.name) as DG.Column<number>;\n }\n return this._scaledActivityColumn as DG.Column<number>;\n }\n\n /**\n * Modifies mutation cliffs selection. If shift and ctrl keys are both pressed, it removes mutation cliffs from\n * selection. If only shift key is pressed, it adds mutation cliffs to selection. If only ctrl key is pressed, it\n * changes mutation cliffs presence in selection. If none of the keys is pressed, it sets the mutation cliffs as the\n * only selected one.\n * @param monomerPosition - monomer-position to modify selection with.\n * @param options - selection options.\n * @param notify - flag indicating if bitset changed event should fire.\n */\n modifyMutationCliffsSelection(monomerPosition: type.SelectionItem, options: type.SelectionOptions = {\n shiftPressed: false,\n ctrlPressed: false,\n }, notify: boolean = true): void {\n if (notify)\n this.mutationCliffsSelection = modifySelection(this.mutationCliffsSelection, monomerPosition, options);\n else\n this._mutationCliffsSelection = modifySelection(this.mutationCliffsSelection, monomerPosition, options);\n }\n\n /**\n * Processes property changes.\n * @param property - changed property.\n */\n onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n this.doRender = true;\n switch (property.name) {\n case `${SAR_PROPERTIES.SEQUENCE}${COLUMN_NAME}`:\n this._positionColumns = null;\n this._monomerPositionStats = null;\n this._mutationCliffs = null;\n this._mutationCliffStats = null;\n this._mutationCliffsSelection = null;\n this._viewerGrid = null;\n break;\n case `${SAR_PROPERTIES.ACTIVITY}${COLUMN_NAME}`:\n case SAR_PROPERTIES.ACTIVITY_SCALING:\n this._monomerPositionStats = null;\n this._mutationCliffs = null;\n this._mutationCliffStats = null;\n this._mutationCliffsSelection = null;\n this._viewerGrid = null;\n this._scaledActivityColumn = null;\n break;\n case `${SAR_PROPERTIES.TARGET}${COLUMN_NAME}`:\n case SAR_PROPERTIES.TARGET_CATEGORY:\n case SAR_PROPERTIES.MIN_ACTIVITY_DELTA:\n case SAR_PROPERTIES.MAX_MUTATIONS:\n this._mutationCliffs = null;\n this._mutationCliffStats = null;\n this._mutationCliffsSelection = null;\n this.doRender = false;\n break;\n case SAR_PROPERTIES.COLUMNS:\n case SAR_PROPERTIES.AGGREGATION:\n if (this instanceof MostPotentResidues)\n this._viewerGrid = null;\n break;\n case SAR_PROPERTIES.ACTIVITY_TARGET:\n if (this instanceof MostPotentResidues || this instanceof MonomerPosition)\n this._viewerGrid = null;\n break;\n }\n if (this._mutationCliffs === null && this.sequenceColumnName && this.activityColumnName)\n this.calculateMutationCliffs().then((mc) => {this.mutationCliffs = mc.cliffs; this.cliffStats = mc.cliffStats;});\n }\n\n /**\n * Gets a map of columns and aggregations.\n * @return - map of columns and aggregations.\n */\n getAggregationColumns(): AggregationColumns {\n return Object.fromEntries(this.columns.map((colName) => [colName, this.aggregation] as [string, DG.AGG])\n .filter(([colName, _]) => this.model.df.columns.contains(colName) &&\n this.model.df.col(colName)!.matches('numerical')));\n }\n\n /**\n * Gets total viewer aggregated columns from viewer properties and analysis settings if applicable.\n * @return - total viewer aggregated columns.\n */\n getTotalViewerAggColumns(): [string, DG.AggregationType][] {\n const aggrCols = this.getAggregationColumns();\n return getTotalAggColumns(this.model.df, this.columns, aggrCols, this.model?.settings?.columns);\n }\n\n /** Creates viewer grid. */\n createViewerGrid(): DG.Grid {\n throw new Error('Not implemented');\n }\n\n /** Removes all the active subscriptions. */\n detach(): void {\n this.subs.forEach((sub) => sub.unsubscribe());\n }\n\n /** Processes attached table and sets viewer properties. */\n onTableAttached(): void {\n super.onTableAttached();\n this.helpUrl = 'https://datagrok.ai/help/datagrok/solutions/domains/bio/peptides-sar';\n if (isApplicableDataframe(this.dataFrame)) {\n this.getProperty(`${SAR_PROPERTIES.SEQUENCE}${COLUMN_NAME}`)\n ?.set(this, this.dataFrame.columns.bySemType(DG.SEMTYPE.MACROMOLECULE)!.name);\n this.getProperty(`${SAR_PROPERTIES.ACTIVITY}${COLUMN_NAME}`)\n ?.set(this, wu(this.dataFrame.columns.numerical).next().value.name);\n if (this.mutationCliffs === null && this.sequenceColumnName && this.activityColumnName)\n this.calculateMutationCliffs().then((mc) => {this.mutationCliffs = mc.cliffs; this.cliffStats = mc.cliffStats;});\n } else {\n const msg = 'PeptidesError: dataframe is missing Macromolecule or numeric columns';\n grok.log.error(msg);\n grok.shell.warning(msg);\n }\n }\n\n /**\n * Calculates Mutation Cliffs.\n * @return - mutation cliffs.\n */\n async calculateMutationCliffs(): Promise<{cliffs: MutationCliffs, cliffStats: type.MutationCliffStats}> {\n const scaledActivityCol: DG.Column<number> = this.dataFrame.getCol(this.activityColumnName);\n //TODO: set categories ordering the same to share compare indexes instead of strings\n const monomerCols: type.RawColumn[] = this.positionColumns.map(extractColInfo);\n const targetCol = this.targetColumnName ? extractColInfo(this.dataFrame.getCol(this.targetColumnName)) : null;\n\n const options: MutationCliffsOptions = {\n maxMutations: this.maxMutations, minActivityDelta: this.minActivityDelta,\n targetCol, currentTarget: this.targetCategory,\n };\n const activityRawData = scaledActivityCol.getRawData();\n\n const mutRes = await this.mutationCliffsDebouncer(activityRawData, monomerCols, options);\n const mutStatistics = calculateCliffsStatistics(mutRes, activityRawData);\n return {cliffs: mutRes, cliffStats: mutStatistics};\n }\n}\n\n/** Structure-activity relationship viewer */\nexport class MonomerPosition extends SARViewer {\n colorColumnName: string;\n colorAggregation: string;\n currentGridCell: DG.GridCell | null = null;\n\n /** Sets MonomerPosition properties. */\n constructor() {\n super();\n\n const colorChoices = wu(grok.shell.t.columns.numerical).toArray().map((col) => col.name);\n this.colorColumnName = this.column(MONOMER_POSITION_PROPERTIES.COLOR,\n {category: PROPERTY_CATEGORIES.INVARIANT_MAP, choices: colorChoices, nullable: false});\n this.colorAggregation = this.string(MONOMER_POSITION_PROPERTIES.COLOR_AGGREGATION, DG.AGG.AVG,\n {category: PROPERTY_CATEGORIES.INVARIANT_MAP, choices: C.AGGREGATION_TYPES});\n }\n\n /**\n * Returns viewer name.\n * @return - viewer name.\n */\n get name(): string {\n return VIEWER_TYPE.MONOMER_POSITION;\n }\n\n /**\n * Returns current viewer operation mode.\n * @return - current viewer operation mode.\n */\n get mode(): SELECTION_MODE {\n return this.dataFrame.getTag(C.TAGS.MONOMER_POSITION_MODE) as SELECTION_MODE ??\n SELECTION_MODE.MUTATION_CLIFFS;\n }\n\n /**\n * Sets viewer operation mode.\n * @param mode - viewer operation mode to set.\n */\n set mode(mode: SELECTION_MODE) {\n this.dataFrame.setTag(C.TAGS.MONOMER_POSITION_MODE, mode);\n this.viewerGrid.invalidate();\n // setTimeout(() => this.viewerGrid.invalidate(), 300);\n }\n\n _invariantMapSelection: type.Selection | null = null;\n\n /**\n * Gets invariant map selection. Initializes it if it is null.\n * @return - invariant map selection.\n */\n get invariantMapSelection(): type.Selection {\n const tagSelection = this.dataFrame.getTag(`${C.SUFFIXES.MP}${C.TAGS.INVARIANT_MAP_SELECTION}`);\n this._invariantMapSelection ??= tagSelection === null ? initSelection(this.positionColumns) :\n JSON.parse(tagSelection);\n return this._invariantMapSelection!;\n }\n\n /**\n * Sets invariant map selection and notifies the model.\n * @param selection - selection to set.\n */\n set invariantMapSelection(selection: type.Selection) {\n this._invariantMapSelection = selection;\n this.dataFrame.setTag(`${C.SUFFIXES.MP}${C.TAGS.INVARIANT_MAP_SELECTION}`, JSON.stringify(selection));\n this.model.fireBitsetChanged(VIEWER_TYPE.MONOMER_POSITION);\n this.model.analysisView.grid.invalidate();\n }\n\n /** Processes attached table and sets viewer properties. */\n onTableAttached(): void {\n super.onTableAttached();\n if (isApplicableDataframe(this.dataFrame)) {\n this.getProperty(`${MONOMER_POSITION_PROPERTIES.COLOR}${COLUMN_NAME}`)\n ?.set(this, this.activityColumnName);\n } else {\n const msg = 'PeptidesError: dataframe is missing Macromolecule or numeric columns';\n grok.log.error(msg);\n grok.shell.warning(msg);\n }\n this.render();\n }\n\n /**\n * Modifies invariant map selection. If shift and ctrl keys are both pressed, it removes invariant map from\n * selection. If only shift key is pressed, it adds invariant map to selection. If only ctrl key is pressed, it\n * changes invariant map presence in selection. If none of the keys is pressed, it sets the invariant map as the\n * only selected one.\n * @param monomerPosition - monomer-position to modify selection with.\n * @param options - selection options.\n * @param notify - flag indicating if bitset changed event should fire.\n */\n modifyInvariantMapSelection(monomerPosition: type.SelectionItem, options: type.SelectionOptions = {\n shiftPressed: false,\n ctrlPressed: false,\n }, notify: boolean = true): void {\n if (notify)\n this.invariantMapSelection = modifySelection(this.invariantMapSelection, monomerPosition, options);\n else\n this._invariantMapSelection = modifySelection(this.invariantMapSelection, monomerPosition, options);\n }\n\n /**\n * Processes property changes.\n * @param property - changed property.\n */\n onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n switch (property.name) {\n case MONOMER_POSITION_PROPERTIES.COLOR:\n case MONOMER_POSITION_PROPERTIES.COLOR_AGGREGATION:\n this.viewerGrid.invalidate();\n break;\n case SAR_PROPERTIES.SEQUENCE:\n this._invariantMapSelection = null;\n break;\n }\n\n // this will cause colors to recalculate\n this.model.df.columns.toList().forEach((col) => {\n col.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] = null;\n });\n if (this.doRender)\n this.render();\n }\n\n /**\n * Creates monomer-position dataframe to be used in MonomerPosition grid.\n * @return - monomer-position dataframe.\n */\n createMonomerPositionDf(): DG.DataFrame {\n const uniqueMonomers = new Set<string>();\n const splitSeqCols = this.positionColumns;\n for (const col of splitSeqCols) {\n const colCat = col.categories;\n for (const cat of colCat) {\n if (cat !== '')\n uniqueMonomers.add(cat);\n }\n }\n\n const monomerCol = DG.Column.fromStrings(C.COLUMNS_NAMES.MONOMER, Array.from(uniqueMonomers));\n const monomerPositionDf = DG.DataFrame.fromColumns([monomerCol]);\n monomerPositionDf.name = 'SAR';\n for (const col of splitSeqCols)\n monomerPositionDf.columns.addNewBool(col.name);\n\n\n return monomerPositionDf;\n }\n\n cacheInvariantMapColors(): void {\n // calculate and cache colors for invariant map\n if (this.colorColumnName && this.dataFrame.col(this.colorColumnName)) {\n const colorCol = this.dataFrame.getCol(this.colorColumnName);\n const colorColData = colorCol!.getRawData();\n let minColorVal = 9999999;\n let maxColorVal = -9999999;\n for (const pCol of this.positionColumns) {\n pCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] = {};\n const colorCache = pCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE];\n const colName = pCol.name;\n const positionColData = pCol.getRawData();\n const positionColCategories = pCol.categories;\n if (!this.monomerPositionStats[colName])\n continue;\n const pStats = this.monomerPositionStats[colName]!;\n for (const pMonomer of Object.keys(pStats)) {\n if (pMonomer === 'general')\n continue;\n //const pStatItem = pStats[pMonomer]!;\n const colorValuesIndexes: number[] = [];\n for (let i = 0; i < pCol.length; ++i) {\n if (positionColCategories[positionColData[i]] === pMonomer)\n colorValuesIndexes.push(i);\n }\n const cellColorDataCol = DG.Column.float('color', colorValuesIndexes.length)\n .init((i) => colorColData[colorValuesIndexes[i]]);\n const aggColor = cellColorDataCol.aggregate(this.colorAggregation as DG.AGG);\n colorCache[pMonomer] = aggColor;\n minColorVal = Math.min(minColorVal, aggColor);\n maxColorVal = Math.max(maxColorVal, aggColor);\n }\n pCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] = colorCache;\n }\n\n // do another swing to normalize colors\n for (const pCol of this.positionColumns) {\n const colorCache = pCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE];\n if (!colorCache)\n continue;\n for (const pMonomer of Object.keys(colorCache)) {\n if (this.activityTarget === C.ACTIVITY_TARGET.LOW)\n colorCache[pMonomer] = maxColorVal - colorCache[pMonomer] + minColorVal;\n colorCache[pMonomer] = DG.Color.scaleColor(colorCache[pMonomer], minColorVal, maxColorVal);\n }\n pCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] = colorCache;\n }\n }\n }\n\n\n /**\n * Builds MonomerPosition interactive grid.\n * @return - MonomerPosition grid.\n */\n createViewerGrid(): DG.Grid {\n const monomerPositionDf = this.createMonomerPositionDf();\n const grid = monomerPositionDf.plot.grid();\n grid.sort([C.COLUMNS_NAMES.MONOMER]);\n const positionColumns = this.positionColumns.map((col) => col.name);\n grid.columns.setOrder([C.COLUMNS_NAMES.MONOMER, ...positionColumns]);\n const monomerCol = monomerPositionDf.getCol(C.COLUMNS_NAMES.MONOMER);\n CR.setMonomerRenderer(monomerCol, this.alphabet);\n this.cacheInvariantMapColors();\n\n grid.onCellRender.subscribe((args: DG.GridCellRenderArgs) => renderCell(args, this,\n this.mode === SELECTION_MODE.INVARIANT_MAP, this.dataFrame.getCol(this.colorColumnName),\n this.colorAggregation as DG.AGG));\n\n grid.onCellTooltip((gridCell: DG.GridCell, x: number, y: number) => {\n if (!gridCell.isTableCell) {\n this.model.unhighlight();\n return true;\n }\n const monomerPosition = this.getMonomerPosition(gridCell);\n highlightMonomerPosition(monomerPosition, this.dataFrame, this.monomerPositionStats);\n this.model.isHighlighting = true;\n const columnEntries = this.getTotalViewerAggColumns();\n\n return showTooltip(this.model.df, this.getScaledActivityColumn(), columnEntries, {\n fromViewer: true,\n isMutationCliffs: this.mode === SELECTION_MODE.MUTATION_CLIFFS, monomerPosition, x, y,\n mpStats: this.monomerPositionStats, cliffStats: this.cliffStats?.stats ?? undefined,\n });\n });\n grid.root.addEventListener('mouseleave', (_ev) => this.model.unhighlight());\n DG.debounce(grid.onCurrentCellChanged, 500).subscribe((gridCell: DG.GridCell) => {\n try {\n if (!this.keyPressed)\n return;\n\n\n if (this.currentGridCell !== null) {\n const previousMonomerPosition = this.getMonomerPosition(this.currentGridCell);\n if (this.mode === SELECTION_MODE.INVARIANT_MAP) {\n this.modifyInvariantMapSelection(previousMonomerPosition, {\n shiftPressed: true,\n ctrlPressed: true,\n }, false);\n } else {\n const hasMutationCliffs = this.mutationCliffs\n ?.get(previousMonomerPosition.monomerOrCluster)?.get(previousMonomerPosition.positionOrClusterType)?.size;\n if (hasMutationCliffs) {\n this.modifyMutationCliffsSelection(previousMonomerPosition, {\n shiftPressed: true,\n ctrlPressed: true,\n }, false);\n }\n }\n }\n const monomerPosition = this.getMonomerPosition(gridCell);\n if (this.mode === SELECTION_MODE.INVARIANT_MAP)\n this.modifyInvariantMapSelection(monomerPosition, {shiftPressed: true, ctrlPressed: false}, true);\n else {\n const hasMutationCliffs = this.mutationCliffs\n ?.get(monomerPosition.monomerOrCluster)?.get(monomerPosition.positionOrClusterType)?.size;\n if (hasMutationCliffs) {\n this.modifyMutationCliffsSelection(monomerPosition, {shiftPressed: true, ctrlPressed: false},\n true);\n }\n }\n\n grid.invalidate();\n setTimeout(() => grid?.invalidate(), 300);\n } finally {\n this.keyPressed = false;\n this.currentGridCell = gridCell;\n }\n });\n grid.root.addEventListener('keydown', (ev) => {\n this.keyPressed = ev.key.startsWith('Arrow');\n if (this.keyPressed)\n return;\n\n\n if (ev.key === 'Escape' || (ev.code === 'KeyA' && ev.ctrlKey && ev.shiftKey)) {\n if (this.mode === SELECTION_MODE.INVARIANT_MAP)\n this._invariantMapSelection = initSelection(this.positionColumns);\n else\n this._mutationCliffsSelection = initSelection(this.positionColumns);\n } else if (ev.code === 'KeyA' && ev.ctrlKey) {\n const positions = Object.keys(this.monomerPositionStats).filter((pos) => pos !== 'general');\n for (const position of positions) {\n const monomers = Object.keys(this.monomerPositionStats[position]!)\n .filter((monomer) => monomer !== 'general');\n for (const monomer of monomers) {\n const monomerPosition = {monomerOrCluster: monomer, positionOrClusterType: position};\n if (this.mode === SELECTION_MODE.INVARIANT_MAP)\n this.modifyInvariantMapSelection(monomerPosition, {shiftPressed: true, ctrlPressed: false}, false);\n else {\n this.modifyMutationCliffsSelection(monomerPosition, {\n shiftPressed: true,\n ctrlPressed: false,\n }, false);\n }\n }\n }\n } else\n return;\n\n\n this.model.fireBitsetChanged(VIEWER_TYPE.MONOMER_POSITION);\n grid.invalidate();\n });\n grid.root.addEventListener('click', (ev) => {\n const gridCell = grid.hitTest(ev.offsetX, ev.offsetY);\n if (!gridCell?.isTableCell || gridCell?.tableColumn?.name === C.COLUMNS_NAMES.MONOMER)\n return;\n\n\n const monomerPosition = this.getMonomerPosition(gridCell);\n if (this.mode === SELECTION_MODE.INVARIANT_MAP) {\n this.modifyInvariantMapSelection(monomerPosition, {shiftPressed: ev.shiftKey, ctrlPressed: ev.ctrlKey});\n if (isSelectionEmpty(this.invariantMapSelection))\n monomerPositionDf.currentRowIdx = -1;\n } else {\n const hasMutationCliffs = this.mutationCliffs?.get(monomerPosition.monomerOrCluster)\n ?.get(monomerPosition.positionOrClusterType)?.size;\n if (hasMutationCliffs) {\n this.modifyMutationCliffsSelection(monomerPosition,\n {shiftPressed: ev.shiftKey, ctrlPressed: ev.ctrlKey});\n }\n }\n grid.invalidate();\n\n this.showHelp();\n });\n\n // const columnWidths = new Map<string, number>();\n // columnWidths.set(C.COLUMNS_NAMES.MONOMER, AAR_CELL_WIDTH);\n // for (const posCol of positionColumns)\n // columnWidths.set(posCol, MUTATION_CLIFFS_CELL_WIDTH);\n\n // grid.onColumnResized.subscribe(() => {\n // try {\n // const resizedCol = Array.from(columnWidths.keys()).find((col) => grid.col(col)?.width !== columnWidths.get(col));\n // if (!resizedCol)\n // return;\n // const resizedColWidth = Math.max(grid.col(resizedCol)?.width ?? MUTATION_CLIFFS_CELL_WIDTH / 2, MUTATION_CLIFFS_CELL_WIDTH / 2);\n // Array.from(columnWidths.keys()).forEach((col) => {\n // columnWidths.set(col, resizedColWidth);\n // grid.col(col) && (grid.col(col)!.width = resizedColWidth);\n // });\n // grid.props.rowHeight = resizedColWidth / 1.5;\n // } catch (e) {\n // grok.log.error(e);\n // }\n // });\n setViewerGridProps(grid);\n\n // Monomer cell renderer overrides width settings. This way I ensure is \"initially\" set.\n const afterDraw = grid.onAfterDrawContent.subscribe(() => {\n const monomerGCol = grid.col(C.COLUMNS_NAMES.MONOMER)!;\n if (monomerGCol.width === AAR_CELL_WIDTH) {\n afterDraw.unsubscribe();\n return;\n }\n monomerGCol.width = AAR_CELL_WIDTH;\n for (const posCol of positionColumns) {\n const gcCol = grid.col(posCol)!;\n gcCol.width = MUTATION_CLIFFS_CELL_WIDTH;\n }\n });\n\n return grid;\n }\n\n /** Shows viewer context help. */\n showHelp(): void {\n _package.files.readAsText('help/monomer-position.md').then((text) => {\n grok.shell.windows.help.showHelp(ui.markdown(text));\n }).catch((e) => grok.log.error(e));\n }\n\n /**\n * Gets monomer-position from MonomerPosition grid cell.\n * @param gridCell - MonomerPosition grid cell.\n * @return - monomer-position object.\n */\n getMonomerPosition(gridCell: DG.GridCell): SelectionItem {\n return {\n monomerOrCluster: gridCell.cell.dataFrame.get(C.COLUMNS_NAMES.MONOMER, gridCell!.tableRowIndex!) as string,\n positionOrClusterType: gridCell!.tableColumn!.name,\n };\n }\n\n /** Renders the MonomerPosition viewer body. */\n render(): void {\n $(this.root).empty();\n if (!this.activityColumnName || !this.sequenceColumnName) {\n this.root.appendChild(ui.divText('Please, select a sequence and activity columns in the viewer properties'));\n return;\n }\n // Backward compatability with 1.16.0\n const columnProperty = this.getProperty(MONOMER_POSITION_PROPERTIES.COLOR);\n if (columnProperty) {\n columnProperty.choices = wu(grok.shell.t.columns.numerical).toArray().map((col) => col.name);\n if (columnProperty.get(this) === C.COLUMNS_NAMES.ACTIVITY_SCALED)\n columnProperty.set(this, C.COLUMNS_NAMES.ACTIVITY);\n }\n\n $(this.root).empty();\n let switchHost = ui.divText(VIEWER_TYPE.MOST_POTENT_RESIDUES, {id: 'pep-viewer-title'});\n if (this.name === VIEWER_TYPE.MONOMER_POSITION) {\n const mutationCliffsMode = ui.input.bool(SELECTION_MODE.MUTATION_CLIFFS,\n {value: this.mode === SELECTION_MODE.MUTATION_CLIFFS});\n mutationCliffsMode.root.addEventListener('click', () => {\n invariantMapMode.value = false;\n mutationCliffsMode.value = true;\n this.mode = SELECTION_MODE.MUTATION_CLIFFS;\n this.showHelp();\n });\n mutationCliffsMode.setTooltip('Statistically significant changes in activity');\n const invariantMapMode = ui.input.bool(SELECTION_MODE.INVARIANT_MAP, {value: this.mode === SELECTION_MODE.INVARIANT_MAP});\n invariantMapMode.root.addEventListener('click', () => {\n mutationCliffsMode.value = false;\n invariantMapMode.value = true;\n this.mode = SELECTION_MODE.INVARIANT_MAP;\n this.showHelp();\n });\n invariantMapMode.setTooltip('Number of sequences having monomer-position');\n const setDefaultProperties = (input: DG.InputBase): void => {\n $(input.root).find('.ui-input-editor').css('margin', '0px').attr('type', 'radio');\n $(input.root).find('.ui-input-description').css('padding', '0px').css('padding-right', '16px');\n $(input.captionLabel).addClass('ui-label-right');\n };\n setDefaultProperties(mutationCliffsMode);\n setDefaultProperties(invariantMapMode);\n\n switchHost = ui.divH([mutationCliffsMode.root, invariantMapMode.root], {id: 'pep-viewer-title'});\n $(switchHost).css('width', 'auto').css('align-self', 'center');\n }\n const viewerRoot = this.viewerGrid.root;\n viewerRoot.style.width = 'auto';\n // expand button\n const expand = ui.iconFA('expand-alt', () => {\n const dialog = ui.dialog('Monomer Position');\n dialog.add(ui.divV([switchHost, viewerRoot], {style: {height: '100%'}}));\n dialog.onCancel(() => this.render());\n dialog.showModal(true);\n this.viewerGrid.invalidate();\n }, 'Show Monomer Position Table in full screen');\n $(expand).addClass('pep-help-icon');\n\n const header = ui.divH([expand, switchHost], {style: {alignSelf: 'center', lineHeight: 'normal'}});\n this.root.appendChild(ui.divV([header, viewerRoot]));\n this.viewerGrid?.invalidate();\n }\n}\n\n/** Vertical structure activity relationship viewer */\nexport class MostPotentResidues extends SARViewer {\n currentGridRowIdx: number | null = null;\n\n /** Sets MostPotentResidues properties. */\n constructor() {\n super();\n }\n\n /**\n * Returns viewer name.\n * @return - viewer name.\n */\n get name(): string {\n return VIEWER_TYPE.MOST_POTENT_RESIDUES;\n }\n\n /** Processes attached table and sets viewer properties. */\n onTableAttached(): void {\n super.onTableAttached();\n this.helpUrl = 'https://datagrok.ai/help/datagrok/solutions/domains/bio/peptides-sar';\n this.render();\n }\n\n /**\n * Processes property changes.\n * @param property - changed property.\n */\n onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n if (this.doRender)\n this.render();\n }\n\n /**\n * Creates most potent residues dataframe to be used in MostPotentResidues grid.\n * @return - most potent residues dataframe.\n */\n createMostPotentResiduesDf(): DG.DataFrame {\n const monomerPositionStatsEntries = Object.entries(this.monomerPositionStats) as [string, PositionStats][];\n const posData: number[] = new Array(monomerPositionStatsEntries.length - 1);\n const monomerData: string[] = new Array(posData.length);\n const mdData: number[] = new Array(posData.length);\n const pValData: (number | null)[] = new Array(posData.length);\n const countData: number[] = new Array(posData.length);\n const ratioData: number[] = new Array(posData.length);\n const meanData: number[] = new Array(posData.length);\n const aggrColumnEntries = this.getTotalViewerAggColumns();\n const aggColNames = aggrColumnEntries.map(([colName, aggFn]) => getAggregatedColName(aggFn, colName));\n const aggrColsData = new Array<Array<number>>(aggColNames.length);\n aggColNames.forEach(((_, idx) => aggrColsData[idx] = new Array<number>(posData.length)));\n let i = 0;\n for (const [position, positionStats] of monomerPositionStatsEntries) {\n const generalPositionStats = positionStats.general;\n if (!generalPositionStats)\n continue;\n\n\n if (Object.entries(positionStats).length === 1)\n continue;\n\n\n const filteredMonomerStats: [string, StatsItem][] = [];\n for (const [monomer, monomerStats] of Object.entries(positionStats)) {\n if (monomer === 'general')\n continue;\n\n\n if ((monomerStats as StatsItem).count > 1 && (monomerStats as StatsItem).pValue === null)\n filteredMonomerStats.push([monomer, monomerStats as StatsItem]);\n\n\n if ((monomerStats as StatsItem).pValue === generalPositionStats.minPValue)\n filteredMonomerStats.push([monomer, monomerStats as StatsItem]);\n }\n\n if (filteredMonomerStats.length === 0)\n continue;\n\n\n let maxEntry: [string, StatsItem] | null = null;\n // depending on the chosen target for activity, we might want to prioritize higher or lower activity.\n for (const [monomer, monomerStats] of filteredMonomerStats) {\n if (maxEntry === null ||\n (this.activityTarget === C.ACTIVITY_TARGET.HIGH && maxEntry[1].meanDifference < monomerStats.meanDifference) || // if we want to prioritize higher activity\n (this.activityTarget === C.ACTIVITY_TARGET.LOW && maxEntry[1].meanDifference > monomerStats.meanDifference) // if we want to prioritize lower activity\n )\n maxEntry = [monomer, monomerStats];\n }\n\n if (maxEntry === null)\n continue;\n\n\n posData[i] = parseInt(position);\n monomerData[i] = maxEntry![0];\n mdData[i] = maxEntry![1].meanDifference;\n pValData[i] = maxEntry![1].pValue;\n countData[i] = maxEntry![1].count;\n ratioData[i] = maxEntry![1].ratio;\n meanData[i] = maxEntry![1].mean;\n\n const stats = this.monomerPositionStats[position][maxEntry![0]];\n const mask = DG.BitSet.fromBytes(stats.mask.buffer.buffer, this.model.df.col(this.activityColumnName)!.length);\n for (let j = 0; j < aggColNames.length; j++) {\n const [colName, aggFn] = aggrColumnEntries[j];\n aggrColsData[j][i] = getAggregatedValue(this.model.df.getCol(colName), aggFn, mask);\n }\n ++i;\n }\n\n posData.length = i;\n monomerData.length = i;\n mdData.length = i;\n pValData.length = i;\n countData.length = i;\n ratioData.length = i;\n meanData.length = i;\n\n const mprDf = DG.DataFrame.create(i);\n const mprDfCols = mprDf.columns;\n mprDfCols.add(DG.Column.fromList(DG.TYPE.INT, C.COLUMNS_NAMES.POSITION, posData));\n mprDfCols.add(DG.Column.fromList(DG.TYPE.STRING, C.COLUMNS_NAMES.MONOMER, monomerData));\n mprDfCols.add(DG.Column.fromList(DG.TYPE.FLOAT, C.COLUMNS_NAMES.MEAN_DIFFERENCE, mdData));\n mprDfCols.add(DG.Column.fromList(DG.TYPE.FLOAT, C.COLUMNS_NAMES.MEAN, meanData));\n mprDfCols.add(DG.Column.fromList(DG.TYPE.FLOAT, C.COLUMNS_NAMES.P_VALUE, pValData));\n mprDfCols.add(DG.Column.fromList(DG.TYPE.INT, C.COLUMNS_NAMES.COUNT, countData));\n mprDfCols.add(DG.Column.fromList(DG.TYPE.FLOAT, C.COLUMNS_NAMES.RATIO, ratioData));\n aggColNames.forEach((it, idx) => mprDfCols.add(DG.Column.fromList(DG.TYPE.FLOAT, it, aggrColsData[idx])));\n\n return mprDf;\n }\n\n /**\n * Builds MostPotentResidues interactive grid.\n * @return - MostPotentResidues grid.\n */\n createViewerGrid(): DG.Grid {\n const mprDf = this.createMostPotentResiduesDf();\n const grid = mprDf.plot.grid();\n grid.sort([C.COLUMNS_NAMES.POSITION]);\n const pValGridCol = grid.col(C.COLUMNS_NAMES.P_VALUE)!;\n pValGridCol.format = '#.000';\n pValGridCol.name = 'P-value';\n const monomerCol = mprDf.getCol(C.COLUMNS_NAMES.MONOMER);\n\n // Setting Monomer column renderer\n CR.setMonomerRenderer(monomerCol, this.alphabet);\n grid.onCellRender.subscribe(\n (args: DG.GridCellRenderArgs) => renderCell(args, this, false, undefined, undefined));\n\n grid.onCellTooltip((gridCell: DG.GridCell, x: number, y: number) => {\n if (!gridCell.isTableCell) {\n this.model.unhighlight();\n return true;\n }\n const monomerPosition = this.getMonomerPosition(gridCell);\n highlightMonomerPosition(monomerPosition, this.dataFrame, this.monomerPositionStats);\n this.model.isHighlighting = true;\n\n if (gridCell.tableColumn?.name === C.COLUMNS_NAMES.MONOMER)\n monomerPosition.positionOrClusterType = C.COLUMNS_NAMES.MONOMER;\n else if (gridCell.tableColumn?.name !== C.COLUMNS_NAMES.MEAN_DIFFERENCE)\n return false;\n\n\n const columnEntries = this.getTotalViewerAggColumns();\n const aggrValues = gridCell.tableRowIndex == null ? undefined :\n getAggregatedColumnValuesFromDf(gridCell.grid.dataFrame!, gridCell.tableRowIndex, columnEntries, {});\n return showTooltip(this.model.df, this.getScaledActivityColumn(), columnEntries,\n {\n fromViewer: true, isMostPotentResidues: true, monomerPosition, x, y, mpStats: this.monomerPositionStats,\n aggrColValues: aggrValues,\n });\n });\n DG.debounce(grid.onCurrentCellChanged, 500).subscribe((gridCell: DG.GridCell) => {\n try {\n if ((this.keyPressed && mprDf.currentCol.name !== C.COLUMNS_NAMES.MEAN_DIFFERENCE) || !this.keyPressed)\n return;\n\n\n const monomerPosition = this.getMonomerPosition(gridCell);\n if (this.currentGridRowIdx !== null) {\n const previousMonomerPosition = this.getMonomerPosition(grid.cell('Diff', this.currentGridRowIdx));\n this.modifyMutationCliffsSelection(previousMonomerPosition, {\n shiftPressed: true,\n ctrlPressed: true,\n }, false);\n }\n const hasMutationCliffs = this.mutationCliffs?.get(monomerPosition.monomerOrCluster)\n ?.get(monomerPosition.positionOrClusterType)?.size;\n if (hasMutationCliffs)\n this.modifyMutationCliffsSelection(monomerPosition, {shiftPressed: true, ctrlPressed: false});\n\n\n grid.invalidate();\n } finally {\n this.keyPressed = false;\n this.currentGridRowIdx = gridCell.gridRow;\n }\n });\n grid.root.addEventListener('keydown', (ev) => {\n this.keyPressed = ev.key.startsWith('Arrow');\n if (this.keyPressed)\n return;\n\n\n if (ev.key === 'Escape' || (ev.code === 'KeyA' && ev.ctrlKey && ev.shiftKey))\n this._mutationCliffsSelection = initSelection(this.positionColumns);\n else if (ev.code === 'KeyA' && ev.ctrlKey) {\n for (let rowIdx = 0; rowIdx < mprDf.rowCount; ++rowIdx) {\n const monomerPosition = this.getMonomerPosition(grid.cell('Diff', rowIdx));\n this.modifyMutationCliffsSelection(monomerPosition, {shiftPressed: true, ctrlPressed: false}, false);\n }\n } else\n return;\n\n\n this.model.fireBitsetChanged(VIEWER_TYPE.MOST_POTENT_RESIDUES);\n grid.invalidate();\n });\n grid.root.addEventListener('mouseleave', (_ev) => this.model.unhighlight());\n grid.root.addEventListener('click', (ev) => {\n const gridCell = grid.hitTest(ev.offsetX, ev.offsetY);\n if (!gridCell?.isTableCell || gridCell!.tableColumn!.name !== C.COLUMNS_NAMES.MEAN_DIFFERENCE)\n return;\n\n\n const monomerPosition = this.getMonomerPosition(gridCell);\n const hasMutationCliffs = this.mutationCliffs?.get(monomerPosition.monomerOrCluster)\n ?.get(monomerPosition.positionOrClusterType)?.size;\n if (!hasMutationCliffs)\n return;\n\n\n this.modifyMutationCliffsSelection(monomerPosition, {shiftPressed: ev.shiftKey, ctrlPressed: ev.ctrlKey});\n grid.invalidate();\n\n _package.files.readAsText('help/most-potent-residues.md').then((text) => {\n grok.shell.windows.help.showHelp(ui.markdown(text));\n }).catch((e) => grok.log.error(e));\n });\n\n setViewerGridProps(grid);\n const mdCol: DG.GridColumn = grid.col(C.COLUMNS_NAMES.MEAN_DIFFERENCE)!;\n mdCol.name = 'Diff';\n // Monomer cell renderer overrides width settings. This way I ensure is \"initially\" set.\n const afterDraw = grid.onAfterDrawContent.subscribe(() => {\n const monomerGCol = grid.col(C.COLUMNS_NAMES.MONOMER)!;\n if (monomerGCol.width === AAR_CELL_WIDTH) {\n afterDraw.unsubscribe();\n return;\n }\n monomerGCol.width = AAR_CELL_WIDTH;\n mdCol.width = MUTATION_CLIFFS_CELL_WIDTH;\n });\n\n return grid;\n }\n\n /**\n * Gets monomer-position from MostPotentResidues grid cell.\n * @param gridCell - MostPotentResidues grid cell.\n * @return - monomer-position object.\n */\n getMonomerPosition(gridCell: DG.GridCell): SelectionItem {\n return {\n monomerOrCluster: gridCell.cell.dataFrame.get(C.COLUMNS_NAMES.MONOMER, gridCell!.tableRowIndex!),\n positionOrClusterType: `${gridCell.cell.dataFrame.get(C.COLUMNS_NAMES.POSITION, gridCell!.tableRowIndex!)}`,\n };\n }\n\n /** Renders the MostPotentResidues viewer body. */\n render(): void {\n $(this.root).empty();\n if (!this.activityColumnName || !this.sequenceColumnName) {\n this.root.appendChild(ui.divText('Please, select a sequence and activity columns in the viewer properties'));\n return;\n }\n const switchHost = ui.divText(VIEWER_TYPE.MOST_POTENT_RESIDUES, {id: 'pep-viewer-title'});\n const viewerRoot = this.viewerGrid.root;\n viewerRoot.style.width = 'auto';\n const header = ui.divH([switchHost], {style: {alignSelf: 'center', lineHeight: 'normal'}});\n this.root.appendChild(ui.divV([header, viewerRoot]));\n this.viewerGrid?.invalidate();\n }\n}\n\n/**\n * Renders SARViewer grid cells.\n * @param args - grid cell render arguments.\n * @param viewer - viewer instance.\n * @param isInvariantMap - flag indicating if viewr is operating in invariant map mode.\n * @param colorCol - column to use for color coding in invariant map mode.\n * @param colorAgg - aggregation function to use for color coding in invariant map mode.\n */\nfunction renderCell(args: DG.GridCellRenderArgs, viewer: SARViewer, isInvariantMap?: boolean,\n _colorCol?: DG.Column<number>, _colorAgg?: DG.AGG): void {\n const renderColNames = [...viewer.positionColumns.map((col) => col.name), C.COLUMNS_NAMES.MEAN_DIFFERENCE];\n const canvasContext = args.g;\n const bound = args.bounds;\n\n canvasContext.save();\n canvasContext.beginPath();\n canvasContext.rect(bound.x, bound.y, bound.width, bound.height);\n canvasContext.clip();\n\n // Hide row column\n const cell = args.cell;\n if (cell.isRowHeader && cell.gridColumn.visible) {\n cell.gridColumn.visible = false;\n args.preventDefault();\n canvasContext.restore();\n return;\n }\n\n const tableColName = cell.tableColumn?.name;\n const tableRowIndex = cell.tableRowIndex!;\n if (!cell.isTableCell || renderColNames.indexOf(tableColName!) === -1) {\n canvasContext.restore();\n return;\n }\n\n const gridTable = cell.grid.table;\n const currentMonomer: string = gridTable.get(C.COLUMNS_NAMES.MONOMER, tableRowIndex);\n const currentPosition: string = tableColName !== C.COLUMNS_NAMES.MEAN_DIFFERENCE ? tableColName :\n gridTable.get(C.COLUMNS_NAMES.POSITION, tableRowIndex).toFixed();\n const currentPosStats = viewer.monomerPositionStats[currentPosition];\n\n if (!currentPosStats![currentMonomer]) {\n args.preventDefault();\n canvasContext.restore();\n return;\n }\n\n if (isInvariantMap) {\n const value = currentPosStats![currentMonomer]!.count;\n const positionCol = viewer.positionColumns.find((col) => col.name === currentPosition)!;\n const colorCache: { [_: string]: number } = positionCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] ?? {};\n let color: number = DG.Color.white;\n // const colorColStats = colorCol!.stats;\n if (colorCache[currentMonomer])\n color = colorCache[currentMonomer];\n else if (viewer instanceof MonomerPosition) {\n viewer.cacheInvariantMapColors();\n color = (positionCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] ?? {})[currentMonomer] ?? DG.Color.white;\n }\n // } else {\n // const positionColData = positionCol.getRawData();\n // const positionColCategories = positionCol.categories;\n\n // const colorColData = colorCol!.getRawData();\n // const colorValuesIndexes: number[] = [];\n // for (let i = 0; i < positionCol.length; ++i) {\n // if (positionColCategories[positionColData[i]] === currentMonomer)\n // colorValuesIndexes.push(i);\n // }\n // const cellColorDataCol = DG.Column.float('color', colorValuesIndexes.length)\n // .init((i) => colorColData[colorValuesIndexes[i]]);\n // let aggColor = cellColorDataCol.aggregate(colorAgg!);\n // // if the target activity is low, we might wat to reverse the color scale\n // if (viewer.activityTarget === C.ACTIVITY_TARGET.LOW)\n // aggColor = colorColStats.max - aggColor + colorColStats.min;\n // color = DG.Color.scaleColor(aggColor, colorColStats.min, colorColStats.max);\n // colorCache[currentMonomer] = aggColor;\n // positionCol.temp[C.TAGS.INVARIANT_MAP_COLOR_CACHE] = colorCache;\n // }\n\n CR.renderInvariantMapCell(canvasContext, currentMonomer, currentPosition,\n (viewer as MonomerPosition).invariantMapSelection, value, bound, color);\n } else\n CR.renderMutationCliffCell(canvasContext, currentMonomer, currentPosition, viewer, bound);\n\n\n args.preventDefault();\n canvasContext.restore();\n}\n\n/**\n * Sets common grid properties.\n * @param grid - viewer grid.\n */\nfunction setViewerGridProps(grid: DG.Grid): void {\n const gridProps = grid.props;\n gridProps.allowEdit = false;\n gridProps.allowRowSelection = false;\n gridProps.allowBlockSelection = false;\n gridProps.allowColSelection = false;\n gridProps.showRowHeader = false;\n gridProps.showCurrentRowIndicator = false;\n gridProps.showReadOnlyNotifications = false;\n\n gridProps.rowHeight = 20;\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {StringDictionary} from '@datagrok-libraries/utils/src/type-declarations';\n\nimport $ from 'cash-dom';\n\nimport * as C from '../utils/constants';\nimport {AggregationColumns, getAggregatedColumnValues, getStats, StatsItem} from '../utils/statistics';\nimport {DistributionLabelMap, getDistributionPanel, getDistributionTable, SPLIT_CATEGORY} from '../utils/misc';\nimport {SARViewer} from '../viewers/sar-viewer';\nimport {CLUSTER_TYPE, LogoSummaryTable} from '../viewers/logo-summary';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {Selection} from '../utils/types';\n\nexport type DistributionItemOptions = {\n peptideSelection: DG.BitSet, columns: AggregationColumns, clusterColName?: string,\n activityCol: DG.Column<number>, monomerPositionSelection: Selection, clusterSelection: Selection,\n};\n\nexport enum DISTRIBUTION_CATEGORIES_KEYS {\n SEPARATE_MONOMERS = 'separateMonomers',\n SEPARATE_POSITIONS = 'separatePositions',\n SEPARATE_CLUSTERS = 'separateClusters',\n}\n\nconst general = 'general';\nconst key2category = (key: DISTRIBUTION_CATEGORIES_KEYS | typeof general): string => {\n if (key === general)\n return 'General';\n\n\n return key.substring(8);\n};\nexport type PeptideViewer = SARViewer | LogoSummaryTable;\n\n\n/**\n * Builds Distribution panel\n * @param table - Dataframe with peptides\n * @param options - Distribution options\n * @return - Distribution panel\n */\nexport function getDistributionWidget(table: DG.DataFrame, options: DistributionItemOptions): HTMLDivElement {\n const mask = table.selection;\n if (!mask.anyTrue)\n return ui.divText('No distribution');\n\n\n const getDistributionCategoreisHost = (): HTMLDivElement => {\n const distributionCategories: HTMLDivElement[] = [getDistributionCategory(general, table, options)];\n for (const tag of Object.values(DISTRIBUTION_CATEGORIES_KEYS)) {\n if (table.getTag(tag) !== `${true}` ||\n (tag === DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_CLUSTERS && !options.clusterColName))\n continue;\n\n\n distributionCategories.push(getDistributionCategory(tag, table, options));\n }\n return (distributionCategories.length === 1) ? distributionCategories[0] : ui.div(distributionCategories);\n };\n const distributionCategoriesHost = ui.div(getDistributionCategoreisHost());\n const inputsNames = Object.values(DISTRIBUTION_CATEGORIES_KEYS);\n const inputsArray: DG.InputBase[] = new Array(inputsNames.length);\n for (let inputIdx = 0; inputIdx < inputsNames.length; inputIdx++) {\n const inputName = inputsNames[inputIdx].substring(8);\n inputsArray[inputIdx] = ui.input.bool(inputName,\n {value: table.getTag(inputsNames[inputIdx]) === `${true}`, onValueChanged: () => {\n table.setTag(inputsNames[inputIdx], `${inputsArray[inputIdx].value}`);\n $(distributionCategoriesHost).empty();\n distributionCategoriesHost.append(getDistributionCategoreisHost());\n }}) as DG.InputBase<boolean>;\n $(inputsArray[inputIdx].captionLabel).addClass('ui-label-right').css('text-align', 'left');\n $(inputsArray[inputIdx].root).find('.ui-input-editor').css('margin', '0px');\n $(inputsArray[inputIdx].root).find('.ui-input-description').css('margin', '0px');\n inputsArray[inputIdx].setTooltip(`Show distribution for each ${inputName}`);\n if (inputName === DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_CLUSTERS)\n inputsArray[inputIdx].enabled = !!(options.clusterColName && options.clusterSelection[CLUSTER_TYPE.ORIGINAL]);\n else if (inputName === DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_MONOMERS ||\n inputName === DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_POSITIONS)\n inputsArray[inputIdx].enabled = Object.entries(options.monomerPositionSelection).length !== 0;\n }\n\n const inputsHost = ui.form(inputsArray);\n // $(inputsHost).css('display', 'inline-flex');\n return ui.divV([inputsHost, distributionCategoriesHost]);\n}\n\n/**\n * Builds activity distribution histogram\n * @param table - Dataframe with peptides\n * @param isTooltip - Is histogram for tooltip\n * @return - Histogram viewer\n */\nexport function getActivityDistribution(\n table: DG.DataFrame, isTooltip: boolean = false,\n // @ts-ignore TODO: fix after api update\n): DG.Viewer<DG.IHistogramSettings> {\n const hist = table.plot.histogram({\n filteringEnabled: false,\n valueColumnName: C.COLUMNS_NAMES.ACTIVITY,\n splitColumnName: C.COLUMNS_NAMES.SPLIT_COL,\n legendVisibility: 'Never',\n showXAxis: true,\n showColumnSelector: false,\n showRangeSlider: false,\n showBinSelector: false,\n backColor: isTooltip ? '#fdffe5' : '#fffff',\n // @ts-ignore TODO: fix after api update\n }) as DG.Viewer<DG.IHistogramSettings>;\n hist.root.style.width = 'auto';\n return hist;\n}\n\n/**\n * Builds stats table map\n * @param stats - Stats item\n * @param options - Stats table map options\n * @param options.fractionDigits - Number of fraction digits for stats values\n * @return - Stats table map\n */\nexport function getStatsTableMap(stats: StatsItem, options: { fractionDigits?: number } = {}): StringDictionary {\n options.fractionDigits ??= 3;\n const tableMap: StringDictionary = {\n 'Count': `${stats.count} (${stats.ratio.toFixed(options.fractionDigits)}%)`,\n 'Mean difference': stats.meanDifference.toFixed(options.fractionDigits),\n 'Mean activity': stats.mean.toFixed(options.fractionDigits),\n };\n if (stats.pValue !== null)\n tableMap['p-value'] = stats.pValue < 0.01 ? '<0.01' : stats.pValue.toFixed(options.fractionDigits);\n\n\n return tableMap;\n}\n\n/**\n * Builds distribution for signle item\n * @param table - Dataframe with peptides\n * @param stats - Stats item\n * @param options - Distribution options\n * @param [labelMap] - Map for histogram legend labels\n * @return - Distribution panel\n */\nfunction getSingleDistribution(table: DG.DataFrame, stats: StatsItem, options: DistributionItemOptions,\n labelMap: DistributionLabelMap = {}): HTMLDivElement {\n const hist = getActivityDistribution(getDistributionTable(options.activityCol, table.selection,\n options.peptideSelection));\n const aggregatedColMap = getAggregatedColumnValues(table, Object.entries(options.columns),\n {filterDf: true, mask: DG.BitSet.fromBytes(stats.mask.buffer.buffer, stats.mask.length)});\n const tableMap = getStatsTableMap(stats);\n const resultMap: { [key: string]: any } = {...tableMap, ...aggregatedColMap};\n const distributionRoot = getDistributionPanel(hist, resultMap, labelMap);\n $(distributionRoot).addClass('d4-flex-col');\n\n return distributionRoot;\n}\n\n/**\n * Builds distribution item for specified category\n * @param category - Distribution category\n * @param table - Dataframe with peptides\n * @param options - Distribution options\n * @return - Distribution item\n */\nfunction getDistributionCategory(category: DISTRIBUTION_CATEGORIES_KEYS | typeof general, table: DG.DataFrame,\n options: DistributionItemOptions): HTMLDivElement {\n let body: HTMLDivElement = ui.divText('No distribution');\n switch (category) {\n case general:\n const bitArray = BitArray.fromSeq(table.selection.length, (i: number) => table.selection.get(i));\n const stats = !table.selection.anyTrue || !table.selection.anyFalse ?\n {\n count: options.activityCol.length, pValue: null, meanDifference: 0, ratio: 1, mask: bitArray,\n mean: options.activityCol.stats.avg,\n } :\n getStats(options.activityCol.getRawData(), bitArray);\n\n body = getSingleDistribution(table, stats, options);\n break;\n case DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_CLUSTERS:\n body = getDistributionForClusters(table, options as Required<DistributionItemOptions>, options.clusterSelection);\n break;\n case DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_MONOMERS:\n const reversedSelectionObject = getReversedObject(options.monomerPositionSelection);\n body = getDistributionForMonomers(table, options, reversedSelectionObject);\n break;\n case DISTRIBUTION_CATEGORIES_KEYS.SEPARATE_POSITIONS:\n body = getDistributionForPositions(table, options, options.monomerPositionSelection);\n break;\n }\n\n return ui.divV([ui.h1(key2category(category)), body]);\n}\n\n/**\n * Builds distribution group for clusters\n * @param table - Dataframe with peptides\n * @param options - Distribution options\n * @param selectionObject - Selection object\n * @return - Distribution group host\n */\nfunction getDistributionForClusters(table: DG.DataFrame, options: Required<DistributionItemOptions>,\n selectionObject: Selection): HTMLDivElement {\n const rowCount = table.rowCount;\n const distributions: HTMLDivElement[] = [];\n const activityColData = options.activityCol.getRawData();\n const clusterCol = table.getCol(options.clusterColName);\n const clusterColCategories = clusterCol.categories;\n const clusterColData = clusterCol.getRawData() as Int32Array;\n\n // Build distributions for original clusters\n const selectedClustersCategoryIndexes = selectionObject[CLUSTER_TYPE.ORIGINAL]\n .map((cluster: string) => clusterColCategories.indexOf(cluster));\n const clusterMasks: BitArray[] = new Array(selectedClustersCategoryIndexes.length).fill(new BitArray(rowCount));\n for (let i = 0; i < rowCount; i++) {\n const cluster = clusterColData[i];\n const selectedIndex = selectedClustersCategoryIndexes.indexOf(cluster);\n if (selectedIndex !== -1)\n clusterMasks[selectedIndex].setTrue(i);\n }\n for (let selectedClusterIdx = 0; selectedClusterIdx < selectedClustersCategoryIndexes.length; selectedClusterIdx++) {\n const selectedClusterCategoryIndex = selectedClustersCategoryIndexes[selectedClusterIdx];\n const stats = getStats(activityColData, clusterMasks[selectedClusterIdx]);\n distributions.push(getSingleDistribution(table, stats, options,\n {[SPLIT_CATEGORY.SELECTION]: clusterColCategories[selectedClusterCategoryIndex]}));\n }\n\n // Build distributions for custom clusters\n const customClusterSelection = selectionObject[CLUSTER_TYPE.CUSTOM];\n for (const clusterColumnName of customClusterSelection) {\n const customClustCol = table.getCol(clusterColumnName);\n const bitArray = BitArray.fromUint32Array(rowCount, customClustCol.getRawData() as Uint32Array);\n const stats = getStats(activityColData, bitArray);\n distributions.push(getSingleDistribution(table, stats, options,\n {[SPLIT_CATEGORY.SELECTION]: clusterColumnName}));\n }\n\n return ui.div(distributions, 'd4-flex-wrap');\n}\n\n/**\n * Builds distribution group for positions category\n * @param table - Dataframe with peptides\n * @param options - Distribution options\n * @param selectionObject - Selection object\n * @return - Distribution group host\n */\nfunction getDistributionForPositions(table: DG.DataFrame, options: DistributionItemOptions,\n selectionObject: Selection): HTMLDivElement {\n const positions = Object.keys(selectionObject);\n const rowCount = table.rowCount;\n const distributions: HTMLDivElement[] = [];\n const activityColData = options.activityCol.getRawData();\n const positionColumns: (DG.Column<string> | undefined)[] = [];\n const positionColumnsCategories: (string[] | undefined)[] = [];\n const positionColumnsData: (Int32Array | undefined)[] = [];\n\n for (let posIdx = 0; posIdx < positions.length; posIdx++) {\n const position = positions[posIdx];\n const monomerList = selectionObject[position];\n if (monomerList.length === 0)\n continue;\n\n\n positionColumns[posIdx] ??= table.getCol(position);\n positionColumnsCategories[posIdx] ??= positionColumns[posIdx]!.categories;\n positionColumnsData[posIdx] ??= positionColumns[posIdx]!.getRawData() as Int32Array;\n\n const mask = new BitArray(table.rowCount);\n for (let monomerIdx = 0; monomerIdx < monomerList.length; monomerIdx++) {\n const monomer = monomerList[monomerIdx];\n const monomerCategoryIndex = positionColumnsCategories[posIdx]!.indexOf(monomer);\n\n for (let i = 0; i < rowCount; i++) {\n if (positionColumnsData[posIdx]![i] === monomerCategoryIndex)\n mask.setTrue(i);\n }\n }\n const stats = getStats(activityColData, mask);\n distributions.push(getSingleDistribution(table, stats, options, {[SPLIT_CATEGORY.SELECTION]: position}));\n }\n\n return ui.div(distributions, 'd4-flex-wrap');\n}\n\n/**\n * Builds distribution group for monomers category\n * @param table - Dataframe with peptides\n * @param options - Distribution options\n * @param reversedSelectionObject - Selection object with monomers as keys and list of positions as values\n * @return - Distribution group host\n */\nfunction getDistributionForMonomers(table: DG.DataFrame, options: DistributionItemOptions,\n reversedSelectionObject: Selection): HTMLDivElement {\n const monomers = Object.keys(reversedSelectionObject);\n const rowCount = table.rowCount;\n const distributions: HTMLDivElement[] = [];\n const positionColumns: (DG.Column<string> | undefined)[] = [];\n const positionColumnsCategories: (string[] | undefined)[] = [];\n const positionColumnsData: (Int32Array | undefined)[] = [];\n const activityColData = options.activityCol.getRawData();\n\n for (const monomer of monomers) {\n const posList = reversedSelectionObject[monomer];\n const mask = new BitArray(rowCount);\n\n for (let posIdx = 0; posIdx < posList.length; posIdx++) {\n const position = posList[posIdx];\n positionColumns[posIdx] ??= table.getCol(position);\n positionColumnsCategories[posIdx] ??= positionColumns[posIdx]!.categories;\n positionColumnsData[posIdx] ??= positionColumns[posIdx]!.getRawData() as Int32Array;\n\n const monomerCategoryIndex = positionColumnsCategories[posIdx]!.indexOf(monomer);\n for (let i = 0; i < rowCount; i++) {\n if (positionColumnsData[posIdx]![i] === monomerCategoryIndex)\n mask.setTrue(i);\n }\n }\n const stats = getStats(activityColData, mask);\n\n distributions.push(getSingleDistribution(table, stats, options, {[SPLIT_CATEGORY.SELECTION]: monomer}));\n }\n\n return ui.div(distributions, 'd4-flex-wrap');\n}\n\n/**\n * Converts monomer-position selection object to have monomers as keys and list of positions as values\n * @param selectionObject - Selection object\n * @return - Reversed selection object\n */\nfunction getReversedObject(selectionObject: Selection): Selection {\n const reversedSelectionObject: Selection = {};\n const positions = Object.keys(selectionObject);\n for (const position of positions) {\n for (const monomer of selectionObject[position]) {\n if (!reversedSelectionObject.hasOwnProperty(monomer)) {\n reversedSelectionObject[monomer] = [position];\n continue;\n }\n if (!reversedSelectionObject[monomer].includes(position))\n reversedSelectionObject[monomer].push(position);\n }\n }\n return reversedSelectionObject;\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as C from '../utils/constants';\nimport * as type from '../utils/types';\nimport {addExpandIconGen, getSeparator, setGridProps} from '../utils/misc';\nimport {renderCellSelection} from '../utils/cell-renderer';\n\nexport type MutationCliffsOptions = {\n mutationCliffs: type.MutationCliffs, mutationCliffsSelection: type.Selection, sequenceColumnName: string,\n positionColumns: DG.Column<string>[], gridColumns: DG.GridColumnList, activityCol: DG.Column<number>,\n};\n\n/**\n * Creates mutation cliffs widget that shows grid of sequences that form mutation cliffs pairs as well as\n * grid of mutation cliffs pairs themselves.\n * @param table - table with sequences.\n * @param options - options for mutation cliffs widget.\n * @param allowExpand - whether to allow expand icon in the grid.\n * @return - mutation cliffs widget.\n */\nexport function mutationCliffsWidget(\n table: DG.DataFrame, options: MutationCliffsOptions, allowExpand = true,\n): DG.Widget {\n //addExpandIcon(pairsGrid);\n //addExpandIcon(uniqueSequencesGrid);\n const res = cliffsPairsWidgetParts(table, options);\n if (!res)\n return new DG.Widget(ui.label('No mutations table generated'));\n const {pairsGrid, uniqueSequencesGrid, aminoToInput} = res;\n const comboGrids = [pairsGrid, uniqueSequencesGrid];\n const widgetRoot = ui.divV([aminoToInput.root, ...comboGrids.map((grid) => grid.root)],\n {style: {width: '100%'}});\n if (allowExpand) {\n addExpandIconGen('Mutation Cliffs pairs', aminoToInput.root, widgetRoot,\n () => {\n const parts = cliffsPairsWidgetParts(table, options);\n return ui.divV([parts!.aminoToInput.root, parts!.pairsGrid.root, parts!.uniqueSequencesGrid.root],\n {style: {width: '100%', height: '100%'}});\n });\n }\n\n return new DG.Widget(widgetRoot);\n}\n\n\nfunction cliffsPairsWidgetParts(table: DG.DataFrame, options: MutationCliffsOptions):\n {pairsGrid: DG.Grid, uniqueSequencesGrid: DG.Grid, aminoToInput: DG.InputBase<string>} | null {\n const filteredIndexes = table.filter.getSelectedIndexes();\n const positions = Object.keys(options.mutationCliffsSelection);\n\n if (!positions.length || options.mutationCliffs === null)\n return null;\n\n\n const substitutionsArray: string[] = [];\n const deltaArray: number[] = [];\n const substitutedToArray: string[] = [];\n const fromIdxArray: number[] = [];\n const toIdxArray: number[] = [];\n const alignedSeqCol = table.getCol(options.sequenceColumnName!);\n const alignedSeqColCategories = alignedSeqCol.categories;\n const alignedSeqColData = alignedSeqCol.getRawData();\n // const activityScaledCol = table.getCol(C.COLUMNS_NAMES.ACTIVITY);\n const activityScaledColData = options.activityCol.getRawData();\n const seenIndexes = new Map<number, number[]>();\n const uniqueSequencesBitSet = DG.BitSet.create(table.rowCount);\n\n const positionColumns: { [colName: string]: DG.Column<string> } =\n Object.fromEntries(options.positionColumns.map((col) => [col.name, col]));\n for (const pos of positions) {\n const posCol = positionColumns[pos];\n const posColCategories = posCol.categories;\n const posColData = posCol.getRawData();\n\n for (const monomer of options.mutationCliffsSelection[pos]) {\n const substitutionsMap = options.mutationCliffs.get(monomer)\n ?.get(pos) as Map<number, type.UTypedArray> | undefined;\n if (typeof substitutionsMap === 'undefined')\n continue;\n\n\n for (const [referenceIdx, indexArray] of substitutionsMap.entries()) {\n if (!filteredIndexes.includes(referenceIdx))\n continue;\n\n\n const forbiddentIndexes = seenIndexes.get(referenceIdx) ?? [];\n const baseSequence = alignedSeqColCategories[alignedSeqColData[referenceIdx]];\n const baseActivity = activityScaledColData[referenceIdx];\n\n for (const subIdx of indexArray) {\n if (forbiddentIndexes.includes(subIdx) || !filteredIndexes.includes(subIdx))\n continue;\n\n\n if (!seenIndexes.has(subIdx))\n seenIndexes.set(subIdx, []);\n\n\n const subSeq = alignedSeqColCategories[alignedSeqColData[subIdx]];\n\n seenIndexes.get(subIdx)!.push(referenceIdx);\n substitutionsArray.push(`${baseSequence}#${subSeq}`);\n deltaArray.push(baseActivity - activityScaledColData[subIdx]);\n substitutedToArray.push(posColCategories[posColData[subIdx]]);\n fromIdxArray.push(referenceIdx);\n toIdxArray.push(subIdx);\n uniqueSequencesBitSet.set(referenceIdx, true);\n uniqueSequencesBitSet.set(subIdx, true);\n }\n }\n }\n }\n\n if (substitutionsArray.length === 0)\n return null;\n\n\n const substCol = DG.Column.fromStrings('Mutation', substitutionsArray);\n const activityDeltaCol = DG.Column.fromList('double', 'Delta', deltaArray);\n const hiddenSubstToAarCol = DG.Column.fromStrings('~to', substitutedToArray);\n const toIdxCol = DG.Column.fromList(DG.COLUMN_TYPE.INT, '~toIdx', toIdxArray);\n const fromIdxCol = DG.Column.fromList(DG.COLUMN_TYPE.INT, '~fromIdx', fromIdxArray);\n const pairsTable = DG.DataFrame.fromColumns([substCol, activityDeltaCol, hiddenSubstToAarCol, toIdxCol, fromIdxCol]);\n pairsTable.name = 'Mutation Cliff pairs';\n\n const aminoToInput = ui.input.string('Mutated to:', {value: '', onValueChanged: () => {\n const substitutedToAar = aminoToInput.stringValue;\n if (substitutedToAar !== '')\n pairsTable.filter.init((idx) => hiddenSubstToAarCol.get(idx) === substitutedToAar);\n else\n pairsTable.filter.setAll(true);\n }});\n aminoToInput.setTooltip('Filter the rows by the monomer that the mutation was substituted to');\n\n const pairsGrid = pairsTable.plot.grid();\n setGridProps(pairsGrid, true);\n substCol.semType = C.SEM_TYPES.MACROMOLECULE_DIFFERENCE;\n substCol.tags[C.TAGS.SEPARATOR] = getSeparator(alignedSeqCol);\n substCol.tags[DG.TAGS.UNITS] = alignedSeqCol.tags[DG.TAGS.UNITS];\n substCol.tags[DG.TAGS.CELL_RENDERER] = 'MacromoleculeDifference';\n\n let keyPress = false;\n let lastSelectedIndex: number | null = null;\n const pairsSelectedIndexes: number[] = [];\n pairsGrid.onCurrentCellChanged.subscribe((gridCell: DG.GridCell) => {\n try {\n if (!gridCell || !gridCell.dart) {\n pairsSelectedIndexes.length = 0;\n setUniqueSeqGridFilter();\n return;\n } // this may happen on escape key press\n const rowIdx = gridCell.tableRowIndex;\n if (!keyPress)\n return;\n\n if (rowIdx === null) {\n pairsSelectedIndexes.length = 0;\n setUniqueSeqGridFilter();\n return;\n }\n\n if (lastSelectedIndex !== null)\n pairsSelectedIndexes.splice(pairsSelectedIndexes.indexOf(lastSelectedIndex), 1);\n\n\n if (!pairsSelectedIndexes.includes(rowIdx)) {\n pairsSelectedIndexes.push(rowIdx);\n pairsGrid.invalidate();\n }\n setUniqueSeqGridFilter();\n } finally {\n keyPress = false;\n lastSelectedIndex = gridCell && gridCell.dart ? gridCell.tableRowIndex : null;\n }\n });\n pairsGrid.root.addEventListener('keydown', (event) => {\n keyPress = event.key.startsWith('Arrow');\n });\n pairsGrid.root.addEventListener('click', (event) => {\n const gridCell = pairsGrid.hitTest(event.offsetX, event.offsetY);\n if (!gridCell || gridCell.tableRowIndex === null)\n return;\n\n\n const rowIdx = gridCell.tableRowIndex;\n if (!event.shiftKey) {\n pairsSelectedIndexes.length = 0;\n pairsSelectedIndexes.push(rowIdx);\n } else {\n const rowIdxIdx = pairsSelectedIndexes.indexOf(rowIdx);\n if (rowIdxIdx === -1)\n pairsSelectedIndexes.push(rowIdx);\n else\n pairsSelectedIndexes.splice(rowIdxIdx, 1);\n }\n setUniqueSeqGridFilter();\n pairsGrid.invalidate();\n uniqueSequencesGrid.invalidate();\n });\n pairsGrid.onCellRender.subscribe((gcArgs) => {\n if (gcArgs.cell.tableColumn?.name !== substCol.name || !pairsSelectedIndexes.includes(gcArgs.cell.tableRowIndex!))\n return;\n\n\n renderCellSelection(gcArgs.g, gcArgs.bounds);\n });\n\n const originalGridColCount = options.gridColumns.length;\n const columnNames: string[] = [];\n for (let colIdx = 1; colIdx < originalGridColCount; colIdx++) {\n const gridCol = options.gridColumns.byIndex(colIdx);\n if (gridCol?.name === options.sequenceColumnName ||\n (gridCol?.visible === true && !Object.hasOwn(positionColumns, gridCol.name)))\n columnNames.push(gridCol!.name);\n }\n\n const uniqueSequencesTable = table.clone(uniqueSequencesBitSet, columnNames);\n uniqueSequencesTable.name = 'Unique sequences that form Mutation Cliffs pairs';\n const seqIdxCol = uniqueSequencesTable.columns.addNewInt('~seqIdx');\n const seqIdxColData = seqIdxCol.getRawData();\n const selectedIndexes = uniqueSequencesBitSet.getSelectedIndexes();\n seqIdxCol.init((idx) => selectedIndexes[idx]);\n const uniqueSequencesGrid = uniqueSequencesTable.plot.grid();\n setGridProps(uniqueSequencesGrid, true);\n uniqueSequencesGrid.props.rowHeight = 20;\n\n function setUniqueSeqGridFilter(): void {\n const uniqueSelectedIndexes: number[] = [];\n for (const idx of pairsSelectedIndexes) {\n uniqueSelectedIndexes.push(fromIdxCol.get(idx)!);\n uniqueSelectedIndexes.push(toIdxCol.get(idx)!);\n }\n uniqueSequencesTable.filter.init(\n (idx) => pairsSelectedIndexes.length === 0 || uniqueSelectedIndexes.includes(seqIdxColData[idx]), true);\n pairsGrid.invalidate();\n uniqueSequencesGrid.invalidate();\n }\n pairsGrid.root.style.width = '100% !important';\n uniqueSequencesGrid.root.style.width = '100% !important';\n setTimeout(() => {\n pairsGrid.root.style.removeProperty('width');\n pairsGrid.root.style.setProperty('width', '100%');\n uniqueSequencesGrid.root.style.removeProperty('width');\n uniqueSequencesGrid.root.style.setProperty('width', '100%');\n pairsGrid.root.style.height = 'unset';\n uniqueSequencesGrid.root.style.height = 'unset';\n }, 200);\n\n return {pairsGrid, uniqueSequencesGrid, aminoToInput};\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 '../styles.css';\nimport * as C from '../utils/constants';\nimport * as type from '../utils/types';\nimport {PeptidesModel, VIEWER_TYPE} from '../model';\nimport $ from 'cash-dom';\nimport {scaleActivity} from '../utils/misc';\nimport {ALIGNMENT, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {ILogoSummaryTable, LogoSummaryTable} from '../viewers/logo-summary';\n\nexport type DialogParameters = { host: HTMLElement, callback: () => Promise<boolean> };\n\n/**\n * Peptides analysis parameters UI\n * @param df - Dataframe with peptides\n * @param [col] - Peptides column\n * @return - UI host and analysis start callback\n */\nexport function analyzePeptidesUI(df: DG.DataFrame, col?: DG.Column<string>): DialogParameters {\n const logoHost = ui.div();\n let seqColInput: DG.InputBase | null = null;\n if (typeof col === 'undefined') {\n // Building UI for starting analysis from dialog (top menu)\n const potentialCol = DG.Utils.firstOrNull(\n df.columns.toList().filter((dfCol) => dfCol.semType === DG.SEMTYPE.MACROMOLECULE));\n if (potentialCol === null)\n throw new Error('Peptides Error: table doesn\\'t contain sequence columns');\n else if (potentialCol.stats.missingValueCount !== 0)\n grok.shell.info('Sequences column contains missing values. They will be ignored during analysis');\n\n\n seqColInput = ui.input.column('Sequence', {table: df, value: potentialCol, onValueChanged: () => {\n const seqCol = seqColInput!.value;\n $(logoHost).empty().append(ui.wait(async () => {\n const viewer = await df.plot.fromType('WebLogo', {sequenceColumnName: seqCol.name});\n viewer.root.style.setProperty('height', '130px');\n return viewer.root;\n }));\n if (seqCol.stats.missingValueCount !== 0)\n grok.shell.info('Sequences column contains missing values. They will be ignored during analysis');\n }, filter: (col: DG.Column) => col.semType === DG.SEMTYPE.MACROMOLECULE});\n seqColInput.setTooltip('Macromolecule column in FASTA, HELM or separated format');\n } else if (!(col.getTag(bioTAGS.aligned) === ALIGNMENT.SEQ_MSA) &&\n col.getTag(DG.TAGS.UNITS) !== NOTATION.HELM) {\n return {\n host: ui.label('Peptides analysis only works with aligned sequences'),\n callback: async (): Promise<boolean> => false,\n };\n }\n\n let funcs = DG.Func.find({package: 'Bio', name: 'webLogoViewer'});\n if (funcs.length === 0) {\n return {\n host: ui.label('Bio package is missing or out of date. Please install the latest version.'),\n callback: async (): Promise<boolean> => false,\n };\n }\n\n funcs = DG.Func.find({package: 'Bio', name: 'getBioLib'});\n if (funcs.length === 0) {\n return {\n host: ui.label('Bio package is missing or out of date. Please install the latest version.'),\n callback: async (): Promise<boolean> => false,\n };\n }\n\n // Activity column properties\n let scaledCol: DG.Column<number>;\n const defaultActivityColumn: DG.Column<number> | null = df.col('activity') || df.col('IC50') ||\n DG.Utils.firstOrNull(df.columns.numerical);\n const histogramHost = ui.div([], {id: 'pep-hist-host'});\n\n const activityScalingMethod = ui.input.choice(\n 'Scaling', {value: C.SCALING_METHODS.NONE, items: Object.values(C.SCALING_METHODS),\n onValueChanged: async (input): Promise<void> => {\n scaledCol = scaleActivity(activityColumnChoice.value!, input.value);\n\n const hist = DG.DataFrame.fromColumns([scaledCol]).plot.histogram({\n filteringEnabled: false, valueColumnName: C.COLUMNS_NAMES.ACTIVITY, legendVisibility: 'Never', showXAxis: true,\n showColumnSelector: false, showRangeSlider: false, showBinSelector: false,\n });\n histogramHost.lastChild?.remove();\n histogramHost.appendChild(hist.root);\n }}) as DG.InputBase<C.SCALING_METHODS | null>;\n activityScalingMethod.setTooltip('Activity column transformation method');\n\n const activityScalingMethodState = (): void => {\n activityScalingMethod.enabled = (activityColumnChoice.value ?? false) && activityColumnChoice.value!.stats.min > 0;\n activityScalingMethod.value = C.SCALING_METHODS.NONE;\n if (activityColumnChoice.value!.stats.missingValueCount !== 0)\n grok.shell.info('Activity column contains missing values. They will be ignored during analysis');\n };\n const activityColumnChoice = ui.input.column('Activity', {table: df, value: defaultActivityColumn!,\n onValueChanged: activityScalingMethodState, filter: (col: DG.Column) => col.type === DG.TYPE.INT || col.type === DG.TYPE.FLOAT || col.type === DG.TYPE.QNUM});\n activityColumnChoice.setTooltip('Numerical activity column');\n const clustersColumnChoice = ui.input.column('Clusters', {table: df, onValueChanged: () => {\n if (clustersColumnChoice.value) {\n generateClustersInput.value = false;\n generateClustersInput.fireChanged();\n }\n }});\n clustersColumnChoice.setTooltip('Optional. Clusters column is used to create Logo Summary Table');\n clustersColumnChoice.nullable = true;\n // clustering input\n const generateClustersInput = ui.input.bool('Generate clusters', {value: true, onValueChanged: () => {\n if (generateClustersInput.value) {\n //@ts-ignore\n clustersColumnChoice.value = null;\n clustersColumnChoice.fireChanged();\n }\n }});\n generateClustersInput\n .setTooltip('Generate clusters column based on sequence space embeddings for Logo Summary Table');\n activityColumnChoice.fireChanged();\n activityScalingMethod.fireChanged();\n generateClustersInput.fireChanged();\n\n\n const inputsList = [activityColumnChoice, activityScalingMethod, clustersColumnChoice, generateClustersInput];\n if (seqColInput !== null)\n inputsList.splice(0, 0, seqColInput);\n\n\n const bitsetChanged = df.filter.onChanged.subscribe(() => activityScalingMethodState());\n\n const startAnalysisCallback = async (): Promise<boolean> => {\n const sequencesCol = col ?? seqColInput!.value;\n bitsetChanged.unsubscribe();\n if (sequencesCol) {\n const model = await startAnalysis(activityColumnChoice.value!, sequencesCol, clustersColumnChoice.value, df,\n scaledCol, activityScalingMethod.value ?? C.SCALING_METHODS.NONE, {addSequenceSpace: false, addMCL: true,\n useEmbeddingsClusters: generateClustersInput.value ?? false});\n return model !== null;\n }\n return false;\n };\n\n let bottomHeight = 'auto';\n const inputElements: HTMLElement[] = [ui.divV(inputsList)];\n $(inputElements[0]).find('label').css('width', 'unset');\n if (typeof col !== 'undefined') {\n const startBtn = ui.button('Launch SAR', startAnalysisCallback, '');\n startBtn.style.alignSelf = 'center';\n inputElements.push(startBtn);\n bottomHeight = '215px';\n }\n\n $(logoHost).empty().append(ui.wait(async () => {\n const viewer = await df.plot.fromType('WebLogo', {sequenceColumnName: col?.name ?? seqColInput!.value!.name});\n viewer.root.style.setProperty('height', '130px');\n return viewer.root;\n }));\n\n const mainHost = ui.divV([\n logoHost,\n ui.splitH([\n ui.splitV(inputElements),\n histogramHost,\n ], {style: {height: bottomHeight, minWidth: '500px', maxWidth: '600px'}}),\n ]);\n return {host: mainHost, callback: startAnalysisCallback};\n}\n\ntype AnalysisOptions = {\n addSequenceSpace?: boolean,\n useEmbeddingsClusters?: boolean,\n addMCL?: boolean,\n};\n\n/**\n * Creates dataframe to use in analysis, model instance and adds viewers\n * @param activityColumn - Activity column\n * @param peptidesCol - Peptides column\n * @param clustersColumn - Clusters column or null\n * @param sourceDf - Source dataframe\n * @param scaledCol - Scaled activity column\n * @param scaling - Activity scaling method\n * @param options - Additional options\n * @return - Peptides model instance or null\n */\nexport async function startAnalysis(activityColumn: DG.Column<number>, peptidesCol: DG.Column<string>,\n clustersColumn: DG.Column | null, sourceDf: DG.DataFrame, scaledCol: DG.Column<number>, scaling: C.SCALING_METHODS,\n options: AnalysisOptions = {}): Promise<PeptidesModel | null> {\n let model: PeptidesModel | null = null;\n if (activityColumn.type !== DG.COLUMN_TYPE.FLOAT && activityColumn.type !== DG.COLUMN_TYPE.INT &&\n activityColumn.type !== DG.COLUMN_TYPE.QNUM\n ) {\n grok.shell.error('The activity column must be of numeric type!');\n return model;\n }\n const progress = DG.TaskBarProgressIndicator.create('Loading SAR...');\n\n // Prepare new DF\n const newDf = DG.DataFrame.create(sourceDf.rowCount);\n newDf.name = 'Peptides analysis';\n const newDfCols = newDf.columns;\n newDfCols.add(scaledCol);\n for (const col of sourceDf.columns) {\n if (col.getTag(C.TAGS.ANALYSIS_COL) !== `${true}`) {\n if (col.name.toLowerCase() === scaledCol.name.toLowerCase())\n col.name = sourceDf.columns.getUnusedName(col.name);\n\n\n newDfCols.add(col);\n }\n }\n\n const settings: type.PeptidesSettings = {\n sequenceColumnName: peptidesCol.name, activityColumnName: activityColumn.name, activityScaling: scaling,\n columns: {}, showDendrogram: false, showSequenceSpace: false,\n sequenceSpaceParams: new type.SequenceSpaceParams(!!options.useEmbeddingsClusters && !clustersColumn),\n mclSettings: new type.MCLSettings(),\n };\n\n if (clustersColumn) {\n const clusterCol = newDf.getCol(clustersColumn.name);\n if (clusterCol.type !== DG.COLUMN_TYPE.STRING)\n newDfCols.replace(clusterCol, clusterCol.convertTo(DG.COLUMN_TYPE.STRING));\n }\n newDf.setTag(C.TAGS.SETTINGS, JSON.stringify(settings));\n\n const bitset = DG.BitSet.create(sourceDf.rowCount,\n (i) => !activityColumn.isNone(i) && !peptidesCol.isNone(i) && sourceDf.filter.get(i));\n\n // Cloning dataframe with applied filter. If filter is not applied, cloning is\n // needed anyway to allow filtering on the original dataframe\n model = PeptidesModel.getInstance(newDf.clone(bitset));\n model.init(settings);\n if (clustersColumn) {\n const lstProps: ILogoSummaryTable = {\n clustersColumnName: clustersColumn.name, sequenceColumnName: peptidesCol.name, activityScaling: scaling,\n activityColumnName: activityColumn.name,\n };\n await model.addLogoSummaryTable(lstProps);\n }\n await model.addMonomerPosition();\n await model.addMostPotentResidues();\n\n // FIXME: enable by default for tests\n if (options.addSequenceSpace ?? false) {\n await model.addSequenceSpace({clusterCol: clustersColumn, clusterEmbeddings: options.useEmbeddingsClusters});\n if (!clustersColumn && (options.useEmbeddingsClusters ?? false)) {\n const clusterCol = model._sequenceSpaceCols\n .find((col) => model!.df.col(col) && model!.df.col(col)?.type === DG.COLUMN_TYPE.STRING);\n if (clusterCol) {\n const lstProps: ILogoSummaryTable = {\n clustersColumnName: clusterCol, sequenceColumnName: peptidesCol.name, activityScaling: scaling,\n activityColumnName: activityColumn.name,\n };\n await model.addLogoSummaryTable(lstProps);\n setTimeout(() => {\n model && (model?.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable)?.render &&\n (model?.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable)?.render();\n }, 100);\n }\n }\n } else if (options.addMCL ?? false) {\n await model.addMCLClusters();\n if (!clustersColumn && (options.useEmbeddingsClusters ?? false)) {\n const mclClusterCol = model._mclCols\n .find(\n (col) => model?.df.col(col) && col.toLowerCase().startsWith('cluster') && !col.toLowerCase().includes('size'),\n );\n if (mclClusterCol) {\n const lstProps: ILogoSummaryTable = {\n clustersColumnName: mclClusterCol, sequenceColumnName: peptidesCol.name, activityScaling: scaling,\n activityColumnName: activityColumn.name,\n };\n await model.addLogoSummaryTable(lstProps);\n setTimeout(() => {\n model && (model?.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable)?.render &&\n (model?.findViewer(VIEWER_TYPE.LOGO_SUMMARY_TABLE) as LogoSummaryTable)?.render();\n }, 100);\n }\n }\n }\n\n\n progress.close();\n return model;\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as type from '../utils/types';\nimport * as C from '../utils/constants';\nimport {PeptidesModel, VIEWER_TYPE} from '../model';\n\nimport $ from 'cash-dom';\nimport wu from 'wu';\nimport {getTreeHelperInstance} from '../package';\nimport {\n MmDistanceFunctionsNames,\n MmDistanceFunctionsNames as distFNames\n} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\n\ntype PaneInputs = { [paneName: string]: DG.InputBase[] };\ntype SettingsElements = { dialog: DG.Dialog, accordion: DG.Accordion, inputs: PaneInputs };\n\nexport enum SETTINGS_PANES {\n GENERAL = 'General',\n VIEWERS = 'Viewers',\n COLUMNS = 'Columns',\n SEQUENCE_SPACE = 'Sequence space',\n MCL = 'MCL',\n}\n\nexport enum GENERAL_INPUTS {\n ACTIVITY = 'Activity',\n ACTIVITY_SCALING = 'Activity scaling',\n}\n\nexport enum VIEWERS_INPUTS {\n DENDROGRAM = VIEWER_TYPE.DENDROGRAM,\n}\n\nexport enum COLUMNS_INPUTS {\n IS_INCLUDED = '',\n AGGREGATION = 'Aggregation',\n}\nexport enum SEQUENCE_SPACE_INPUTS {\n DISTANCE_FUNCTION = 'Distance Function',\n GAP_OPEN = 'Gap Open Penalty',\n GAP_EXTEND = 'Gap Extend Penalty',\n CLUSTER_EMBEDDINGS = 'Cluster Embeddings',\n EPSILON = 'Epsilon',\n MIN_PTS = 'Minimum Points',\n FINGERPRINT_TYPE = 'Fingerprint Type',\n}\n\nexport enum MCL_INPUTS {\n DISTANCE_FUNCTION = 'Distance Function',\n GAP_OPEN = 'Gap Open Penalty',\n GAP_EXTEND = 'Gap Extend Penalty',\n FINGERPRINT_TYPE = 'Fingerprint Type',\n THRESHOLD = 'Similarity Threshold',\n INFLATION = 'Inflation Factor',\n MAX_ITERATIONS = 'Max Iterations',\n}\n\n\nexport const PANES_INPUTS = {\n [SETTINGS_PANES.GENERAL]: GENERAL_INPUTS,\n [SETTINGS_PANES.VIEWERS]: VIEWERS_INPUTS,\n [SETTINGS_PANES.COLUMNS]: COLUMNS_INPUTS,\n [SETTINGS_PANES.SEQUENCE_SPACE]: SEQUENCE_SPACE_INPUTS,\n [SETTINGS_PANES.MCL]: MCL_INPUTS,\n};\n\n/**\n * Creates settings dialog for peptides analysis.\n * @param model - Peptides analysis model.\n * @return - Settings dialog elements.\n */\nexport function getSettingsDialog(model: PeptidesModel): SettingsElements {\n if (model.settings == null)\n grok.log.error('PeptidesError: Settings are not initialized');\n\n const accordion = ui.accordion();\n const settings = model.settings;\n const currentScaling = settings?.activityScaling ?? C.SCALING_METHODS.NONE;\n const currentColumns = settings?.columns ?? {};\n\n const result: type.PartialPeptidesSettings = {};\n const inputs: PaneInputs = {};\n const seqSpaceParams = settings?.sequenceSpaceParams ?? new type.SequenceSpaceParams();\n const mclParams = settings?.mclSettings ?? new type.MCLSettings();\n // General pane options\n const activityCol = ui.input.column(GENERAL_INPUTS.ACTIVITY, {table: model.df,\n value: model.df.getCol(model.settings!.activityColumnName!), onValueChanged: () => result.activityColumnName = activityCol.value!.name,\n filter: (col: DG.Column) => (col.type === DG.TYPE.FLOAT || col.type === DG.TYPE.INT) &&\n col.name !== C.COLUMNS_NAMES.ACTIVITY && col.stats.missingValueCount === 0});\n activityCol.setTooltip('Numeric activity column');\n const activityScaling =\n ui.input.choice(GENERAL_INPUTS.ACTIVITY_SCALING, {value: currentScaling, items: Object.values(C.SCALING_METHODS),\n onValueChanged: () => result.activityScaling = activityScaling.value as C.SCALING_METHODS}) as DG.InputBase<C.SCALING_METHODS>;\n activityScaling.setTooltip('Activity column transformation method');\n\n accordion.addPane(SETTINGS_PANES.GENERAL, () => ui.inputs([activityCol, activityScaling]), true);\n inputs[SETTINGS_PANES.GENERAL] = [activityCol, activityScaling];\n\n // Viewers pane options\n /* FIXME: combinations of adding and deleting viewers are not working properly\n const isMPEnabled = wu(model.analysisView.viewers).some((v) => v.type === VIEWER_TYPE.MONOMER_POSITION);\n const monomerPosition = ui.input.bool(VIEWER_TYPE.MONOMER_POSITION, {value: isMPEnabled ?? false,\n onValueChanged: () => result.showMostPotentResidues = monomerPosition.value!});\n const isMPREnabled = wu(model.analysisView.viewers).some((v) => v.type === VIEWER_TYPE.MOST_POTENT_RESIDUES);\n const mostPotentResidues = ui.input.bool(VIEWER_TYPE.MOST_POTENT_RESIDUES, {value: isMPREnabled ?? false,\n onValueChanged: () => result.showMonomerPosition = mostPotentResidues.value!});\n const isLSTEnabled = wu(model.analysisView.viewers).some((v) => v.type === VIEWER_TYPE.LOGO_SUMMARY_TABLE);\n const logoSummaryTable = ui.input.bool(VIEWER_TYPE.LOGO_SUMMARY_TABLE, {value: isLSTEnabled ?? false,\n onValueChanged: () => result.showLogoSummaryTable = logoSummaryTable.value!});\n logoSummaryTable.enabled = typeof settings.clustersColumnName !== 'undefined';\n */\n const isDendrogramEnabled = wu(model.analysisView.viewers).some((v) => v.type === VIEWER_TYPE.DENDROGRAM);\n const dendrogram = ui.input.bool(VIEWER_TYPE.DENDROGRAM, {value: isDendrogramEnabled ?? false,\n onValueChanged: () => result.showDendrogram = dendrogram.value}) as DG.InputBase<boolean>;\n const clusterMaxActivity = ui.input.bool(VIEWER_TYPE.CLUSTER_MAX_ACTIVITY, {value: !!settings?.showClusterMaxActivity,\n onValueChanged: () => {result.showClusterMaxActivity = clusterMaxActivity.value ?? undefined;}});\n const showSeqSpace = ui.input.bool('Sequence space', {value: !!settings?.showSequenceSpace,\n onValueChanged: () => {\n result.showSequenceSpace = showSeqSpace.value ?? undefined;\n if (showSeqSpace.value) {\n seqSpacePane.root.style.display = 'flex';\n if (!settings?.showSequenceSpace)\n result.sequenceSpaceParams = seqSpaceParams;\n } else {\n seqSpacePane.root.style.display = 'none';\n delete result.sequenceSpaceParams;\n }\n if (result.showSequenceSpace === settings?.showSequenceSpace)\n delete result.showSequenceSpace;\n }});\n clusterMaxActivity.setTooltip('Show cluster max activity viewer');\n dendrogram.setTooltip('Show dendrogram viewer');\n dendrogram.enabled = getTreeHelperInstance() !== null;\n\n accordion.addPane(SETTINGS_PANES.VIEWERS, () => ui.inputs([dendrogram, showSeqSpace, clusterMaxActivity]), true);\n inputs[SETTINGS_PANES.VIEWERS] = [dendrogram, showSeqSpace, clusterMaxActivity];\n\n // Columns to include pane options\n const inputsRows: HTMLElement[] = [];\n const includedColumnsInputs: DG.InputBase[] = [];\n for (const col of model.df.columns.numerical) {\n const colName = col.name;\n if (colName === settings!.activityColumnName || colName === C.COLUMNS_NAMES.ACTIVITY)\n continue;\n\n\n const isIncludedInput = ui.input.bool(COLUMNS_INPUTS.IS_INCLUDED, {value: typeof (currentColumns)[colName] !== 'undefined',\n onValueChanged: () => {\n result.columns ??= {};\n if (isIncludedInput.value)\n result.columns[colName] = aggregationInput.value;\n else {\n delete result.columns[colName];\n if (Object.keys(result.columns).length === Object.keys(currentColumns).length)\n delete result.columns;\n }\n }}) as DG.InputBase<boolean>;\n isIncludedInput.setTooltip('Include aggregated column value in tooltips, Logo Summary Table and ' +\n 'Distribution panel');\n\n const aggregationInput = ui.input.choice(COLUMNS_INPUTS.AGGREGATION, {value: (currentColumns)[colName] ?? DG.AGG.AVG,\n items: Object.values(DG.STATS), onValueChanged: () => {\n result.columns ??= {};\n if (isIncludedInput.value)\n result.columns[colName] = aggregationInput.value;\n else {\n delete result.columns[col.name];\n if (Object.keys(result.columns).length === Object.keys(currentColumns).length)\n delete result.columns;\n }\n }}) as DG.InputBase<DG.AggregationType>;\n aggregationInput.setTooltip('Aggregation method');\n $(aggregationInput.root).find('label').css('width', 'auto');\n const inputsRow = ui.inputsRow(col.name, [isIncludedInput, aggregationInput]);\n includedColumnsInputs.push(...[isIncludedInput, aggregationInput]);\n $(inputsRow).find('div.ui-div').css('display', 'inline-flex');\n inputsRows.push(inputsRow);\n }\n if (inputsRows.length !== 0) {\n accordion.addPane(SETTINGS_PANES.COLUMNS, () => ui.divV(inputsRows), false);\n inputs[SETTINGS_PANES.COLUMNS] = includedColumnsInputs;\n }\n\n // Sequence space pane options\n const modifiedSeqSpaceParams: Partial<type.SequenceSpaceParams> = {};\n function onSeqSpaceParamsChange(fieldName: keyof type.SequenceSpaceParams, value: any): void {\n correctSeqSpaceInputs();\n if (value === null || value === undefined || value === '')\n return;\n modifiedSeqSpaceParams[fieldName] = value;\n let isAllSame = true;\n for (const [key, val] of Object.entries(modifiedSeqSpaceParams)) {\n if (val !== seqSpaceParams[key as keyof type.SequenceSpaceParams]) {\n isAllSame = false;\n break;\n }\n }\n if (isAllSame)\n delete result.sequenceSpaceParams;\n else\n result.sequenceSpaceParams = {...seqSpaceParams, ...modifiedSeqSpaceParams};\n }\n\n function toggleInputs(nwInputs: DG.InputBase[], condition: boolean): void {\n nwInputs.forEach((input) => {\n if (condition)\n input.root.style.display = 'flex';\n else\n input.root.style.display = 'none';\n });\n }\n // SEQ SPACE INPUTS\n const distanceFunctionInput: DG.ChoiceInput<MmDistanceFunctionsNames> = ui.input.choice(SEQUENCE_SPACE_INPUTS.DISTANCE_FUNCTION,\n {value: seqSpaceParams.distanceF, items: [distFNames.NEEDLEMANN_WUNSCH, distFNames.HAMMING, distFNames.LEVENSHTEIN, distFNames.MONOMER_CHEMICAL_DISTANCE],\n onValueChanged: () => onSeqSpaceParamsChange('distanceF', distanceFunctionInput.value)}) as DG.ChoiceInput<MmDistanceFunctionsNames>\n distanceFunctionInput.setTooltip('Distance function for sequences');\n const gapOpenInput = ui.input.float(SEQUENCE_SPACE_INPUTS.GAP_OPEN, {value: seqSpaceParams.gapOpen,\n onValueChanged: () => onSeqSpaceParamsChange('gapOpen', gapOpenInput.value)});\n const gapExtendInput = ui.input.float(SEQUENCE_SPACE_INPUTS.GAP_EXTEND, {value: seqSpaceParams.gapExtend,\n onValueChanged: () => onSeqSpaceParamsChange('gapExtend', gapExtendInput.value)});\n const clusterEmbeddingsInput =\n ui.input.bool(SEQUENCE_SPACE_INPUTS.CLUSTER_EMBEDDINGS, {value: seqSpaceParams.clusterEmbeddings ?? false,\n onValueChanged: () => onSeqSpaceParamsChange('clusterEmbeddings', clusterEmbeddingsInput.value)});\n clusterEmbeddingsInput.setTooltip('Cluster embeddings using DBSCAN algorithm');\n const epsilonInput = ui.input.float(SEQUENCE_SPACE_INPUTS.EPSILON, {value: seqSpaceParams.epsilon,\n onValueChanged: () => onSeqSpaceParamsChange('epsilon', epsilonInput.value)});\n epsilonInput.setTooltip(\n 'Epsilon parameter for DBSCAN. Minimum distance between two points to be considered as a cluster');\n const minPtsInput = ui.input.int(SEQUENCE_SPACE_INPUTS.MIN_PTS, {value: seqSpaceParams.minPts,\n onValueChanged: () => onSeqSpaceParamsChange('minPts', minPtsInput.value)});\n minPtsInput.setTooltip('Minimum number of points in a cluster');\n const fingerprintTypesInput: DG.ChoiceInput<string> = ui.input.choice(SEQUENCE_SPACE_INPUTS.FINGERPRINT_TYPE, {value: seqSpaceParams.fingerprintType,\n items: ['Morgan', 'RDKit', 'Pattern', 'AtomPair', 'MACCS', 'TopologicalTorsion'],\n onValueChanged: () => onSeqSpaceParamsChange('fingerprintType', fingerprintTypesInput.value)}) as DG.ChoiceInput<string>;\n function correctSeqSpaceInputs(): void {\n toggleInputs([gapOpenInput, gapExtendInput], distanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);\n toggleInputs([epsilonInput, minPtsInput], clusterEmbeddingsInput.value === true);\n toggleInputs([fingerprintTypesInput],\n distanceFunctionInput.value === distFNames.MONOMER_CHEMICAL_DISTANCE ||\n distanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);\n }\n correctSeqSpaceInputs();\n // END OF SEQ SPACE INPUTS\n\n //MCL INPUTS\n\n const modifiedMCLParams: Partial<type.MCLSettings> = {};\n function onMCLParamsChange(fieldName: keyof type.MCLSettings, value: any): void {\n correctMCLInputs();\n //correctSeqSpaceInputs();\n if (value === null || value === undefined || value === '')\n return;\n modifiedMCLParams[fieldName] = value;\n let isAllSame = true;\n for (const [key, val] of Object.entries(modifiedMCLParams)) {\n if (val !== mclParams[key as keyof type.MCLSettings]) {\n isAllSame = false;\n break;\n }\n }\n if (isAllSame)\n delete result.mclSettings;\n else\n result.mclSettings = {...mclParams, ...modifiedMCLParams};\n }\n\n function correctMCLInputs(): void {\n toggleInputs([mclGapOpenInput, mclGapExtendInput], mclDistanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);\n toggleInputs([mclFingerprintTypesInput],\n mclDistanceFunctionInput.value === distFNames.MONOMER_CHEMICAL_DISTANCE ||\n mclDistanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);\n }\n\n const mclDistanceFunctionInput: DG.ChoiceInput<MmDistanceFunctionsNames> = ui.input.choice(MCL_INPUTS.DISTANCE_FUNCTION,\n {value: mclParams.distanceF, items: [distFNames.NEEDLEMANN_WUNSCH, distFNames.MONOMER_CHEMICAL_DISTANCE, distFNames.HAMMING, distFNames.LEVENSHTEIN],\n onValueChanged: () => onMCLParamsChange('distanceF', mclDistanceFunctionInput.value)}) as DG.ChoiceInput<MmDistanceFunctionsNames>;\n const mclGapOpenInput = ui.input.float(MCL_INPUTS.GAP_OPEN, {value: mclParams.gapOpen,\n onValueChanged: () => onMCLParamsChange('gapOpen', mclGapOpenInput.value)});\n const mclGapExtendInput = ui.input.float(MCL_INPUTS.GAP_EXTEND, {value: mclParams.gapExtend,\n onValueChanged: () => onMCLParamsChange('gapExtend', mclGapExtendInput.value)});\n const mclFingerprintTypesInput: DG.ChoiceInput<string> = ui.input.choice(MCL_INPUTS.FINGERPRINT_TYPE, {value: mclParams.fingerprintType,\n items: ['Morgan', 'RDKit', 'Pattern', 'AtomPair', 'MACCS', 'TopologicalTorsion'],\n onValueChanged: () => onMCLParamsChange('fingerprintType', mclFingerprintTypesInput.value)}) as DG.ChoiceInput<string>;\n const mclThresholdInput = ui.input.int(MCL_INPUTS.THRESHOLD, {value: mclParams.threshold ?? 80,\n onValueChanged: () => onMCLParamsChange('threshold', mclThresholdInput.value)});\n const mclMaxIterationsInput = ui.input.int(MCL_INPUTS.MAX_ITERATIONS, {value: mclParams.maxIterations ?? 5,\n onValueChanged: () => onMCLParamsChange('maxIterations', mclMaxIterationsInput.value)});\n const mclInflationInput = ui.input.float(MCL_INPUTS.INFLATION, {value: mclParams.inflation ?? 1.4,\n onValueChanged: () => {onMCLParamsChange('inflation', mclInflationInput.value);}});\n correctMCLInputs();\n\n const mclInputs = [mclThresholdInput, mclDistanceFunctionInput, mclFingerprintTypesInput,\n mclGapOpenInput, mclGapExtendInput, mclInflationInput, mclMaxIterationsInput];\n\n accordion.addPane(SETTINGS_PANES.MCL, () => ui.inputs(mclInputs), true);\n inputs[SETTINGS_PANES.MCL] = mclInputs;\n // END OF MCL INPUTS\n\n const seqSpaceInputs = [distanceFunctionInput, fingerprintTypesInput, gapOpenInput,\n gapExtendInput, clusterEmbeddingsInput, epsilonInput, minPtsInput];\n const seqSpacePane = accordion.addPane(SETTINGS_PANES.SEQUENCE_SPACE, () => ui.inputs(seqSpaceInputs), true);\n inputs[SETTINGS_PANES.SEQUENCE_SPACE] = seqSpaceInputs;\n showSeqSpace.fireChanged();\n const dialog = ui.dialog('Peptides settings').add(accordion);\n dialog.root.style.width = '400px';\n dialog.onOK(() => {\n model.settings = result;\n });\n dialog.show();\n\n return {dialog, accordion, inputs};\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"wu\"] = factory();\n\telse\n\t\troot[\"wu\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _toConsumableArray = __webpack_require__(1)[\"default\"];\n\n\tvar _slicedToArray = __webpack_require__(39)[\"default\"];\n\n\tvar _Symbol$iterator = __webpack_require__(52)[\"default\"];\n\n\tvar _getIterator = __webpack_require__(40)[\"default\"];\n\n\tvar _regeneratorRuntime = __webpack_require__(54)[\"default\"];\n\n\tvar _Object$keys = __webpack_require__(80)[\"default\"];\n\n\tvar _Set = __webpack_require__(84)[\"default\"];\n\n\tvar _Promise = __webpack_require__(65)[\"default\"];\n\n\tvar wu = module.exports = function wu(iterable) {\n\t if (!isIterable(iterable)) {\n\t throw new Error(\"wu: `\" + iterable + \"` is not iterable!\");\n\t }\n\t return new Wu(iterable);\n\t};\n\n\tfunction Wu(iterable) {\n\t var iterator = getIterator(iterable);\n\t this.next = iterator.next.bind(iterator);\n\t}\n\twu.prototype = Wu.prototype;\n\n\twu.prototype[_Symbol$iterator] = function () {\n\t return this;\n\t};\n\n\t/*\n\t * Internal utilities\n\t */\n\n\t// An internal placeholder value.\n\tvar MISSING = {};\n\n\t// Return whether a thing is iterable.\n\tvar isIterable = function isIterable(thing) {\n\t return thing && typeof thing[_Symbol$iterator] === \"function\";\n\t};\n\n\t// Get the iterator for the thing or throw an error.\n\tvar getIterator = function getIterator(thing) {\n\t if (isIterable(thing)) {\n\t return _getIterator(thing);\n\t }\n\t throw new TypeError(\"Not iterable: \" + thing);\n\t};\n\n\t// Define a static method on `wu` and set its prototype to the shared\n\t// `Wu.prototype`.\n\tvar staticMethod = function staticMethod(name, fn) {\n\t fn.prototype = Wu.prototype;\n\t wu[name] = fn;\n\t};\n\n\t// Define a function that is attached as both a `Wu.prototype` method and a\n\t// curryable static method on `wu` directly that takes an iterable as its last\n\t// parameter.\n\tvar prototypeAndStatic = function prototypeAndStatic(name, fn) {\n\t var expectedArgs = arguments.length <= 2 || arguments[2] === undefined ? fn.length : arguments[2];\n\t return (function () {\n\t fn.prototype = Wu.prototype;\n\t Wu.prototype[name] = fn;\n\n\t // +1 for the iterable, which is the `this` value of the function so it\n\t // isn't reflected by the length property.\n\t expectedArgs += 1;\n\n\t wu[name] = wu.curryable(function () {\n\t var _wu;\n\n\t for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\n\t var iterable = args.pop();\n\t return (_wu = wu(iterable))[name].apply(_wu, args);\n\t }, expectedArgs);\n\t })();\n\t};\n\n\t// A decorator for rewrapping a method's returned iterable in wu to maintain\n\t// chainability.\n\tvar rewrap = function rewrap(fn) {\n\t return function () {\n\t for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t args[_key2] = arguments[_key2];\n\t }\n\n\t return wu(fn.call.apply(fn, [this].concat(args)));\n\t };\n\t};\n\n\tvar rewrapStaticMethod = function rewrapStaticMethod(name, fn) {\n\t return staticMethod(name, rewrap(fn));\n\t};\n\tvar rewrapPrototypeAndStatic = function rewrapPrototypeAndStatic(name, fn, expectedArgs) {\n\t return prototypeAndStatic(name, rewrap(fn), expectedArgs);\n\t};\n\n\t// Return a wrapped version of `fn` bound with the initial arguments\n\t// `...args`.\n\tfunction curry(fn, args) {\n\t return function () {\n\t for (var _len3 = arguments.length, moreArgs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n\t moreArgs[_key3] = arguments[_key3];\n\t }\n\n\t return fn.call.apply(fn, [this].concat(_toConsumableArray(args), moreArgs));\n\t };\n\t}\n\n\t/*\n\t * Public utilities\n\t */\n\n\tstaticMethod(\"curryable\", function (fn) {\n\t var expected = arguments.length <= 1 || arguments[1] === undefined ? fn.length : arguments[1];\n\t return (function () {\n\t return function f() {\n\t for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n\t args[_key4] = arguments[_key4];\n\t }\n\n\t return args.length >= expected ? fn.apply(this, args) : curry(f, args);\n\t };\n\t })();\n\t});\n\n\trewrapStaticMethod(\"entries\", _regeneratorRuntime.mark(function callee$0$0(obj) {\n\t var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, k;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion = true;\n\t _didIteratorError = false;\n\t _iteratorError = undefined;\n\t context$1$0.prev = 3;\n\t _iterator = _getIterator(_Object$keys(obj));\n\n\t case 5:\n\t if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t k = _step.value;\n\t context$1$0.next = 9;\n\t return [k, obj[k]];\n\n\t case 9:\n\t _iteratorNormalCompletion = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 12:\n\t context$1$0.next = 18;\n\t break;\n\n\t case 14:\n\t context$1$0.prev = 14;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError = true;\n\t _iteratorError = context$1$0.t0;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.prev = 19;\n\n\t if (!_iteratorNormalCompletion && _iterator[\"return\"]) {\n\t _iterator[\"return\"]();\n\t }\n\n\t case 21:\n\t context$1$0.prev = 21;\n\n\t if (!_didIteratorError) {\n\t context$1$0.next = 24;\n\t break;\n\t }\n\n\t throw _iteratorError;\n\n\t case 24:\n\t return context$1$0.finish(21);\n\n\t case 25:\n\t return context$1$0.finish(18);\n\n\t case 26:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 14, 18, 26], [19,, 21, 25]]);\n\t}));\n\n\trewrapStaticMethod(\"keys\", _regeneratorRuntime.mark(function callee$0$0(obj) {\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t return context$1$0.delegateYield(_Object$keys(obj), \"t0\", 1);\n\n\t case 1:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\trewrapStaticMethod(\"values\", _regeneratorRuntime.mark(function callee$0$0(obj) {\n\t var _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, k;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion2 = true;\n\t _didIteratorError2 = false;\n\t _iteratorError2 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator2 = _getIterator(_Object$keys(obj));\n\n\t case 5:\n\t if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t k = _step2.value;\n\t context$1$0.next = 9;\n\t return obj[k];\n\n\t case 9:\n\t _iteratorNormalCompletion2 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 12:\n\t context$1$0.next = 18;\n\t break;\n\n\t case 14:\n\t context$1$0.prev = 14;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError2 = true;\n\t _iteratorError2 = context$1$0.t0;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.prev = 19;\n\n\t if (!_iteratorNormalCompletion2 && _iterator2[\"return\"]) {\n\t _iterator2[\"return\"]();\n\t }\n\n\t case 21:\n\t context$1$0.prev = 21;\n\n\t if (!_didIteratorError2) {\n\t context$1$0.next = 24;\n\t break;\n\t }\n\n\t throw _iteratorError2;\n\n\t case 24:\n\t return context$1$0.finish(21);\n\n\t case 25:\n\t return context$1$0.finish(18);\n\n\t case 26:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 14, 18, 26], [19,, 21, 25]]);\n\t}));\n\n\t/*\n\t * Infinite iterators\n\t */\n\n\trewrapPrototypeAndStatic(\"cycle\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var saved, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t saved = [];\n\t _iteratorNormalCompletion3 = true;\n\t _didIteratorError3 = false;\n\t _iteratorError3 = undefined;\n\t context$1$0.prev = 4;\n\t _iterator3 = _getIterator(this);\n\n\t case 6:\n\t if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) {\n\t context$1$0.next = 14;\n\t break;\n\t }\n\n\t x = _step3.value;\n\t context$1$0.next = 10;\n\t return x;\n\n\t case 10:\n\t saved.push(x);\n\n\t case 11:\n\t _iteratorNormalCompletion3 = true;\n\t context$1$0.next = 6;\n\t break;\n\n\t case 14:\n\t context$1$0.next = 20;\n\t break;\n\n\t case 16:\n\t context$1$0.prev = 16;\n\t context$1$0.t0 = context$1$0[\"catch\"](4);\n\t _didIteratorError3 = true;\n\t _iteratorError3 = context$1$0.t0;\n\n\t case 20:\n\t context$1$0.prev = 20;\n\t context$1$0.prev = 21;\n\n\t if (!_iteratorNormalCompletion3 && _iterator3[\"return\"]) {\n\t _iterator3[\"return\"]();\n\t }\n\n\t case 23:\n\t context$1$0.prev = 23;\n\n\t if (!_didIteratorError3) {\n\t context$1$0.next = 26;\n\t break;\n\t }\n\n\t throw _iteratorError3;\n\n\t case 26:\n\t return context$1$0.finish(23);\n\n\t case 27:\n\t return context$1$0.finish(20);\n\n\t case 28:\n\t if (!saved) {\n\t context$1$0.next = 32;\n\t break;\n\t }\n\n\t return context$1$0.delegateYield(saved, \"t1\", 30);\n\n\t case 30:\n\t context$1$0.next = 28;\n\t break;\n\n\t case 32:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[4, 16, 20, 28], [21,, 23, 27]]);\n\t}));\n\n\trewrapStaticMethod(\"count\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];\n\t var step = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1];\n\t var n;\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t n = start;\n\n\t case 1:\n\t if (false) {\n\t context$1$0.next = 7;\n\t break;\n\t }\n\n\t context$1$0.next = 4;\n\t return n;\n\n\t case 4:\n\t n += step;\n\t context$1$0.next = 1;\n\t break;\n\n\t case 7:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\trewrapStaticMethod(\"repeat\", _regeneratorRuntime.mark(function callee$0$0(thing) {\n\t var times = arguments.length <= 1 || arguments[1] === undefined ? Infinity : arguments[1];\n\t var i;\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t if (!(times === Infinity)) {\n\t context$1$0.next = 8;\n\t break;\n\t }\n\n\t case 1:\n\t if (false) {\n\t context$1$0.next = 6;\n\t break;\n\t }\n\n\t context$1$0.next = 4;\n\t return thing;\n\n\t case 4:\n\t context$1$0.next = 1;\n\t break;\n\n\t case 6:\n\t context$1$0.next = 15;\n\t break;\n\n\t case 8:\n\t i = 0;\n\n\t case 9:\n\t if (!(i < times)) {\n\t context$1$0.next = 15;\n\t break;\n\t }\n\n\t context$1$0.next = 12;\n\t return thing;\n\n\t case 12:\n\t i++;\n\t context$1$0.next = 9;\n\t break;\n\n\t case 15:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\t/*\n\t * Iterators that terminate once the input sequence has been exhausted\n\t */\n\n\trewrapStaticMethod(\"chain\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var _iteratorNormalCompletion4,\n\t _didIteratorError4,\n\t _iteratorError4,\n\t _len5,\n\t iterables,\n\t _key5,\n\t _iterator4,\n\t _step4,\n\t it,\n\t args$1$0 = arguments;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion4 = true;\n\t _didIteratorError4 = false;\n\t _iteratorError4 = undefined;\n\t context$1$0.prev = 3;\n\n\t for (_len5 = args$1$0.length, iterables = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n\t iterables[_key5] = args$1$0[_key5];\n\t }\n\n\t _iterator4 = _getIterator(iterables);\n\n\t case 6:\n\t if (_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t it = _step4.value;\n\t return context$1$0.delegateYield(it, \"t0\", 9);\n\n\t case 9:\n\t _iteratorNormalCompletion4 = true;\n\t context$1$0.next = 6;\n\t break;\n\n\t case 12:\n\t context$1$0.next = 18;\n\t break;\n\n\t case 14:\n\t context$1$0.prev = 14;\n\t context$1$0.t1 = context$1$0[\"catch\"](3);\n\t _didIteratorError4 = true;\n\t _iteratorError4 = context$1$0.t1;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.prev = 19;\n\n\t if (!_iteratorNormalCompletion4 && _iterator4[\"return\"]) {\n\t _iterator4[\"return\"]();\n\t }\n\n\t case 21:\n\t context$1$0.prev = 21;\n\n\t if (!_didIteratorError4) {\n\t context$1$0.next = 24;\n\t break;\n\t }\n\n\t throw _iteratorError4;\n\n\t case 24:\n\t return context$1$0.finish(21);\n\n\t case 25:\n\t return context$1$0.finish(18);\n\n\t case 26:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 14, 18, 26], [19,, 21, 25]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"chunk\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var n = arguments.length <= 0 || arguments[0] === undefined ? 2 : arguments[0];\n\n\t var items, index, _iteratorNormalCompletion5, _didIteratorError5, _iteratorError5, _iterator5, _step5, item;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t items = [];\n\t index = 0;\n\t _iteratorNormalCompletion5 = true;\n\t _didIteratorError5 = false;\n\t _iteratorError5 = undefined;\n\t context$1$0.prev = 5;\n\t _iterator5 = _getIterator(this);\n\n\t case 7:\n\t if (_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done) {\n\t context$1$0.next = 18;\n\t break;\n\t }\n\n\t item = _step5.value;\n\n\t items[index++] = item;\n\n\t if (!(index === n)) {\n\t context$1$0.next = 15;\n\t break;\n\t }\n\n\t context$1$0.next = 13;\n\t return items;\n\n\t case 13:\n\t items = [];\n\t index = 0;\n\n\t case 15:\n\t _iteratorNormalCompletion5 = true;\n\t context$1$0.next = 7;\n\t break;\n\n\t case 18:\n\t context$1$0.next = 24;\n\t break;\n\n\t case 20:\n\t context$1$0.prev = 20;\n\t context$1$0.t0 = context$1$0[\"catch\"](5);\n\t _didIteratorError5 = true;\n\t _iteratorError5 = context$1$0.t0;\n\n\t case 24:\n\t context$1$0.prev = 24;\n\t context$1$0.prev = 25;\n\n\t if (!_iteratorNormalCompletion5 && _iterator5[\"return\"]) {\n\t _iterator5[\"return\"]();\n\t }\n\n\t case 27:\n\t context$1$0.prev = 27;\n\n\t if (!_didIteratorError5) {\n\t context$1$0.next = 30;\n\t break;\n\t }\n\n\t throw _iteratorError5;\n\n\t case 30:\n\t return context$1$0.finish(27);\n\n\t case 31:\n\t return context$1$0.finish(24);\n\n\t case 32:\n\t if (!index) {\n\t context$1$0.next = 35;\n\t break;\n\t }\n\n\t context$1$0.next = 35;\n\t return items;\n\n\t case 35:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[5, 20, 24, 32], [25,, 27, 31]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"concatMap\", _regeneratorRuntime.mark(function callee$0$0(fn) {\n\t var _iteratorNormalCompletion6, _didIteratorError6, _iteratorError6, _iterator6, _step6, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion6 = true;\n\t _didIteratorError6 = false;\n\t _iteratorError6 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator6 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done) {\n\t context$1$0.next = 11;\n\t break;\n\t }\n\n\t x = _step6.value;\n\t return context$1$0.delegateYield(fn(x), \"t0\", 8);\n\n\t case 8:\n\t _iteratorNormalCompletion6 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 11:\n\t context$1$0.next = 17;\n\t break;\n\n\t case 13:\n\t context$1$0.prev = 13;\n\t context$1$0.t1 = context$1$0[\"catch\"](3);\n\t _didIteratorError6 = true;\n\t _iteratorError6 = context$1$0.t1;\n\n\t case 17:\n\t context$1$0.prev = 17;\n\t context$1$0.prev = 18;\n\n\t if (!_iteratorNormalCompletion6 && _iterator6[\"return\"]) {\n\t _iterator6[\"return\"]();\n\t }\n\n\t case 20:\n\t context$1$0.prev = 20;\n\n\t if (!_didIteratorError6) {\n\t context$1$0.next = 23;\n\t break;\n\t }\n\n\t throw _iteratorError6;\n\n\t case 23:\n\t return context$1$0.finish(20);\n\n\t case 24:\n\t return context$1$0.finish(17);\n\n\t case 25:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 13, 17, 25], [18,, 20, 24]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"drop\", _regeneratorRuntime.mark(function callee$0$0(n) {\n\t var i, _iteratorNormalCompletion7, _didIteratorError7, _iteratorError7, _iterator7, _step7, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t i = 0;\n\t _iteratorNormalCompletion7 = true;\n\t _didIteratorError7 = false;\n\t _iteratorError7 = undefined;\n\t context$1$0.prev = 4;\n\t _iterator7 = _getIterator(this);\n\n\t case 6:\n\t if (_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done) {\n\t context$1$0.next = 16;\n\t break;\n\t }\n\n\t x = _step7.value;\n\n\t if (!(i++ < n)) {\n\t context$1$0.next = 10;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"continue\", 13);\n\n\t case 10:\n\t context$1$0.next = 12;\n\t return x;\n\n\t case 12:\n\t return context$1$0.abrupt(\"break\", 16);\n\n\t case 13:\n\t _iteratorNormalCompletion7 = true;\n\t context$1$0.next = 6;\n\t break;\n\n\t case 16:\n\t context$1$0.next = 22;\n\t break;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.t0 = context$1$0[\"catch\"](4);\n\t _didIteratorError7 = true;\n\t _iteratorError7 = context$1$0.t0;\n\n\t case 22:\n\t context$1$0.prev = 22;\n\t context$1$0.prev = 23;\n\n\t if (!_iteratorNormalCompletion7 && _iterator7[\"return\"]) {\n\t _iterator7[\"return\"]();\n\t }\n\n\t case 25:\n\t context$1$0.prev = 25;\n\n\t if (!_didIteratorError7) {\n\t context$1$0.next = 28;\n\t break;\n\t }\n\n\t throw _iteratorError7;\n\n\t case 28:\n\t return context$1$0.finish(25);\n\n\t case 29:\n\t return context$1$0.finish(22);\n\n\t case 30:\n\t return context$1$0.delegateYield(this, \"t1\", 31);\n\n\t case 31:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[4, 18, 22, 30], [23,, 25, 29]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"dropWhile\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? Boolean : arguments[0];\n\n\t var _iteratorNormalCompletion8, _didIteratorError8, _iteratorError8, _iterator8, _step8, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion8 = true;\n\t _didIteratorError8 = false;\n\t _iteratorError8 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator8 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done) {\n\t context$1$0.next = 15;\n\t break;\n\t }\n\n\t x = _step8.value;\n\n\t if (!fn(x)) {\n\t context$1$0.next = 9;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"continue\", 12);\n\n\t case 9:\n\t context$1$0.next = 11;\n\t return x;\n\n\t case 11:\n\t return context$1$0.abrupt(\"break\", 15);\n\n\t case 12:\n\t _iteratorNormalCompletion8 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 15:\n\t context$1$0.next = 21;\n\t break;\n\n\t case 17:\n\t context$1$0.prev = 17;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError8 = true;\n\t _iteratorError8 = context$1$0.t0;\n\n\t case 21:\n\t context$1$0.prev = 21;\n\t context$1$0.prev = 22;\n\n\t if (!_iteratorNormalCompletion8 && _iterator8[\"return\"]) {\n\t _iterator8[\"return\"]();\n\t }\n\n\t case 24:\n\t context$1$0.prev = 24;\n\n\t if (!_didIteratorError8) {\n\t context$1$0.next = 27;\n\t break;\n\t }\n\n\t throw _iteratorError8;\n\n\t case 27:\n\t return context$1$0.finish(24);\n\n\t case 28:\n\t return context$1$0.finish(21);\n\n\t case 29:\n\t return context$1$0.delegateYield(this, \"t1\", 30);\n\n\t case 30:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 17, 21, 29], [22,, 24, 28]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"enumerate\", _regeneratorRuntime.mark(function callee$0$0() {\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t return context$1$0.delegateYield(_zip([this, wu.count()]), \"t0\", 1);\n\n\t case 1:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\trewrapPrototypeAndStatic(\"filter\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? Boolean : arguments[0];\n\n\t var _iteratorNormalCompletion9, _didIteratorError9, _iteratorError9, _iterator9, _step9, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion9 = true;\n\t _didIteratorError9 = false;\n\t _iteratorError9 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator9 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done) {\n\t context$1$0.next = 13;\n\t break;\n\t }\n\n\t x = _step9.value;\n\n\t if (!fn(x)) {\n\t context$1$0.next = 10;\n\t break;\n\t }\n\n\t context$1$0.next = 10;\n\t return x;\n\n\t case 10:\n\t _iteratorNormalCompletion9 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 13:\n\t context$1$0.next = 19;\n\t break;\n\n\t case 15:\n\t context$1$0.prev = 15;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError9 = true;\n\t _iteratorError9 = context$1$0.t0;\n\n\t case 19:\n\t context$1$0.prev = 19;\n\t context$1$0.prev = 20;\n\n\t if (!_iteratorNormalCompletion9 && _iterator9[\"return\"]) {\n\t _iterator9[\"return\"]();\n\t }\n\n\t case 22:\n\t context$1$0.prev = 22;\n\n\t if (!_didIteratorError9) {\n\t context$1$0.next = 25;\n\t break;\n\t }\n\n\t throw _iteratorError9;\n\n\t case 25:\n\t return context$1$0.finish(22);\n\n\t case 26:\n\t return context$1$0.finish(19);\n\n\t case 27:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 15, 19, 27], [20,, 22, 26]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"flatten\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var shallow = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0];\n\n\t var _iteratorNormalCompletion10, _didIteratorError10, _iteratorError10, _iterator10, _step10, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion10 = true;\n\t _didIteratorError10 = false;\n\t _iteratorError10 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator10 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done) {\n\t context$1$0.next = 16;\n\t break;\n\t }\n\n\t x = _step10.value;\n\n\t if (!(typeof x !== \"string\" && isIterable(x))) {\n\t context$1$0.next = 11;\n\t break;\n\t }\n\n\t return context$1$0.delegateYield(shallow ? x : wu(x).flatten(), \"t0\", 9);\n\n\t case 9:\n\t context$1$0.next = 13;\n\t break;\n\n\t case 11:\n\t context$1$0.next = 13;\n\t return x;\n\n\t case 13:\n\t _iteratorNormalCompletion10 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 16:\n\t context$1$0.next = 22;\n\t break;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.t1 = context$1$0[\"catch\"](3);\n\t _didIteratorError10 = true;\n\t _iteratorError10 = context$1$0.t1;\n\n\t case 22:\n\t context$1$0.prev = 22;\n\t context$1$0.prev = 23;\n\n\t if (!_iteratorNormalCompletion10 && _iterator10[\"return\"]) {\n\t _iterator10[\"return\"]();\n\t }\n\n\t case 25:\n\t context$1$0.prev = 25;\n\n\t if (!_didIteratorError10) {\n\t context$1$0.next = 28;\n\t break;\n\t }\n\n\t throw _iteratorError10;\n\n\t case 28:\n\t return context$1$0.finish(25);\n\n\t case 29:\n\t return context$1$0.finish(22);\n\n\t case 30:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 18, 22, 30], [23,, 25, 29]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"invoke\", _regeneratorRuntime.mark(function callee$0$0(name) {\n\t var _iteratorNormalCompletion11,\n\t _didIteratorError11,\n\t _iteratorError11,\n\t _len6,\n\t args,\n\t _key6,\n\t _iterator11,\n\t _step11,\n\t x,\n\t args$1$0 = arguments;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion11 = true;\n\t _didIteratorError11 = false;\n\t _iteratorError11 = undefined;\n\t context$1$0.prev = 3;\n\n\t for (_len6 = args$1$0.length, args = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {\n\t args[_key6 - 1] = args$1$0[_key6];\n\t }\n\n\t _iterator11 = _getIterator(this);\n\n\t case 6:\n\t if (_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done) {\n\t context$1$0.next = 13;\n\t break;\n\t }\n\n\t x = _step11.value;\n\t context$1$0.next = 10;\n\t return x[name].apply(x, args);\n\n\t case 10:\n\t _iteratorNormalCompletion11 = true;\n\t context$1$0.next = 6;\n\t break;\n\n\t case 13:\n\t context$1$0.next = 19;\n\t break;\n\n\t case 15:\n\t context$1$0.prev = 15;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError11 = true;\n\t _iteratorError11 = context$1$0.t0;\n\n\t case 19:\n\t context$1$0.prev = 19;\n\t context$1$0.prev = 20;\n\n\t if (!_iteratorNormalCompletion11 && _iterator11[\"return\"]) {\n\t _iterator11[\"return\"]();\n\t }\n\n\t case 22:\n\t context$1$0.prev = 22;\n\n\t if (!_didIteratorError11) {\n\t context$1$0.next = 25;\n\t break;\n\t }\n\n\t throw _iteratorError11;\n\n\t case 25:\n\t return context$1$0.finish(22);\n\n\t case 26:\n\t return context$1$0.finish(19);\n\n\t case 27:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 15, 19, 27], [20,, 22, 26]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"map\", _regeneratorRuntime.mark(function callee$0$0(fn) {\n\t var _iteratorNormalCompletion12, _didIteratorError12, _iteratorError12, _iterator12, _step12, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion12 = true;\n\t _didIteratorError12 = false;\n\t _iteratorError12 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator12 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t x = _step12.value;\n\t context$1$0.next = 9;\n\t return fn(x);\n\n\t case 9:\n\t _iteratorNormalCompletion12 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 12:\n\t context$1$0.next = 18;\n\t break;\n\n\t case 14:\n\t context$1$0.prev = 14;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError12 = true;\n\t _iteratorError12 = context$1$0.t0;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.prev = 19;\n\n\t if (!_iteratorNormalCompletion12 && _iterator12[\"return\"]) {\n\t _iterator12[\"return\"]();\n\t }\n\n\t case 21:\n\t context$1$0.prev = 21;\n\n\t if (!_didIteratorError12) {\n\t context$1$0.next = 24;\n\t break;\n\t }\n\n\t throw _iteratorError12;\n\n\t case 24:\n\t return context$1$0.finish(21);\n\n\t case 25:\n\t return context$1$0.finish(18);\n\n\t case 26:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 14, 18, 26], [19,, 21, 25]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"pluck\", _regeneratorRuntime.mark(function callee$0$0(name) {\n\t var _iteratorNormalCompletion13, _didIteratorError13, _iteratorError13, _iterator13, _step13, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion13 = true;\n\t _didIteratorError13 = false;\n\t _iteratorError13 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator13 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t x = _step13.value;\n\t context$1$0.next = 9;\n\t return x[name];\n\n\t case 9:\n\t _iteratorNormalCompletion13 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 12:\n\t context$1$0.next = 18;\n\t break;\n\n\t case 14:\n\t context$1$0.prev = 14;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError13 = true;\n\t _iteratorError13 = context$1$0.t0;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.prev = 19;\n\n\t if (!_iteratorNormalCompletion13 && _iterator13[\"return\"]) {\n\t _iterator13[\"return\"]();\n\t }\n\n\t case 21:\n\t context$1$0.prev = 21;\n\n\t if (!_didIteratorError13) {\n\t context$1$0.next = 24;\n\t break;\n\t }\n\n\t throw _iteratorError13;\n\n\t case 24:\n\t return context$1$0.finish(21);\n\n\t case 25:\n\t return context$1$0.finish(18);\n\n\t case 26:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 14, 18, 26], [19,, 21, 25]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"reductions\", _regeneratorRuntime.mark(function callee$0$0(fn) {\n\t var initial = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1];\n\n\t var val, _iteratorNormalCompletion14, _didIteratorError14, _iteratorError14, _iterator14, _step14, x, _iteratorNormalCompletion15, _didIteratorError15, _iteratorError15, _iterator15, _step15;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t val = initial;\n\n\t if (!(val === undefined)) {\n\t context$1$0.next = 28;\n\t break;\n\t }\n\n\t _iteratorNormalCompletion14 = true;\n\t _didIteratorError14 = false;\n\t _iteratorError14 = undefined;\n\t context$1$0.prev = 5;\n\t _iterator14 = _getIterator(this);\n\n\t case 7:\n\t if (_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done) {\n\t context$1$0.next = 14;\n\t break;\n\t }\n\n\t x = _step14.value;\n\n\t val = x;\n\t return context$1$0.abrupt(\"break\", 14);\n\n\t case 11:\n\t _iteratorNormalCompletion14 = true;\n\t context$1$0.next = 7;\n\t break;\n\n\t case 14:\n\t context$1$0.next = 20;\n\t break;\n\n\t case 16:\n\t context$1$0.prev = 16;\n\t context$1$0.t0 = context$1$0[\"catch\"](5);\n\t _didIteratorError14 = true;\n\t _iteratorError14 = context$1$0.t0;\n\n\t case 20:\n\t context$1$0.prev = 20;\n\t context$1$0.prev = 21;\n\n\t if (!_iteratorNormalCompletion14 && _iterator14[\"return\"]) {\n\t _iterator14[\"return\"]();\n\t }\n\n\t case 23:\n\t context$1$0.prev = 23;\n\n\t if (!_didIteratorError14) {\n\t context$1$0.next = 26;\n\t break;\n\t }\n\n\t throw _iteratorError14;\n\n\t case 26:\n\t return context$1$0.finish(23);\n\n\t case 27:\n\t return context$1$0.finish(20);\n\n\t case 28:\n\t context$1$0.next = 30;\n\t return val;\n\n\t case 30:\n\t _iteratorNormalCompletion15 = true;\n\t _didIteratorError15 = false;\n\t _iteratorError15 = undefined;\n\t context$1$0.prev = 33;\n\t _iterator15 = _getIterator(this);\n\n\t case 35:\n\t if (_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done) {\n\t context$1$0.next = 42;\n\t break;\n\t }\n\n\t x = _step15.value;\n\t context$1$0.next = 39;\n\t return val = fn(val, x);\n\n\t case 39:\n\t _iteratorNormalCompletion15 = true;\n\t context$1$0.next = 35;\n\t break;\n\n\t case 42:\n\t context$1$0.next = 48;\n\t break;\n\n\t case 44:\n\t context$1$0.prev = 44;\n\t context$1$0.t1 = context$1$0[\"catch\"](33);\n\t _didIteratorError15 = true;\n\t _iteratorError15 = context$1$0.t1;\n\n\t case 48:\n\t context$1$0.prev = 48;\n\t context$1$0.prev = 49;\n\n\t if (!_iteratorNormalCompletion15 && _iterator15[\"return\"]) {\n\t _iterator15[\"return\"]();\n\t }\n\n\t case 51:\n\t context$1$0.prev = 51;\n\n\t if (!_didIteratorError15) {\n\t context$1$0.next = 54;\n\t break;\n\t }\n\n\t throw _iteratorError15;\n\n\t case 54:\n\t return context$1$0.finish(51);\n\n\t case 55:\n\t return context$1$0.finish(48);\n\n\t case 56:\n\t return context$1$0.abrupt(\"return\", val);\n\n\t case 57:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[5, 16, 20, 28], [21,, 23, 27], [33, 44, 48, 56], [49,, 51, 55]]);\n\t}), 2);\n\n\trewrapPrototypeAndStatic(\"reject\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? Boolean : arguments[0];\n\n\t var _iteratorNormalCompletion16, _didIteratorError16, _iteratorError16, _iterator16, _step16, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion16 = true;\n\t _didIteratorError16 = false;\n\t _iteratorError16 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator16 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done) {\n\t context$1$0.next = 13;\n\t break;\n\t }\n\n\t x = _step16.value;\n\n\t if (fn(x)) {\n\t context$1$0.next = 10;\n\t break;\n\t }\n\n\t context$1$0.next = 10;\n\t return x;\n\n\t case 10:\n\t _iteratorNormalCompletion16 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 13:\n\t context$1$0.next = 19;\n\t break;\n\n\t case 15:\n\t context$1$0.prev = 15;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError16 = true;\n\t _iteratorError16 = context$1$0.t0;\n\n\t case 19:\n\t context$1$0.prev = 19;\n\t context$1$0.prev = 20;\n\n\t if (!_iteratorNormalCompletion16 && _iterator16[\"return\"]) {\n\t _iterator16[\"return\"]();\n\t }\n\n\t case 22:\n\t context$1$0.prev = 22;\n\n\t if (!_didIteratorError16) {\n\t context$1$0.next = 25;\n\t break;\n\t }\n\n\t throw _iteratorError16;\n\n\t case 25:\n\t return context$1$0.finish(22);\n\n\t case 26:\n\t return context$1$0.finish(19);\n\n\t case 27:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 15, 19, 27], [20,, 22, 26]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"slice\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];\n\t var stop = arguments.length <= 1 || arguments[1] === undefined ? Infinity : arguments[1];\n\n\t var _iteratorNormalCompletion17, _didIteratorError17, _iteratorError17, _iterator17, _step17, _step17$value, x, i;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t if (!(stop < start)) {\n\t context$1$0.next = 2;\n\t break;\n\t }\n\n\t throw new RangeError(\"parameter `stop` (= \" + stop + \") must be >= `start` (= \" + start + \")\");\n\n\t case 2:\n\t _iteratorNormalCompletion17 = true;\n\t _didIteratorError17 = false;\n\t _iteratorError17 = undefined;\n\t context$1$0.prev = 5;\n\t _iterator17 = _getIterator(this.enumerate());\n\n\t case 7:\n\t if (_iteratorNormalCompletion17 = (_step17 = _iterator17.next()).done) {\n\t context$1$0.next = 20;\n\t break;\n\t }\n\n\t _step17$value = _slicedToArray(_step17.value, 2);\n\t x = _step17$value[0];\n\t i = _step17$value[1];\n\n\t if (!(i < start)) {\n\t context$1$0.next = 13;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"continue\", 17);\n\n\t case 13:\n\t if (!(i >= stop)) {\n\t context$1$0.next = 15;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"break\", 20);\n\n\t case 15:\n\t context$1$0.next = 17;\n\t return x;\n\n\t case 17:\n\t _iteratorNormalCompletion17 = true;\n\t context$1$0.next = 7;\n\t break;\n\n\t case 20:\n\t context$1$0.next = 26;\n\t break;\n\n\t case 22:\n\t context$1$0.prev = 22;\n\t context$1$0.t0 = context$1$0[\"catch\"](5);\n\t _didIteratorError17 = true;\n\t _iteratorError17 = context$1$0.t0;\n\n\t case 26:\n\t context$1$0.prev = 26;\n\t context$1$0.prev = 27;\n\n\t if (!_iteratorNormalCompletion17 && _iterator17[\"return\"]) {\n\t _iterator17[\"return\"]();\n\t }\n\n\t case 29:\n\t context$1$0.prev = 29;\n\n\t if (!_didIteratorError17) {\n\t context$1$0.next = 32;\n\t break;\n\t }\n\n\t throw _iteratorError17;\n\n\t case 32:\n\t return context$1$0.finish(29);\n\n\t case 33:\n\t return context$1$0.finish(26);\n\n\t case 34:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[5, 22, 26, 34], [27,, 29, 33]]);\n\t}), 2);\n\n\trewrapPrototypeAndStatic(\"spreadMap\", _regeneratorRuntime.mark(function callee$0$0(fn) {\n\t var _iteratorNormalCompletion18, _didIteratorError18, _iteratorError18, _iterator18, _step18, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion18 = true;\n\t _didIteratorError18 = false;\n\t _iteratorError18 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator18 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion18 = (_step18 = _iterator18.next()).done) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t x = _step18.value;\n\t context$1$0.next = 9;\n\t return fn.apply(undefined, _toConsumableArray(x));\n\n\t case 9:\n\t _iteratorNormalCompletion18 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 12:\n\t context$1$0.next = 18;\n\t break;\n\n\t case 14:\n\t context$1$0.prev = 14;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError18 = true;\n\t _iteratorError18 = context$1$0.t0;\n\n\t case 18:\n\t context$1$0.prev = 18;\n\t context$1$0.prev = 19;\n\n\t if (!_iteratorNormalCompletion18 && _iterator18[\"return\"]) {\n\t _iterator18[\"return\"]();\n\t }\n\n\t case 21:\n\t context$1$0.prev = 21;\n\n\t if (!_didIteratorError18) {\n\t context$1$0.next = 24;\n\t break;\n\t }\n\n\t throw _iteratorError18;\n\n\t case 24:\n\t return context$1$0.finish(21);\n\n\t case 25:\n\t return context$1$0.finish(18);\n\n\t case 26:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 14, 18, 26], [19,, 21, 25]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"take\", _regeneratorRuntime.mark(function callee$0$0(n) {\n\t var i, _iteratorNormalCompletion19, _didIteratorError19, _iteratorError19, _iterator19, _step19, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t if (!(n < 1)) {\n\t context$1$0.next = 2;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"return\");\n\n\t case 2:\n\t i = 0;\n\t _iteratorNormalCompletion19 = true;\n\t _didIteratorError19 = false;\n\t _iteratorError19 = undefined;\n\t context$1$0.prev = 6;\n\t _iterator19 = _getIterator(this);\n\n\t case 8:\n\t if (_iteratorNormalCompletion19 = (_step19 = _iterator19.next()).done) {\n\t context$1$0.next = 17;\n\t break;\n\t }\n\n\t x = _step19.value;\n\t context$1$0.next = 12;\n\t return x;\n\n\t case 12:\n\t if (!(++i >= n)) {\n\t context$1$0.next = 14;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"break\", 17);\n\n\t case 14:\n\t _iteratorNormalCompletion19 = true;\n\t context$1$0.next = 8;\n\t break;\n\n\t case 17:\n\t context$1$0.next = 23;\n\t break;\n\n\t case 19:\n\t context$1$0.prev = 19;\n\t context$1$0.t0 = context$1$0[\"catch\"](6);\n\t _didIteratorError19 = true;\n\t _iteratorError19 = context$1$0.t0;\n\n\t case 23:\n\t context$1$0.prev = 23;\n\t context$1$0.prev = 24;\n\n\t if (!_iteratorNormalCompletion19 && _iterator19[\"return\"]) {\n\t _iterator19[\"return\"]();\n\t }\n\n\t case 26:\n\t context$1$0.prev = 26;\n\n\t if (!_didIteratorError19) {\n\t context$1$0.next = 29;\n\t break;\n\t }\n\n\t throw _iteratorError19;\n\n\t case 29:\n\t return context$1$0.finish(26);\n\n\t case 30:\n\t return context$1$0.finish(23);\n\n\t case 31:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[6, 19, 23, 31], [24,, 26, 30]]);\n\t}));\n\n\trewrapPrototypeAndStatic(\"takeWhile\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? Boolean : arguments[0];\n\n\t var _iteratorNormalCompletion20, _didIteratorError20, _iteratorError20, _iterator20, _step20, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion20 = true;\n\t _didIteratorError20 = false;\n\t _iteratorError20 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator20 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion20 = (_step20 = _iterator20.next()).done) {\n\t context$1$0.next = 14;\n\t break;\n\t }\n\n\t x = _step20.value;\n\n\t if (fn(x)) {\n\t context$1$0.next = 9;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"break\", 14);\n\n\t case 9:\n\t context$1$0.next = 11;\n\t return x;\n\n\t case 11:\n\t _iteratorNormalCompletion20 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 14:\n\t context$1$0.next = 20;\n\t break;\n\n\t case 16:\n\t context$1$0.prev = 16;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError20 = true;\n\t _iteratorError20 = context$1$0.t0;\n\n\t case 20:\n\t context$1$0.prev = 20;\n\t context$1$0.prev = 21;\n\n\t if (!_iteratorNormalCompletion20 && _iterator20[\"return\"]) {\n\t _iterator20[\"return\"]();\n\t }\n\n\t case 23:\n\t context$1$0.prev = 23;\n\n\t if (!_didIteratorError20) {\n\t context$1$0.next = 26;\n\t break;\n\t }\n\n\t throw _iteratorError20;\n\n\t case 26:\n\t return context$1$0.finish(23);\n\n\t case 27:\n\t return context$1$0.finish(20);\n\n\t case 28:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 16, 20, 28], [21,, 23, 27]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"tap\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? console.log.bind(console) : arguments[0];\n\n\t var _iteratorNormalCompletion21, _didIteratorError21, _iteratorError21, _iterator21, _step21, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t _iteratorNormalCompletion21 = true;\n\t _didIteratorError21 = false;\n\t _iteratorError21 = undefined;\n\t context$1$0.prev = 3;\n\t _iterator21 = _getIterator(this);\n\n\t case 5:\n\t if (_iteratorNormalCompletion21 = (_step21 = _iterator21.next()).done) {\n\t context$1$0.next = 13;\n\t break;\n\t }\n\n\t x = _step21.value;\n\n\t fn(x);\n\t context$1$0.next = 10;\n\t return x;\n\n\t case 10:\n\t _iteratorNormalCompletion21 = true;\n\t context$1$0.next = 5;\n\t break;\n\n\t case 13:\n\t context$1$0.next = 19;\n\t break;\n\n\t case 15:\n\t context$1$0.prev = 15;\n\t context$1$0.t0 = context$1$0[\"catch\"](3);\n\t _didIteratorError21 = true;\n\t _iteratorError21 = context$1$0.t0;\n\n\t case 19:\n\t context$1$0.prev = 19;\n\t context$1$0.prev = 20;\n\n\t if (!_iteratorNormalCompletion21 && _iterator21[\"return\"]) {\n\t _iterator21[\"return\"]();\n\t }\n\n\t case 22:\n\t context$1$0.prev = 22;\n\n\t if (!_didIteratorError21) {\n\t context$1$0.next = 25;\n\t break;\n\t }\n\n\t throw _iteratorError21;\n\n\t case 25:\n\t return context$1$0.finish(22);\n\n\t case 26:\n\t return context$1$0.finish(19);\n\n\t case 27:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[3, 15, 19, 27], [20,, 22, 26]]);\n\t}), 1);\n\n\trewrapPrototypeAndStatic(\"unique\", _regeneratorRuntime.mark(function callee$0$0() {\n\t var seen, _iteratorNormalCompletion22, _didIteratorError22, _iteratorError22, _iterator22, _step22, x;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t seen = new _Set();\n\t _iteratorNormalCompletion22 = true;\n\t _didIteratorError22 = false;\n\t _iteratorError22 = undefined;\n\t context$1$0.prev = 4;\n\t _iterator22 = _getIterator(this);\n\n\t case 6:\n\t if (_iteratorNormalCompletion22 = (_step22 = _iterator22.next()).done) {\n\t context$1$0.next = 15;\n\t break;\n\t }\n\n\t x = _step22.value;\n\n\t if (seen.has(x)) {\n\t context$1$0.next = 12;\n\t break;\n\t }\n\n\t context$1$0.next = 11;\n\t return x;\n\n\t case 11:\n\t seen.add(x);\n\n\t case 12:\n\t _iteratorNormalCompletion22 = true;\n\t context$1$0.next = 6;\n\t break;\n\n\t case 15:\n\t context$1$0.next = 21;\n\t break;\n\n\t case 17:\n\t context$1$0.prev = 17;\n\t context$1$0.t0 = context$1$0[\"catch\"](4);\n\t _didIteratorError22 = true;\n\t _iteratorError22 = context$1$0.t0;\n\n\t case 21:\n\t context$1$0.prev = 21;\n\t context$1$0.prev = 22;\n\n\t if (!_iteratorNormalCompletion22 && _iterator22[\"return\"]) {\n\t _iterator22[\"return\"]();\n\t }\n\n\t case 24:\n\t context$1$0.prev = 24;\n\n\t if (!_didIteratorError22) {\n\t context$1$0.next = 27;\n\t break;\n\t }\n\n\t throw _iteratorError22;\n\n\t case 27:\n\t return context$1$0.finish(24);\n\n\t case 28:\n\t return context$1$0.finish(21);\n\n\t case 29:\n\t seen.clear();\n\n\t case 30:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[4, 17, 21, 29], [22,, 24, 28]]);\n\t}));\n\n\tvar _zip = rewrap(_regeneratorRuntime.mark(function callee$0$0(iterables) {\n\t var longest = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];\n\n\t var iters, numIters, numFinished, finished, zipped, _iteratorNormalCompletion23, _didIteratorError23, _iteratorError23, _iterator23, _step23, it, _it$next, value, done;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t if (iterables.length) {\n\t context$1$0.next = 2;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"return\");\n\n\t case 2:\n\t iters = iterables.map(getIterator);\n\t numIters = iterables.length;\n\t numFinished = 0;\n\t finished = false;\n\n\t case 6:\n\t if (finished) {\n\t context$1$0.next = 44;\n\t break;\n\t }\n\n\t zipped = [];\n\t _iteratorNormalCompletion23 = true;\n\t _didIteratorError23 = false;\n\t _iteratorError23 = undefined;\n\t context$1$0.prev = 11;\n\t _iterator23 = _getIterator(iters);\n\n\t case 13:\n\t if (_iteratorNormalCompletion23 = (_step23 = _iterator23.next()).done) {\n\t context$1$0.next = 26;\n\t break;\n\t }\n\n\t it = _step23.value;\n\t _it$next = it.next();\n\t value = _it$next.value;\n\t done = _it$next.done;\n\n\t if (!done) {\n\t context$1$0.next = 22;\n\t break;\n\t }\n\n\t if (longest) {\n\t context$1$0.next = 21;\n\t break;\n\t }\n\n\t return context$1$0.abrupt(\"return\");\n\n\t case 21:\n\t if (++numFinished == numIters) {\n\t finished = true;\n\t }\n\n\t case 22:\n\t if (value === undefined) {\n\t // Leave a hole in the array so that you can distinguish an iterable\n\t // that's done (via `index in array == false`) from an iterable\n\t // yielding `undefined`.\n\t zipped.length++;\n\t } else {\n\t zipped.push(value);\n\t }\n\n\t case 23:\n\t _iteratorNormalCompletion23 = true;\n\t context$1$0.next = 13;\n\t break;\n\n\t case 26:\n\t context$1$0.next = 32;\n\t break;\n\n\t case 28:\n\t context$1$0.prev = 28;\n\t context$1$0.t0 = context$1$0[\"catch\"](11);\n\t _didIteratorError23 = true;\n\t _iteratorError23 = context$1$0.t0;\n\n\t case 32:\n\t context$1$0.prev = 32;\n\t context$1$0.prev = 33;\n\n\t if (!_iteratorNormalCompletion23 && _iterator23[\"return\"]) {\n\t _iterator23[\"return\"]();\n\t }\n\n\t case 35:\n\t context$1$0.prev = 35;\n\n\t if (!_didIteratorError23) {\n\t context$1$0.next = 38;\n\t break;\n\t }\n\n\t throw _iteratorError23;\n\n\t case 38:\n\t return context$1$0.finish(35);\n\n\t case 39:\n\t return context$1$0.finish(32);\n\n\t case 40:\n\t context$1$0.next = 42;\n\t return zipped;\n\n\t case 42:\n\t context$1$0.next = 6;\n\t break;\n\n\t case 44:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this, [[11, 28, 32, 40], [33,, 35, 39]]);\n\t}));\n\n\trewrapStaticMethod(\"zip\", _regeneratorRuntime.mark(function callee$0$0() {\n\t for (var _len7 = arguments.length, iterables = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n\t iterables[_key7] = arguments[_key7];\n\t }\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t return context$1$0.delegateYield(_zip(iterables), \"t0\", 1);\n\n\t case 1:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\trewrapStaticMethod(\"zipLongest\", _regeneratorRuntime.mark(function callee$0$0() {\n\t for (var _len8 = arguments.length, iterables = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {\n\t iterables[_key8] = arguments[_key8];\n\t }\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t return context$1$0.delegateYield(_zip(iterables, true), \"t0\", 1);\n\n\t case 1:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\trewrapStaticMethod(\"zipWith\", _regeneratorRuntime.mark(function callee$0$0(fn) {\n\t for (var _len9 = arguments.length, iterables = Array(_len9 > 1 ? _len9 - 1 : 0), _key9 = 1; _key9 < _len9; _key9++) {\n\t iterables[_key9 - 1] = arguments[_key9];\n\t }\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t return context$1$0.delegateYield(_zip(iterables).spreadMap(fn), \"t0\", 1);\n\n\t case 1:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\n\t/*\n\t * Functions that force iteration to completion and return a value.\n\t */\n\n\t// The maximum number of milliseconds we will block the main thread at a time\n\t// while in `asyncEach`.\n\twu.MAX_BLOCK = 15;\n\t// The number of milliseconds to yield to the main thread between bursts of\n\t// work.\n\twu.TIMEOUT = 1;\n\n\tprototypeAndStatic(\"asyncEach\", function (fn) {\n\t var maxBlock = arguments.length <= 1 || arguments[1] === undefined ? wu.MAX_BLOCK : arguments[1];\n\t var timeout = arguments.length <= 2 || arguments[2] === undefined ? wu.TIMEOUT : arguments[2];\n\n\t var iter = getIterator(this);\n\n\t return new _Promise(function (resolve, reject) {\n\t (function loop() {\n\t var start = Date.now();\n\n\t var _iteratorNormalCompletion24 = true;\n\t var _didIteratorError24 = false;\n\t var _iteratorError24 = undefined;\n\n\t try {\n\t for (var _iterator24 = _getIterator(iter), _step24; !(_iteratorNormalCompletion24 = (_step24 = _iterator24.next()).done); _iteratorNormalCompletion24 = true) {\n\t var x = _step24.value;\n\n\t try {\n\t fn(x);\n\t } catch (e) {\n\t reject(e);\n\t return;\n\t }\n\n\t if (Date.now() - start > maxBlock) {\n\t setTimeout(loop, timeout);\n\t return;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError24 = true;\n\t _iteratorError24 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion24 && _iterator24[\"return\"]) {\n\t _iterator24[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError24) {\n\t throw _iteratorError24;\n\t }\n\t }\n\t }\n\n\t resolve();\n\t })();\n\t });\n\t}, 3);\n\n\tprototypeAndStatic(\"every\", function () {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? Boolean : arguments[0];\n\t var _iteratorNormalCompletion25 = true;\n\t var _didIteratorError25 = false;\n\t var _iteratorError25 = undefined;\n\n\t try {\n\t for (var _iterator25 = _getIterator(this), _step25; !(_iteratorNormalCompletion25 = (_step25 = _iterator25.next()).done); _iteratorNormalCompletion25 = true) {\n\t var x = _step25.value;\n\n\t if (!fn(x)) {\n\t return false;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError25 = true;\n\t _iteratorError25 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion25 && _iterator25[\"return\"]) {\n\t _iterator25[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError25) {\n\t throw _iteratorError25;\n\t }\n\t }\n\t }\n\n\t return true;\n\t}, 1);\n\n\tprototypeAndStatic(\"find\", function (fn) {\n\t var _iteratorNormalCompletion26 = true;\n\t var _didIteratorError26 = false;\n\t var _iteratorError26 = undefined;\n\n\t try {\n\t for (var _iterator26 = _getIterator(this), _step26; !(_iteratorNormalCompletion26 = (_step26 = _iterator26.next()).done); _iteratorNormalCompletion26 = true) {\n\t var x = _step26.value;\n\n\t if (fn(x)) {\n\t return x;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError26 = true;\n\t _iteratorError26 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion26 && _iterator26[\"return\"]) {\n\t _iterator26[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError26) {\n\t throw _iteratorError26;\n\t }\n\t }\n\t }\n\t});\n\n\tprototypeAndStatic(\"forEach\", function (fn) {\n\t var _iteratorNormalCompletion27 = true;\n\t var _didIteratorError27 = false;\n\t var _iteratorError27 = undefined;\n\n\t try {\n\t for (var _iterator27 = _getIterator(this), _step27; !(_iteratorNormalCompletion27 = (_step27 = _iterator27.next()).done); _iteratorNormalCompletion27 = true) {\n\t var x = _step27.value;\n\n\t fn(x);\n\t }\n\t } catch (err) {\n\t _didIteratorError27 = true;\n\t _iteratorError27 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion27 && _iterator27[\"return\"]) {\n\t _iterator27[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError27) {\n\t throw _iteratorError27;\n\t }\n\t }\n\t }\n\t});\n\n\tprototypeAndStatic(\"has\", function (thing) {\n\t return this.some(function (x) {\n\t return x === thing;\n\t });\n\t});\n\n\tprototypeAndStatic(\"reduce\", function (fn) {\n\t var initial = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1];\n\n\t var val = initial;\n\t if (val === undefined) {\n\t var _iteratorNormalCompletion28 = true;\n\t var _didIteratorError28 = false;\n\t var _iteratorError28 = undefined;\n\n\t try {\n\t for (var _iterator28 = _getIterator(this), _step28; !(_iteratorNormalCompletion28 = (_step28 = _iterator28.next()).done); _iteratorNormalCompletion28 = true) {\n\t var x = _step28.value;\n\n\t val = x;\n\t break;\n\t }\n\t } catch (err) {\n\t _didIteratorError28 = true;\n\t _iteratorError28 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion28 && _iterator28[\"return\"]) {\n\t _iterator28[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError28) {\n\t throw _iteratorError28;\n\t }\n\t }\n\t }\n\t }\n\n\t var _iteratorNormalCompletion29 = true;\n\t var _didIteratorError29 = false;\n\t var _iteratorError29 = undefined;\n\n\t try {\n\t for (var _iterator29 = _getIterator(this), _step29; !(_iteratorNormalCompletion29 = (_step29 = _iterator29.next()).done); _iteratorNormalCompletion29 = true) {\n\t var x = _step29.value;\n\n\t val = fn(val, x);\n\t }\n\t } catch (err) {\n\t _didIteratorError29 = true;\n\t _iteratorError29 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion29 && _iterator29[\"return\"]) {\n\t _iterator29[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError29) {\n\t throw _iteratorError29;\n\t }\n\t }\n\t }\n\n\t return val;\n\t}, 2);\n\n\tprototypeAndStatic(\"some\", function () {\n\t var fn = arguments.length <= 0 || arguments[0] === undefined ? Boolean : arguments[0];\n\t var _iteratorNormalCompletion30 = true;\n\t var _didIteratorError30 = false;\n\t var _iteratorError30 = undefined;\n\n\t try {\n\t for (var _iterator30 = _getIterator(this), _step30; !(_iteratorNormalCompletion30 = (_step30 = _iterator30.next()).done); _iteratorNormalCompletion30 = true) {\n\t var x = _step30.value;\n\n\t if (fn(x)) {\n\t return true;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError30 = true;\n\t _iteratorError30 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion30 && _iterator30[\"return\"]) {\n\t _iterator30[\"return\"]();\n\t }\n\t } finally {\n\t if (_didIteratorError30) {\n\t throw _iteratorError30;\n\t }\n\t }\n\t }\n\n\t return false;\n\t}, 1);\n\n\tprototypeAndStatic(\"toArray\", function () {\n\t return [].concat(_toConsumableArray(this));\n\t});\n\n\t/*\n\t * Methods that return an array of iterables.\n\t */\n\n\tvar MAX_CACHE = 500;\n\n\tvar _tee = rewrap(_regeneratorRuntime.mark(function callee$0$0(iterator, cache) {\n\t var items, index, _iterator$next, done, value;\n\n\t return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {\n\t while (1) switch (context$1$0.prev = context$1$0.next) {\n\t case 0:\n\t items = cache.items;\n\t index = 0;\n\n\t case 2:\n\t if (false) {\n\t context$1$0.next = 25;\n\t break;\n\t }\n\n\t if (!(index === items.length)) {\n\t context$1$0.next = 14;\n\t break;\n\t }\n\n\t _iterator$next = iterator.next();\n\t done = _iterator$next.done;\n\t value = _iterator$next.value;\n\n\t if (!done) {\n\t context$1$0.next = 10;\n\t break;\n\t }\n\n\t if (cache.returned === MISSING) {\n\t cache.returned = value;\n\t }\n\t return context$1$0.abrupt(\"break\", 25);\n\n\t case 10:\n\t context$1$0.next = 12;\n\t return items[index++] = value;\n\n\t case 12:\n\t context$1$0.next = 23;\n\t break;\n\n\t case 14:\n\t if (!(index === cache.tail)) {\n\t context$1$0.next = 21;\n\t break;\n\t }\n\n\t value = items[index];\n\n\t if (index === MAX_CACHE) {\n\t items = cache.items = items.slice(index);\n\t index = 0;\n\t cache.tail = 0;\n\t } else {\n\t items[index] = undefined;\n\t cache.tail = ++index;\n\t }\n\t context$1$0.next = 19;\n\t return value;\n\n\t case 19:\n\t context$1$0.next = 23;\n\t break;\n\n\t case 21:\n\t context$1$0.next = 23;\n\t return items[index++];\n\n\t case 23:\n\t context$1$0.next = 2;\n\t break;\n\n\t case 25:\n\n\t if (cache.tail === index) {\n\t items.length = 0;\n\t }\n\n\t return context$1$0.abrupt(\"return\", cache.returned);\n\n\t case 27:\n\t case \"end\":\n\t return context$1$0.stop();\n\t }\n\t }, callee$0$0, this);\n\t}));\n\t_tee.prototype = Wu.prototype;\n\n\tprototypeAndStatic(\"tee\", function () {\n\t var n = arguments.length <= 0 || arguments[0] === undefined ? 2 : arguments[0];\n\n\t var iterables = new Array(n);\n\t var cache = { tail: 0, items: [], returned: MISSING };\n\n\t while (n--) {\n\t iterables[n] = _tee(this, cache);\n\t }\n\n\t return iterables;\n\t}, 1);\n\n\tprototypeAndStatic(\"unzip\", function () {\n\t var n = arguments.length <= 0 || arguments[0] === undefined ? 2 : arguments[0];\n\n\t return this.tee(n).map(function (iter, i) {\n\t return iter.pluck(i);\n\t });\n\t}, 1);\n\n\t/*\n\t * Number of chambers.\n\t */\n\n\twu.tang = { clan: 36 };\n\n\t// We don't have a cached item for this index, we need to force its\n\t// evaluation.\n\n\t// If we are the last iterator to use a cached value, clean up after\n\t// ourselves.\n\n\t// We have an item in the cache for this index, so yield it.\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _Array$from = __webpack_require__(2)[\"default\"];\n\n\texports[\"default\"] = function (arr) {\n\t if (Array.isArray(arr)) {\n\t for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n\t return arr2;\n\t } else {\n\t return _Array$from(arr);\n\t }\n\t};\n\n\texports.__esModule = true;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(3), __esModule: true };\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(4);\n\t__webpack_require__(26);\n\tmodule.exports = __webpack_require__(12).Array.from;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $at = __webpack_require__(5)(true);\n\n\t// 21.1.3.27 String.prototype[@@iterator]()\n\t__webpack_require__(8)(String, 'String', function(iterated){\n\t this._t = String(iterated); // target\n\t this._i = 0; // next index\n\t// 21.1.5.2.1 %StringIteratorPrototype%.next()\n\t}, function(){\n\t var O = this._t\n\t , index = this._i\n\t , point;\n\t if(index >= O.length)return {value: undefined, done: true};\n\t point = $at(O, index);\n\t this._i += point.length;\n\t return {value: point, done: false};\n\t});\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// true -> String#at\n\t// false -> String#codePointAt\n\tvar toInteger = __webpack_require__(6)\n\t , defined = __webpack_require__(7);\n\tmodule.exports = function(TO_STRING){\n\t return function(that, pos){\n\t var s = String(defined(that))\n\t , i = toInteger(pos)\n\t , l = s.length\n\t , a, b;\n\t if(i < 0 || i >= l)return TO_STRING ? '' : undefined;\n\t a = s.charCodeAt(i);\n\t return a < 0xd800 || a > 0xdbff || i + 1 === l\n\t || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n\t ? TO_STRING ? s.charAt(i) : a\n\t : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n\t };\n\t};\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t// 7.1.4 ToInteger\n\tvar ceil = Math.ceil\n\t , floor = Math.floor;\n\tmodule.exports = function(it){\n\t return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n\t};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t// 7.2.1 RequireObjectCoercible(argument)\n\tmodule.exports = function(it){\n\t if(it == undefined)throw TypeError(\"Can't call method on \" + it);\n\t return it;\n\t};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar LIBRARY = __webpack_require__(9)\n\t , $def = __webpack_require__(10)\n\t , $redef = __webpack_require__(13)\n\t , hide = __webpack_require__(14)\n\t , has = __webpack_require__(19)\n\t , SYMBOL_ITERATOR = __webpack_require__(20)('iterator')\n\t , Iterators = __webpack_require__(23)\n\t , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n\t , FF_ITERATOR = '@@iterator'\n\t , KEYS = 'keys'\n\t , VALUES = 'values';\n\tvar returnThis = function(){ return this; };\n\tmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCE){\n\t __webpack_require__(24)(Constructor, NAME, next);\n\t var createMethod = function(kind){\n\t switch(kind){\n\t case KEYS: return function keys(){ return new Constructor(this, kind); };\n\t case VALUES: return function values(){ return new Constructor(this, kind); };\n\t } return function entries(){ return new Constructor(this, kind); };\n\t };\n\t var TAG = NAME + ' Iterator'\n\t , proto = Base.prototype\n\t , _native = proto[SYMBOL_ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n\t , _default = _native || createMethod(DEFAULT)\n\t , methods, key;\n\t // Fix native\n\t if(_native){\n\t var IteratorPrototype = __webpack_require__(15).getProto(_default.call(new Base));\n\t // Set @@toStringTag to native iterators\n\t __webpack_require__(25)(IteratorPrototype, TAG, true);\n\t // FF fix\n\t if(!LIBRARY && has(proto, FF_ITERATOR))hide(IteratorPrototype, SYMBOL_ITERATOR, returnThis);\n\t }\n\t // Define iterator\n\t if(!LIBRARY || FORCE)hide(proto, SYMBOL_ITERATOR, _default);\n\t // Plug for library\n\t Iterators[NAME] = _default;\n\t Iterators[TAG] = returnThis;\n\t if(DEFAULT){\n\t methods = {\n\t keys: IS_SET ? _default : createMethod(KEYS),\n\t values: DEFAULT == VALUES ? _default : createMethod(VALUES),\n\t entries: DEFAULT != VALUES ? _default : createMethod('entries')\n\t };\n\t if(FORCE)for(key in methods){\n\t if(!(key in proto))$redef(proto, key, methods[key]);\n\t } else $def($def.P + $def.F * BUGGY, NAME, methods);\n\t }\n\t};\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\tmodule.exports = true;\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(11)\n\t , core = __webpack_require__(12)\n\t , PROTOTYPE = 'prototype';\n\tvar ctx = function(fn, that){\n\t return function(){\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\tvar $def = function(type, name, source){\n\t var key, own, out, exp\n\t , isGlobal = type & $def.G\n\t , isProto = type & $def.P\n\t , target = isGlobal ? global : type & $def.S\n\t ? global[name] : (global[name] || {})[PROTOTYPE]\n\t , exports = isGlobal ? core : core[name] || (core[name] = {});\n\t if(isGlobal)source = name;\n\t for(key in source){\n\t // contains in native\n\t own = !(type & $def.F) && target && key in target;\n\t if(own && key in exports)continue;\n\t // export native or passed\n\t out = own ? target[key] : source[key];\n\t // prevent global pollution for namespaces\n\t if(isGlobal && typeof target[key] != 'function')exp = source[key];\n\t // bind timers to global for call from export context\n\t else if(type & $def.B && own)exp = ctx(out, global);\n\t // wrap global constructors for prevent change them in library\n\t else if(type & $def.W && target[key] == out)!function(C){\n\t exp = function(param){\n\t return this instanceof C ? new C(param) : C(param);\n\t };\n\t exp[PROTOTYPE] = C[PROTOTYPE];\n\t }(out);\n\t else exp = isProto && typeof out == 'function' ? ctx(Function.call, out) : out;\n\t // export\n\t exports[key] = exp;\n\t if(isProto)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;\n\t }\n\t};\n\t// type bitmap\n\t$def.F = 1; // forced\n\t$def.G = 2; // global\n\t$def.S = 4; // static\n\t$def.P = 8; // proto\n\t$def.B = 16; // bind\n\t$def.W = 32; // wrap\n\tmodule.exports = $def;\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar UNDEFINED = 'undefined';\n\tvar global = module.exports = typeof window != UNDEFINED && window.Math == Math\n\t ? window : typeof self != UNDEFINED && self.Math == Math ? self : Function('return this')();\n\tif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tvar core = module.exports = {version: '1.2.0'};\n\tif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(14);\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $ = __webpack_require__(15)\n\t , createDesc = __webpack_require__(16);\n\tmodule.exports = __webpack_require__(17) ? function(object, key, value){\n\t return $.setDesc(object, key, createDesc(1, value));\n\t} : function(object, key, value){\n\t object[key] = value;\n\t return object;\n\t};\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\tvar $Object = Object;\n\tmodule.exports = {\n\t create: $Object.create,\n\t getProto: $Object.getPrototypeOf,\n\t isEnum: {}.propertyIsEnumerable,\n\t getDesc: $Object.getOwnPropertyDescriptor,\n\t setDesc: $Object.defineProperty,\n\t setDescs: $Object.defineProperties,\n\t getKeys: $Object.keys,\n\t getNames: $Object.getOwnPropertyNames,\n\t getSymbols: $Object.getOwnPropertySymbols,\n\t each: [].forEach\n\t};\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(bitmap, value){\n\t return {\n\t enumerable : !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable : !(bitmap & 4),\n\t value : value\n\t };\n\t};\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Thank's IE8 for his funny defineProperty\n\tmodule.exports = !__webpack_require__(18)(function(){\n\t return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n\t});\n\n/***/ },\n/* 18 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(exec){\n\t try {\n\t return !!exec();\n\t } catch(e){\n\t return true;\n\t }\n\t};\n\n/***/ },\n/* 19 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\tmodule.exports = function(it, key){\n\t return hasOwnProperty.call(it, key);\n\t};\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar store = __webpack_require__(21)('wks')\n\t , Symbol = __webpack_require__(11).Symbol;\n\tmodule.exports = function(name){\n\t return store[name] || (store[name] =\n\t Symbol && Symbol[name] || (Symbol || __webpack_require__(22))('Symbol.' + name));\n\t};\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(11)\n\t , SHARED = '__core-js_shared__'\n\t , store = global[SHARED] || (global[SHARED] = {});\n\tmodule.exports = function(key){\n\t return store[key] || (store[key] = {});\n\t};\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\tvar id = 0\n\t , px = Math.random();\n\tmodule.exports = function(key){\n\t return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n\t};\n\n/***/ },\n/* 23 */\n/***/ function(module, exports) {\n\n\tmodule.exports = {};\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $ = __webpack_require__(15)\n\t , IteratorPrototype = {};\n\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\t__webpack_require__(14)(IteratorPrototype, __webpack_require__(20)('iterator'), function(){ return this; });\n\n\tmodule.exports = function(Constructor, NAME, next){\n\t Constructor.prototype = $.create(IteratorPrototype, {next: __webpack_require__(16)(1,next)});\n\t __webpack_require__(25)(Constructor, NAME + ' Iterator');\n\t};\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar has = __webpack_require__(19)\n\t , hide = __webpack_require__(14)\n\t , TAG = __webpack_require__(20)('toStringTag');\n\n\tmodule.exports = function(it, tag, stat){\n\t if(it && !has(it = stat ? it : it.prototype, TAG))hide(it, TAG, tag);\n\t};\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar ctx = __webpack_require__(27)\n\t , $def = __webpack_require__(10)\n\t , toObject = __webpack_require__(29)\n\t , call = __webpack_require__(30)\n\t , isArrayIter = __webpack_require__(33)\n\t , toLength = __webpack_require__(34)\n\t , getIterFn = __webpack_require__(35);\n\t$def($def.S + $def.F * !__webpack_require__(38)(function(iter){ Array.from(iter); }), 'Array', {\n\t // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n\t from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){\n\t var O = toObject(arrayLike)\n\t , C = typeof this == 'function' ? this : Array\n\t , mapfn = arguments[1]\n\t , mapping = mapfn !== undefined\n\t , index = 0\n\t , iterFn = getIterFn(O)\n\t , length, result, step, iterator;\n\t if(mapping)mapfn = ctx(mapfn, arguments[2], 2);\n\t // if object isn't iterable or it's array with default iterator - use simple case\n\t if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){\n\t for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){\n\t result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value;\n\t }\n\t } else {\n\t length = toLength(O.length);\n\t for(result = new C(length); length > index; index++){\n\t result[index] = mapping ? mapfn(O[index], index) : O[index];\n\t }\n\t }\n\t result.length = index;\n\t return result;\n\t }\n\t});\n\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// optional / simple context binding\n\tvar aFunction = __webpack_require__(28);\n\tmodule.exports = function(fn, that, length){\n\t aFunction(fn);\n\t if(that === undefined)return fn;\n\t switch(length){\n\t case 1: return function(a){\n\t return fn.call(that, a);\n\t };\n\t case 2: return function(a, b){\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function(a, b, c){\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function(/* ...args */){\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(it){\n\t if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n\t return it;\n\t};\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.13 ToObject(argument)\n\tvar defined = __webpack_require__(7);\n\tmodule.exports = function(it){\n\t return Object(defined(it));\n\t};\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// call something on iterator step with safe closing on error\n\tvar anObject = __webpack_require__(31);\n\tmodule.exports = function(iterator, fn, value, entries){\n\t try {\n\t return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n\t // 7.4.6 IteratorClose(iterator, completion)\n\t } catch(e){\n\t var ret = iterator['return'];\n\t if(ret !== undefined)anObject(ret.call(iterator));\n\t throw e;\n\t }\n\t};\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(32);\n\tmodule.exports = function(it){\n\t if(!isObject(it))throw TypeError(it + ' is not an object!');\n\t return it;\n\t};\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(it){\n\t return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// check on default Array iterator\n\tvar Iterators = __webpack_require__(23)\n\t , ITERATOR = __webpack_require__(20)('iterator');\n\tmodule.exports = function(it){\n\t return (Iterators.Array || Array.prototype[ITERATOR]) === it;\n\t};\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.15 ToLength\n\tvar toInteger = __webpack_require__(6)\n\t , min = Math.min;\n\tmodule.exports = function(it){\n\t return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n\t};\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar classof = __webpack_require__(36)\n\t , ITERATOR = __webpack_require__(20)('iterator')\n\t , Iterators = __webpack_require__(23);\n\tmodule.exports = __webpack_require__(12).getIteratorMethod = function(it){\n\t if(it != undefined)return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];\n\t};\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// getting tag from 19.1.3.6 Object.prototype.toString()\n\tvar cof = __webpack_require__(37)\n\t , TAG = __webpack_require__(20)('toStringTag')\n\t // ES3 wrong here\n\t , ARG = cof(function(){ return arguments; }()) == 'Arguments';\n\n\tmodule.exports = function(it){\n\t var O, T, B;\n\t return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t // @@toStringTag case\n\t : typeof (T = (O = Object(it))[TAG]) == 'string' ? T\n\t // builtinTag case\n\t : ARG ? cof(O)\n\t // ES3 arguments fallback\n\t : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n\t};\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\tvar toString = {}.toString;\n\n\tmodule.exports = function(it){\n\t return toString.call(it).slice(8, -1);\n\t};\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar SYMBOL_ITERATOR = __webpack_require__(20)('iterator')\n\t , SAFE_CLOSING = false;\n\ttry {\n\t var riter = [7][SYMBOL_ITERATOR]();\n\t riter['return'] = function(){ SAFE_CLOSING = true; };\n\t Array.from(riter, function(){ throw 2; });\n\t} catch(e){ /* empty */ }\n\tmodule.exports = function(exec){\n\t if(!SAFE_CLOSING)return false;\n\t var safe = false;\n\t try {\n\t var arr = [7]\n\t , iter = arr[SYMBOL_ITERATOR]();\n\t iter.next = function(){ safe = true; };\n\t arr[SYMBOL_ITERATOR] = function(){ return iter; };\n\t exec(arr);\n\t } catch(e){ /* empty */ }\n\t return safe;\n\t};\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\tvar _getIterator = __webpack_require__(40)[\"default\"];\n\n\tvar _isIterable = __webpack_require__(49)[\"default\"];\n\n\texports[\"default\"] = (function () {\n\t function sliceIterator(arr, i) {\n\t var _arr = [];\n\t var _n = true;\n\t var _d = false;\n\t var _e = undefined;\n\n\t try {\n\t for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t _arr.push(_s.value);\n\n\t if (i && _arr.length === i) break;\n\t }\n\t } catch (err) {\n\t _d = true;\n\t _e = err;\n\t } finally {\n\t try {\n\t if (!_n && _i[\"return\"]) _i[\"return\"]();\n\t } finally {\n\t if (_d) throw _e;\n\t }\n\t }\n\n\t return _arr;\n\t }\n\n\t return function (arr, i) {\n\t if (Array.isArray(arr)) {\n\t return arr;\n\t } else if (_isIterable(Object(arr))) {\n\t return sliceIterator(arr, i);\n\t } else {\n\t throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n\t }\n\t };\n\t})();\n\n\texports.__esModule = true;\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(41), __esModule: true };\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(42);\n\t__webpack_require__(4);\n\tmodule.exports = __webpack_require__(48);\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(43);\n\tvar Iterators = __webpack_require__(23);\n\tIterators.NodeList = Iterators.HTMLCollection = Iterators.Array;\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar setUnscope = __webpack_require__(44)\n\t , step = __webpack_require__(45)\n\t , Iterators = __webpack_require__(23)\n\t , toIObject = __webpack_require__(46);\n\n\t// 22.1.3.4 Array.prototype.entries()\n\t// 22.1.3.13 Array.prototype.keys()\n\t// 22.1.3.29 Array.prototype.values()\n\t// 22.1.3.30 Array.prototype[@@iterator]()\n\t__webpack_require__(8)(Array, 'Array', function(iterated, kind){\n\t this._t = toIObject(iterated); // target\n\t this._i = 0; // next index\n\t this._k = kind; // kind\n\t// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n\t}, function(){\n\t var O = this._t\n\t , kind = this._k\n\t , index = this._i++;\n\t if(!O || index >= O.length){\n\t this._t = undefined;\n\t return step(1);\n\t }\n\t if(kind == 'keys' )return step(0, index);\n\t if(kind == 'values')return step(0, O[index]);\n\t return step(0, [index, O[index]]);\n\t}, 'values');\n\n\t// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\n\tIterators.Arguments = Iterators.Array;\n\n\tsetUnscope('keys');\n\tsetUnscope('values');\n\tsetUnscope('entries');\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(){ /* empty */ };\n\n/***/ },\n/* 45 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(done, value){\n\t return {value: value, done: !!done};\n\t};\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// to indexed object, toObject with fallback for non-array-like ES3 strings\r\n\tvar IObject = __webpack_require__(47)\r\n\t , defined = __webpack_require__(7);\r\n\tmodule.exports = function(it){\r\n\t return IObject(defined(it));\r\n\t};\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// indexed object, fallback for non-array-like ES3 strings\n\tvar cof = __webpack_require__(37);\n\tmodule.exports = 0 in Object('z') ? Object : function(it){\n\t return cof(it) == 'String' ? it.split('') : Object(it);\n\t};\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar anObject = __webpack_require__(31)\n\t , get = __webpack_require__(35);\n\tmodule.exports = __webpack_require__(12).getIterator = function(it){\n\t var iterFn = get(it);\n\t if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');\n\t return anObject(iterFn.call(it));\n\t};\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(50), __esModule: true };\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(42);\n\t__webpack_require__(4);\n\tmodule.exports = __webpack_require__(51);\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar classof = __webpack_require__(36)\n\t , ITERATOR = __webpack_require__(20)('iterator')\n\t , Iterators = __webpack_require__(23);\n\tmodule.exports = __webpack_require__(12).isIterable = function(it){\n\t var O = Object(it);\n\t return ITERATOR in O || '@@iterator' in O || Iterators.hasOwnProperty(classof(O));\n\t};\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(53), __esModule: true };\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(4);\n\t__webpack_require__(42);\n\tmodule.exports = __webpack_require__(20)('iterator');\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {// This method of obtaining a reference to the global object needs to be\n\t// kept identical to the way it is obtained in runtime.js\n\tvar g =\n\t typeof global === \"object\" ? global :\n\t typeof window === \"object\" ? window :\n\t typeof self === \"object\" ? self : this;\n\n\t// Use `getOwnPropertyNames` because not all browsers support calling\n\t// `hasOwnProperty` on the global `self` object in a worker. See #183.\n\tvar hadRuntime = g.regeneratorRuntime &&\n\t Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n\t// Save the old regeneratorRuntime in case it needs to be restored later.\n\tvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n\t// Force reevalutation of runtime.js.\n\tg.regeneratorRuntime = undefined;\n\n\tmodule.exports = __webpack_require__(55);\n\n\tif (hadRuntime) {\n\t // Restore the original runtime.\n\t g.regeneratorRuntime = oldRuntime;\n\t} else {\n\t // Remove the global property added by runtime.js.\n\t try {\n\t delete g.regeneratorRuntime;\n\t } catch(e) {\n\t g.regeneratorRuntime = undefined;\n\t }\n\t}\n\n\tmodule.exports = { \"default\": module.exports, __esModule: true };\n\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {/**\n\t * Copyright (c) 2014, Facebook, Inc.\n\t * All rights reserved.\n\t *\n\t * This source code is licensed under the BSD-style license found in the\n\t * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n\t * additional grant of patent rights can be found in the PATENTS file in\n\t * the same directory.\n\t */\n\n\t\"use strict\";\n\n\tvar _Symbol = __webpack_require__(57)[\"default\"];\n\n\tvar _Symbol$iterator = __webpack_require__(52)[\"default\"];\n\n\tvar _Object$create = __webpack_require__(63)[\"default\"];\n\n\tvar _Promise = __webpack_require__(65)[\"default\"];\n\n\t!(function (global) {\n\t \"use strict\";\n\n\t var hasOwn = Object.prototype.hasOwnProperty;\n\t var undefined; // More compressible than void 0.\n\t var iteratorSymbol = typeof _Symbol === \"function\" && _Symbol$iterator || \"@@iterator\";\n\n\t var inModule = typeof module === \"object\";\n\t var runtime = global.regeneratorRuntime;\n\t if (runtime) {\n\t if (inModule) {\n\t // If regeneratorRuntime is defined globally and we're in a module,\n\t // make the exports object identical to regeneratorRuntime.\n\t module.exports = runtime;\n\t }\n\t // Don't bother evaluating the rest of this file if the runtime was\n\t // already defined globally.\n\t return;\n\t }\n\n\t // Define the runtime globally (as expected by generated code) as either\n\t // module.exports (if we're in a module) or a new, empty object.\n\t runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n\t function wrap(innerFn, outerFn, self, tryLocsList) {\n\t // If outerFn provided, then outerFn.prototype instanceof Generator.\n\t var generator = _Object$create((outerFn || Generator).prototype);\n\n\t generator._invoke = makeInvokeMethod(innerFn, self || null, new Context(tryLocsList || []));\n\n\t return generator;\n\t }\n\t runtime.wrap = wrap;\n\n\t // Try/catch helper to minimize deoptimizations. Returns a completion\n\t // record like context.tryEntries[i].completion. This interface could\n\t // have been (and was previously) designed to take a closure to be\n\t // invoked without arguments, but in all the cases we care about we\n\t // already have an existing method we want to call, so there's no need\n\t // to create a new function object. We can even get away with assuming\n\t // the method takes exactly one argument, since that happens to be true\n\t // in every case, so we don't have to touch the arguments object. The\n\t // only additional allocation required is the completion record, which\n\t // has a stable shape and so hopefully should be cheap to allocate.\n\t function tryCatch(fn, obj, arg) {\n\t try {\n\t return { type: \"normal\", arg: fn.call(obj, arg) };\n\t } catch (err) {\n\t return { type: \"throw\", arg: err };\n\t }\n\t }\n\n\t var GenStateSuspendedStart = \"suspendedStart\";\n\t var GenStateSuspendedYield = \"suspendedYield\";\n\t var GenStateExecuting = \"executing\";\n\t var GenStateCompleted = \"completed\";\n\n\t // Returning this object from the innerFn has the same effect as\n\t // breaking out of the dispatch switch statement.\n\t var ContinueSentinel = {};\n\n\t // Dummy constructor functions that we use as the .constructor and\n\t // .constructor.prototype properties for functions that return Generator\n\t // objects. For full spec compliance, you may wish to configure your\n\t // minifier not to mangle the names of these two functions.\n\t function Generator() {}\n\t function GeneratorFunction() {}\n\t function GeneratorFunctionPrototype() {}\n\n\t var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n\t GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n\t GeneratorFunctionPrototype.constructor = GeneratorFunction;\n\t GeneratorFunction.displayName = \"GeneratorFunction\";\n\n\t // Helper for defining the .next, .throw, and .return methods of the\n\t // Iterator interface in terms of a single ._invoke method.\n\t function defineIteratorMethods(prototype) {\n\t [\"next\", \"throw\", \"return\"].forEach(function (method) {\n\t prototype[method] = function (arg) {\n\t return this._invoke(method, arg);\n\t };\n\t });\n\t }\n\n\t runtime.isGeneratorFunction = function (genFun) {\n\t var ctor = typeof genFun === \"function\" && genFun.constructor;\n\t return ctor ? ctor === GeneratorFunction ||\n\t // For the native GeneratorFunction constructor, the best we can\n\t // do is to check its .name property.\n\t (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n\t };\n\n\t runtime.mark = function (genFun) {\n\t genFun.__proto__ = GeneratorFunctionPrototype;\n\t genFun.prototype = _Object$create(Gp);\n\t return genFun;\n\t };\n\n\t // Within the body of any async function, `await x` is transformed to\n\t // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n\t // `value instanceof AwaitArgument` to determine if the yielded value is\n\t // meant to be awaited. Some may consider the name of this method too\n\t // cutesy, but they are curmudgeons.\n\t runtime.awrap = function (arg) {\n\t return new AwaitArgument(arg);\n\t };\n\n\t function AwaitArgument(arg) {\n\t this.arg = arg;\n\t }\n\n\t function AsyncIterator(generator) {\n\t // This invoke function is written in a style that assumes some\n\t // calling function (or Promise) will handle exceptions.\n\t function invoke(method, arg) {\n\t var result = generator[method](arg);\n\t var value = result.value;\n\t return value instanceof AwaitArgument ? _Promise.resolve(value.arg).then(invokeNext, invokeThrow) : _Promise.resolve(value).then(function (unwrapped) {\n\t // When a yielded Promise is resolved, its final value becomes\n\t // the .value of the Promise<{value,done}> result for the\n\t // current iteration. If the Promise is rejected, however, the\n\t // result for this iteration will be rejected with the same\n\t // reason. Note that rejections of yielded Promises are not\n\t // thrown back into the generator function, as is the case\n\t // when an awaited Promise is rejected. This difference in\n\t // behavior between yield and await is important, because it\n\t // allows the consumer to decide what to do with the yielded\n\t // rejection (swallow it and continue, manually .throw it back\n\t // into the generator, abandon iteration, whatever). With\n\t // await, by contrast, there is no opportunity to examine the\n\t // rejection reason outside the generator function, so the\n\t // only option is to throw it from the await expression, and\n\t // let the generator function handle the exception.\n\t result.value = unwrapped;\n\t return result;\n\t });\n\t }\n\n\t if (typeof process === \"object\" && process.domain) {\n\t invoke = process.domain.bind(invoke);\n\t }\n\n\t var invokeNext = invoke.bind(generator, \"next\");\n\t var invokeThrow = invoke.bind(generator, \"throw\");\n\t var invokeReturn = invoke.bind(generator, \"return\");\n\t var previousPromise;\n\n\t function enqueue(method, arg) {\n\t var enqueueResult =\n\t // If enqueue has been called before, then we want to wait until\n\t // all previous Promises have been resolved before calling invoke,\n\t // so that results are always delivered in the correct order. If\n\t // enqueue has not been called before, then it is important to\n\t // call invoke immediately, without waiting on a callback to fire,\n\t // so that the async generator function has the opportunity to do\n\t // any necessary setup in a predictable way. This predictability\n\t // is why the Promise constructor synchronously invokes its\n\t // executor callback, and why async functions synchronously\n\t // execute code before the first await. Since we implement simple\n\t // async functions in terms of async generators, it is especially\n\t // important to get this right, even though it requires care.\n\t previousPromise ? previousPromise.then(function () {\n\t return invoke(method, arg);\n\t }) : new _Promise(function (resolve) {\n\t resolve(invoke(method, arg));\n\t });\n\n\t // Avoid propagating enqueueResult failures to Promises returned by\n\t // later invocations of the iterator.\n\t previousPromise = enqueueResult[\"catch\"](function (ignored) {});\n\n\t return enqueueResult;\n\t }\n\n\t // Define the unified helper method that is used to implement .next,\n\t // .throw, and .return (see defineIteratorMethods).\n\t this._invoke = enqueue;\n\t }\n\n\t defineIteratorMethods(AsyncIterator.prototype);\n\n\t // Note that simple async functions are implemented on top of\n\t // AsyncIterator objects; they just return a Promise for the value of\n\t // the final result produced by the iterator.\n\t runtime.async = function (innerFn, outerFn, self, tryLocsList) {\n\t var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));\n\n\t return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n\t : iter.next().then(function (result) {\n\t return result.done ? result.value : iter.next();\n\t });\n\t };\n\n\t function makeInvokeMethod(innerFn, self, context) {\n\t var state = GenStateSuspendedStart;\n\n\t return function invoke(method, arg) {\n\t if (state === GenStateExecuting) {\n\t throw new Error(\"Generator is already running\");\n\t }\n\n\t if (state === GenStateCompleted) {\n\t if (method === \"throw\") {\n\t throw arg;\n\t }\n\n\t // Be forgiving, per 25.3.3.3.3 of the spec:\n\t // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n\t return doneResult();\n\t }\n\n\t while (true) {\n\t var delegate = context.delegate;\n\t if (delegate) {\n\t if (method === \"return\" || method === \"throw\" && delegate.iterator[method] === undefined) {\n\t // A return or throw (when the delegate iterator has no throw\n\t // method) always terminates the yield* loop.\n\t context.delegate = null;\n\n\t // If the delegate iterator has a return method, give it a\n\t // chance to clean up.\n\t var returnMethod = delegate.iterator[\"return\"];\n\t if (returnMethod) {\n\t var record = tryCatch(returnMethod, delegate.iterator, arg);\n\t if (record.type === \"throw\") {\n\t // If the return method threw an exception, let that\n\t // exception prevail over the original return or throw.\n\t method = \"throw\";\n\t arg = record.arg;\n\t continue;\n\t }\n\t }\n\n\t if (method === \"return\") {\n\t // Continue with the outer return, now that the delegate\n\t // iterator has been terminated.\n\t continue;\n\t }\n\t }\n\n\t var record = tryCatch(delegate.iterator[method], delegate.iterator, arg);\n\n\t if (record.type === \"throw\") {\n\t context.delegate = null;\n\n\t // Like returning generator.throw(uncaught), but without the\n\t // overhead of an extra function call.\n\t method = \"throw\";\n\t arg = record.arg;\n\t continue;\n\t }\n\n\t // Delegate generator ran and handled its own exceptions so\n\t // regardless of what the method was, we continue as if it is\n\t // \"next\" with an undefined arg.\n\t method = \"next\";\n\t arg = undefined;\n\n\t var info = record.arg;\n\t if (info.done) {\n\t context[delegate.resultName] = info.value;\n\t context.next = delegate.nextLoc;\n\t } else {\n\t state = GenStateSuspendedYield;\n\t return info;\n\t }\n\n\t context.delegate = null;\n\t }\n\n\t if (method === \"next\") {\n\t if (state === GenStateSuspendedYield) {\n\t context.sent = arg;\n\t } else {\n\t context.sent = undefined;\n\t }\n\t } else if (method === \"throw\") {\n\t if (state === GenStateSuspendedStart) {\n\t state = GenStateCompleted;\n\t throw arg;\n\t }\n\n\t if (context.dispatchException(arg)) {\n\t // If the dispatched exception was caught by a catch block,\n\t // then let that catch block handle the exception normally.\n\t method = \"next\";\n\t arg = undefined;\n\t }\n\t } else if (method === \"return\") {\n\t context.abrupt(\"return\", arg);\n\t }\n\n\t state = GenStateExecuting;\n\n\t var record = tryCatch(innerFn, self, context);\n\t if (record.type === \"normal\") {\n\t // If an exception is thrown from innerFn, we leave state ===\n\t // GenStateExecuting and loop back for another invocation.\n\t state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n\t var info = {\n\t value: record.arg,\n\t done: context.done\n\t };\n\n\t if (record.arg === ContinueSentinel) {\n\t if (context.delegate && method === \"next\") {\n\t // Deliberately forget the last sent value so that we don't\n\t // accidentally pass it on to the delegate.\n\t arg = undefined;\n\t }\n\t } else {\n\t return info;\n\t }\n\t } else if (record.type === \"throw\") {\n\t state = GenStateCompleted;\n\t // Dispatch the exception by looping back around to the\n\t // context.dispatchException(arg) call above.\n\t method = \"throw\";\n\t arg = record.arg;\n\t }\n\t }\n\t };\n\t }\n\n\t // Define Generator.prototype.{next,throw,return} in terms of the\n\t // unified ._invoke helper method.\n\t defineIteratorMethods(Gp);\n\n\t Gp[iteratorSymbol] = function () {\n\t return this;\n\t };\n\n\t Gp.toString = function () {\n\t return \"[object Generator]\";\n\t };\n\n\t function pushTryEntry(locs) {\n\t var entry = { tryLoc: locs[0] };\n\n\t if (1 in locs) {\n\t entry.catchLoc = locs[1];\n\t }\n\n\t if (2 in locs) {\n\t entry.finallyLoc = locs[2];\n\t entry.afterLoc = locs[3];\n\t }\n\n\t this.tryEntries.push(entry);\n\t }\n\n\t function resetTryEntry(entry) {\n\t var record = entry.completion || {};\n\t record.type = \"normal\";\n\t delete record.arg;\n\t entry.completion = record;\n\t }\n\n\t function Context(tryLocsList) {\n\t // The root entry object (effectively a try statement without a catch\n\t // or a finally block) gives us a place to store values thrown from\n\t // locations where there is no enclosing try statement.\n\t this.tryEntries = [{ tryLoc: \"root\" }];\n\t tryLocsList.forEach(pushTryEntry, this);\n\t this.reset(true);\n\t }\n\n\t runtime.keys = function (object) {\n\t var keys = [];\n\t for (var key in object) {\n\t keys.push(key);\n\t }\n\t keys.reverse();\n\n\t // Rather than returning an object with a next method, we keep\n\t // things simple and return the next function itself.\n\t return function next() {\n\t while (keys.length) {\n\t var key = keys.pop();\n\t if (key in object) {\n\t next.value = key;\n\t next.done = false;\n\t return next;\n\t }\n\t }\n\n\t // To avoid creating an additional object, we just hang the .value\n\t // and .done properties off the next function object itself. This\n\t // also ensures that the minifier will not anonymize the function.\n\t next.done = true;\n\t return next;\n\t };\n\t };\n\n\t function values(iterable) {\n\t if (iterable) {\n\t var iteratorMethod = iterable[iteratorSymbol];\n\t if (iteratorMethod) {\n\t return iteratorMethod.call(iterable);\n\t }\n\n\t if (typeof iterable.next === \"function\") {\n\t return iterable;\n\t }\n\n\t if (!isNaN(iterable.length)) {\n\t var i = -1,\n\t next = function next() {\n\t while (++i < iterable.length) {\n\t if (hasOwn.call(iterable, i)) {\n\t next.value = iterable[i];\n\t next.done = false;\n\t return next;\n\t }\n\t }\n\n\t next.value = undefined;\n\t next.done = true;\n\n\t return next;\n\t };\n\n\t return next.next = next;\n\t }\n\t }\n\n\t // Return an iterator with no values.\n\t return { next: doneResult };\n\t }\n\t runtime.values = values;\n\n\t function doneResult() {\n\t return { value: undefined, done: true };\n\t }\n\n\t Context.prototype = {\n\t constructor: Context,\n\n\t reset: function reset(skipTempReset) {\n\t this.prev = 0;\n\t this.next = 0;\n\t this.sent = undefined;\n\t this.done = false;\n\t this.delegate = null;\n\n\t this.tryEntries.forEach(resetTryEntry);\n\n\t if (!skipTempReset) {\n\t for (var name in this) {\n\t // Not sure about the optimal order of these conditions:\n\t if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n\t this[name] = undefined;\n\t }\n\t }\n\t }\n\t },\n\n\t stop: function stop() {\n\t this.done = true;\n\n\t var rootEntry = this.tryEntries[0];\n\t var rootRecord = rootEntry.completion;\n\t if (rootRecord.type === \"throw\") {\n\t throw rootRecord.arg;\n\t }\n\n\t return this.rval;\n\t },\n\n\t dispatchException: function dispatchException(exception) {\n\t if (this.done) {\n\t throw exception;\n\t }\n\n\t var context = this;\n\t function handle(loc, caught) {\n\t record.type = \"throw\";\n\t record.arg = exception;\n\t context.next = loc;\n\t return !!caught;\n\t }\n\n\t for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t var entry = this.tryEntries[i];\n\t var record = entry.completion;\n\n\t if (entry.tryLoc === \"root\") {\n\t // Exception thrown outside of any try block that could handle\n\t // it, so set the completion value of the entire function to\n\t // throw the exception.\n\t return handle(\"end\");\n\t }\n\n\t if (entry.tryLoc <= this.prev) {\n\t var hasCatch = hasOwn.call(entry, \"catchLoc\");\n\t var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n\t if (hasCatch && hasFinally) {\n\t if (this.prev < entry.catchLoc) {\n\t return handle(entry.catchLoc, true);\n\t } else if (this.prev < entry.finallyLoc) {\n\t return handle(entry.finallyLoc);\n\t }\n\t } else if (hasCatch) {\n\t if (this.prev < entry.catchLoc) {\n\t return handle(entry.catchLoc, true);\n\t }\n\t } else if (hasFinally) {\n\t if (this.prev < entry.finallyLoc) {\n\t return handle(entry.finallyLoc);\n\t }\n\t } else {\n\t throw new Error(\"try statement without catch or finally\");\n\t }\n\t }\n\t }\n\t },\n\n\t abrupt: function abrupt(type, arg) {\n\t for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t var entry = this.tryEntries[i];\n\t if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n\t var finallyEntry = entry;\n\t break;\n\t }\n\t }\n\n\t if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n\t // Ignore the finally entry if control is not jumping to a\n\t // location outside the try/catch block.\n\t finallyEntry = null;\n\t }\n\n\t var record = finallyEntry ? finallyEntry.completion : {};\n\t record.type = type;\n\t record.arg = arg;\n\n\t if (finallyEntry) {\n\t this.next = finallyEntry.finallyLoc;\n\t } else {\n\t this.complete(record);\n\t }\n\n\t return ContinueSentinel;\n\t },\n\n\t complete: function complete(record, afterLoc) {\n\t if (record.type === \"throw\") {\n\t throw record.arg;\n\t }\n\n\t if (record.type === \"break\" || record.type === \"continue\") {\n\t this.next = record.arg;\n\t } else if (record.type === \"return\") {\n\t this.rval = record.arg;\n\t this.next = \"end\";\n\t } else if (record.type === \"normal\" && afterLoc) {\n\t this.next = afterLoc;\n\t }\n\t },\n\n\t finish: function finish(finallyLoc) {\n\t for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t var entry = this.tryEntries[i];\n\t if (entry.finallyLoc === finallyLoc) {\n\t this.complete(entry.completion, entry.afterLoc);\n\t resetTryEntry(entry);\n\t return ContinueSentinel;\n\t }\n\t }\n\t },\n\n\t \"catch\": function _catch(tryLoc) {\n\t for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n\t var entry = this.tryEntries[i];\n\t if (entry.tryLoc === tryLoc) {\n\t var record = entry.completion;\n\t if (record.type === \"throw\") {\n\t var thrown = record.arg;\n\t resetTryEntry(entry);\n\t }\n\t return thrown;\n\t }\n\t }\n\n\t // The context.catch method must only be called with a location\n\t // argument that corresponds to a known catch block.\n\t throw new Error(\"illegal catch attempt\");\n\t },\n\n\t delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n\t this.delegate = {\n\t iterator: values(iterable),\n\t resultName: resultName,\n\t nextLoc: nextLoc\n\t };\n\n\t return ContinueSentinel;\n\t }\n\t };\n\t})(\n\t// Among the various tricks for obtaining a reference to the global\n\t// object, this seems to be the most reliable technique that does not\n\t// use indirect eval (which violates Content Security Policy).\n\ttypeof global === \"object\" ? global : typeof window === \"object\" ? window : typeof self === \"object\" ? self : undefined);\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(56)))\n\n/***/ },\n/* 56 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\n\tfunction cleanUpNextTick() {\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = setTimeout(cleanUpNextTick);\n\t draining = true;\n\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t clearTimeout(timeout);\n\t}\n\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t setTimeout(drainQueue, 0);\n\t }\n\t};\n\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\n\tfunction noop() {}\n\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(58), __esModule: true };\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(59);\n\tmodule.exports = __webpack_require__(12).Symbol;\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// ECMAScript 6 symbols shim\n\tvar $ = __webpack_require__(15)\n\t , global = __webpack_require__(11)\n\t , has = __webpack_require__(19)\n\t , SUPPORT_DESC = __webpack_require__(17)\n\t , $def = __webpack_require__(10)\n\t , $redef = __webpack_require__(13)\n\t , $fails = __webpack_require__(18)\n\t , shared = __webpack_require__(21)\n\t , setTag = __webpack_require__(25)\n\t , uid = __webpack_require__(22)\n\t , wks = __webpack_require__(20)\n\t , keyOf = __webpack_require__(60)\n\t , $names = __webpack_require__(61)\n\t , enumKeys = __webpack_require__(62)\n\t , isObject = __webpack_require__(32)\n\t , anObject = __webpack_require__(31)\n\t , toIObject = __webpack_require__(46)\n\t , createDesc = __webpack_require__(16)\n\t , getDesc = $.getDesc\n\t , setDesc = $.setDesc\n\t , _create = $.create\n\t , getNames = $names.get\n\t , $Symbol = global.Symbol\n\t , setter = false\n\t , HIDDEN = wks('_hidden')\n\t , isEnum = $.isEnum\n\t , SymbolRegistry = shared('symbol-registry')\n\t , AllSymbols = shared('symbols')\n\t , useNative = typeof $Symbol == 'function'\n\t , ObjectProto = Object.prototype;\n\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDesc = SUPPORT_DESC && $fails(function(){\n\t return _create(setDesc({}, 'a', {\n\t get: function(){ return setDesc(this, 'a', {value: 7}).a; }\n\t })).a != 7;\n\t}) ? function(it, key, D){\n\t var protoDesc = getDesc(ObjectProto, key);\n\t if(protoDesc)delete ObjectProto[key];\n\t setDesc(it, key, D);\n\t if(protoDesc && it !== ObjectProto)setDesc(ObjectProto, key, protoDesc);\n\t} : setDesc;\n\n\tvar wrap = function(tag){\n\t var sym = AllSymbols[tag] = _create($Symbol.prototype);\n\t sym._k = tag;\n\t SUPPORT_DESC && setter && setSymbolDesc(ObjectProto, tag, {\n\t configurable: true,\n\t set: function(value){\n\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n\t setSymbolDesc(this, tag, createDesc(1, value));\n\t }\n\t });\n\t return sym;\n\t};\n\n\tvar $defineProperty = function defineProperty(it, key, D){\n\t if(D && has(AllSymbols, key)){\n\t if(!D.enumerable){\n\t if(!has(it, HIDDEN))setDesc(it, HIDDEN, createDesc(1, {}));\n\t it[HIDDEN][key] = true;\n\t } else {\n\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n\t D = _create(D, {enumerable: createDesc(0, false)});\n\t } return setSymbolDesc(it, key, D);\n\t } return setDesc(it, key, D);\n\t};\n\tvar $defineProperties = function defineProperties(it, P){\n\t anObject(it);\n\t var keys = enumKeys(P = toIObject(P))\n\t , i = 0\n\t , l = keys.length\n\t , key;\n\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n\t return it;\n\t};\n\tvar $create = function create(it, P){\n\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n\t};\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n\t var E = isEnum.call(this, key);\n\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]\n\t ? E : true;\n\t};\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n\t var D = getDesc(it = toIObject(it), key);\n\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n\t return D;\n\t};\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n\t var names = getNames(toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i)if(!has(AllSymbols, key = names[i++]) && key != HIDDEN)result.push(key);\n\t return result;\n\t};\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n\t var names = getNames(toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i)if(has(AllSymbols, key = names[i++]))result.push(AllSymbols[key]);\n\t return result;\n\t};\n\n\t// 19.4.1.1 Symbol([description])\n\tif(!useNative){\n\t $Symbol = function Symbol(){\n\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor');\n\t return wrap(uid(arguments[0]));\n\t };\n\t $redef($Symbol.prototype, 'toString', function toString(){\n\t return this._k;\n\t });\n\n\t $.create = $create;\n\t $.isEnum = $propertyIsEnumerable;\n\t $.getDesc = $getOwnPropertyDescriptor;\n\t $.setDesc = $defineProperty;\n\t $.setDescs = $defineProperties;\n\t $.getNames = $names.get = $getOwnPropertyNames;\n\t $.getSymbols = $getOwnPropertySymbols;\n\n\t if(SUPPORT_DESC && !__webpack_require__(9)){\n\t $redef(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n\t }\n\t}\n\n\t// MS Edge converts symbol values to JSON as {}\n\tif(!useNative || $fails(function(){\n\t return JSON.stringify([$Symbol()]) != '[null]';\n\t}))$redef($Symbol.prototype, 'toJSON', function toJSON(){\n\t if(useNative && isObject(this))return this;\n\t});\n\n\tvar symbolStatics = {\n\t // 19.4.2.1 Symbol.for(key)\n\t 'for': function(key){\n\t return has(SymbolRegistry, key += '')\n\t ? SymbolRegistry[key]\n\t : SymbolRegistry[key] = $Symbol(key);\n\t },\n\t // 19.4.2.5 Symbol.keyFor(sym)\n\t keyFor: function keyFor(key){\n\t return keyOf(SymbolRegistry, key);\n\t },\n\t useSetter: function(){ setter = true; },\n\t useSimple: function(){ setter = false; }\n\t};\n\t// 19.4.2.2 Symbol.hasInstance\n\t// 19.4.2.3 Symbol.isConcatSpreadable\n\t// 19.4.2.4 Symbol.iterator\n\t// 19.4.2.6 Symbol.match\n\t// 19.4.2.8 Symbol.replace\n\t// 19.4.2.9 Symbol.search\n\t// 19.4.2.10 Symbol.species\n\t// 19.4.2.11 Symbol.split\n\t// 19.4.2.12 Symbol.toPrimitive\n\t// 19.4.2.13 Symbol.toStringTag\n\t// 19.4.2.14 Symbol.unscopables\n\t$.each.call((\n\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,' +\n\t 'species,split,toPrimitive,toStringTag,unscopables'\n\t ).split(','), function(it){\n\t var sym = wks(it);\n\t symbolStatics[it] = useNative ? sym : wrap(sym);\n\t }\n\t);\n\n\tsetter = true;\n\n\t$def($def.G + $def.W, {Symbol: $Symbol});\n\n\t$def($def.S, 'Symbol', symbolStatics);\n\n\t$def($def.S + $def.F * !useNative, 'Object', {\n\t // 19.1.2.2 Object.create(O [, Properties])\n\t create: $create,\n\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n\t defineProperty: $defineProperty,\n\t // 19.1.2.3 Object.defineProperties(O, Properties)\n\t defineProperties: $defineProperties,\n\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n\t // 19.1.2.7 Object.getOwnPropertyNames(O)\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\n\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\n\tsetTag($Symbol, 'Symbol');\n\t// 20.2.1.9 Math[@@toStringTag]\n\tsetTag(Math, 'Math', true);\n\t// 24.3.3 JSON[@@toStringTag]\n\tsetTag(global.JSON, 'JSON', true);\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $ = __webpack_require__(15)\n\t , toIObject = __webpack_require__(46);\n\tmodule.exports = function(object, el){\n\t var O = toIObject(object)\n\t , keys = $.getKeys(O)\n\t , length = keys.length\n\t , index = 0\n\t , key;\n\t while(length > index)if(O[key = keys[index++]] === el)return key;\n\t};\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\tvar toString = {}.toString\n\t , toIObject = __webpack_require__(46)\n\t , getNames = __webpack_require__(15).getNames;\n\n\tvar windowNames = typeof window == 'object' && Object.getOwnPropertyNames\n\t ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames = function(it){\n\t try {\n\t return getNames(it);\n\t } catch(e){\n\t return windowNames.slice();\n\t }\n\t};\n\n\tmodule.exports.get = function getOwnPropertyNames(it){\n\t if(windowNames && toString.call(it) == '[object Window]')return getWindowNames(it);\n\t return getNames(toIObject(it));\n\t};\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// all enumerable object keys, includes symbols\n\tvar $ = __webpack_require__(15);\n\tmodule.exports = function(it){\n\t var keys = $.getKeys(it)\n\t , getSymbols = $.getSymbols;\n\t if(getSymbols){\n\t var symbols = getSymbols(it)\n\t , isEnum = $.isEnum\n\t , i = 0\n\t , key;\n\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))keys.push(key);\n\t }\n\t return keys;\n\t};\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(64), __esModule: true };\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $ = __webpack_require__(15);\n\tmodule.exports = function create(P, D){\n\t return $.create(P, D);\n\t};\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(66), __esModule: true };\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(67);\n\t__webpack_require__(4);\n\t__webpack_require__(42);\n\t__webpack_require__(68);\n\tmodule.exports = __webpack_require__(12).Promise;\n\n/***/ },\n/* 67 */\n/***/ function(module, exports) {\n\n\t\n\n/***/ },\n/* 68 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $ = __webpack_require__(15)\n\t , LIBRARY = __webpack_require__(9)\n\t , global = __webpack_require__(11)\n\t , ctx = __webpack_require__(27)\n\t , classof = __webpack_require__(36)\n\t , $def = __webpack_require__(10)\n\t , isObject = __webpack_require__(32)\n\t , anObject = __webpack_require__(31)\n\t , aFunction = __webpack_require__(28)\n\t , strictNew = __webpack_require__(69)\n\t , forOf = __webpack_require__(70)\n\t , setProto = __webpack_require__(71).set\n\t , same = __webpack_require__(72)\n\t , species = __webpack_require__(73)\n\t , SPECIES = __webpack_require__(20)('species')\n\t , RECORD = __webpack_require__(22)('record')\n\t , asap = __webpack_require__(74)\n\t , PROMISE = 'Promise'\n\t , process = global.process\n\t , isNode = classof(process) == 'process'\n\t , P = global[PROMISE]\n\t , Wrapper;\n\n\tvar testResolve = function(sub){\n\t var test = new P(function(){});\n\t if(sub)test.constructor = Object;\n\t return P.resolve(test) === test;\n\t};\n\n\tvar useNative = function(){\n\t var works = false;\n\t function P2(x){\n\t var self = new P(x);\n\t setProto(self, P2.prototype);\n\t return self;\n\t }\n\t try {\n\t works = P && P.resolve && testResolve();\n\t setProto(P2, P);\n\t P2.prototype = $.create(P.prototype, {constructor: {value: P2}});\n\t // actual Firefox has broken subclass support, test that\n\t if(!(P2.resolve(5).then(function(){}) instanceof P2)){\n\t works = false;\n\t }\n\t // actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162\n\t if(works && __webpack_require__(17)){\n\t var thenableThenGotten = false;\n\t P.resolve($.setDesc({}, 'then', {\n\t get: function(){ thenableThenGotten = true; }\n\t }));\n\t works = thenableThenGotten;\n\t }\n\t } catch(e){ works = false; }\n\t return works;\n\t}();\n\n\t// helpers\n\tvar isPromise = function(it){\n\t return isObject(it) && (useNative ? classof(it) == 'Promise' : RECORD in it);\n\t};\n\tvar sameConstructor = function(a, b){\n\t // library wrapper special case\n\t if(LIBRARY && a === P && b === Wrapper)return true;\n\t return same(a, b);\n\t};\n\tvar getConstructor = function(C){\n\t var S = anObject(C)[SPECIES];\n\t return S != undefined ? S : C;\n\t};\n\tvar isThenable = function(it){\n\t var then;\n\t return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\tvar notify = function(record, isReject){\n\t if(record.n)return;\n\t record.n = true;\n\t var chain = record.c;\n\t asap(function(){\n\t var value = record.v\n\t , ok = record.s == 1\n\t , i = 0;\n\t var run = function(react){\n\t var cb = ok ? react.ok : react.fail\n\t , ret, then;\n\t try {\n\t if(cb){\n\t if(!ok)record.h = true;\n\t ret = cb === true ? value : cb(value);\n\t if(ret === react.P){\n\t react.rej(TypeError('Promise-chain cycle'));\n\t } else if(then = isThenable(ret)){\n\t then.call(ret, react.res, react.rej);\n\t } else react.res(ret);\n\t } else react.rej(value);\n\t } catch(err){\n\t react.rej(err);\n\t }\n\t };\n\t while(chain.length > i)run(chain[i++]); // variable length - can't use forEach\n\t chain.length = 0;\n\t record.n = false;\n\t if(isReject)setTimeout(function(){\n\t var promise = record.p\n\t , handler, console;\n\t if(isUnhandled(promise)){\n\t if(isNode){\n\t process.emit('unhandledRejection', value, promise);\n\t } else if(handler = global.onunhandledrejection){\n\t handler({promise: promise, reason: value});\n\t } else if((console = global.console) && console.error){\n\t console.error('Unhandled promise rejection', value);\n\t }\n\t } record.a = undefined;\n\t }, 1);\n\t });\n\t};\n\tvar isUnhandled = function(promise){\n\t var record = promise[RECORD]\n\t , chain = record.a || record.c\n\t , i = 0\n\t , react;\n\t if(record.h)return false;\n\t while(chain.length > i){\n\t react = chain[i++];\n\t if(react.fail || !isUnhandled(react.P))return false;\n\t } return true;\n\t};\n\tvar $reject = function(value){\n\t var record = this;\n\t if(record.d)return;\n\t record.d = true;\n\t record = record.r || record; // unwrap\n\t record.v = value;\n\t record.s = 2;\n\t record.a = record.c.slice();\n\t notify(record, true);\n\t};\n\tvar $resolve = function(value){\n\t var record = this\n\t , then;\n\t if(record.d)return;\n\t record.d = true;\n\t record = record.r || record; // unwrap\n\t try {\n\t if(then = isThenable(value)){\n\t asap(function(){\n\t var wrapper = {r: record, d: false}; // wrap\n\t try {\n\t then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n\t } catch(e){\n\t $reject.call(wrapper, e);\n\t }\n\t });\n\t } else {\n\t record.v = value;\n\t record.s = 1;\n\t notify(record, false);\n\t }\n\t } catch(e){\n\t $reject.call({r: record, d: false}, e); // wrap\n\t }\n\t};\n\n\t// constructor polyfill\n\tif(!useNative){\n\t // 25.4.3.1 Promise(executor)\n\t P = function Promise(executor){\n\t aFunction(executor);\n\t var record = {\n\t p: strictNew(this, P, PROMISE), // <- promise\n\t c: [], // <- awaiting reactions\n\t a: undefined, // <- checked in isUnhandled reactions\n\t s: 0, // <- state\n\t d: false, // <- done\n\t v: undefined, // <- value\n\t h: false, // <- handled rejection\n\t n: false // <- notify\n\t };\n\t this[RECORD] = record;\n\t try {\n\t executor(ctx($resolve, record, 1), ctx($reject, record, 1));\n\t } catch(err){\n\t $reject.call(record, err);\n\t }\n\t };\n\t __webpack_require__(79)(P.prototype, {\n\t // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n\t then: function then(onFulfilled, onRejected){\n\t var S = anObject(anObject(this).constructor)[SPECIES];\n\t var react = {\n\t ok: typeof onFulfilled == 'function' ? onFulfilled : true,\n\t fail: typeof onRejected == 'function' ? onRejected : false\n\t };\n\t var promise = react.P = new (S != undefined ? S : P)(function(res, rej){\n\t react.res = res;\n\t react.rej = rej;\n\t });\n\t aFunction(react.res);\n\t aFunction(react.rej);\n\t var record = this[RECORD];\n\t record.c.push(react);\n\t if(record.a)record.a.push(react);\n\t if(record.s)notify(record, false);\n\t return promise;\n\t },\n\t // 25.4.5.1 Promise.prototype.catch(onRejected)\n\t 'catch': function(onRejected){\n\t return this.then(undefined, onRejected);\n\t }\n\t });\n\t}\n\n\t// export\n\t$def($def.G + $def.W + $def.F * !useNative, {Promise: P});\n\t__webpack_require__(25)(P, PROMISE);\n\tspecies(P);\n\tspecies(Wrapper = __webpack_require__(12)[PROMISE]);\n\n\t// statics\n\t$def($def.S + $def.F * !useNative, PROMISE, {\n\t // 25.4.4.5 Promise.reject(r)\n\t reject: function reject(r){\n\t return new this(function(res, rej){ rej(r); });\n\t }\n\t});\n\t$def($def.S + $def.F * (!useNative || testResolve(true)), PROMISE, {\n\t // 25.4.4.6 Promise.resolve(x)\n\t resolve: function resolve(x){\n\t return isPromise(x) && sameConstructor(x.constructor, this)\n\t ? x : new this(function(res){ res(x); });\n\t }\n\t});\n\t$def($def.S + $def.F * !(useNative && __webpack_require__(38)(function(iter){\n\t P.all(iter)['catch'](function(){});\n\t})), PROMISE, {\n\t // 25.4.4.1 Promise.all(iterable)\n\t all: function all(iterable){\n\t var C = getConstructor(this)\n\t , values = [];\n\t return new C(function(res, rej){\n\t forOf(iterable, false, values.push, values);\n\t var remaining = values.length\n\t , results = Array(remaining);\n\t if(remaining)$.each.call(values, function(promise, index){\n\t C.resolve(promise).then(function(value){\n\t results[index] = value;\n\t --remaining || res(results);\n\t }, rej);\n\t });\n\t else res(results);\n\t });\n\t },\n\t // 25.4.4.4 Promise.race(iterable)\n\t race: function race(iterable){\n\t var C = getConstructor(this);\n\t return new C(function(res, rej){\n\t forOf(iterable, false, function(promise){\n\t C.resolve(promise).then(res, rej);\n\t });\n\t });\n\t }\n\t});\n\n/***/ },\n/* 69 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(it, Constructor, name){\n\t if(!(it instanceof Constructor))throw TypeError(name + \": use the 'new' operator!\");\n\t return it;\n\t};\n\n/***/ },\n/* 70 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar ctx = __webpack_require__(27)\n\t , call = __webpack_require__(30)\n\t , isArrayIter = __webpack_require__(33)\n\t , anObject = __webpack_require__(31)\n\t , toLength = __webpack_require__(34)\n\t , getIterFn = __webpack_require__(35);\n\tmodule.exports = function(iterable, entries, fn, that){\n\t var iterFn = getIterFn(iterable)\n\t , f = ctx(fn, that, entries ? 2 : 1)\n\t , index = 0\n\t , length, step, iterator;\n\t if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!');\n\t // fast case for arrays with default iterator\n\t if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){\n\t entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n\t } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){\n\t call(iterator, f, step.value, entries);\n\t }\n\t};\n\n/***/ },\n/* 71 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\t/* eslint-disable no-proto */\n\tvar getDesc = __webpack_require__(15).getDesc\n\t , isObject = __webpack_require__(32)\n\t , anObject = __webpack_require__(31);\n\tvar check = function(O, proto){\n\t anObject(O);\n\t if(!isObject(proto) && proto !== null)throw TypeError(proto + \": can't set as prototype!\");\n\t};\n\tmodule.exports = {\n\t set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line no-proto\n\t function(test, buggy, set){\n\t try {\n\t set = __webpack_require__(27)(Function.call, getDesc(Object.prototype, '__proto__').set, 2);\n\t set(test, []);\n\t buggy = !(test instanceof Array);\n\t } catch(e){ buggy = true; }\n\t return function setPrototypeOf(O, proto){\n\t check(O, proto);\n\t if(buggy)O.__proto__ = proto;\n\t else set(O, proto);\n\t return O;\n\t };\n\t }({}, false) : undefined),\n\t check: check\n\t};\n\n/***/ },\n/* 72 */\n/***/ function(module, exports) {\n\n\tmodule.exports = Object.is || function is(x, y){\n\t return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n/***/ },\n/* 73 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $ = __webpack_require__(15)\n\t , SPECIES = __webpack_require__(20)('species');\n\tmodule.exports = function(C){\n\t if(__webpack_require__(17) && !(SPECIES in C))$.setDesc(C, SPECIES, {\n\t configurable: true,\n\t get: function(){ return this; }\n\t });\n\t};\n\n/***/ },\n/* 74 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(11)\r\n\t , macrotask = __webpack_require__(75).set\r\n\t , Observer = global.MutationObserver || global.WebKitMutationObserver\r\n\t , process = global.process\r\n\t , isNode = __webpack_require__(37)(process) == 'process'\r\n\t , head, last, notify;\r\n\r\n\tvar flush = function(){\r\n\t var parent, domain;\r\n\t if(isNode && (parent = process.domain)){\r\n\t process.domain = null;\r\n\t parent.exit();\r\n\t }\r\n\t while(head){\r\n\t domain = head.domain;\r\n\t if(domain)domain.enter();\r\n\t head.fn.call(); // <- currently we use it only for Promise - try / catch not required\r\n\t if(domain)domain.exit();\r\n\t head = head.next;\r\n\t } last = undefined;\r\n\t if(parent)parent.enter();\r\n\t}\r\n\r\n\t// Node.js\r\n\tif(isNode){\r\n\t notify = function(){\r\n\t process.nextTick(flush);\r\n\t };\r\n\t// browsers with MutationObserver\r\n\t} else if(Observer){\r\n\t var toggle = 1\r\n\t , node = document.createTextNode('');\r\n\t new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new\r\n\t notify = function(){\r\n\t node.data = toggle = -toggle;\r\n\t };\r\n\t// for other environments - macrotask based on:\r\n\t// - setImmediate\r\n\t// - MessageChannel\r\n\t// - window.postMessag\r\n\t// - onreadystatechange\r\n\t// - setTimeout\r\n\t} else {\r\n\t notify = function(){\r\n\t // strange IE + webpack dev server bug - use .call(global)\r\n\t macrotask.call(global, flush);\r\n\t };\r\n\t}\r\n\r\n\tmodule.exports = function asap(fn){\r\n\t var task = {fn: fn, next: undefined, domain: isNode && process.domain};\r\n\t if(last)last.next = task;\r\n\t if(!head){\r\n\t head = task;\r\n\t notify();\r\n\t } last = task;\r\n\t};\n\n/***/ },\n/* 75 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar ctx = __webpack_require__(27)\n\t , invoke = __webpack_require__(76)\n\t , html = __webpack_require__(77)\n\t , cel = __webpack_require__(78)\n\t , global = __webpack_require__(11)\n\t , process = global.process\n\t , setTask = global.setImmediate\n\t , clearTask = global.clearImmediate\n\t , MessageChannel = global.MessageChannel\n\t , counter = 0\n\t , queue = {}\n\t , ONREADYSTATECHANGE = 'onreadystatechange'\n\t , defer, channel, port;\n\tvar run = function(){\n\t var id = +this;\n\t if(queue.hasOwnProperty(id)){\n\t var fn = queue[id];\n\t delete queue[id];\n\t fn();\n\t }\n\t};\n\tvar listner = function(event){\n\t run.call(event.data);\n\t};\n\t// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\tif(!setTask || !clearTask){\n\t setTask = function setImmediate(fn){\n\t var args = [], i = 1;\n\t while(arguments.length > i)args.push(arguments[i++]);\n\t queue[++counter] = function(){\n\t invoke(typeof fn == 'function' ? fn : Function(fn), args);\n\t };\n\t defer(counter);\n\t return counter;\n\t };\n\t clearTask = function clearImmediate(id){\n\t delete queue[id];\n\t };\n\t // Node.js 0.8-\n\t if(__webpack_require__(37)(process) == 'process'){\n\t defer = function(id){\n\t process.nextTick(ctx(run, id, 1));\n\t };\n\t // Browsers with MessageChannel, includes WebWorkers\n\t } else if(MessageChannel){\n\t channel = new MessageChannel;\n\t port = channel.port2;\n\t channel.port1.onmessage = listner;\n\t defer = ctx(port.postMessage, port, 1);\n\t // Browsers with postMessage, skip WebWorkers\n\t // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n\t } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScript){\n\t defer = function(id){\n\t global.postMessage(id + '', '*');\n\t };\n\t global.addEventListener('message', listner, false);\n\t // IE8-\n\t } else if(ONREADYSTATECHANGE in cel('script')){\n\t defer = function(id){\n\t html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){\n\t html.removeChild(this);\n\t run.call(id);\n\t };\n\t };\n\t // Rest old browsers\n\t } else {\n\t defer = function(id){\n\t setTimeout(ctx(run, id, 1), 0);\n\t };\n\t }\n\t}\n\tmodule.exports = {\n\t set: setTask,\n\t clear: clearTask\n\t};\n\n/***/ },\n/* 76 */\n/***/ function(module, exports) {\n\n\t// fast apply, http://jsperf.lnkit.com/fast-apply/5\n\tmodule.exports = function(fn, args, that){\n\t var un = that === undefined;\n\t switch(args.length){\n\t case 0: return un ? fn()\n\t : fn.call(that);\n\t case 1: return un ? fn(args[0])\n\t : fn.call(that, args[0]);\n\t case 2: return un ? fn(args[0], args[1])\n\t : fn.call(that, args[0], args[1]);\n\t case 3: return un ? fn(args[0], args[1], args[2])\n\t : fn.call(that, args[0], args[1], args[2]);\n\t case 4: return un ? fn(args[0], args[1], args[2], args[3])\n\t : fn.call(that, args[0], args[1], args[2], args[3]);\n\t } return fn.apply(that, args);\n\t};\n\n/***/ },\n/* 77 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(11).document && document.documentElement;\n\n/***/ },\n/* 78 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(32)\n\t , document = __webpack_require__(11).document\n\t // in old IE typeof document.createElement is 'object'\n\t , is = isObject(document) && isObject(document.createElement);\n\tmodule.exports = function(it){\n\t return is ? document.createElement(it) : {};\n\t};\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $redef = __webpack_require__(13);\n\tmodule.exports = function(target, src){\n\t for(var key in src)$redef(target, key, src[key]);\n\t return target;\n\t};\n\n/***/ },\n/* 80 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(81), __esModule: true };\n\n/***/ },\n/* 81 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(82);\n\tmodule.exports = __webpack_require__(12).Object.keys;\n\n/***/ },\n/* 82 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.14 Object.keys(O)\n\tvar toObject = __webpack_require__(29);\n\n\t__webpack_require__(83)('keys', function($keys){\n\t return function keys(it){\n\t return $keys(toObject(it));\n\t };\n\t});\n\n/***/ },\n/* 83 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// most Object methods by ES6 should accept primitives\n\tmodule.exports = function(KEY, exec){\n\t var $def = __webpack_require__(10)\n\t , fn = (__webpack_require__(12).Object || {})[KEY] || Object[KEY]\n\t , exp = {};\n\t exp[KEY] = exec(fn);\n\t $def($def.S + $def.F * __webpack_require__(18)(function(){ fn(1); }), 'Object', exp);\n\t};\n\n/***/ },\n/* 84 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(85), __esModule: true };\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(67);\n\t__webpack_require__(4);\n\t__webpack_require__(42);\n\t__webpack_require__(86);\n\t__webpack_require__(89);\n\tmodule.exports = __webpack_require__(12).Set;\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar strong = __webpack_require__(87);\n\n\t// 23.2 Set Objects\n\t__webpack_require__(88)('Set', function(get){\n\t return function Set(){ return get(this, arguments[0]); };\n\t}, {\n\t // 23.2.3.1 Set.prototype.add(value)\n\t add: function add(value){\n\t return strong.def(this, value = value === 0 ? 0 : value, value);\n\t }\n\t}, strong);\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $ = __webpack_require__(15)\n\t , hide = __webpack_require__(14)\n\t , ctx = __webpack_require__(27)\n\t , species = __webpack_require__(73)\n\t , strictNew = __webpack_require__(69)\n\t , defined = __webpack_require__(7)\n\t , forOf = __webpack_require__(70)\n\t , step = __webpack_require__(45)\n\t , ID = __webpack_require__(22)('id')\n\t , $has = __webpack_require__(19)\n\t , isObject = __webpack_require__(32)\n\t , isExtensible = Object.isExtensible || isObject\n\t , SUPPORT_DESC = __webpack_require__(17)\n\t , SIZE = SUPPORT_DESC ? '_s' : 'size'\n\t , id = 0;\n\n\tvar fastKey = function(it, create){\n\t // return primitive with prefix\n\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if(!$has(it, ID)){\n\t // can't set id to frozen object\n\t if(!isExtensible(it))return 'F';\n\t // not necessary to add id\n\t if(!create)return 'E';\n\t // add missing object id\n\t hide(it, ID, ++id);\n\t // return object id with prefix\n\t } return 'O' + it[ID];\n\t};\n\n\tvar getEntry = function(that, key){\n\t // fast case\n\t var index = fastKey(key), entry;\n\t if(index !== 'F')return that._i[index];\n\t // frozen object case\n\t for(entry = that._f; entry; entry = entry.n){\n\t if(entry.k == key)return entry;\n\t }\n\t};\n\n\tmodule.exports = {\n\t getConstructor: function(wrapper, NAME, IS_MAP, ADDER){\n\t var C = wrapper(function(that, iterable){\n\t strictNew(that, C, NAME);\n\t that._i = $.create(null); // index\n\t that._f = undefined; // first entry\n\t that._l = undefined; // last entry\n\t that[SIZE] = 0; // size\n\t if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that);\n\t });\n\t __webpack_require__(79)(C.prototype, {\n\t // 23.1.3.1 Map.prototype.clear()\n\t // 23.2.3.2 Set.prototype.clear()\n\t clear: function clear(){\n\t for(var that = this, data = that._i, entry = that._f; entry; entry = entry.n){\n\t entry.r = true;\n\t if(entry.p)entry.p = entry.p.n = undefined;\n\t delete data[entry.i];\n\t }\n\t that._f = that._l = undefined;\n\t that[SIZE] = 0;\n\t },\n\t // 23.1.3.3 Map.prototype.delete(key)\n\t // 23.2.3.4 Set.prototype.delete(value)\n\t 'delete': function(key){\n\t var that = this\n\t , entry = getEntry(that, key);\n\t if(entry){\n\t var next = entry.n\n\t , prev = entry.p;\n\t delete that._i[entry.i];\n\t entry.r = true;\n\t if(prev)prev.n = next;\n\t if(next)next.p = prev;\n\t if(that._f == entry)that._f = next;\n\t if(that._l == entry)that._l = prev;\n\t that[SIZE]--;\n\t } return !!entry;\n\t },\n\t // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n\t // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n\t forEach: function forEach(callbackfn /*, that = undefined */){\n\t var f = ctx(callbackfn, arguments[1], 3)\n\t , entry;\n\t while(entry = entry ? entry.n : this._f){\n\t f(entry.v, entry.k, this);\n\t // revert to the last existing entry\n\t while(entry && entry.r)entry = entry.p;\n\t }\n\t },\n\t // 23.1.3.7 Map.prototype.has(key)\n\t // 23.2.3.7 Set.prototype.has(value)\n\t has: function has(key){\n\t return !!getEntry(this, key);\n\t }\n\t });\n\t if(SUPPORT_DESC)$.setDesc(C.prototype, 'size', {\n\t get: function(){\n\t return defined(this[SIZE]);\n\t }\n\t });\n\t return C;\n\t },\n\t def: function(that, key, value){\n\t var entry = getEntry(that, key)\n\t , prev, index;\n\t // change existing entry\n\t if(entry){\n\t entry.v = value;\n\t // create new entry\n\t } else {\n\t that._l = entry = {\n\t i: index = fastKey(key, true), // <- index\n\t k: key, // <- key\n\t v: value, // <- value\n\t p: prev = that._l, // <- previous entry\n\t n: undefined, // <- next entry\n\t r: false // <- removed\n\t };\n\t if(!that._f)that._f = entry;\n\t if(prev)prev.n = entry;\n\t that[SIZE]++;\n\t // add to index\n\t if(index !== 'F')that._i[index] = entry;\n\t } return that;\n\t },\n\t getEntry: getEntry,\n\t setStrong: function(C, NAME, IS_MAP){\n\t // add .keys, .values, .entries, [@@iterator]\n\t // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n\t __webpack_require__(8)(C, NAME, function(iterated, kind){\n\t this._t = iterated; // target\n\t this._k = kind; // kind\n\t this._l = undefined; // previous\n\t }, function(){\n\t var that = this\n\t , kind = that._k\n\t , entry = that._l;\n\t // revert to the last existing entry\n\t while(entry && entry.r)entry = entry.p;\n\t // get next entry\n\t if(!that._t || !(that._l = entry = entry ? entry.n : that._t._f)){\n\t // or finish the iteration\n\t that._t = undefined;\n\t return step(1);\n\t }\n\t // return step by kind\n\t if(kind == 'keys' )return step(0, entry.k);\n\t if(kind == 'values')return step(0, entry.v);\n\t return step(0, [entry.k, entry.v]);\n\t }, IS_MAP ? 'entries' : 'values' , !IS_MAP, true);\n\n\t // add [@@species], 23.1.2.2, 23.2.2.2\n\t species(C);\n\t species(__webpack_require__(12)[NAME]); // for wrapper\n\t }\n\t};\n\n/***/ },\n/* 88 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $ = __webpack_require__(15)\n\t , $def = __webpack_require__(10)\n\t , hide = __webpack_require__(14)\n\t , forOf = __webpack_require__(70)\n\t , strictNew = __webpack_require__(69);\n\n\tmodule.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){\n\t var Base = __webpack_require__(11)[NAME]\n\t , C = Base\n\t , ADDER = IS_MAP ? 'set' : 'add'\n\t , proto = C && C.prototype\n\t , O = {};\n\t if(!__webpack_require__(17) || typeof C != 'function'\n\t || !(IS_WEAK || proto.forEach && !__webpack_require__(18)(function(){ new C().entries().next(); }))\n\t ){\n\t // create collection constructor\n\t C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n\t __webpack_require__(79)(C.prototype, methods);\n\t } else {\n\t C = wrapper(function(target, iterable){\n\t strictNew(target, C, NAME);\n\t target._c = new Base;\n\t if(iterable != undefined)forOf(iterable, IS_MAP, target[ADDER], target);\n\t });\n\t $.each.call('add,clear,delete,forEach,get,has,set,keys,values,entries'.split(','),function(KEY){\n\t var chain = KEY == 'add' || KEY == 'set';\n\t if(KEY in proto && !(IS_WEAK && KEY == 'clear'))hide(C.prototype, KEY, function(a, b){\n\t var result = this._c[KEY](a === 0 ? 0 : a, b);\n\t return chain ? this : result;\n\t });\n\t });\n\t if('size' in proto)$.setDesc(C.prototype, 'size', {\n\t get: function(){\n\t return this._c.size;\n\t }\n\t });\n\t }\n\n\t __webpack_require__(25)(C, NAME);\n\n\t O[NAME] = C;\n\t $def($def.G + $def.W + $def.F, O);\n\n\t if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP);\n\n\t return C;\n\t};\n\n/***/ },\n/* 89 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/DavidBruant/Map-Set.prototype.toJSON\n\tvar $def = __webpack_require__(10);\n\n\t$def($def.P, 'Set', {toJSON: __webpack_require__(90)('Set')});\n\n/***/ },\n/* 90 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/DavidBruant/Map-Set.prototype.toJSON\n\tvar forOf = __webpack_require__(70)\n\t , classof = __webpack_require__(36);\n\tmodule.exports = function(NAME){\n\t return function toJSON(){\n\t if(classof(this) != NAME)throw TypeError(NAME + \"#toJSON isn't generic\");\n\t var arr = [];\n\t forOf(this, false, arr.push, arr);\n\t return arr;\n\t };\n\t};\n\n/***/ }\n/******/ ])\n});\n;","module.exports = DG;","module.exports = grok;","module.exports = rxjs;","module.exports = ui;","// 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\tloaded: false,\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// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// 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};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\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__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\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};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t529: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// no jsonp function","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3576);\n"],"names":["StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","IntArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","NumberArrayMetricsNames","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","HAMMING","LEVENSHTEIN","MONOMER_CHEMICAL_DISTANCE","NEEDLEMANN_WUNSCH","async","getMonomerLibHelper","funcList","find","package","name","length","Error","prepare","call","getOutputParamValue","sequenceChemSimilarity","positionColumns","referenceSequence","columns","toList","monomerLib","getBioLib","rawCols","Array","rowCount","totalSimilarity","Float32Array","position","referenceMonomerCanonical","getCanonical","referenceMol","getMonomer","smiles","monomerCol","monomerColData","getRawData","monomerColCategories","categories","emptyCategoryIdx","indexOf","data","emptyIndex","molCol","fromStrings","map","cat","similarityColData","fromColumns","getSimilarities","rowIdx","monomerCategoryIdx","similarityIndex","updatedSimilarity","currentRawCol","fromFloat32Array","MonomerWorks","constructor","this","getCappedRotatedMonomer","monomerType","monomerName","monomer","molfile","PHOSPHATE_SYMBOL","HELM_WRAPPERS_REGEXP","RegExp","NOTATION","ALPHABET","TAGS","positionSeparator","monomerRe","Alphabets","fasta","peptide","Set","dna","rna","candidateAlphabets","PT","DNA","RNA","GAP_SYMBOL","CandidateType","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","vectorLength","v","sqrSum","i","Math","sqrt","SeqPaletteBase","makePalette","dt","simplified","PaletteType","palette","forEach","cp","objList","colour","obj","ind","colourPalette","_palette","get","m","undefinedColor","AminoacidsPalettes","Lesk","lesk","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","getPalette","scheme","getInnerOuter","c","isInner","inner","outer","char","isNaN","parseInt","getColorAAPivot","chemPaletteInstance","outerMonomer","innerMonomer","slice","amino","toUpperCase","substring","AAFullNames","toLowerCase","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","NucleotidesPalettes","Chromatogram","chromatogram","Nucleotides","StringUtils","hashCode","s","hash","charCodeAt","UnknownSeqPalette","GrayAllPalette","UnknownColorPalette","buildPalette","concat","Object","values","pI","color","dgColor","fromHtml","g","r","b","distToBlack","pow","toRgb","correctColor","UnknownSeqPalettes","Gray","gray","Color","StringListSeqSplitted","mList","canonicals","originals","isGap","posIdx","getOriginal","gapOriginalMonomer","FastaSimpleSeqSplitted","seqS","FASTA","splitterAsFasta","seq","mmList","toString","matchAll","ma","toArray","splitterAsFastaSimple","getSplitterWithSeparator","separator","limit","undefined","mRe","String","raw","lastIndex","ceil","mEa","mI","exec","replace","splice","replaceAll","split","SEPARATOR","helmRe","helmPp1Re","splitterAsHelm","ea","inSeq","mm","pp1M","HELM","longMonomerPartRe","monomerToShort","maxLengthOfMonomer","shortAminoMatch","match","needAddDots","shortAmino","detectAlphabet","candidates","gapSymbol","candidatesSims","sim","keys","delete","freqA","alphabetA","push","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","getAlphabetSimilarity","alphabetName","maxSim","max","cs","UN","pickUpPalette","seqCol","minLength","semType","MACROMOLECULE","forColumn","stats","splitter","cats","splitted","sameLength","firstLength","mSeq","cm","getStats","catI","getStatsForCol","paletteType","getPaletteByType","SeqTemps","seqHandler","notationProvider","GapOriginals","SeqHandler","col","_splitter","cached","_splitted","columnVersion","_stats","_maxLength","_posList","_joiner","type","STRING","_column","units","getTag","UNITS","_units","_notation","getNotation","_defaultGapOriginal","isFasta","isHelm","column","tags","aligned","alphabetIsMultichar","setUnitsToFastaColumn","isSeparator","setUnitsToSeparatorColumn","setUnitsToHelmColumn","setTag","includes","temp","version","uh","setTags","alphabetSize","some","notation","defaultGapOriginal","helmCompatible","isHelmCompatible","getAlphabetSize","alphabetSizeStr","console","warn","getAlphabetIsMultichar","getSplitted","resSS","deref","WeakRef","getSplitter","colLen","maxLength","take","posList","posListTxt","positionNames","p","trim","pos","isRna","isDna","isPeptide","isMsa","om","startsWith","getHelmWrappers","getNewColumn","tgtNotation","tgtSeparator","colName","newColName","dataFrame","getUnusedName","newColumn","fromList","fill","CELL_RENDERER","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","getNewColumnFromList","seqList","templateCol","targetNotation","unitsStringIsValid","getNewColumnFromParams","len","getDistanceFunctionName","getDistanceFunction","checkHelmCompatibility","peptides","getMonomerSymbolsByType","peptidesSet","catIdxSet","colRawData","add","monomers","toFasta","toSeparator","toHelm","convertHelmToFastaSeparator","srcSeq","tgtGapOriginal","isNucleotide","helmItemsArray","tgtMonomersArray","join","convert","joiner","getJoiner","init","srcSS","getRegion","startIdx","endIdx","regCol","startIdxVal","endIdxVal","regLength","gapOM","rowI","regOMList","regJPos","seqJPos","getRegionOfPositionNames","str","srcPosList","regPosList","srcJPos","srcPositionNamesStr","srcPositionLabelsStr","positionLabels","opts","res","srcSh","joinToFasta","joinToSeparator","isDnaOrRna","wrappers","joinToHelm","getConverter","tgtUnits","convertToFasta","convertToHelm","convertToSeparator","resMList","src","srcUhSplitter","splitterAsHelmNucl","srcMList","tgtMList","filter","prefix","leftWrapper","rightWrapper","postfix","resOMList","splitAlignedSequences","sequenceColumn","createCol","index","positionCol","resultDf","addNewString","columnList","create","currentMonomerList","set","PositionHeight","VerticalAlignments","HorizontalAlignments","PositionMarginStates","FilterSources","sequenceColumnName","valueAggrType","TOTAL_COUNT","valueColumnName","startPositionName","endPositionName","skipEmptySequences","skipEmptyPositions","shrinkEmptyTail","backgroundColor","positionHeight","Entropy","positionWidth","verticalAlignment","MIDDLE","horizontalAlignment","CENTER","fixWidth","fitArea","minHeight","maxHeight","showPositionLabels","positionMarginState","AUTO","positionMargin","filterSource","Filtered","_scriptDir","exportCppDbscanLib","document","currentScript","readyPromiseResolve","readyPromiseReject","Module","Promise","resolve","reject","readBinary","moduleOverrides","assign","ENVIRONMENT_IS_WEB","window","ENVIRONMENT_IS_WORKER","importScripts","scriptDirectory","process","versions","node","self","location","href","substr","lastIndexOf","url","xhr","XMLHttpRequest","open","responseType","send","Uint8Array","log","bind","wasmBinary","wasmMemory","err","WebAssembly","abort","HEAP8","HEAPU8","HEAPU32","ABORT","updateMemoryViews","buffer","Int8Array","Int16Array","Int32Array","Uint16Array","Uint32Array","Float64Array","__ATPRERUN__","__ATINIT__","__ATPOSTRUN__","runDependencies","runDependencyWatcher","dependenciesFulfilled","what","e","RuntimeError","wasmBinaryFile","path","isDataURI","filename","getBinary","file","instantiateArrayBuffer","binaryFile","imports","receiver","fetch","then","credentials","response","catch","getBinaryPromise","binary","instantiate","instance","reason","callRuntimeCallbacks","callbacks","shift","ExceptionInfo","excPtr","ptr","set_type","get_type","set_destructor","destructor","get_destructor","set_caught","caught","get_caught","set_rethrown","rethrown","get_rethrown","set_adjusted_ptr","adjustedPtr","get_adjusted_ptr","get_exception_ptr","___cxa_is_pointer_type","adjusted","emscripten_realloc_buffer","size","grow","byteLength","getCFunc","ident","UTF8Decoder","TextDecoder","ccall","returnType","argTypes","args","toC","ret","lengthBytesUTF8","stackAlloc","outPtr","maxBytesToWrite","heap","outIdx","u","stringToUTF8Array","stringToUTF8","stringToUTF8OnStack","arr","array","func","cArgs","stack","converter","stackSave","apply","stackRestore","heapOrArray","idx","maxBytesToRead","endPtr","decode","subarray","u0","u1","u2","fromCharCode","ch","UTF8ArrayToString","Boolean","convertReturnValue","onDone","calledRun","wasmImports","dest","num","copyWithin","requestedSize","x","oldSize","maxHeapSize","cutDown","overGrownHeapSize","min","callback","info","receiveInstance","module","cb","exports","unshift","id","clearInterval","removeRunDependency","result","instantiateStreaming","createWasm","arguments","run","doRun","postRun","preRun","setTimeout","numericArgs","every","runCaller","pop","ready","define","hamming","distanceF","scoringMatrix","alphabetIndexes","a","indexes","matrix","minCharCode","k","scorringArray","entries","key","matrixRow","key2","index2","getDistanceF","threshold","seq1","seq2","diff","s1l","s2l","thresholdLimit","abs","levenstein","MmDistanceFunctionsNames","mmDistanceFunctions","defaultArgs","gapOpen","gapExtend","needlemanWunch","charCodeArray","verticalGaps","horizontalGaps","prevRow","currRow","j","diagonal","top","left","maxScore","BitArray","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","assureGoez","argName","assureInRange","value","copy","dst","count","copyFrom","other","lengthInInts","incrementVersion","notify","floor","versionedName","setLength","nIntsNeeded","newData","fromAnd","set1","set2","fromValues","fromSeq","flag","setBit","fromString","charAt","fromUint32Array","fromBytes","bytes","num1","num2","countBits","equals","getBit","clone","bitArray","from","setAll","invert","flags","setIndexes","clear","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","getRangeAsList","setRange","start","end","setTrue","setFalse","setRandom","n","random","and","andNot","notAnd","not","or","xor","insertAt","oldlength","removeAt","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","trueCount","falseCount","_onBitCount","remainingBits","countWhere","andWithCountBits","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","fromCsv","BYTE_ARRAY","assure","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","ms","error","notNull","doc","win","docEle","documentElement","createElement","div","table","tbody","tr","isArray","ArrayPrototype","prototype","idRe","classRe","htmlRe","tagRe","selector","context","isFragment","nodeType","isDocument","isElement","test","getElementsByClassName","getElementsByTagName","querySelectorAll","Cash","isCash","eles","isString","ctx","getElementById","parseHTML","cash","isFunction","l","fn","isWindow","isUndefined","isNull","isNumeric","parseFloat","isFinite","isPlainObject","proto","getPrototypeOf","each","_reverse","extend","sources","_i","deep","target","source","Symbol","empty","ele","firstChild","removeChild","plugins","splitValuesRe","getSplitValues","computeStyle","prop","isVariable","style","getComputedStyle","getPropertyValue","computeStyleInt","getExtraSpace","xAxis","toggleClass","cls","force","classes","isForce","classList","remove","toggle","addClass","removeAttr","attr","attrs","removeAttribute","value_1","getAttribute","setAttribute","removeClass","hasClass","Number","eq","first","last","text","textContent","defaultDisplay","isHidden","matches","getCompareFunction","comparator","is","filtered","collection","compare","detach","parentNode","fragmentRe","singleTagRe","containers","td","th","thead","tfoot","html","$1","fragment","container","innerHTML","childNodes","pluck","until","plucked","isCallback","val_1","val_2","getValue","multiple","options","option","selected","disabled","unique","item","val","isSelect","checkableRe","eleValue_1","checked","guid","children","parent","child","closest","$parent","siblings","HTMLCDATARe","scriptTypeRe","scriptAttributes","insertSelectors","selectors","anchors","inverse","inside","reverseLoop1","reverseLoop2","reverseLoop3","si","ti","ai","anchor","targetFinal","indexFinal","evaluate","insertBefore","nodeName","replaceChild","nextSibling","script_1","head","evalScripts","ownerDocument","insertElement","cloneNode","after","append","hasScript","appendTo","wrapInner","$ele","contents","wrapAll","before","structure","wrapper","firstElementChild","wrap","insertAfter","prepend","prependTo","tagName","contentDocument","content","_all","_until","nextAll","nextUntil","parents","parentsUntil","prev","prevAll","prevUntil","offsetParent","dashAlphaRe","camelCase","letter","readyState","addEventListener","unwrap","replaceWith","offset","rect","getBoundingClientRect","pageYOffset","pageXOffset","isFixed","doc_1","body","parentOffset","propMap","class","contenteditable","for","readonly","maxlength","tabindex","colspan","rowspan","usemap","removeProp","cssVariableRe","isCSSVariable","prefixedProps","vendorsPrefixes","numericProps","animationIterationCount","columnCount","flexGrow","flexShrink","fontWeight","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","opacity","order","orphans","widows","zIndex","getSuffixedValue","attempt","_a","css","isVariable_1","propCC","propUC","getPrefixedProp","setProperty","JSONStringRe","getData","dataset","JSON","parse","getDocumentDimension","dimension","datas","stringify","setData","includeMargins","propLC","valueNumber","boxSizing","displayProperty","hidden","display","getDefaultDisplay","hide","show","eventsNamespace","eventsFocus","focus","blur","eventsHover","mouseenter","mouseleave","eventsMouseRe","getEventNameBubbling","parseEventName","eventName","parts","sort","getEventsCache","hasNamespaces","ns1","ns2","ns","removeEvent","namespaces","cache","sel","removeEventListener","trigger","event","nameOriginal","name_1","createEvent","initEvent","namespace","___ot","___td","isEventFocus","dispatchEvent","off","eventFullName","_this","on","_one","isEventHover","finalCallback","stopImmediatePropagation","relatedTarget","defineProperty","configurable","returnValue","preventDefault","stopPropagation","eventCache","addEvent","one","queryEncodeCRLFRe","skippableRe","serialize","query","elements","encodeURIComponent","queryEncode","___CSS_LOADER_EXPORT___","cssWithMappingToString","list","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","cssMapping","btoa","base64","unescape","sourceMapping","__esModule","digestLength","blockSize","K","hashBlocks","w","d","f","h","t1","t2","Hash","state","bufferLength","bytesHashed","finished","reset","clean","update","dataLength","dataPos","finish","out","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","HMAC","pad","istate","ostate","hmac","fillBuffer","counter","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","pbkdf2","password","iterations","dkLen","prf","ctr","t","dk","factory","sha256","peq","distance","tmp","lst","pv","mv","sc","xv","myers_32","mhc","phc","hsize","vsize","vlen","pb","mb","xh","ph","mh","score","myers_x","jStat","calcRdx","LOG10E","isNumber","_init","retZero","retOne","retIdent","utils","toVector","_random_fn","TypeError","rows","cols","dimensions","row","rowa","submat","arange","cola","diag","nrow","antidiag","transpose","objArr","toAlter","ncol","cumreduce","alter","zeros","ones","rand","identity","symmetric","cnt","hival","current","rl","_slice","rcSlice","colSlice","rowSlice","sliceAssign","A","B","nl","ml","diagArray","mat","jProto","funcs","passfunc","results","ascNum","clip","sum","sumsqrd","sumsqerr","mean","sumrow","product","low","high","_arr","meansqerr","geomean","logs","meanOfLogs","exp","median","arrlen","cumsum","cumprod","diffs","arrLen","rank","distinctNumbers","numberCounts","number","sortedDistinctNumbers","numberRanks","currentRank","mode","maxCount","numMaxCount","mode_arr","range","variance","pooledvariance","reduce","samples","deviation","dev","stdev","pooledstdev","meandev","meddev","coeffvar","quartiles","round","quantiles","quantilesArray","alphap","betap","aleph","gamma","sortedArray","quantileVals","percentile","exclusive","realIndex","frac","percentileOfScore","kind","strict","histogram","binCnt","binWidth","bins","covariance","arr1","arr2","arr1Len","sq_dev","corrcoeff","spearmancoeff","stanMoment","mu","sigma","skewSum","skewness","kurtosis","fullbool","tmpthis","callbackFunction","argsToPass","curriedFunction","vector","gammaln","xx","y","cof","ser","loggam","x0","x2","xp","gl","gl0","PI","gammafn","z","yi","q","fact","xden","xnum","Infinity","sin","gammap","lowRegGamma","an","aln","ap","del","ITMAX","NaN","factorialln","factorial","combination","combinationln","permutation","betafn","betaln","betacf","m2","aa","fpmin","qab","qap","qam","gammapinv","pp","lna1","afac","a1","gln","erf","ty","isneg","dd","erfc","erfcinv","ibetainv","lna","lnb","al","b1","ibeta","bt","randn","randg","shape","a2","oalph","betinc","eps","c9","a0","b0","m9","tukeyWprob","rr","cc","xleg","aleg","qsqz","wincr","pr_w","normal","cdf","blb","binc","bub","einsum","cc1","wi","elsum","jj","ac","qexpo","rinsum","_b","_c","newthis","sample","vals","fnfunc","beta","pdf","alpha","inv","centralF","df1","df2","binomial","cauchy","local","scale","atan","tan","chisquare","dof","exponential","rate","invgamma","kumaraswamy","lognormal","noncentralt","ncp","studentt","tol","flip","prob","lastvalue","std","pareto","SQRT2","dof2","weibull","uniform","betacdf","negbin","hypgeom","N","scaledPDF","samplesDone","scaledCDF","factor","poisson","sumarr","sampleSmall","L","sampleLarge","U","V","slam","loglam","invalpha","vr","us","lam","triangular","arcsine","asin","cos","laplace","tukey","nmeans","df","xlegq","alegq","ulen","f2","f2lf","f21","ff4","ans","otsum","twa1","x1","ps","tukeyQinv","valx0","valx1","iter","isUsable","subtract","divide","multiply","nrescols","rescols","dot","right","norm","nnorm","angle","acos","aug","newarr","gauss_jordan","det","determinant","submatrix","sign","gauss_elimination","maug","pivot","y2","maxrow","triaUpSolve","matrix_mode","triaLowSolve","lu","R","cholesky","T","gauss_jacobi","xk","gauss_seidel","SOR","householder","QR","lstsq","array_mode","Q","Q1","RI","I","Aj","cAi","Ij","cIi","R_I","Q2","jacobi","maxim","theta","condition","ev","rungekutta","t_j","u_j","k1","k2","k3","romberg","h1","richardson","X","y1","h_min","simpson","hermite","F","dF","dl","lagrange","cubic_spline","sq","gauss_quadrature","PCA","temp1","Bt","D","temp2","Y","C","Vt","differenceOfProportions","p1","n1","p2","n2","pooled","zscore","ztest","sides","tscore","ttest","anovafscore","expVar","sampMean","sampSampMean","tmpargs","unexpVar","anovaftest","ftest","fscore","anovaftes","qscore","mean1","mean2","sd","qtest","tukeyhsd","arrays","means","normalci","change","tci","significant","pvalue","oneSidedDifferenceOfProportions","twoSidedDifferenceOfProportions","models","ols","endog","exog","nobs","df_model","df_resid","coef","predict","resid","ybar","SSE","SSR","SST","R2","t_test","model","var_count","subModelList","endog_index","exog_index","sigmaHat","seBetaHat","mod","tStatistic","pValue","leftppf","interval95","se","F_statistic","F_test","adjust_R2","buildxmatrix","matrixRows","builddxmatrix","buildjxmatrix","jMat","pass","buildymatrix","buildjymatrix","matrixmult","regress","jMatX","jMatY","innerinv","xtranspxinv","xtransp","regresst","compile","jMatYBar","yBar","yAverage","anova","residuals","ssr","msr","sse","mse","sst","mst","r2","fratio","rmse","r2adj","sds","ts","covar","xtranspx","matrixsubtract","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","indexByIdentifier","sourceMap","references","updater","addElementStyle","byIndex","api","newObj","lastIdentifiers","newList","newLastIdentifiers","_index","memo","styleTarget","querySelector","HTMLIFrameElement","getTarget","appendChild","element","attributes","styleElement","nonce","removeStyleElement","styleSheet","cssText","createTextNode","SCORE","calculateScores","ref","scoring","splitSeqDf","refCol","refSplitted","scoresCol","IDENTITY","reference","positionsDf","numPositions","positionCols","positionEmptyCategories","categoryIndexesTemplate","posCol","identityScoresCol","float","identityScoresData","rowIndex","calculateIdentity","SIMILARITY","monomerColumns","calculateSimilarity","DimReductionMethods","WEBGSLAGGREGATION","WEBGPUDISTANCE","MatrixMatrixOpType","MatrixOpType","MatrixScalarOpType","EUCLIDEAN","MANHATTAN","TANIMOTO","LEVENSTEIN","NEEDLEMAN_WUNSCH","SOKAL","COSINE","ASYMMETRIC","Difference","OneHot","ScatterPlotCurrentLineStyle","DistanceAggregationMethods","ScatterPlotLinesRenderer","currentLineId","_currentLineIdx","sp","render","linesToRender","lines","updateLines","linesVisibility","visibility","yAxis","currentLineStyle","none","lineClicked","Subject","lineHover","mouseOverLineId","arrowWidth","xAxisCol","byName","yAxisCol","canvas","getInfo","getContext","arrowSize","onmousedown","clientX","clientY","onmousemove","checkCoordsOnLine","offsetX","offsetY","onEvent","subscribe","_","renderLines","multipleLinesCounts","skipMultiLineCalculation","createMultiLinesIndices","_d","_e","_f","_g","_h","_j","_l","_m","_o","spLook","getOptions","look","individualLineStyles","colors","width","opacities","drawArrowsArr","lineWidth","strokeStyle","markerSizeCol","lineLen","sizeFrom","sizeTo","getMarkersSizes","pointFrom","worldToScreen","aX","aY","pointTo","bX","bY","minAxis","viewBox","height","beginPath","hypot","widths","toggleCurrentLineStyle","multiLines","controlPoint","getLineLength","startPointWithMarker","getPointOnDistance","endtPointWithMarker","findControlPoint","moveTo","quadraticCurveTo","lineTo","drawArrows","arrowPoint","arrowCPX","arrowCPY","canvasArrow","stroke","closePath","fillLeftBottomRect","bold","dashed","setLineDash","markerMinSize","markerMaxSize","markerDefaultSize","Path2D","yAxisBox","minX","maxY","xAxisBox","fillStyle","arrayIdxsBitArray","firstLineIdx","linesPerPair","pointToCompare1","pointToCompare2","candidateIdx","minDist","dist","pFrom","pTo","fromMarker","toMarker","calculateDistToCurveLine","calculateDistToStraightLine","xMin","xMax","yMin","yMax","distToStraightLineSegment","pc","calculateDistToCurveInRect","p0","stepsNum","deltaT","arrX","arrY","maxHW","minSumHW","candidateIdxs","xOnCurve","yOnCurve","rectW","rectH","sumHW","p1x","p1y","p2x","p2y","p3x","p3y","midX","midY","dx","dy","perpendicularLen","arrowEndX","arrowEndY","quadX","quadY","arrowAngle","atan2","VIEWER_TYPE","PeptidesModel","isBitsetChangedInitialized","isUserChangedSelection","_dm","isInitialized","isRibbonSet","webLogoSelectedMonomers","webLogoBounds","cachedWebLogoTooltip","bar","tooltip","_layoutEventInitialized","subs","isHighlighting","controlFire","accordionSource","_sequenceSpaceViewer","_mclViewer","_monomerPositionStats","_settings","_sequenceSpaceCols","_mclCols","_webLogoSelection","monomerPositionStats","scaledActivityColumn","getScaledActivityColumn","analysisView","_analysisView","tableViews","ID","addTableView","MULTIPLE_VIEWS","grid","invalidate","settings","settingsStr","SETTINGS","newSettingsEntries","oldSeqSpaceOptions","sequenceSpaceParams","updateVars","newSeqSpaceOptions","clusterEmbeddings","variable","createScaledCol","webLogoSelection","showDendrogram","addDendrogram","closeViewer","DENDROGRAM","showClusterMaxActivity","addClusterMaxActivityViewer","CLUSTER_MAX_ACTIVITY","showLogoSummaryTable","addLogoSummaryTable","LOGO_SUMMARY_TABLE","showMonomerPosition","addMonomerPosition","MONOMER_POSITION","showMostPotentResidues","addMostPotentResidues","MOST_POTENT_RESIDUES","findViewer","_viewerGrid","_logoSummaryTable","mpr","showSequenceSpace","addSequenceSpace","addMCLClusters","tagSelection","WL","INVARIANT_MAP_SELECTION","selection","fireBitsetChanged","byTags","POSITION_COL","getCol","getInstance","ACTIVITY_SCALED","ACTIVITY","modelName","modifyWebLogoSelection","monomerPosition","shiftPressed","ctrlPressed","getVisibleSelection","createAccordion","trueModel","acc","root","filterAndSelectionBs","filteredTitlePart","getSelectionString","selectedMonomerPositions","monomerList","trueLSTViewer","selectionDescription","selectedClusters","clusterSelection","ORIGINAL","CUSTOM","trueMPViewer","invariantMapSelection","selectedMutationCliffs","mutationCliffsSelection","trueMPRViewer","selectedMPRMonomerPositions","selectedMonomers","descritionsHost","addTitle","addPane","newView","onclick","createNewView","onmouseover","newCluster","clusterFromSelection","removeCluster","lstViewer","errorDiv","requestSource","viewers","panelDataSources","combinedBitset","panelDataSource","bitset","clusterStats","mutationCliffs","Map","invariantMapSelectionBitset","sarViewer","gridColumns","activityCol","isModelSource","totalMonomerPositionSelection","peptideSelection","getAggregationColumns","monomerPositionSelection","clusterColName","clustersColumnName","areObjectsEqual","o1","o2","tableSelection","newTable","numericalCols","numerical","gridColIdx","gridCol","visible","sourceCol","BOOL","sourceColRawData","sourceColCategories","activityColumn","addNewFloat","addNewVirtual","tag","plot","props","showRowHeader","maxWidth","panel","parentElement","gridHost","marginLeft","originalGridCol","mpStats","isFiltered","cellRendererOptions","isSelectionTable","colorPalette","tooltipOptions","isAnalysis","getSelectionWidget","getCombinedSelection","updateGrid","joinDataFrames","selectionCallback","unhighlightCallback","unhighlight","highlightCallback","mp","headerSelectedMonomers","onViewLayoutApplied","layout","view","setTooltips","setBitsetCallback","setGridProperties","names","newCol","newColCat","newColData","addNew","ANALYSIS_COL","sourceGrid","scaledCol","activityColumnName","activityScaling","setOrder","highlight","onCellTooltip","cell","isColHeader","tableColumn","MONOMER","isTableCell","combinedSelection","addInvariantMapSelection","positionStats","mpViewer","addMutationCliffsSelection","mc","substitutions","mprViewer","clustType","clust","showAccordion","o","onChanged","_package","logger","debug","createLogoSummaryTable","createLogoSummaryTableGrid","fireFilterChanged","fireChanged","sourceGridProps","allowColSelection","allowEdit","showReadOnlyNotifications","showCurrentRowIndicator","canvasContext","maxCategory","measureText","posCols","colIdx","viewerType","viewer","close","findViewerNode","dockManager","rootNode","containerElement","pi","dFunc","inputs","colNameList","linkage","settingsButton","setRibbonPanels","onAccordionConstructed","actionsPane","getPane","actionsHost","currentRowIdx","IDENTITY_TEMPLATE","SIMILARITY_TEMPLATE","onViewRemoved","unsubscribe","onTableRemoved","onProjectClosed","project","viewerProperties","categorical","logoSummaryTable","fromType","dock","RIGHT","viewerGrid","potentialClusterCol","clusterColumnName","activityTarget","HIGH","connectivityColumnName","clusterSizeThreshold","activityThreshold","_clusterMaxActivity","lstNode","DOWN","maxMutations","minActivityDelta","mostPotentResidues","dm","dockType","refNode","ratio","LEFT","rowMask","newDf","addViewer","webLogoMode","membersRatioThreshold","warning","embeddingColNames","oldClusterCol","embed1","embed2","epsilon","minPts","clusterRes","embedX","embedY","worker","Worker","URL","postMessage","onmessage","clusters","terminate","getDbscanWorker","newClusterName","clusterCol","colorColumnName","mclSettings","mclParams","columnAddedSub","onColumnsAdded","colArgs","mclAdditionSub","onViewerAdded","SCATTER_PLOT","findNode","FILL","bioPreprocessingFunc","mclViewer","metrics","weights","aggregationMethod","preprocessingFuncs","preprocessingFuncArgs","maxIterations","useWebGPU","inflate","scp","tv","tableView","scatterPlot","showXAxis","showYAxis","showXSelector","showYSelector","title","distanceFnArgs","encodedColEntries","pf","colInputName","metricInputName","mclWorker","distanceFns","resolveF","promise","onerror","createMCLWorker","it","terminateSub","onViewerClosed","emberdXColName","emberdYColName","clustersCounter","connectivity","js","clusterCounterColName","connectivityColName","embedXCol","embedYCol","clusterCounterCol","addNewInt","connectivityCol","xColumnName","yColumnName","markovCluster","fingerprintType","inflation","serializedOptions","sh","linearCol","newName","seqSpaceSettings","seqSpaceParams","molecules","methodName","UMAP","similarityMetric","plotEmbeddings","addedColCount","seqSpaceAdditionSub","seqSpaceViewer","onContextMenu","menu","panels","tools","vert","items","horz","appHeader","header","icon","iconPath","description","learnMoreUrl","runAsync","rxjs","operators","ClusterMaxActivityViewer","scViewer","_scViewer","createSCViewer","_titleHost","marginRight","_selsectIcon","viewerError","renderTimeout","renderDebounceTime","scFilterQuery","maxActivityInClusterColName","selectionSubscription","linesDrawSubscription","nullable","string","choices","LOW","int","scatterPlotProps","showColorSelector","xAxisType","logarithmic","yAxisType","invertYAxis","clusterSizeColName","markerType","showSizeSelector","FLOAT","INT","BIG_INT","QNUM","clusterSizeCol","getOrCreate","clusterSizeMap","cluster","isNone","linear","maxActivityIndexPerClusterMap","maxConnectivityIndexPerClusterMap","activity","prevMaxActivityIndex","prevMaxConnectivityIndex","maxAtivityInClusterSizeCol","maxConnectivityInClusterColName","synSelectionColName","maxActivityLabel","maxConnectivityLabel","onDataEvent","pipe","getSelectedIndexes","currentSelection","filterBitset","filteredIndexes","selectTopQuadrants","selectionBitset","clusterInt","clusterSize","cursor","onBeforeDrawScene","viewPort","viewport","startPointHor","startPointVer","endPointHor","endPointVer","onTableAttached","getProperty","onDataChanged","clearTimeout","clusterSizeLabel","alignSelf","marginBottom","textOrientation","writingMode","transform","invalidateCanvas","onPropertyChanged","property","treeHelper","monomerWorks","getMonomerWorksInstance","getTreeHelperInstance","initPeptides","treeHelperPackageName","getTreeHelper","openDemoData","chosenFile","webRoot","loadTable","windows","showProperties","Peptides","getIconUrl","showToolbox","showHelp","View","peptidesDialog","analyzeObject","dialog","host","onOK","testInitFunctionPeptides","peptidesPanel","clusterMaxActivity","manualAlignment","_monomer","alignedSequenceCol","currentDf","sequenceInput","applyChangesBtn","newSequence","splitSequence","affectedRowIndex","part","resetBtn","manualAlignmentWidget","macromoleculeSarFastaDemo","showContextPanel","simpleTable","files","readAsText","simpleActivityCol","simpleAlignedSeqCol","simpleScaledCol","MINUS_LG","clustersCol","alignedCol","sequenceCol","monomerOrCluster","positionOrClusterType","macromoleculeSarFastaDemoUI","lstPiechartCellRenderer","ParallelMutationCliffs","threadCount","navigator","hardwareConcurrency","_workerCount","_workers","calc","activityArray","monomerInfoArray","substitutionsInfo","currentTargetIdx","targetCol","currentTarget","promises","matSize","chunkSize","monomerInfo","resolveWorker","rejectWorker","seq1Idxs","seq2Idxs","all","monomerPositionsMap","monomerPos","monomer1Cat","rawData","monomer1","monomer2Cat","monomer2","position1Map","position2Map","indexes1Map","indexes2Map","indexes1","indexes2","findMutations","mutationCliffsService","calculateCliffsStatistics","cliffs","minDiff","maxDiff","minCount","monomerStatsMap","monomerSubMap","subMap","meanDifference","calculateMonomerPositionStatistics","monomerPositionObject","general","activityColData","sourceDfLen","tempActivityData","selectedIndexes","posColData","posColCateogries","currentPositionObject","categoryIndex","boolArray","avg","getSummaryStats","genObj","summaryStats","possibleMaxCount","possibleMinCount","possibleMaxMeanDifference","maxMeanDifference","possibleMinMeanDifference","minMeanDifference","possibleMaxPValue","maxPValue","possibleMinPValue","minPValue","possibleMaxRatio","maxRatio","possibleMinRatio","minRatio","calculateClusterStatistics","customClusters","origClustCol","origClustColData","origClustColCat","origClustMasks","customClustMasks","customClustColNamesList","origClustStats","customClustStats","masks","clustNames","resultStats","maskIdx","renderCellSelection","bounds","toHtml","selectedRows","strokeRect","setMonomerRenderer","renderMutationCliffCell","currentMonomer","currentPosition","halfWidth","maxRadius","pVal","currentMeanDifference","maxPValComplement","minPValComplement","pValCentering","centeredMaxPValComplement","centeredMinPValComplement","centeredPValLimit","pValComplement","lightLightGray","scaleColor","rCoef","radius","arc","cliffStats","diffScalingFactor","colorCoef","textBaseline","textAlign","font","shadowBlur","shadowColor","white","uniqueValues","fillText","monomerSelection","renderInvariantMapCell","cellValue","setAlpha","fillRect","getContrastColor","renderLogoSummaryCell","setWebLogoRenderer","setOptions","onCellRender","gcArgs","save","M_P_STATS_CACHE","colCache","dfFilterBuffer","getBuffer","fullStats","sortedStatsOrder","sortedOrder","monomerSelectionStats","drawOptions","pr","devicePixelRatio","symbolStyle","upperLetterHeight","upperLetterAscent","marginVertical","marginHorizontal","selectionWidth","textHeight","headerStyle","totalSpace","currentY","barHeight","xSelection","leftShift","barWidth","xStart","monomerBounds","monomerHeight","selectionHeight","resetTransform","monomerTxt","mTm","line","rowSelection","widthTransform","heightTransform","setTransform","black","drawLogoInBounds","restore","headerRenderer","eventAction","hitTest","barCoords","coords","isIntersectingX","isIntersectingY","findWebLogoMonomerPosition","shiftKey","ctrlKey","requestWebLogoAction","overlay","mouseMove","LSTPieChartRenderer","colorCacheKey","HoverTempKey","hoverSeparator","cellType","defaultWidth","defaultHeight","categoryNumberCache","getPrevHoveredSector","onMouseMove","gridCell","beforeReturn","vectorX","vectorY","JSONData","angles","totalCount","angleAccum","hitCategory","hitCategoryName","hitCategoryValue","percentage","toFixed","hoverTemp","_cellStyle","box","fitSquare","clearRect","alphas","fromEntries","category","colorCache","getCategoricalColor","lightGray","textWidth","middleAngle","textRadiusMult","textRadius","textX","textY","point","at","COLUMNS_NAMES","LST_COLUMN_NAMES","SEM_TYPES","COLUMN_NAME","SCALING_METHODS","ACTIVITY_TARGET","SUFFIXES","AGGREGATION_TYPES","FIRST","KEY","PIVOT","SELECTED_ROWS_COUNT","AGG_STATS_MAPPING","VALUE_COUNT","UNIQUE_COUNT","MISSING_VALUE_COUNT","MIN","MAX","SUM","MED","AVG","STDEV","VARIANCE","SKEW","KURT","Q3","SPLIT_CATEGORY","getSeparator","scaleActivity","scaling","NONE","formula","LG","log10","FORMULA","calculateSelected","bySemTypeAll","selectedObj","extractColInfo","getDistributionPanel","hist","statsMap","labelMap","splitCol","SPLIT_COL","labels","categoryIdx","meta","getColor","label","getDistributionTable","selectionMismatch","activityData","isSelected","SELECTION","ALL","PEPTIDES_SELECTION","categoryOrder","setCategoryOrder","setCategorical","addExpandIcon","fullscreenIcon","fullscreenGrid","setGridProps","pairsFullscreenDialog","showModal","addExpandIconGen","dialogName","mouseOverRoot","onClickElementFunc","fullScreenIcon","fullScreenElement","fullScreenDialog","autosize","allowRowSelection","allowBlockSelection","autoSize","isSelectionEmpty","selectionList","modifySelection","clusterOrMonomerPosition","monomerIndex","selectionKeys","posOrClustType","highlightMonomerPosition","posStat","initSelection","tempSelection","getSelectionBitset","selectionEntries","statsType","statsItem","areParametersEqual","mutationCliffsToMaskInfo","monomerMap","indexMap","indexList","getTotalAggColumns","viewerSelectedColNames","aggColsViewer","aggColsModel","aggColsEntries","aggColsEntriesFromSettings","isApplicableDataframe","minRows","debounce","timeout","timer","getAggregatedColName","aggF","rest","selectedIndex","restIndex","selectedMean","restMean","testResult","sample1","sample2","devKnown","devEqual","variance1","variance2","length1","length2","pMore","pLess","pTot","sampleVariance1","sampleVariance2","criticalValue","totalVariance","tTest","currentMeanDiff","getAggregatedValue","agg","mappedAgg","stat","fromColumn","getAggregatedColumnValues","filterDf","fractionDigits","filteredDf","colResults","aggFn","getAggregatedColumnValuesFromDf","getStringColAggregatedJSON","valueCounts","resJSON","showMonomerTooltip","tooltipElements","mw","mol","autoCrop","autoCropMargin","suppressChiralText","svgMol","showTooltip","fromViewer","isMutationCliffs","isMostPotentResidues","showTooltipAt","tableMap","aggregatedColMap","aggrColValues","resultMap","distroStatsElem","MCLSettings","SequenceSpaceParams","CLUSTER_TYPE","LST_CATEGORIES","LogoSummaryTable","bitsets","keyPress","currentRowIndex","_scaledActivityColumn","_clusterStats","_clusterSelection","_positionColumns","GENERAL","columnTypeFilter","CATEGORICAL","NUMERICAL","full","STYLE","AGGREGATION","aggregation","CLUSTER_SELECTION","initClusterSelection","getSharedPositionColumns","isClusterSelectionEmpty","CUSTOM_CLUSTER","bySemType","msg","sub","emptyDf","expand","onCancel","doRender","updateFilter","newClusterSelection","getTotalViewerAggColumns","aggrCols","getStringAggregatedColumns","cn","clustersColName","isDfFiltered","filteredDfCols","filteredDfRowCount","filteredDfClustCol","filteredDfClustColData","filteredDfClustColCat","customClustColList","customLST","customLSTCols","customLSTClustCol","CLUSTER","customMembersColData","MEMBERS","customWebLogoCol","WEB_LOGO","customDistCol","DISTRIBUTION","customMDColData","MEAN_DIFFERENCE","customPValColData","P_VALUE","customRatioColData","RATIO","origLSTBuilder","groupBy","aggNumericColsEntries","aggStringColNames","aggStringCols","aggNumericColNames","customAggRawCols","numericColAggEntries","aggIdx","customLSTAggCol","customBitsets","customClustCol","bsMask","aggColIdx","origLST","aggregate","origLSTLen","origLSTCols","origLSTClustCol","convertTo","origLSTClustColCat","origMembersColData","origWebLogoCol","origDistCol","origMDColData","origPValColData","origRatioColData","origAggStringCols","origBitsets","filteredClustName","summaryTable","sn","aggColNames","rowHeader","rowHeight","webLogoCache","distCache","maxSequenceLen","webLogoGridCol","pepCol","gridCellArgs","tableRowIndex","bound","clusterBitSet","viewerProps","getProperties","webLogoTable","createWebLogoDf","filteringEnabled","splitColumnName","legendVisibility","showColumnSelector","showRangeSlider","showBinSelector","backColor","xAxisHeight","_ev","onCurrentCellChanged","modifyClusterSelection","getCluster","code","help","highlightCluster","gridProps","clustName","memberstCol","membersColData","minMembers","viewerDfCols","viewerDfColsLength","newClusterVals","activityScaledCol","toBinaryString","aggregatedValues","stringAggregatedValues","addNewCluster","lss","viewerDfRows","clustCol","clustColCat","dfCols","clustIdx","compact","clusterName","newClusterCol","fromBitSet","bs","seekValue","distributionTable","SELECTION_MODE","SAR_PROPERTIES","MONOMER_POSITION_PROPERTIES","PROPERTY_CATEGORIES","SARViewer","keyPressed","_mutationCliffs","_mutationCliffStats","_mutationCliffsSelection","SEQUENCE","ACTIVITY_SCALING","targetColumnName","TARGET","MUTATION_CLIFFS","targetCategory","TARGET_CATEGORY","MIN_ACTIVITY_DELTA","MAX_MUTATIONS","COLUMNS","mutationCliffsDebouncer","createViewerGrid","MonomerPosition","MostPotentResidues","isMonomerPositionStatsEqual","getSharedStats","getSharedMutationCliffs","tagSuffix","MP","MPR","MUTATION_CLIFFS_SELECTION","modifyMutationCliffsSelection","calculateMutationCliffs","helpUrl","scaledActivityCol","monomerCols","activityRawData","mutRes","currentGridCell","_invariantMapSelection","colorChoices","COLOR","INVARIANT_MAP","colorAggregation","COLOR_AGGREGATION","MONOMER_POSITION_MODE","modifyInvariantMapSelection","INVARIANT_MAP_COLOR_CACHE","createMonomerPositionDf","uniqueMonomers","splitSeqCols","colCat","monomerPositionDf","addNewBool","cacheInvariantMapColors","colorColData","minColorVal","maxColorVal","pCol","positionColData","positionColCategories","pStats","pMonomer","colorValuesIndexes","aggColor","renderCell","getMonomerPosition","columnEntries","previousMonomerPosition","positions","setViewerGridProps","afterDraw","onAfterDrawContent","monomerGCol","columnProperty","switchHost","mutationCliffsMode","bool","invariantMapMode","setTooltip","setDefaultProperties","input","captionLabel","viewerRoot","currentGridRowIdx","createMostPotentResiduesDf","monomerPositionStatsEntries","posData","monomerData","mdData","pValData","countData","ratioData","meanData","aggrColumnEntries","aggrColsData","generalPositionStats","filteredMonomerStats","monomerStats","maxEntry","mprDf","mprDfCols","POSITION","MEAN","COUNT","pValGridCol","format","aggrValues","currentCol","mdCol","isInvariantMap","_colorCol","_colorAgg","renderColNames","isRowHeader","tableColName","gridTable","currentPosStats","DISTRIBUTION_CATEGORIES_KEYS","key2category","getDistributionWidget","getDistributionCategoreisHost","distributionCategories","getDistributionCategory","SEPARATE_CLUSTERS","distributionCategoriesHost","inputsNames","inputsArray","inputIdx","inputName","onValueChanged","enabled","SEPARATE_MONOMERS","SEPARATE_POSITIONS","inputsHost","getActivityDistribution","isTooltip","getStatsTableMap","getSingleDistribution","distributionRoot","selectionObject","distributions","clusterColCategories","clusterColData","selectedClustersCategoryIndexes","clusterMasks","selectedClusterIdx","selectedClusterCategoryIndex","customClusterSelection","getDistributionForClusters","reversedSelectionObject","hasOwnProperty","getReversedObject","positionColumnsCategories","positionColumnsData","monomerCategoryIndex","getDistributionForMonomers","monomerIdx","getDistributionForPositions","mutationCliffsWidget","allowExpand","cliffsPairsWidgetParts","pairsGrid","uniqueSequencesGrid","aminoToInput","comboGrids","widgetRoot","substitutionsArray","deltaArray","substitutedToArray","fromIdxArray","toIdxArray","alignedSeqCol","alignedSeqColCategories","alignedSeqColData","activityScaledColData","seenIndexes","uniqueSequencesBitSet","posColCategories","substitutionsMap","referenceIdx","indexArray","forbiddentIndexes","baseSequence","baseActivity","subIdx","subSeq","substCol","activityDeltaCol","hiddenSubstToAarCol","toIdxCol","fromIdxCol","pairsTable","substitutedToAar","stringValue","MACROMOLECULE_DIFFERENCE","lastSelectedIndex","pairsSelectedIndexes","dart","setUniqueSeqGridFilter","rowIdxIdx","originalGridColCount","columnNames","hasOwn","uniqueSequencesTable","seqIdxCol","seqIdxColData","uniqueSelectedIndexes","removeProperty","analyzePeptidesUI","logoHost","seqColInput","potentialCol","firstOrNull","dfCol","missingValueCount","defaultActivityColumn","histogramHost","activityScalingMethod","choice","activityColumnChoice","lastChild","activityScalingMethodState","clustersColumnChoice","generateClustersInput","inputsList","bitsetChanged","startAnalysisCallback","sequencesCol","startAnalysis","addMCL","useEmbeddingsClusters","bottomHeight","inputElements","startBtn","minWidth","peptidesCol","clustersColumn","sourceDf","progress","newDfCols","lstProps","mclClusterCol","SETTINGS_PANES","GENERAL_INPUTS","VIEWERS_INPUTS","COLUMNS_INPUTS","SEQUENCE_SPACE_INPUTS","MCL_INPUTS","getSettingsDialog","accordion","currentScaling","currentColumns","isDendrogramEnabled","dendrogram","showSeqSpace","seqSpacePane","VIEWERS","inputsRows","includedColumnsInputs","isIncludedInput","IS_INCLUDED","aggregationInput","inputsRow","modifiedSeqSpaceParams","onSeqSpaceParamsChange","fieldName","correctSeqSpaceInputs","isAllSame","toggleInputs","nwInputs","distanceFunctionInput","DISTANCE_FUNCTION","gapOpenInput","GAP_OPEN","gapExtendInput","GAP_EXTEND","clusterEmbeddingsInput","CLUSTER_EMBEDDINGS","epsilonInput","EPSILON","minPtsInput","MIN_PTS","fingerprintTypesInput","FINGERPRINT_TYPE","modifiedMCLParams","onMCLParamsChange","correctMCLInputs","mclGapOpenInput","mclGapExtendInput","mclDistanceFunctionInput","mclFingerprintTypesInput","mclThresholdInput","THRESHOLD","mclMaxIterationsInput","MAX_ITERATIONS","mclInflationInput","INFLATION","mclInputs","MCL","seqSpaceInputs","SEQUENCE_SPACE","installedModules","moduleId","loaded","_toConsumableArray","_slicedToArray","_Symbol$iterator","_getIterator","_regeneratorRuntime","_Object$keys","_Set","_Promise","wu","iterable","isIterable","Wu","iterator","getIterator","MISSING","thing","staticMethod","prototypeAndStatic","expectedArgs","curryable","_wu","_len","_key","rewrap","_len2","_key2","rewrapStaticMethod","rewrapPrototypeAndStatic","expected","_len4","_key4","_len3","moreArgs","_key3","curry","mark","callee$0$0","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","context$1$0","t0","stop","delegateYield","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","saved","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","times","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_len5","iterables","_key5","_iterator4","_step4","args$1$0","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_iterator7","_step7","abrupt","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_iterator8","_step8","_zip","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_iterator9","_step9","_iteratorNormalCompletion10","_didIteratorError10","_iteratorError10","_iterator10","_step10","shallow","flatten","_iteratorNormalCompletion11","_didIteratorError11","_iteratorError11","_len6","_key6","_iterator11","_step11","_iteratorNormalCompletion12","_didIteratorError12","_iteratorError12","_iterator12","_step12","_iteratorNormalCompletion13","_didIteratorError13","_iteratorError13","_iterator13","_step13","_iteratorNormalCompletion14","_didIteratorError14","_iteratorError14","_iterator14","_step14","_iteratorNormalCompletion15","_didIteratorError15","_iteratorError15","_iterator15","_step15","initial","_iteratorNormalCompletion16","_didIteratorError16","_iteratorError16","_iterator16","_step16","_iteratorNormalCompletion17","_didIteratorError17","_iteratorError17","_iterator17","_step17","_step17$value","RangeError","enumerate","_iteratorNormalCompletion18","_didIteratorError18","_iteratorError18","_iterator18","_step18","_iteratorNormalCompletion19","_didIteratorError19","_iteratorError19","_iterator19","_step19","_iteratorNormalCompletion20","_didIteratorError20","_iteratorError20","_iterator20","_step20","_iteratorNormalCompletion21","_didIteratorError21","_iteratorError21","_iterator21","_step21","seen","_iteratorNormalCompletion22","_didIteratorError22","_iteratorError22","_iterator22","_step22","iters","numIters","numFinished","zipped","_iteratorNormalCompletion23","_didIteratorError23","_iteratorError23","_iterator23","_step23","_it$next","longest","_len7","_key7","_len8","_key8","_len9","_key9","spreadMap","MAX_BLOCK","TIMEOUT","maxBlock","loop","Date","now","_iteratorNormalCompletion24","_didIteratorError24","_iteratorError24","_step24","_iterator24","_iteratorNormalCompletion25","_didIteratorError25","_iteratorError25","_step25","_iterator25","_iteratorNormalCompletion26","_didIteratorError26","_iteratorError26","_step26","_iterator26","_iteratorNormalCompletion27","_didIteratorError27","_iteratorError27","_step27","_iterator27","_iteratorNormalCompletion28","_didIteratorError28","_iteratorError28","_step28","_iterator28","_iteratorNormalCompletion29","_didIteratorError29","_iteratorError29","_step29","_iterator29","_iteratorNormalCompletion30","_didIteratorError30","_iteratorError30","_step30","_iterator30","_tee","_iterator$next","returned","tail","tee","tang","clan","_Array$from","$at","iterated","_t","O","toInteger","defined","TO_STRING","that","LIBRARY","$def","$redef","SYMBOL_ITERATOR","Iterators","BUGGY","FF_ITERATOR","KEYS","VALUES","returnThis","Base","NAME","Constructor","DEFAULT","IS_SET","FORCE","methods","createMethod","TAG","_native","_default","IteratorPrototype","getProto","global","core","PROTOTYPE","own","isGlobal","G","isProto","S","W","param","Function","UNDEFINED","__g","__e","$","createDesc","object","setDesc","$Object","isEnum","propertyIsEnumerable","getDesc","getOwnPropertyDescriptor","setDescs","defineProperties","getKeys","getNames","getOwnPropertyNames","getSymbols","getOwnPropertySymbols","bitmap","enumerable","writable","store","SHARED","px","toObject","isArrayIter","toLength","getIterFn","arrayLike","mapfn","mapping","iterFn","aFunction","anObject","isObject","ITERATOR","classof","getIteratorMethod","ARG","callee","SAFE_CLOSING","riter","safe","_isIterable","_n","_s","sliceIterator","NodeList","HTMLCollection","setUnscope","toIObject","Arguments","IObject","hadRuntime","regeneratorRuntime","oldRuntime","_Symbol","_Object$create","iteratorSymbol","inModule","runtime","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","__proto__","awrap","AwaitArgument","defineIteratorMethods","AsyncIterator","innerFn","outerFn","tryLocsList","reverse","Context","skipTempReset","sent","delegate","tryEntries","resetTryEntry","rootRecord","completion","rval","dispatchException","exception","handle","loc","record","entry","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","finallyEntry","complete","afterLoc","thrown","resultName","nextLoc","_invoke","method","doneResult","returnMethod","tryCatch","makeInvokeMethod","invoke","invokeNext","invokeThrow","unwrapped","domain","previousPromise","enqueueResult","ignored","pushTryEntry","locs","iteratorMethod","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","Item","fun","noop","nextTick","browser","env","argv","addListener","once","removeListener","removeAllListeners","emit","binding","cwd","chdir","dir","umask","SUPPORT_DESC","$fails","shared","uid","wks","keyOf","$names","enumKeys","_create","$Symbol","setter","HIDDEN","SymbolRegistry","AllSymbols","useNative","ObjectProto","setSymbolDesc","protoDesc","sym","$defineProperty","$defineProperties","$create","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","symbolStatics","keyFor","useSetter","useSimple","el","windowNames","getWindowNames","symbols","Wrapper","strictNew","forOf","setProto","same","species","SPECIES","RECORD","asap","PROMISE","isNode","testResolve","works","P2","thenableThenGotten","getConstructor","isThenable","isReject","chain","ok","react","fail","rej","handler","isUnhandled","onunhandledrejection","$reject","$resolve","executor","onFulfilled","onRejected","remaining","race","setPrototypeOf","buggy","macrotask","Observer","MutationObserver","WebKitMutationObserver","flush","exit","enter","observe","characterData","task","defer","channel","port","cel","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","ONREADYSTATECHANGE","listner","port2","port1","importScript","un","$keys","strong","def","$has","isExtensible","SIZE","fastKey","getEntry","IS_MAP","ADDER","callbackfn","setStrong","common","IS_WEAK","toJSON","DG","grok","ui","__webpack_module_cache__","__webpack_require__","cachedModule","__webpack_modules__","amdO","getter","definition","chunkId","globalThis","hmd","toStringTag","scriptUrl","scripts","baseURI","nc","__webpack_exports__"],"sourceRoot":""}