@datagrok/helm 2.1.11 → 2.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +1 -0
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/files/tests/sample_HELM-missedInLib.csv +541 -0
- package/files/tests/sample_HELM-noMissedInLib.csv +541 -0
- package/package.json +18 -16
- package/src/cell-renderer.ts +89 -53
- package/src/package-test.ts +2 -0
- package/src/package.ts +31 -25
- package/src/tests/findMonomers-tests.ts +56 -0
- package/src/tests/helm-tests.ts +6 -4
- package/src/utils.ts +33 -1
- package/tsconfig.json +1 -1
- package/webpack.config.js +5 -11
package/.eslintrc.json
CHANGED
package/dist/package-test.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var helm_test;(()=>{"use strict";var t={d:(e,n)=>{for(var s in n)t.o(n,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:n[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{_package:()=>w,test:()=>T,tests:()=>o});const n=DG,s=grok;var r=function(t,e,n,s){return new(n||(n=Promise))((function(r,o){function i(t){try{l(s.next(t))}catch(t){o(t)}}function c(t){try{l(s.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,c)}l((s=s.apply(t,e||[])).next())}))};const o={};let i;var c;!function(t){t.notNull=function(t,e){if(null==t)throw new Error(`${null==e?"Value":e} not defined`)}}(c||(c={}));class l{constructor(t,e){this.catchUnhandled=!0,this.report=!1,void 0!==t&&(this.catchUnhandled=t),void 0!==e&&(this.report=e)}}class a{constructor(t,e,n,s){var o;this.category=t,this.name=e,null!=s||(s={}),null!==(o=s.timeout)&&void 0!==o||(s.timeout=3e4),this.options=s,this.test=()=>r(this,void 0,void 0,(function*(){return new Promise(((t,e)=>r(this,void 0,void 0,(function*(){let s="";try{s=yield n()}catch(t){e(t)}t(s)}))))}))}}function u(t,e,n){null==o[i]&&(o[i]={}),null==o[i].tests&&(o[i].tests=[]),o[i].tests.push(new a(i,t,e,n))}function f(t,e){if(t!==e)throw new Error(`Expected "${e}", got "${t}"`)}function d(t,e,n=.001){if(!(Math.abs(t-e)<n))throw new Error(`Expected ${e}, got ${t} (tolerance = ${n})`)}function p(t,e){for(const[n,s]of Object.entries(e)){if(!t.hasOwnProperty(n))throw new Error(`Expected property "${n}" not found`);const e=t[n];if(e instanceof Array&&s instanceof Array)h(e,s);else if(e instanceof Object&&s instanceof Object)p(e,s);else if(Number.isFinite(e)&&Number.isFinite(s))d(e,s);else if(e!=s)throw new Error(`Expected (${s}) for key '${n}', got (${e})`)}}function h(t,e){const n=t.length,s=e.length;if(n!=s)throw new Error(`Arrays are of different length: actual array length is ${n} and expected array length is ${s}`);for(let s=0;s<n;s++)if(t[s]instanceof Array&&e[s]instanceof Array)h(t[s],e[s]);else if(t[s]instanceof Object&&e[s]instanceof Object)p(t[s],e[s]);else if(t[s]!=e[s])throw new Error(`Expected ${e[s]} at position ${s}, got ${t[s]}`)}function g(t,e){var n,s,o;return r(this,void 0,void 0,(function*(){let r;const i=null!=e&&!t.name.toLowerCase().startsWith(e.toLowerCase()),c=(null===(n=t.options)||void 0===n?void 0:n.skipReason)||i,l=i?"skipped":null===(s=t.options)||void 0===s?void 0:s.skipReason;c||console.log(`Started ${t.category} ${t.name}`);const a=new Date;try{r=c?{success:!0,result:l,ms:0,skipped:!0}:{success:!0,result:null!==(o=yield t.test())&&void 0!==o?o:"OK",ms:0,skipped:!1}}catch(t){r={success:!1,result:t.toString(),ms:0,skipped:!1}}const u=new Date;return r.ms=u-a,c||console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`),r.category=t.category,r.name=t.name,r}))}function E(t){t=m(t,"$")[0];const e=[];if(!scil.Utils.isNullOrEmpty(t)){const n=m(t,"|");for(let s=0;s<n.length;++s){let r=(t=y(n[s]).str).indexOf("{");r=(t=t.substring(r+1)).indexOf("}");const o=m(t=t.substring(0,r),".");for(const t of o)if(t&&""!==t)if(t.startsWith("[")&&t.includes("]")){const n=t.substring(1,t.indexOf("]"));e.push(n);const s=t.substring(t.indexOf("]")+1);o.push(s)}else if(t.includes("[")&&t.endsWith("]")){const n=t.substring(t.lastIndexOf("[")+1,t.length-1);e.push(n);const s=t.substring(0,t.lastIndexOf("["));o.push(s)}else if(t.includes("(")&&t.includes(")")){const e=t.substring(0,t.indexOf("(")),n=t.substring(t.lastIndexOf(")")+1),s=[e,t.substring(e.length+1,t.length-n.length-1),n];for(const t of s)o.push(t)}else e.push(t)}}return e}function m(t,e){const n=[];let s="",r=0,o=0,i=0,c=0;for(let l=0;l<t.length;++l){let a=t.substring(l,l+1);if(a==e&&0==o&&0==r&&0==i&&0==c)n.push(s),s="";else{if(s+=a,c>0&&"\\"==a&&l+1<t.length){++l;const e=t.substring(l,l+1);s+=e,a+=e}'"'==a?l>0&&"\\"==t.substring(l-1,l)||(c=0==c?1:0):"["==a?++o:"]"==a?--o:"("==a?++r:")"==a?--r:"{"==a?++i:"}"==a&&--i}}return n.push(s),n}function y(t){const e=$(t,'"');if(null!=e.tag)return e;const n=$(t,"'");return{tag:e.tag,repeat:n.tag,str:n.str}}function $(t,e){let n=null;if(scil.Utils.endswith(t,e)){let s=t.length-1;for(;s>0&&(s=t.lastIndexOf(e,s-1),!(s<=0||"\\"!=t.substring(s-1,s))););s>0&&s<t.length-1&&(n=t.substring(s+1,t.length-1),t=t.substring(0,s))}return null!=n&&(n=n.replace(new RegExp("\\"+e,"g"),e)),{tag:v(n),str:t}}function v(t){return scil.Utils.isNullOrEmpty(t)?t:t.replace(/[\\]./g,(function(t){switch(t){case"\\r":return"\r";case"\\n":return"\n";case"\\t":return"\t";default:return t.substring(1)}}))}var P=function(t,e,n,s){return new(n||(n=Promise))((function(r,o){function i(t){try{l(s.next(t))}catch(t){o(t)}}function c(t){try{l(s.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,c)}l((s=s.apply(t,e||[])).next())}))};i="Helm",(()=>{const t=[["L-hArg(Et,Et)","E","F","G","C","E"],["L-hArg(Et,Et)","L-hArg(Et,Et)","E","F","G"],["dhp","m1A","p","r","T","p","r","T","p","r","G","p"],["r","mo6pur","p","r","T","p","r","T","p","r","G","p"],["afhna","mo6pur","36SS","r","T","p"]],e=["comples-monomer","complex-monomer+side-chain","complex-monomer+side-chain-RNA","complex-side-chain","complex+side-chain+linker"];u("parseHelm",(()=>P(void 0,void 0,void 0,(function*(){const t=[["meI","hHis","Aca","N","T","dK","Thr_PO3H2","D-Tyr_Et","Aze","dV","E","Phe_4Me"],["A","C","T","G","W","E","Q"],["R","U","P","T","A"],["A","*","G","C"]],e=["PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$","PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$","RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$","PEPTIDE1{A.*.G.C}$$$$V2.0"];for(let n=0;n<e.length;++n){const s=new Set(E(e[n])),r=Array.from(s);f(JSON.stringify(r),JSON.stringify(t[n]))}})))),["PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0","PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$","RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0","RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0","RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0"].forEach(((n,s)=>{u(e[s],(()=>P(void 0,void 0,void 0,(function*(){const e=E(n);e.sort();const r=t[s];r.sort(),h(e,r)}))))}))})();const w=new n.Package;function T(t,e,i){return c=this,a=void 0,f=function*(){const c=yield function(t){var e,i,c,a,u;return r(this,void 0,void 0,(function*(){const f=[],d=null===(i=null===(e=s.functions.getCurrentCall())||void 0===e?void 0:e.func)||void 0===i?void 0:i.package;console.log("Running tests"),null!=t||(t={}),null!==(c=(u=t).testContext)&&void 0!==c||(u.testContext=new l),s.shell.lastError="";for(const[e,n]of Object.entries(o)){if(null!=(null==t?void 0:t.category)&&!e.toLowerCase().startsWith(null==t?void 0:t.category.toLowerCase()))continue;console.log(`Started ${e} category`);try{n.before&&(yield n.before())}catch(t){n.beforeStatus=t.toString()}const s=null!==(a=n.tests)&&void 0!==a?a:[],r=[];for(let e=0;e<s.length;e++)r.push(yield g(s[e],null==t?void 0:t.test));const o=(yield Promise.all(r)).filter((t=>"skipped"!=t.result));try{n.after&&(yield n.after())}catch(t){n.afterStatus=t.toString()}n.afterStatus&&o.push({category:e,name:"init",result:n.afterStatus,success:!1,ms:0,skipped:!1}),n.beforeStatus&&o.push({category:e,name:"init",result:n.beforeStatus,success:!1,ms:0,skipped:!1}),f.push(...o)}if(t.testContext.catchUnhandled&&(yield function(t){return r(this,void 0,void 0,(function*(){yield new Promise((e=>setTimeout(e,t)))}))}(1e3),s.shell.lastError.length>0&&f.push({category:"Unhandled exceptions",name:"exceptions",result:s.shell.lastError,success:!1,ms:0,skipped:!1})),t.testContext.report){const t=new n.Logger,e=f.filter((t=>t.success)).length,s=f.filter((t=>t.skipped)).length,r=f.filter((t=>!t.success)),o="Package @package tested: @successful successful, @skipped skipped, @failed failed tests",i={successful:e,skipped:s,failed:r.length,package:d};for(const t of r)Object.assign(i,{[`${t.category} | ${t.name}`]:t.result});t.log(o,i,"package-tested")}return f}))}({category:t,test:e,testContext:i});return n.DataFrame.fromObjects(c)},new((u=void 0)||(u=Promise))((function(t,e){function n(t){try{r(f.next(t))}catch(t){e(t)}}function s(t){try{r(f.throw(t))}catch(t){e(t)}}function r(e){var r;e.done?t(e.value):(r=e.value,r instanceof u?r:new u((function(t){t(r)}))).then(n,s)}r((f=f.apply(c,a||[])).next())}));var c,a,u,f}helm_test=e})();
|
|
1
|
+
var helm_test;(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{_package:()=>et,test:()=>nt,tests:()=>o});const n=DG,r=grok;var s=function(t,e,n,r){return new(n||(n=Promise))((function(s,o){function i(t){try{l(r.next(t))}catch(t){o(t)}}function a(t){try{l(r.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};const o={},i={};let a;var l;!function(t){t.notNull=function(t,e){if(null==t)throw new Error(`${null==e?"Value":e} not defined`)}}(l||(l={}));class c{constructor(t,e){this.catchUnhandled=!0,this.report=!1,void 0!==t&&(this.catchUnhandled=t),void 0!==e&&(this.report=e)}}class u{constructor(t,e,n,r){var o;this.category=t,this.name=e,null!=r||(r={}),null!==(o=r.timeout)&&void 0!==o||(r.timeout=3e4),this.options=r,this.test=()=>s(this,void 0,void 0,(function*(){return new Promise(((t,e)=>s(this,void 0,void 0,(function*(){let r="";try{r=yield n()}catch(t){e(t)}t(r)}))))}))}}function h(t,e,n){null==o[a]&&(o[a]={}),null==o[a].tests&&(o[a].tests=[]),o[a].tests.push(new u(a,t,e,n))}function g(t,e=!0,n){if(n=n?`${n}, `:"",t!==e)throw new Error(`${n}Expected "${e}", got "${t}"`)}function f(t,e,n=.001,r){if(t===Number.POSITIVE_INFINITY&&e===Number.POSITIVE_INFINITY||t===Number.NEGATIVE_INFINITY&&e===Number.NEGATIVE_INFINITY||t===Number.NaN&&e===Number.NaN||isNaN(t)&&isNaN(e))return;const s=Math.abs(t-e)<n;if(g(s,!0,`${null!=r?r:""} (tolerance = ${n})`),!s)throw new Error(`Expected ${e}, got ${t} (tolerance = ${n})`)}function p(t,e){for(const[n,r]of Object.entries(e)){if(!t.hasOwnProperty(n))throw new Error(`Expected property "${n}" not found`);const e=t[n];if(e instanceof Array&&r instanceof Array)C(e,r);else if(e instanceof Object&&r instanceof Object)p(e,r);else if(Number.isFinite(e)&&Number.isFinite(r))f(e,r);else if(e!=r)throw new Error(`Expected (${r}) for key '${n}', got (${e})`)}}function C(t,e){const n=t.length,r=e.length;if(n!=r)throw new Error(`Arrays are of different length: actual array length is ${n} and expected array length is ${r}`);for(let r=0;r<n;r++)if(t[r]instanceof Array&&e[r]instanceof Array)C(t[r],e[r]);else if(t[r]instanceof Object&&e[r]instanceof Object)p(t[r],e[r]);else if(t[r]!=e[r])throw new Error(`Expected ${e[r]} at position ${r}, got ${t[r]}`)}function m(t,e){a=t,e()}function d(t){null==o[a]&&(o[a]={}),o[a].before=t}function E(t){null==o[a]&&(o[a]={}),o[a].after=t}function b(t,e){return t.replace(new RegExp(e.name,"gi"),e.nqName)}function T(t){var e,a,l,h,g;return s(this,void 0,void 0,(function*(){const f=null===(a=null===(e=r.functions.getCurrentCall())||void 0===e?void 0:e.func)||void 0===a?void 0:a.package;yield function(t,e){return s(this,void 0,void 0,(function*(){if(i[t])return;const e=o;if(void 0!==e["Auto Tests"])return void(i[t]=!0);const n=[],a=yield r.dapi.functions.filter(`package.id = "${t}"`).list();for(const t of a){const e=t.options.test;if(e&&Array.isArray(e)&&e.length)for(let o=0;o<e.length;o++)n.push(new u("Auto Tests",1===e.length?t.name:`${t.name} ${o+1}`,(()=>s(this,void 0,void 0,(function*(){if(!0!==(yield r.functions.eval(b(e[o],t))))throw`Failed: ${e[o]}`})))))}i[t]=!0,n.length&&(e["Auto Tests"]={tests:n})}))}(f.id);const p=[];console.log("Running tests"),null!=t||(t={}),null!==(l=(g=t).testContext)&&void 0!==l||(g.testContext=new c),r.shell.lastError="";for(const[e,n]of Object.entries(o)){if(null!=(null==t?void 0:t.category)&&!e.toLowerCase().startsWith(null==t?void 0:t.category.toLowerCase()))continue;console.log(`Started ${e} category`);try{n.before&&(yield n.before())}catch(t){n.beforeStatus=t.toString()}const r=null!==(h=n.tests)&&void 0!==h?h:[],s=[];for(let e=0;e<r.length;e++)s.push(yield A(r[e],null==t?void 0:t.test));const o=(yield Promise.all(s)).filter((t=>"skipped"!=t.result));try{n.after&&(yield n.after())}catch(t){n.afterStatus=t.toString()}n.afterStatus&&o.push({category:e,name:"init",result:n.afterStatus,success:!1,ms:0,skipped:!1}),n.beforeStatus&&o.push({category:e,name:"init",result:n.beforeStatus,success:!1,ms:0,skipped:!1}),p.push(...o)}if(t.testContext.catchUnhandled&&(yield function(t){return s(this,void 0,void 0,(function*(){yield new Promise((e=>setTimeout(e,t)))}))}(1e3),r.shell.lastError.length>0&&p.push({category:"Unhandled exceptions",name:"exceptions",result:r.shell.lastError,success:!1,ms:0,skipped:!1})),t.testContext.report){const t=new n.Logger,e=p.filter((t=>t.success)).length,r=p.filter((t=>t.skipped)).length,s=p.filter((t=>!t.success)),o="Package @package tested: @successful successful, @skipped skipped, @failed failed tests",i={successful:e,skipped:r,failed:s.length,package:f};for(const t of s)Object.assign(i,{[`${t.category} | ${t.name}`]:t.result});t.log(o,i,"package-tested")}return p}))}function A(t,e){var n,r,o;return s(this,void 0,void 0,(function*(){let s;const i=null!=e&&!t.name.toLowerCase().startsWith(e.toLowerCase()),a=(null===(n=t.options)||void 0===n?void 0:n.skipReason)||i,l=i?"skipped":null===(r=t.options)||void 0===r?void 0:r.skipReason;a||console.log(`Started ${t.category} ${t.name}`);const c=new Date;try{s=a?{success:!0,result:l,ms:0,skipped:!0}:{success:!0,result:null!==(o=yield t.test())&&void 0!==o?o:"OK",ms:0,skipped:!1}}catch(t){s={success:!1,result:t.toString(),ms:0,skipped:!1}}const u=new Date;return s.ms=u-c,a||console.log(`Finished ${t.category} ${t.name} for ${s.ms} ms`),s.category=t.category,s.name=t.name,s}))}function N(t){t=y(t,"$")[0];const e=[];if(!scil.Utils.isNullOrEmpty(t)){const n=y(t,"|");for(let r=0;r<n.length;++r){let s=(t=w(n[r]).str).indexOf("{");s=(t=t.substring(s+1)).indexOf("}");const o=y(t=t.substring(0,s),".");for(const t of o)if(t&&""!==t)if(t.startsWith("[")&&t.includes("]")){const n=t.substring(1,t.indexOf("]"));e.push(n);const r=t.substring(t.indexOf("]")+1);o.push(r)}else if(t.includes("[")&&t.endsWith("]")){const n=t.substring(t.lastIndexOf("[")+1,t.length-1);e.push(n);const r=t.substring(0,t.lastIndexOf("["));o.push(r)}else if(t.includes("(")&&t.includes(")")){const e=t.substring(0,t.indexOf("(")),n=t.substring(t.lastIndexOf(")")+1),r=[e,t.substring(e.length+1,t.length-n.length-1),n];for(const t of r)o.push(t)}else e.push(t)}}return e}function y(t,e){const n=[];let r="",s=0,o=0,i=0,a=0;for(let l=0;l<t.length;++l){let c=t.substring(l,l+1);if(c==e&&0==o&&0==s&&0==i&&0==a)n.push(r),r="";else{if(r+=c,a>0&&"\\"==c&&l+1<t.length){++l;const e=t.substring(l,l+1);r+=e,c+=e}'"'==c?l>0&&"\\"==t.substring(l-1,l)||(a=0==a?1:0):"["==c?++o:"]"==c?--o:"("==c?++s:")"==c?--s:"{"==c?++i:"}"==c&&--i}}return n.push(r),n}function w(t){const e=S(t,'"');if(null!=e.tag)return e;const n=S(t,"'");return{tag:e.tag,repeat:n.tag,str:n.str}}function S(t,e){let n=null;if(scil.Utils.endswith(t,e)){let r=t.length-1;for(;r>0&&(r=t.lastIndexOf(e,r-1),!(r<=0||"\\"!=t.substring(r-1,r))););r>0&&r<t.length-1&&(n=t.substring(r+1,t.length-1),t=t.substring(0,r))}return null!=n&&(n=n.replace(new RegExp("\\"+e,"g"),e)),{tag:O(n),str:t}}function O(t){return scil.Utils.isNullOrEmpty(t)?t:t.replace(/[\\]./g,(function(t){switch(t){case"\\r":return"\r";case"\\n":return"\n";case"\\t":return"\t";default:return t.substring(1)}}))}var M=function(t,e,n,r){return new(n||(n=Promise))((function(s,o){function i(t){try{l(r.next(t))}catch(t){o(t)}}function a(t){try{l(r.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};m("Helm",(()=>{const t=[["L-hArg(Et,Et)","E","F","G","C","E"],["L-hArg(Et,Et)","L-hArg(Et,Et)","E","F","G"],["dhp","m1A","p","r","T","p","r","T","p","r","G","p"],["r","mo6pur","p","r","T","p","r","T","p","r","G","p"],["afhna","mo6pur","36SS","r","T","p"]],e=["comples-monomer","complex-monomer+side-chain","complex-monomer+side-chain-RNA","complex-side-chain","complex+side-chain+linker"];h("parseHelm",(()=>M(void 0,void 0,void 0,(function*(){const t=[["meI","hHis","Aca","N","T","dK","Thr_PO3H2","D-Tyr_Et","Aze","dV","E","Phe_4Me"],["A","C","T","G","W","E","Q"],["R","U","P","T","A"],["A","*","G","C"]],e=["PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$","PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$","RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$","PEPTIDE1{A.*.G.C}$$$$V2.0"];for(let n=0;n<e.length;++n){const r=new Set(N(e[n])),s=Array.from(r);g(JSON.stringify(s),JSON.stringify(t[n]))}})))),["PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0","PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$","RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0","RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0","RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0"].forEach(((n,r)=>{h(e[r],(()=>M(void 0,void 0,void 0,(function*(){const e=N(n);e.sort();const s=t[r];s.sort(),C(e,s)}))))}))})),wu;class P{constructor(t,e,n){this.name=t,this.alphabet=e,this.cutoff=n}}class $ extends P{constructor(t,e,n){super(t.name,t.alphabet,t.cutoff),this.freq=e,this.similarity=n}}const I=/(\[[A-Za-z0-9-_]+\]|.)/g,v=new class{constructor(){this.fasta={peptide:new Set(["G","L","Y","S","E","Q","D","N","F","A","K","R","H","C","V","P","W","I","M","T"]),dna:new Set(["A","C","G","T"]),rna:new Set(["A","C","G","U"])}}},L=[new P("PT",v.fasta.peptide,.5),new P("DNA",v.fasta.dna,.55),new P("RNA",v.fasta.rna,.55)],H=new Uint32Array(65536),G={gapOpen:8,gapExtend:2,scoringMatrix:[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0,-4],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1,-4],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1,-4],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1,-4],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2,-4],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1,-4],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-4],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1,-4],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1,-4],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1,-4],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1,-4],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1,-4],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1,-4],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2,-4],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0,-4],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0,-4],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2,-4],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1,-4],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1,-4],[-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1,-4],[-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1,-4],[-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1]],alphabetIndexes:{A:0,R:1,N:2,D:3,C:4,Q:5,E:6,G:7,H:8,I:9,L:10,K:11,M:12,F:13,P:14,S:15,T:16,W:17,Y:18,V:19,B:20,Z:21,X:22,"*":23}};var _;!function(t){t.HAMMING="Hamming",t.LEVENSHTEIN="Levenshtein",t.NEEDLEMANN_WUNSCH="Needlemann-Wunsch"}(_||(_={}));const R={[_.HAMMING]:function(){return(t,e)=>{let n=0;t.length!==e.length&&(n=Math.abs(t.length-e.length));let r=0;for(let n=0;n<Math.min(t.length,e.length);n++)t[n]!==e[n]&&r++;return r+=n,r/=Math.max(t.length,e.length),r}},[_.LEVENSHTEIN]:function(){return(t,e)=>((t,e)=>{if(t.length<e.length){const n=e;e=t,t=n}return 0===e.length?t.length:t.length<=32?((t,e)=>{const n=t.length,r=e.length,s=1<<n-1;let o=-1,i=0,a=n,l=n;for(;l--;)H[t.charCodeAt(l)]|=1<<l;for(l=0;l<r;l++){let t=H[e.charCodeAt(l)];const n=t|i;t|=(t&o)+o^o,i|=~(t|o),o&=t,i&s&&a++,o&s&&a--,i=i<<1|1,o=o<<1|~(n|i),i&=n}for(l=n;l--;)H[t.charCodeAt(l)]=0;return a})(t,e):((t,e)=>{const n=e.length,r=t.length,s=[],o=[],i=Math.ceil(n/32),a=Math.ceil(r/32);for(let t=0;t<i;t++)o[t]=-1,s[t]=0;let l=0;for(;l<a-1;l++){let i=0,a=-1;const c=32*l,u=Math.min(32,r)+c;for(let e=c;e<u;e++)H[t.charCodeAt(e)]|=1<<e;for(let t=0;t<n;t++){const n=H[e.charCodeAt(t)],r=o[t/32|0]>>>t&1,l=s[t/32|0]>>>t&1,c=n|i,u=((n|l)&a)+a^a|n|l;let h=i|~(u|a),g=a&u;h>>>31^r&&(o[t/32|0]^=1<<t),g>>>31^l&&(s[t/32|0]^=1<<t),h=h<<1|r,g=g<<1|l,a=g|~(c|h),i=h&c}for(let e=c;e<u;e++)H[t.charCodeAt(e)]=0}let c=0,u=-1;const h=32*l,g=Math.min(32,r-h)+h;for(let e=h;e<g;e++)H[t.charCodeAt(e)]|=1<<e;let f=r;for(let t=0;t<n;t++){const n=H[e.charCodeAt(t)],i=o[t/32|0]>>>t&1,a=s[t/32|0]>>>t&1,l=n|c,h=((n|a)&u)+u^u|n|a;let g=c|~(h|u),p=u&h;f+=g>>>r-1&1,f-=p>>>r-1&1,g>>>31^i&&(o[t/32|0]^=1<<t),p>>>31^a&&(s[t/32|0]^=1<<t),g=g<<1|i,p=p<<1|a,u=p|~(l|g),c=g&l}for(let e=h;e<g;e++)H[t.charCodeAt(e)]=0;return f})(t,e)})(t,e)/Math.max(t.length,e.length)},[_.NEEDLEMANN_WUNSCH]:function(t){return(e,n)=>{const{gapOpen:r,gapExtend:s,scoringMatrix:o,alphabetIndexes:i}={...G,...t},a=[new Array(e.length+1).fill(0),new Array(e.length+1).fill(0)],l=new Array(e.length+1).fill(!1),c=new Array(e.length+1).fill(!1);let u=0,h=1;for(let t=1;t<e.length+1;t++)a[0][t]=-r-(t-1)*s;for(let t=1;t<n.length+1;t++){a[h][0]=-r-(t-1)*s;for(let g=1;g<e.length+1;g++){const f=a[u][g-1]+o[i[e[g-1]]][i[n[t-1]]],p=a[u][g]-(l[g]?s:r),C=a[h][g-1]-(c[g-1]?s:r);a[h][g]=Math.max(f,C,p),a[h][g]===f?(l[g]=!1,c[g]=!1):a[h][g]===C?(l[g]=!1,c[g]=!0):(l[g]=!0,c[g]=!1)}u=h,h=(h+1)%2}const g=e.split("").map((t=>o[i[t]][i[t]])).reduce(((t,e)=>t+e),0),f=n.split("").map((t=>o[i[t]][i[t]])).reduce(((t,e)=>t+e),0),p=Math.max(g,f);return(p-a[u][e.length])/p}}},x=new class{constructor(){this.uhTemp=`units-handler.${n.SEMTYPE.MACROMOLECULE}`}};class D{static setUnitsToFastaColumn(t){if(t.column.semType!==n.SEMTYPE.MACROMOLECULE||"fasta"!==t.column.getTag(n.TAGS.UNITS))throw new Error(`The column of notation 'fasta' must be '${n.SEMTYPE.MACROMOLECULE}'.`);t.column.setTag(n.TAGS.UNITS,"fasta"),D.setTags(t)}static setUnitsToSeparatorColumn(t,e){if(t.column.semType!==n.SEMTYPE.MACROMOLECULE||"separator"!==t.column.getTag(n.TAGS.UNITS))throw new Error(`The column of notation 'separator' must be '${n.SEMTYPE.MACROMOLECULE}'.`);if(!e)throw new Error("The column of notation 'separator' must have the separator tag.");t.column.setTag(n.TAGS.UNITS,"separator"),t.column.setTag("separator",e),D.setTags(t)}static setUnitsToHelmColumn(t){if(t.column.semType!==n.SEMTYPE.MACROMOLECULE)throw new Error(`The column of notation 'helm' must be '${n.SEMTYPE.MACROMOLECULE}'`);t.column.setTag(n.TAGS.UNITS,"helm"),D.setTags(t)}static setTags(t){const e=t.column.getTag(n.TAGS.UNITS),r=t.stats;if(Object.keys(r.freq).some((t=>t.length>1)),["fasta","separator"].includes(e)){if(0===Object.keys(r.freq).length)throw new Error("Alphabet is empty");const e=r.sameLength?"SEQ.MSA":"SEQ";t.column.setTag("aligned",e);const n=function(t,e,n="-"){const r=e.map((e=>{const r=function(t,e,n="-"){const r=new Set([...new Set(Object.keys(t)),...e]);r.delete(n);const s=[],o=[];for(const n of r)s.push(n in t?t[n]:0),o.push(e.has(n)?1:0);const i=new U(s),a=new U(o);return function(t,e){if(t.length!=e.length)throw new Error("The dimensionality of the vectors must match");let n=0;for(let r=0;r<t.length;r++)n+=t[r]*e[r];return n}(i,a)/(F(i)*F(a))}(t,e.alphabet,n);return new $(e,t,r)}));let s;const o=Math.max(...r.map((t=>t.similarity>t.cutoff?t.similarity:-1)));s=o>0?r.find((t=>t.similarity===o)).name:"UN";return s}(r.freq,L);if(t.column.setTag("alphabet",n),"UN"===n){const e=Object.keys(r.freq).length,n=Object.keys(r.freq).some((t=>t.length>1));t.column.setTag(".alphabetSize",e.toString()),t.column.setTag(".alphabetIsMultichar",n?"true":"false")}}}get column(){return this._column}get units(){return this._units}get notation(){return this._notation}get defaultGapSymbol(){return this._defaultGapSymbol}get separator(){const t=this.column.getTag("separator")??void 0;if("separator"===this.notation&&void 0===t)throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);return t}get aligned(){const t=this.column.getTag("aligned");if(!t&&(this.isFasta()||this.isSeparator()))throw new Error("Tag aligned not set");return t}get alphabet(){const t=this.column.getTag("alphabet");if(!t&&(this.isFasta()||this.isSeparator()))throw new Error("Tag alphabet not set");return t}get helmCompatible(){return this.column.getTag(".isHelmCompatible")}getAlphabetSize(){if("helm"==this.notation||"UN"==this.alphabet){const t=this.column.getTag(".alphabetSize");let e;if(t)e=parseInt(t);else{const t=this.stats;e=Object.keys(t.freq).length}return e}switch(this.alphabet){case"PT":return 20;case"DNA":case"RNA":return 4;case"NT":return console.warn("Unexpected alphabet 'NT'."),4;default:throw new Error(`Unexpected alphabet '${this.alphabet}'.`)}}getAlphabetIsMultichar(){return"helm"===this.notation||"UN"===this.alphabet&&"true"===this.column.getTag(".alphabetIsMultichar")}get splitted(){if(null===this._splitted){const t=this.getSplitter(),e=this._column.length;this._splitted=new Array(e);const n=this._column.getRawData(),r=this._column.categories;for(let s=0;s<e;s++){const e=r[n[s]];this._splitted[s]=t(e)}}return this._splitted}get stats(){if(null===this._stats){const t={};let e=!0,n=null;for(const r of this.splitted){null==n?n=r.length:r.length!==n&&(e=!1);for(const e of r)e in t||(t[e]=0),t[e]+=1}this._stats={freq:t,sameLength:e}}return this._stats}isFasta(){return"fasta"===this.notation}isSeparator(){return"separator"===this.notation}isHelm(){return"helm"===this.notation}isRna(){return"RNA"===this.alphabet}isDna(){return"DNA"===this.alphabet}isPeptide(){return"PT"===this.alphabet}isMsa(){return!!this.aligned&&this.aligned.toUpperCase().includes("MSA")}isHelmCompatible(){return"true"===this.helmCompatible}getNotation(){if(this.units.toLowerCase().startsWith("fasta"))return"fasta";if(this.units.toLowerCase().startsWith("separator"))return"separator";if(this.units.toLowerCase().startsWith("helm"))return"helm";throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`)}getNewColumn(t,e){const r=this.column,s=r.length,o=t.toLowerCase()+"("+r.name+")",i=r.dataFrame.columns.getUnusedName(o),a=n.Column.fromList("string",i,new Array(s).fill(""));if(a.semType=n.SEMTYPE.MACROMOLECULE,a.setTag(n.TAGS.UNITS,t),"separator"===t){if(!e)throw new Error("Notation 'separator' requires separator value.");a.setTag("separator",e)}a.setTag(n.TAGS.CELL_RENDERER,"Macromolecule");const l=r.getTag("aligned");l&&a.setTag("aligned",l);const c=r.getTag("alphabet");c&&a.setTag("alphabet",c);let u=r.getTag(".alphabetSize");u&&a.setTag(".alphabetSize",u);const h=r.getTag(".alphabetIsMultichar");return void 0!==h&&a.setTag(".alphabetIsMultichar",h),"helm"==t&&(u=this.getAlphabetSize().toString(),a.setTag(".alphabetSize",u)),a}static getNewColumn(t){const e=D.getOrCreate(t),n=e.notation;return e.getNewColumn(n)}static unitsStringIsValid(t){return t=t.toLowerCase(),["fasta","separator","helm"].some((e=>t.startsWith(e.toLowerCase())))}static getNewColumnFromParams(t,e,r){if(!D.unitsStringIsValid(r))throw new Error("Invalid format of 'units' parameter");const s=n.Column.fromList("string",e,new Array(t).fill(""));return s.semType=n.SEMTYPE.MACROMOLECULE,s.setTag(n.TAGS.UNITS,r),s}getSplitter(){return function(t){if(t.semType!==n.SEMTYPE.MACROMOLECULE)throw new Error(`Get splitter for semType "${n.SEMTYPE.MACROMOLECULE}" only.`);return function(t,e,n){if(t.toLowerCase().startsWith("fasta"))return Q;if(t.toLowerCase().startsWith("separator"))return q(e,void 0);if(t.toLowerCase().startsWith("helm"))return z;throw new Error(`Unexpected units ${t} .`)}(t.getTag(n.TAGS.UNITS),t.getTag("separator"))}(this._column)}getDistanceFunctionName(){if(!this.isFasta())throw new Error("Only FASTA notation is supported");if(this.isMsa())return _.HAMMING;switch(this.alphabet){case"DNA":case"RNA":default:return _.LEVENSHTEIN;case"PT":return _.NEEDLEMANN_WUNSCH}}getDistanceFunction(){return R[this.getDistanceFunctionName()]()}async checkHelmCompatibility(){if(this.column.tags.has(".isHelmCompatible"))return"true"===this.column.getTag(".isHelmCompatible");const t=(await J()).getBioLib().getMonomerSymbolsByType("PEPTIDE".toString()),e=new Set(t),n=q(this.separator);for(const t of this.column.categories){const r=n(t);for(const t of r)if(!e.has(t))return this.column.setTag(".isHelmCompatible","false"),!1}return this.column.setTag(".isHelmCompatible","true"),!0}constructor(t){if(this._splitted=null,this._stats=null,t.type!=n.TYPE.STRING)throw new Error(`Unexpected column type '${t.type}', must be '${n.TYPE.STRING}'.`);this._column=t;const e=this._column.getTag(n.TAGS.UNITS);if(null==e)throw new Error("Units are not specified in column");if(this._units=e,this._notation=this.getNotation(),this._defaultGapSymbol=this.isFasta()?D._defaultGapSymbolsDict.FASTA:this.isHelm()?D._defaultGapSymbolsDict.HELM:D._defaultGapSymbolsDict.SEPARATOR,!this.column.tags.has("aligned")||!this.column.tags.has("alphabet")||!this.column.tags.has(".alphabetIsMultichar")&&!this.isHelm()&&"UN"===this.alphabet)if(this.isFasta())D.setUnitsToFastaColumn(this);else if(this.isSeparator()){const e=t.getTag("separator");D.setUnitsToSeparatorColumn(this,e)}else{if(!this.isHelm())throw new Error(`Unexpected units '${this.column.getTag(n.TAGS.UNITS)}'.`);D.setUnitsToHelmColumn(this)}if(!this.column.tags.has(".alphabetIsMultichar"))if(this.isHelm())this.column.setTag(".alphabetIsMultichar","true");else if(["UN"].includes(this.alphabet))throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' tag '.alphabetIsMultichar' is mandatory.`)}static getOrCreate(t){return x.uhTemp in t.temp||(t.temp[x.uhTemp]=new D(t)),t.temp[x.uhTemp]}}D._defaultGapSymbolsDict={HELM:"*",SEPARATOR:"",FASTA:"-"};class U extends Float32Array{}function F(t){let e=0;for(let n=0;n<t.length;n++)e+=t[n]*t[n];return Math.sqrt(e)}class k{static makePalette(t,e=!1,n=k){const r={};return t.forEach((t=>{const n=t[0],s=t[1];n.forEach(((t,n)=>{r[t]=this.colourPalette[s][e?0:n]}))})),new n(r)}constructor(t){this._palette=t}get(t){return this._palette[t]}}k.undefinedColor="rgb(100,100,100)",k.colourPalette={orange:["rgb(255,187,120)","rgb(245,167,100)","rgb(235,137,70)","rgb(205, 111, 71)"],all_green:["rgb(44,160,44)","rgb(74,160,74)","rgb(23,103,57)","rgb(30,110,96)","rgb(60,131,95)","rgb(24,110,79)","rgb(152,223,138)","rgb(182, 223, 138)","rgb(152, 193, 138)"],all_blue:["rgb(31,119,180)","rgb(23,190,207)","rgb(122, 102, 189)","rgb(158,218,229)","rgb(141, 124, 217)","rgb(31, 120, 150)"],magenta:["rgb(162,106,192)","rgb(197,165,224)","rgb(208,113,218)"],red:["rgb(214,39,40)","rgb(255,152,150)"],st_blue:["rgb(23,190,207)","rgb(158,218,229)","rgb(31,119,180)"],dark_blue:["rgb(31,119,180)","rgb(31, 120, 150)"],light_blue:["rgb(23,190,207)","rgb(158,218,229)","rgb(108, 218, 229)","rgb(23,190,227)"],lilac_blue:["rgb(124,102,211)","rgb(149,134,217)","rgb(97, 81, 150)"],dark_green:["rgb(23,103,57)","rgb(30,110,96)","rgb(60,131,95)","rgb(24,110,79)"],green:["rgb(44,160,44)","rgb(74,160,74)"],light_green:["rgb(152,223,138)","rgb(182, 223, 138)","rgb(152, 193, 138)"],st_green:["rgb(44,160,44)","rgb(152,223,138)","rgb(39, 174, 96)","rgb(74,160,74)"],pink:["rgb(247,182,210)"],brown:["rgb(140,86,75)","rgb(102, 62, 54)"],gray:["rgb(127,127,127)","rgb(199,199,199)","rgb(196,156,148)","rgb(222, 222, 180)"],yellow:["rgb(188,189,34)"],white:["rgb(230,230,230)"]};class W extends k{static get Lesk(){return void 0===this.lesk&&(this.lesk=this.makePalette([[["G","A","S","T"],"orange"],[["C","V","I","L","P","F","Y","M","W"],"all_green"],[["N","Q","H"],"magenta"],[["D","E"],"red"],[["K","R"],"all_blue"]],!1,W)),this.lesk}static get GrokGroups(){return void 0===this.grokGroups&&(this.grokGroups=this.makePalette([[["C","U"],"yellow"],[["G","P"],"red"],[["A","V","I","L","M","F","Y","W"],"all_green"],[["R","H","K"],"light_blue"],[["D","E"],"dark_blue"],[["S","T","N","Q"],"orange"]],!1,W)),this.grokGroups}static get RasMol(){return void 0===this.rasMol&&(this.rasMol=new W({D:"#E60A0A",E:"#E60A0A",C:"#E6E600",M:"#E6E600",K:"#145AFF",R:"#145AFF",S:"#FA9600",T:"#FA9600",F:"#3232AA",Y:"#3232AA",N:"#00DCDC",Q:"#00DCDC",G:"#EBEBEB",L:"#0F820F",V:"#0F820F",I:"#0F820F",A:"#C8C8C8",W:"#B45AB4",H:"#8282D2",P:"#DC9682",others:"#BEA06E"})),this.rasMol}get(t){const e=t in W.aaSynonyms?W.aaSynonyms[t]:t;return super.get(e)}}W.aaSynonyms={MeNle:"L",MeA:"A",MeG:"G",MeF:"F"};class V{static getPalette(t="grok"){switch(t){case"grok":return W.GrokGroups;case"lesk":return W.Lesk;default:throw new Error(`ChemPalette: scheme \`${t}\` does not exist`)}}static getInnerOuter(t){let e=0,n="",r="";for(const s of t)"("==s?e++:")"==s?e--:e?n+=s:r+=s;return isNaN(parseInt(n))?[r,n]:[r,""]}static getColorAAPivot(t="",e="grok"){const n=this.getPalette(e);let[r,s]=this.getInnerOuter(t);if(r=r.length>6?`${r.slice(0,3)}...`:r,s=s.length>6?`${s.slice(0,3)}...`:s,1==t.length||"("==t[1]){const e=t[0]?.toUpperCase();return e in n?[n.get(e),e,s,1]:[this.undefinedColor,r,s,1]}if("d"==t[0]&&t[1]in n&&(2==t.length||"("==t[2])){const e=t[1]?.toUpperCase();return e in n?[n.get(e),e,s,2]:[this.undefinedColor,r,s,2]}if(t.substring(0,3)in this.AAFullNames&&(3==t.length||"("==t[3])){const e=this.AAFullNames[t.substring(0,3)];return e in n?[n.get(e),e,s,3]:[this.undefinedColor,r,s,3]}if(t[0]?.toLowerCase()==t[0]&&t.substring(1,3)in this.AAFullNames&&(4==t.length||"("==t[4])){const e=this.AAFullNames[t.substring(1,3)];return e in n?[n.get(e),e,s,4]:[this.undefinedColor,r,s,4]}return[this.undefinedColor,r,s,0]}}V.SemType="Aminoacids",V.SemTypeMultipleAlignment="AminoacidsMultipleAlignment",V.undefinedColor="rgb(100,100,100)",V.Names={G:"Glycine",L:"Leucine",Y:"Tyrosine",S:"Serine",E:"Glutamic acid",Q:"Glutamine",D:"Aspartic acid",N:"Asparagine",F:"Phenylalanine",A:"Alanine",K:"Lysine",R:"Arginine",H:"Histidine",C:"Cysteine",V:"Valine",P:"Proline",W:"Tryptophan",I:"Isoleucine",M:"Methionine",T:"Threonine"},V.AASmiles={G:"NCC(=O)O",L:"N[C@H](CC(C)C)C(=O)O",Y:"NC(CC1=CC=C(O)C=C1)C(=O)O",S:"NC(CO)C(=O)O",E:"N[C@@H](CCC(O)=O)C(=O)O",Q:"N[C@@H](CCC(N)=O)C(=O)O",D:"N[C@@H](CC(O)=O)C(=O)O",N:"N[C@@H](CC(N)=O)C(=O)O",F:"NC(CC1=CC=CC=C1)C(=O)O",A:"N[C@H](C)C(=O)O",K:"NC(CCCCN)C(=O)O",R:"N[C@H](CCCNC(=N)C)C(=O)O",H:"NC(CC1=CN=C[N]1)C(=O)O",C:"N[C@@H](CS)C(=O)O",V:"NC(C(C)C)C(=O)O",P:"N(CCC1)C1C(=O)O",W:"N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O",I:"N[C@H]([C@H](C)CC)C(=O)O",M:"NC(CCSC)C(=O)O",T:"NC(C(O)C)C(=O)O"},V.AASmilesTruncated={G:"*C*",L:"CC(C)C[C@H](*)*",Y:"C1=CC(=CC=C1CC(*)*)O",S:"OCC(*)C*",E:"*[C@@H](CCC(O)=O)*",Q:"*N[C@@H](CCC(N)=O)*",D:"*[C@@H](CC(O)=O)*",N:"*[C@@H](CC(N)=O)*",F:"C1=CC=C(C=C1)CC(*)*",A:"C[C@H](*)*",K:"C(CCN)CC(*)*",R:"*[C@H](CCCNC(=N)C)*",H:"C1=C(NC=N1)CC(*)*",C:"C([C@@H](*)*)S",V:"CC(C)C(*)*",P:"C1CCN(*)C1*",W:"*[C@@H](Cc1c2ccccc2n([H])c1)*",I:"CC[C@H](C)[C@H](*)*",M:"CSCCC(*)*",T:"CC(O)C(*)*"},V.AAFullNames={Ala:"A",Arg:"R",Asn:"N",Asp:"D",Cys:"C",Gln:"Q",Glu:"E",Gly:"G",His:"H",Ile:"I",Leu:"L",Lys:"K",Met:"M",Phe:"F",Pro:"P",Ser:"S",Thr:"T",Trp:"W",Tyr:"Y",Val:"V"};class Y{}Y.SemType="Nucleotides",Y.SemTypeMultipleAlignment="NucleotidesMultipleAlignment",Y.Names={A:"Adenine",C:"Cytosine",G:"Guanine",T:"Thymine",U:"Uracil"};class j extends class{}{static buildPalette(){return[].concat(...Object.values(k.colourPalette))}get(t){const e=class{static hashCode(t){let e=0;if(0===t.length)return e;for(let n=0;n<t.length;n++)e=(e<<5)-e+t.charCodeAt(n),e|=0;return e}}.hashCode(t)%j.palette.length;return function(t){if(null==t)return"rgb(100,100,100)";const e=n.Color.fromHtml(t),r=n.Color.g(e),s=n.Color.r(e),o=n.Color.b(e),i=Math.sqrt(Math.pow(0-s,2)+Math.pow(0-r,2)+Math.pow(0-o,2));return i>210?`rgb(${s/i*210},${r/i*210},${o/i*210})`:n.Color.toRgb(e)}(j.palette[e])}}function Q(t){return t.toString().replace(I,".$1").slice(1).split(".").map((t=>t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):"-"===t?"":t))}function q(t,e){return n=>n.split(t,e)}j.palette=j.buildPalette();const K=/(PEPTIDE1|DNA1|RNA1)\{([^}]+)}/g,B=/\[([^\[\]]+)]/g;function z(t){K.lastIndex=0;const e=K.exec(t.toString()),n=e?e[2]:null;return(n?n.split("."):[]).map((t=>{B.lastIndex=0;const e=B.exec(t);return e&&e.length>=2?e[1]:t}))}async function J(){const t=n.Func.find({package:"Bio",name:"getMonomerLibHelper"});if(0===t.length)throw new Error('Package "Bio" must be installed for MonomerLibHelper.');return(await t[0].prepare().call()).getOutputParamValue()}var Z=function(t,e,n,r){return new(n||(n=Promise))((function(s,o){function i(t){try{l(r.next(t))}catch(t){o(t)}}function a(t){try{l(r.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};const X="Libraries",tt={"HELMCoreLibrary.json":"HELMCoreLibrary.json"};m("findMonomers",(()=>{let t,e=null;d((()=>Z(void 0,void 0,void 0,(function*(){t=yield J(),e=yield r.dapi.userDataStorage.get(X,!0),yield r.dapi.userDataStorage.post(X,tt,!0),yield t.loadLibraries(!0)})))),E((()=>Z(void 0,void 0,void 0,(function*(){yield r.dapi.userDataStorage.put(X,e,!0)}))));const n={withoutMissed:{test:"PEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$",tgt:new Set},withMissed:{test:"PEPTIDE1{meI.missed2.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$",tgt:new Set(["missed2"])}};for(const[t,e]of Object.entries(n))h(t,(()=>Z(void 0,void 0,void 0,(function*(){var t,n;t=e.test,n=e.tgt,p(function(t){const e=Object.keys(org.helm.webeditor.monomerTypeList()),n=[],r=[];for(let t=0;t<e.length;t++)n.push(new scil.helm.Monomers.getMonomerSet(e[t])),Object.keys(n[t]).forEach((e=>{r.push(n[t][e].id)}));const s=N(t);return new Set(s.filter((t=>!r.includes(t))))}(t),n)}))))}));const et=new n.Package;function nt(t,e,r){return s=this,o=void 0,a=function*(){const s=yield T({category:t,test:e,testContext:r});return n.DataFrame.fromObjects(s)},new((i=void 0)||(i=Promise))((function(t,e){function n(t){try{l(a.next(t))}catch(t){e(t)}}function r(t){try{l(a.throw(t))}catch(t){e(t)}}function l(e){var s;e.done?t(e.value):(s=e.value,s instanceof i?s:new i((function(t){t(s)}))).then(n,r)}l((a=a.apply(s,o||[])).next())}));var s,o,i,a}helm_test=e})();
|
|
2
2
|
//# sourceMappingURL=package-test.js.map
|
package/dist/package-test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-test.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"DG\"","webpack://helm/external var \"grok\"","webpack://helm/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://helm/./src/utils.ts","webpack://helm/./src/tests/helm-tests.ts","webpack://helm/./src/package-test.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nexport const tests = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let result = '';\n try {\n result = yield test();\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport function testEvent(event, handler, trigger, ms = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n let sub;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n }\n catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected) {\n if (actual !== expected)\n throw new Error(`Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001) {\n const areEqual = Math.abs(actual - expected) < tolerance;\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests) {\n currentCategory = category;\n tests();\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d;\n var _e;\n return __awaiter(this, void 0, void 0, function* () {\n const results = [];\n const packageName = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {\n if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = x.toString();\n }\n const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));\n const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: packageName\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n return results;\n });\n}\nfunction execTest(t, predicate) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n let r;\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else\n r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };\n }\n catch (x) {\n r = { success: false, result: x.toString(), ms: 0, skipped: false };\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n });\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n });\n}\nexport function isDialogPresent(dialogTitle) {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\nexport function testViewer(v, df, detectSemanticTypes = false) {\n return __awaiter(this, void 0, void 0, function* () {\n if (detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++)\n df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n yield delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);\n yield delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n }\n finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUhlLGNBQU8sVUFHdEIsQ0FBQTtBQUNILENBQUMsRUFOZ0IsTUFBTSxLQUFOLE1BQU0sUUFNdEI7QUFRRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFZLGNBQXdCLEVBQUUsTUFBZ0I7UUFIdEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdiLElBQUksY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUFBLENBQUM7Q0FDSDtBQUVELE1BQU0sT0FBTyxJQUFJO0lBTWYsWUFBWSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLE9BQXFCOztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFH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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEpOiB2b2lkIHtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzogeyBjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCB9KSB7XG4gIGNvbnN0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKT8uZnVuYz8ucGFja2FnZTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlTmFtZVxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2VcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0LnRlc3QoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfVxuICBjb25zdCBzdG9wID0gbmV3IERhdGUoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG5cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKClbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=","import * as DG from 'datagrok-api/dg';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements =[firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n/* this function returns names of monomers that are NOT in the monomer library */\nexport function findMonomers(helmString: string) {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n const splitString = parseHelm(helmString);\n return new Set(splitString.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","import {after, before, category, delay, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';\n//import {findMonomers, helmToFasta, helmToPeptide, helmToRNA, initHelm} from '../package';\nimport {_package} from '../package-test';\nimport {parseHelm} from '../utils';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\n\ncategory('Helm', () => {\n //These tests require webservice that is not present on test stand\n // test('helmToFasta', async () => {\n // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');\n // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');\n // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');\n // });\n //\n // test('helmToRNA', async () => {\n // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');\n // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');\n // // eslint-disable-next-line max-len\n // expect(\n // await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA'\n // );\n // });\n //\n // test('helmToPeptide', async () => {\n // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');\n // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');\n // // eslint-disable-next-line max-len\n // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');\n // });\n\n // detectMacromolecule is a function of Bio package\n // test('detectMacromolecule', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n // });\n\n // semType and units tags are detecting by Bio package function detectMacromolecule\n // test('detectHelm', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.tags[DG.TAGS.UNITS], 'HELM');\n // });\n\n const complexMonomers = [\n // tests parsing of complex monomemer in square brackets like [L-hArg(Et,Et)]\n 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n // tests parsing of complex monomer and one as a side chain as well\n 'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',\n // tests parsing of complex monomer and one as a side chain as well\n 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // tests complex monomer as side chain\n 'RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // test complex monomer, side chain and linker\n 'RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0'\n ];\n\n const complexMonomersExpected = [\n ['L-hArg(Et,Et)', 'E', 'F', 'G', 'C', 'E'],\n ['L-hArg(Et,Et)', 'L-hArg(Et,Et)', 'E', 'F', 'G'],\n ['dhp', 'm1A', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['r', 'mo6pur', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['afhna', 'mo6pur', '36SS', 'r', 'T', 'p']\n ];\n\n const complexTestNames = [\n 'comples-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',\n 'complex-side-chain', 'complex+side-chain+linker'\n ];\n test('parseHelm', async () => {\n const expectedResults = [\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],\n ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],\n ['R', 'U', 'P', 'T', 'A'],\n ['A', '*', 'G', 'C']\n ];\n const helmStrings = [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',\n // eslint-disable-next-line max-len\n 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',\n 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',\n 'PEPTIDE1{A.*.G.C}$$$$V2.0'\n ];\n for (let idx = 0; idx < helmStrings.length; ++idx) {\n const monomerSet = new Set(parseHelm(helmStrings[idx]));\n const monomerArray = Array.from(monomerSet);\n expect(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));\n }\n });\n complexMonomers.forEach((helm, i) => {\n test(complexTestNames[i], async () => {\n const monomersArray = parseHelm(helm);\n monomersArray.sort();\n const expected = complexMonomersExpected[i];\n expected.sort();\n expectArray(monomersArray, expected);\n });\n });\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\nimport './tests/helm-tests.ts';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n const data = await runTests({category, test, testContext});\n return DG.DataFrame.fromObjects(data)!;\n}\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DG","grok","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","tests","currentCategory","assure","notNull","name","Error","TestContext","constructor","catchUnhandled","report","this","undefined","Test","category","test","options","_a","timeout","push","expect","actual","expected","expectFloat","tolerance","Math","abs","expectObject","expectedKey","expectedValue","entries","actualValue","Array","expectArray","Number","isFinite","actualLength","length","expectedLength","i","execTest","t","predicate","_b","_c","r","filter","toLowerCase","startsWith","skip","skipReason","console","log","start","Date","success","ms","skipped","x","toString","stop","parseHelm","s","split","monomers","scil","Utils","isNullOrEmpty","seqs","p","detachAnnotation","str","indexOf","substring","ss","monomer","includes","element","residue","endsWith","lastIndexOf","firstPiece","thirdPiece","elements","el","sep","ret","frag","parentheses","bracket","braces","quote","c","c2","_detachAppendix","tag","repeat","endswith","replace","RegExp","m","complexMonomersExpected","complexTestNames","expectedResults","helmStrings","idx","monomerSet","Set","monomerArray","from","JSON","stringify","forEach","helm","monomersArray","sort","_package","testContext","data","_d","_e","results","packageName","func","package","before","beforeStatus","res","all","d","after","afterStatus","setTimeout","delay","logger","successful","failed","description","params","assign","runTests"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"package-test.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"DG\"","webpack://helm/external var \"grok\"","webpack://helm/./node_modules/@datagrok-libraries/utils/src/test.ts","webpack://helm/./src/utils.ts","webpack://helm/./src/tests/helm-tests.ts","webpack://helm/external var \"wu\"","webpack://helm/types.ts","webpack://helm/consts.ts","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.ts","webpack://helm/units-handler.ts","webpack://helm/utils.ts","webpack://helm/./node_modules/@datagrok-libraries/utils/src/vector-operations.ts","webpack://helm/./node_modules/@datagrok-libraries/utils/src/type-declarations.ts","webpack://helm/seq-palettes.ts","webpack://helm/aminoacids.ts","webpack://helm/nucleotides.ts","webpack://helm/unknown.ts","webpack://helm/monomer-utils.ts","webpack://helm/./src/tests/findMonomers-tests.ts","webpack://helm/./src/package-test.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {Observable, Subscription} from 'rxjs';\nimport Timeout = NodeJS.Timeout;\nimport {DataFrame} from 'datagrok-api/dg';\n\nexport const tests: {\n [key: string]: {\n tests?: Test[], before?: () => Promise<void>, after?: () => Promise<void>,\n beforeStatus?: string, afterStatus?: string\n }\n} = {};\n\nconst autoTestsCatName = 'Auto Tests';\nconst wasRegistered: {[key: string]: boolean} = {};\nexport let currentCategory: string;\n\nexport namespace assure {\n export function notNull(value: any, name?: string) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n}\n\nexport interface TestOptions {\n timeout?: number;\n unhandledExceptionTimeout?: number;\n skipReason?: string;\n}\n\nexport class TestContext {\n catchUnhandled = true;\n report = false;\n\n constructor(catchUnhandled?: boolean, report?: boolean) {\n if (catchUnhandled !== undefined) this.catchUnhandled = catchUnhandled;\n if (report !== undefined) this.report = report;\n };\n}\n\nexport class Test {\n test: () => Promise<any>;\n name: string;\n category: string;\n options?: TestOptions;\n\n constructor(category: string, name: string, test: () => Promise<any>, options?: TestOptions) {\n this.category = category;\n this.name = name;\n options ??= {};\n options.timeout ??= 30000;\n this.options = options;\n this.test = async (): Promise<any> => {\n return new Promise(async (resolve, reject) => {\n let result = '';\n try {\n result = await test();\n } catch (e: any) {\n reject(e);\n }\n resolve(result);\n });\n };\n }\n}\n\nexport async function testEvent<T>(event: Observable<T>,\n handler: (args: T) => void, trigger: () => void, ms: number = 0): Promise<string> {\n let sub: Subscription;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n } catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\n }, ms);\n trigger();\n });\n}\n\nexport function test(name: string, test: () => Promise<any>, options?: TestOptions): void {\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\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual: any, expected: any = true, error?: string): void {\n if (error)\n error = `${error}, `;\n else error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\n\nexport function expectFloat(actual: number, expected: number, tolerance = 0.001, error?: string): void {\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 ?? ''} (tolerance = ${tolerance})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\n\nexport function expectTable(actual: DataFrame, expected: DataFrame, error?: string): void {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error ?? ''}, row count`);\n\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}\n\nexport function expectObject(actual: { [key: string]: any }, expected: { [key: string]: any }) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n\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}\n\nexport function expectArray(actual: ArrayLike<any>, expected: ArrayLike<any>) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n\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\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\n/* Defines a test suite. */\nexport function category(category: string, tests: () => void): void {\n currentCategory = category;\n tests();\n}\n\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before: () => Promise<void>): void {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after: () => Promise<void>): void {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\n\nfunction addNamespace(s: string, f: DG.Func): string {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\n\nexport async function initAutoTests(packageId: string, module?: any) {\n if (wasRegistered[packageId]) return;\n const moduleTests = module ? module.tests : tests;\n if (moduleTests[autoTestsCatName] !== undefined) {\n wasRegistered[packageId] = true;\n return;\n }\n const moduleAutoTests = [];\n const packFunctions = await grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n for (const f of packFunctions) {\n const tests = f.options['test'];\n if (!(tests && Array.isArray(tests) && tests.length)) continue;\n for (let i = 0; i < tests.length; i++) {\n moduleAutoTests.push(new Test(autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, async () => {\n const res = await grok.functions.eval(addNamespace(tests[i], f));\n // eslint-disable-next-line no-throw-literal\n if (res !== true) throw `Failed: ${tests[i]}`;\n }));\n }\n }\n wasRegistered[packageId] = true;\n if (!moduleAutoTests.length) return;\n moduleTests[autoTestsCatName] = {tests: moduleAutoTests};\n}\n\nexport async function runTests(options?: {category?: string, test?: string, testContext?: TestContext}) {\n const package_ = grok.functions.getCurrentCall()?.func?.package;\n await initAutoTests(package_.id);\n const results: { category?: string, name?: string, success: boolean,\n result: string, ms: number, skipped: boolean }[] = [];\n console.log(`Running tests`);\n options ??= {};\n options!.testContext ??= new TestContext();\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if (options?.category != undefined) {\n if (!key.toLowerCase().startsWith(options?.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n await value.before();\n } catch (x: any) {\n value.beforeStatus = x.toString();\n }\n const t = value.tests ?? [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(await execTest(t[i], options?.test));\n const data = (await Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n await value.after();\n } catch (x: any) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false});\n if (value.beforeStatus)\n data.push({category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false});\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n await delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: package_\n };\n for (const r of failed) Object.assign(params, {[`${r.category} | ${r.name}`]: r.result});\n logger.log(description, params, 'package-tested');\n }\n return results;\n}\n\nasync function execTest(t: Test, predicate: string | undefined) {\n let r: { category?: string, name?: string, success: boolean, result: string, ms: number, skipped: boolean };\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = t.options?.skipReason || filter;\n const skipReason = filter ? 'skipped' : t.options?.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = {success: true, result: skipReason!, ms: 0, skipped: true};\n else\n r = {success: true, result: await t.test() ?? 'OK', ms: 0, skipped: false};\n } catch (x: any) {\n r = {success: false, result: x.toString(), ms: 0, skipped: false};\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n}\n\n/* Waits [ms] milliseconds */\nexport async function delay(ms: number) {\n await new Promise((r) => setTimeout(r, ms));\n}\n\nexport async function awaitCheck(checkHandler: () => boolean,\n error: string = 'Timeout exceeded', wait: number = 500): Promise<void> {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval: Timeout = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n}\n\nexport function isDialogPresent(dialogTitle: string): boolean {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\n\nexport async function testViewer(v: string, df: DG.DataFrame, detectSemanticTypes: boolean = false): Promise<void> {\n if (detectSemanticTypes) await grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n await awaitCheck(() => document.querySelector(selector) !== null,\n 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++) df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps: Record<string, boolean> = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n await delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n await awaitCheck(() => document.querySelector(selector) !== null,\n 'cannot load viewer from layout', 3000);\n await delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid')!;\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n } finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from './constants';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements =[firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// //@ts-ignore\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// //@ts-ignore\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\nexport function findMonomers(helmString: string) {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n const splitString = parseHelm(helmString);\n return new Set(splitString.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../package-test';\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';\n//import {findMonomers, helmToFasta, helmToPeptide, helmToRNA, initHelm} from '../package';\nimport {parseHelm} from '../utils';\n\n\ncategory('Helm', () => {\n //These tests require webservice that is not present on test stand\n // test('helmToFasta', async () => {\n // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');\n // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');\n // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');\n // });\n //\n // test('helmToRNA', async () => {\n // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');\n // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');\n // // eslint-disable-next-line max-len\n // expect(\n // await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA'\n // );\n // });\n //\n // test('helmToPeptide', async () => {\n // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');\n // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');\n // // eslint-disable-next-line max-len\n // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');\n // });\n\n // detectMacromolecule is a function of Bio package\n // test('detectMacromolecule', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n // });\n\n // semType and units tags are detecting by Bio package function detectMacromolecule\n // test('detectHelm', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.tags[DG.TAGS.UNITS], 'HELM');\n // });\n\n const complexMonomers = [\n // tests parsing of complex monomemer in square brackets like [L-hArg(Et,Et)]\n 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n // tests parsing of complex monomer and one as a side chain as well\n 'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',\n // tests parsing of complex monomer and one as a side chain as well\n 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // tests complex monomer as side chain\n 'RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // test complex monomer, side chain and linker\n 'RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0'\n ];\n\n const complexMonomersExpected = [\n ['L-hArg(Et,Et)', 'E', 'F', 'G', 'C', 'E'],\n ['L-hArg(Et,Et)', 'L-hArg(Et,Et)', 'E', 'F', 'G'],\n ['dhp', 'm1A', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['r', 'mo6pur', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['afhna', 'mo6pur', '36SS', 'r', 'T', 'p']\n ];\n\n const complexTestNames = [\n 'comples-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',\n 'complex-side-chain', 'complex+side-chain+linker'\n ];\n test('parseHelm', async () => {\n const expectedResults = [\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],\n ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],\n ['R', 'U', 'P', 'T', 'A'],\n ['A', '*', 'G', 'C']\n ];\n const helmStrings = [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',\n // eslint-disable-next-line max-len\n 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',\n 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',\n 'PEPTIDE1{A.*.G.C}$$$$V2.0'\n ];\n for (let idx = 0; idx < helmStrings.length; ++idx) {\n const monomerSet = new Set(parseHelm(helmStrings[idx]));\n const monomerArray = Array.from(monomerSet);\n expect(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));\n }\n });\n complexMonomers.forEach((helm, i) => {\n test(complexTestNames[i], async () => {\n const monomersArray = parseHelm(helm);\n monomersArray.sort();\n const expected = complexMonomersExpected[i];\n expected.sort();\n expectArray(monomersArray, expected);\n });\n });\n});\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;",null,null,"const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","import {mmDistanceFunctionType} from './types';\n\n// Blosum 62 matrix for protein sequences\nconst BLOSUM62:Array<Array<number>> =\n[[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\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes: {[id:string]:number} = {\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};\n\ninterface NeedlemanWunchArgs {\n gapOpen: number;\n gapExtend: number;\n scoringMatrix: number[][];\n alphabetIndexes: {[id:string]:number};\n}\n\nconst defaultArgs: NeedlemanWunchArgs = {\n gapOpen: 8,\n gapExtend: 2,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\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: Partial<NeedlemanWunchArgs>): mmDistanceFunctionType {\n return (seq1: string, seq2: string) : number => {\n const {gapOpen, gapExtend, scoringMatrix, alphabetIndexes} = {...defaultArgs, ...args};\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix: number[][] = [\n new Array<number>(seq1.length + 1).fill(0),\n new Array<number>(seq1.length + 1).fill(0)\n ];\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps: boolean[] = new Array<boolean>(seq1.length + 1).fill(false);\n const horizontalGaps: boolean[] = new Array<boolean>(seq1.length + 1).fill(false);\n\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\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 =\n matrix[prevRow][j - 1] + scoringMatrix[alphabetIndexes[seq1[j - 1]]][alphabetIndexes[seq2[i - 1]]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen );\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(\n diagonal, left, top\n );\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n } else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\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 return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n","import {hamming} from './hamming';\nimport {levenstein} from './levenstein';\nimport {needlemanWunch} from './needleman-wunsch';\nimport {mmDistanceFunctionType} from './types';\n\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 enum MmDistanceFunctionsNames {\n HAMMING = 'Hamming',\n LEVENSHTEIN = 'Levenshtein',\n NEEDLEMANN_WUNSCH = 'Needlemann-Wunsch'\n};\n\nexport const mmDistanceFunctions: Record<MmDistanceFunctionsNames, (value?: any) => mmDistanceFunctionType> = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n","import {mmDistanceFunctionType} from './types';\n\nexport function hamming(): mmDistanceFunctionType {\n return (seq1: string, seq2: string) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n if (seq1.length !== seq2.length)\n diff = Math.abs(seq1.length - seq2.length);\n\n let result = 0;\n for (let i = 0; i < Math.min(seq1.length, seq2.length); i++) {\n if (seq1[i] !== seq2[i])\n result++;\n }\n result += diff;\n result /= Math.max(seq1.length, seq2.length);\n return result;\n };\n}\n","import {distance} from 'fastest-levenshtein';\nimport {mmDistanceFunctionType} from './types';\n\nexport function levenstein(): mmDistanceFunctionType {\n return (seq1: string, seq2: string) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n",null,null,"import {Matrix, Vector, Coordinates, Vectors, DistanceMetric} from './type-declarations';\nimport {randomFloat, randomInt} from './random';\n\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: boolean = false, message: string = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1: number, dimension2: number, fill: number = 0): Coordinates {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\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: Matrix): 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/**\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: Vector, q: Vector, multiplier: number = 1): Vector {\n const nItems = p.length;\n\n assert(nItems == q.length, 'Vector lengths do not match.');\n\n const total = new Vector(nItems);\n\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n\n return total;\n}\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: Vector): number {\n let total = 0;\n\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n\n return total;\n}\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: Vector): Vector {\n const nItems = v.length;\n const total = new Vector(nItems);\n\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n\n return total;\n}\n\nexport function vectorLength(v: Vector): number {\n let sqrSum: number = 0;\n for (let i: number = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\n\nexport function vectorDotProduct(v1: Vector, v2: Vector): number {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod: number = 0;\n for (let i: number = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\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: number, dimension2: number, scale: number = 1.): Matrix {\n const matrix = initCoordinates(dimension1, dimension2);\n\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/**\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: Vector, q: Vector): number {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n\n/**\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: Vectors, distance: DistanceMetric): Matrix {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d: number = (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/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin: number, end: number, endExclusive = false): Int32Array {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n\n return series;\n}\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: any[], reverse = false): number[] {\n const sortfn = reverse ? (a: any[], b: any[]) => (b[0] - a[0]) : (a: any[], b: any[]) => (a[0] - b[0]);\n const decor = (v: any, i: number) => [v, i]; // set index to value\n const undecor = (a: any[]) => a[1]; // leave only index\n const _argsort = (arr: any[]) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\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: number, n: number, dist: (i1: number, i2: number) => number): number[] {\n function maxBy(values: IterableIterator<number>, orderBy: (i: number) => number) {\n let maxValue = null;\n let maxOrderBy = null;\n\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\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n\n while (subset.length < n) {\n const idx = maxBy(\n complement.values() as IterableIterator<number>,\n (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/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data: Vector): Vector {\n let mean = 0;\n let std = 0;\n\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n\n mean /= data.length;\n\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n\n std = Math.sqrt(std / data.length);\n\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n\n return data;\n}\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: any[], b: any[]): any[] {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n","/**\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<Vector> {}\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<any> {}\n\n/**\n * Denotes a dictionary containing function options.\n *\n * @export\n * @type Options\n */\nexport type Options = {[name: string]: any};\n\n/**\n * Denotes custom distance metric between the two given vectors.\n *\n * @export\n * @type DistanceMetric\n * @param {any} v1 The first vector.\n * @param {any} v2 The second vector.\n * @return {number} Distance between these two vectors.\n */\nexport type DistanceMetric = (v1: any, v2: any) => (number);\n\n/**\n * Denotes a simple string to string dictionary.\n *\n * @export\n * @type StringDictionary\n */\nexport type StringDictionary = {[key: string]: string};\n",null,null,null,null,null,"import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../package-test';\nimport {after, before, category, delay, expect, expectObject, test} from '@datagrok-libraries/utils/src/test';\nimport {findMonomers} from '../utils';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\n\nconst LIB_STORAGE_NAME = 'Libraries';\nexport const LIB_DEFAULT: { [fileName: string]: string } = {'HELMCoreLibrary.json': 'HELMCoreLibrary.json'};\n\n\n/** Tests with default monomer library */\ncategory('findMonomers', () => {\n\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibrariesSettings: any = null;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibrariesSettings = await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true);\n\n // Tests 'findMonomers' requires default monomer library loaded\n await grok.dapi.userDataStorage.post(LIB_STORAGE_NAME, LIB_DEFAULT, true);\n await monomerLibHelper.loadLibraries(true); // load default libraries\n });\n\n after(async () => {\n await grok.dapi.userDataStorage.put(LIB_STORAGE_NAME, userLibrariesSettings, true);\n });\n\n const tests: { [testName: string]: { test: string, tgt: Set<string> } } = {\n 'withoutMissed': {\n test: 'PEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(),\n },\n 'withMissed':\n {\n test: 'PEPTIDE1{meI.missed2.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(['missed2'])\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(testName, async () => {\n _testFindMonomers(testData.test, testData.tgt);\n });\n }\n\n function _testFindMonomers(testHelmValue: string, tgtMissedSet: Set<string>): void {\n const resMissedSet: Set<string> = findMonomers(testHelmValue);\n expectObject(resMissedSet, tgtMissedSet);\n }\n});\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\n\nimport './tests/helm-tests.ts';\nimport './tests/findMonomers-tests';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n const data = await runTests({category, test, testContext});\n return DG.DataFrame.fromObjects(data)!;\n}\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DG","grok","tests","wasRegistered","currentCategory","assure","notNull","name","Error","TestContext","constructor","catchUnhandled","report","undefined","this","Test","category","test","options","timeout","Promise","resolve","reject","result","e","push","expect","actual","expected","error","expectFloat","tolerance","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","NaN","isNaN","areEqual","Math","abs","expectObject","expectedKey","expectedValue","entries","actualValue","Array","expectArray","isFinite","actualLength","length","expectedLength","i","before","after","addNamespace","s","f","replace","RegExp","nqName","runTests","package_","func","package","packageId","module","moduleTests","autoTestsCatName","moduleAutoTests","packFunctions","list","isArray","initAutoTests","id","results","console","log","testContext","toLowerCase","startsWith","x","beforeStatus","toString","t","res","execTest","data","all","filter","d","afterStatus","success","ms","skipped","r","setTimeout","delay","logger","successful","failed","description","params","assign","predicate","skip","skipReason","start","Date","stop","parseHelm","split","monomers","scil","Utils","isNullOrEmpty","seqs","p","detachAnnotation","str","indexOf","substring","ss","monomer","includes","element","residue","endsWith","lastIndexOf","firstPiece","thirdPiece","elements","el","sep","ret","frag","parentheses","bracket","braces","quote","c","c2","_detachAppendix","tag","repeat","endswith","m","complexMonomersExpected","complexTestNames","expectedResults","helmStrings","idx","monomerSet","Set","monomerArray","from","JSON","stringify","forEach","helm","monomersArray","sort","wu","peq","Uint32Array","defaultArgs","gapOpen","gapExtend","scoringMatrix","alphabetIndexes","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","seq1","seq2","diff","min","max","LEVENSHTEIN","a","b","tmp","n","lst","pv","mv","sc","charCodeAt","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","j","vlen","k","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","args","matrix","fill","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","left","perfectMatchSeq1","map","reduce","perfectMatchSeq2","maxScore","v1","v2","prod","Float32Array","vectorLength","v","sqrSum","sqrt","LIB_STORAGE_NAME","LIB_DEFAULT","monomerLibHelper","userLibrariesSettings","getMonomerLibHelper","loadLibraries","tgt","testName","testData","testHelmValue","tgtMissedSet","helmString","types","keys","org","webeditor","monomerTypeList","monomerNames","Monomers","getMonomerSet","splitString","val","findMonomers","_package"],"sourceRoot":""}
|