jbrowse-plugin-graphgenomeviewer 4.0.8 → 4.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +4 -3
  2. package/dist/chunks/{AddTrackWorkflow-LRRSAVSX.js → AddTrackWorkflow-7KLJNIAX.js} +2 -2
  3. package/dist/chunks/GbzBaseSyntenyAdapter-O7AKR55X.js +8 -0
  4. package/dist/chunks/{GbzBaseSyntenyAdapter-WI3VYEF2.js.map → GbzBaseSyntenyAdapter-O7AKR55X.js.map} +4 -4
  5. package/dist/chunks/{GraphGenomeView-K5PZO33Q.js → GraphGenomeView-4ZUICQSO.js} +2 -2
  6. package/dist/chunks/{GraphGenomeView-K5PZO33Q.js.map → GraphGenomeView-4ZUICQSO.js.map} +1 -1
  7. package/dist/chunks/LinearGraphDisplay-AZ44H6WY.js +2 -0
  8. package/dist/chunks/{LinearGraphDisplay-3WQBA6ZX.js.map → LinearGraphDisplay-AZ44H6WY.js.map} +1 -1
  9. package/dist/chunks/{MinigraphBubbleAdapter-FJIBTKQY.js → MinigraphBubbleAdapter-BBAHDHUE.js} +2 -2
  10. package/dist/chunks/{RgfaTabixAdapter-7ZGKJJYW.js → RgfaTabixAdapter-FHJY2UWW.js} +2 -2
  11. package/dist/chunks/bandage-layout-G7WR4TGV.js +1660 -0
  12. package/dist/chunks/bandage-layout-G7WR4TGV.js.map +7 -0
  13. package/dist/chunks/chunk-5A5QL3OE.js +2 -0
  14. package/dist/chunks/chunk-5A5QL3OE.js.map +7 -0
  15. package/dist/chunks/chunk-FX7PHSWL.js +2 -0
  16. package/dist/chunks/chunk-FX7PHSWL.js.map +7 -0
  17. package/dist/chunks/chunk-I35KECKU.js +4 -0
  18. package/dist/chunks/chunk-I35KECKU.js.map +7 -0
  19. package/dist/chunks/chunk-QRVREF7H.js +2 -0
  20. package/dist/chunks/chunk-QRVREF7H.js.map +7 -0
  21. package/dist/chunks/chunk-REZGHXQH.js +3 -0
  22. package/dist/chunks/chunk-REZGHXQH.js.map +7 -0
  23. package/dist/chunks/chunk-VZG4DSVU.js +2 -0
  24. package/dist/chunks/chunk-VZG4DSVU.js.map +7 -0
  25. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +2 -2
  26. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  27. package/package.json +2 -1
  28. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +36 -0
  29. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +48 -2
  30. package/src/GbzBaseSyntenyAdapter/configSchema.ts +52 -10
  31. package/src/GetGraphReads.ts +72 -0
  32. package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +34 -13
  33. package/src/GraphGenomeView/layout/mergeRuns.test.ts +15 -0
  34. package/src/GraphGenomeView/layout/mergeRuns.ts +83 -31
  35. package/src/GraphGenomeView/layout/orderedLayout.ts +1 -1
  36. package/src/GraphGenomeView/layout/tubeMapLayout.ts +16 -8
  37. package/src/GraphGenomeView/model.test.ts +12 -1
  38. package/src/GraphGenomeView/model.ts +64 -17
  39. package/src/GraphGenomeView/pipeline.ts +1 -1
  40. package/src/GraphGenomeView/renderer/Canvas2DRenderer.test.ts +26 -1
  41. package/src/GraphGenomeView/renderer/Canvas2DRenderer.ts +35 -16
  42. package/src/GraphGenomeView/renderer/GeometryBuilder.test.ts +121 -0
  43. package/src/GraphGenomeView/renderer/GeometryBuilder.ts +228 -30
  44. package/src/GraphGenomeView/renderer/types.ts +5 -3
  45. package/src/GraphGenomeView/subgraphLoad.test.ts +97 -0
  46. package/src/GraphGenomeView/tubeMap/draw.ts +45 -0
  47. package/src/GraphGenomeView/tubeMap/mismatches.test.ts +146 -0
  48. package/src/GraphGenomeView/tubeMap/mismatches.ts +84 -0
  49. package/src/GraphGenomeView/tubeMap/reads.test.ts +88 -0
  50. package/src/GraphGenomeView/tubeMap/reads.ts +164 -0
  51. package/src/GraphGenomeView/types.ts +3 -0
  52. package/src/GraphGenomeView/util/edgeCurves.ts +2 -2
  53. package/src/GraphGenomeView/util/geometry.test.ts +51 -0
  54. package/src/GraphGenomeView/util/geometry.ts +106 -6
  55. package/src/GraphTrack/index.ts +15 -6
  56. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +63 -2
  57. package/src/LinearGraphDisplay/index.ts +3 -1
  58. package/src/bandage/README.md +5 -0
  59. package/src/bandage/bandage-layout.js +0 -0
  60. package/src/bandage/native/include/graph.h +8 -2
  61. package/src/bandage/native/src/bindings.cpp +18 -1
  62. package/src/bandage/native/src/graphlayout.cpp +4 -2
  63. package/src/core.test.ts +3 -1
  64. package/src/gaf/gafFile.test.ts +62 -0
  65. package/src/gaf/gafFile.ts +114 -0
  66. package/src/gaf/parseGaf.test.ts +57 -0
  67. package/src/gaf/parseGaf.ts +122 -0
  68. package/src/graphTrackDefaults/graphTrackDefaults.test.ts +25 -0
  69. package/src/graphTrackDefaults/index.ts +6 -1
  70. package/src/index.ts +2 -0
  71. package/src/launchFromGraph/syntenyTracks.test.ts +55 -0
  72. package/src/launchFromGraph/syntenyTracks.ts +23 -6
  73. package/src/version.ts +1 -1
  74. package/dist/chunks/GbzBaseSyntenyAdapter-WI3VYEF2.js +0 -8
  75. package/dist/chunks/LinearGraphDisplay-3WQBA6ZX.js +0 -2
  76. package/dist/chunks/bandage-layout-FIOZ7B3E.js +0 -1660
  77. package/dist/chunks/bandage-layout-FIOZ7B3E.js.map +0 -7
  78. package/dist/chunks/chunk-5TBIQWPH.js +0 -4
  79. package/dist/chunks/chunk-5TBIQWPH.js.map +0 -7
  80. package/dist/chunks/chunk-HOM2Y6XS.js +0 -2
  81. package/dist/chunks/chunk-HOM2Y6XS.js.map +0 -7
  82. package/dist/chunks/chunk-JVMMNMQG.js +0 -2
  83. package/dist/chunks/chunk-JVMMNMQG.js.map +0 -7
  84. package/dist/chunks/chunk-TN6FK5UD.js +0 -2
  85. package/dist/chunks/chunk-TN6FK5UD.js.map +0 -7
  86. package/dist/chunks/chunk-VXUVWSY5.js +0 -2
  87. package/dist/chunks/chunk-VXUVWSY5.js.map +0 -7
  88. /package/dist/chunks/{AddTrackWorkflow-LRRSAVSX.js.map → AddTrackWorkflow-7KLJNIAX.js.map} +0 -0
  89. /package/dist/chunks/{MinigraphBubbleAdapter-FJIBTKQY.js.map → MinigraphBubbleAdapter-BBAHDHUE.js.map} +0 -0
  90. /package/dist/chunks/{RgfaTabixAdapter-7ZGKJJYW.js.map → RgfaTabixAdapter-FHJY2UWW.js.map} +0 -0
package/README.md CHANGED
@@ -11,6 +11,7 @@ Pangenome graphs in JBrowse 2.
11
11
  reference's
12
12
  - Bubbles from `gfatools bubble` or the graph itself, opened level by level
13
13
  - gbz-base haplotypes as walks: carriage as node thickness, one walk lifted out
14
+ - GAF reads in the tube map, with their mismatches, from a gbz-base track
14
15
 
15
16
  ## Usage
16
17
 
@@ -56,14 +57,14 @@ Needs JBrowse 5.0.0-beta.9 or later.
56
57
  - gbz-base swaps in `{ "type": "GbzBaseSyntenyAdapter", "uri": "….gbz.db" }`; an
57
58
  `hg38` or `hs1` track finds the graph's GRCh38 or CHM13 reference sample, and
58
59
  `assemblyNameToPanSN` covers other names
60
+ - `"reads": "….gaf.gz"` on that adapter draws GAF reads in the tube map layouts
59
61
 
60
62
  ## Docs
61
63
 
62
64
  - [docs/layouts.md](docs/layouts.md) — layouts, bubbles, walks, genes, loci
63
65
  - [docs/developing.md](docs/developing.md) — building, testing, `host-compat`
64
- - [docs/layout-experiments.md](docs/layout-experiments.md) — every locus in
65
- every layout
66
66
 
67
67
  ## License
68
68
 
69
- GPL-3.0-or-later (the wasm FMMM engine is OGDF, GPL).
69
+ GPL-3.0-or-later (this module is based on work from Bandage and ODGF graph
70
+ drawing algorithms which are both GPL).
@@ -1,2 +1,2 @@
1
- import{a as F,b as T,e as y}from"./chunk-JVMMNMQG.js";import"./chunk-D7XFR2IV.js";import{a as N}from"./chunk-J4OLMLS5.js";import{a as W}from"./chunk-FCWXYIFC.js";import{a as C,b as B,c as H,d as _,e as O}from"./chunk-XEJ47DLD.js";import{a as w,b as t}from"./chunk-FY3BTKY4.js";var S=w((q,L)=>{L.exports=JBrowseExports["@jbrowse/core/util/tss-react"]});var s=t(O(),1),i=t(_(),1),l=t(N(),1),A=t(S(),1),R=t(W(),1),e=t(H(),1),x=t(B(),1);var o=t(C(),1),j=(0,A.makeStyles)()(n=>({paper:{margin:n.spacing(),padding:n.spacing()},field:{marginTop:n.spacing(2)},submit:{marginTop:25,marginBottom:100,display:"block"}})),D=["RgfaTabixAdapter","MinigraphBubbleAdapter"],J=(0,x.observer)(function({model:r}){let{classes:c}=j(),h=(0,l.getSession)(r),b=(0,R.getRoot)(r),[m,G]=(0,s.useState)("RgfaTabixAdapter"),[p,v]=(0,s.useState)(),[g,P]=(0,s.useState)(),[u,I]=(0,s.useState)(""),[d,M]=(0,s.useState)("Pangenome graph"),[f,k]=(0,s.useState)();function E(){if(!(!p||!r.assembly))try{k(void 0);let a=d.trim();(0,l.addTrackFromWidget)({model:r,session:h,conf:y({choice:m,loc:p,indexLoc:g,assembly:r.assembly,sample:u,trackId:(0,l.makeTrackId)({name:a}),name:a})})}catch(a){k(a)}}return(0,o.jsxs)(e.Paper,{className:c.paper,children:[f?(0,o.jsx)(i.ErrorMessage,{error:f}):null,(0,o.jsxs)(e.FormControl,{children:[(0,o.jsx)(e.FormLabel,{children:"File type"}),(0,o.jsx)(e.RadioGroup,{value:m,onChange:a=>{G(a.target.value)},children:D.map(a=>(0,o.jsx)(e.FormControlLabel,{value:a,control:(0,o.jsx)(e.Radio,{}),label:F[a]},a))})]}),(0,o.jsx)(i.FileSelector,{location:p,name:T[m],rootModel:b,setLocation:v}),(0,o.jsx)(i.FileSelector,{location:g,name:"Path to tabix index (optional; the sibling .tbi is assumed, a .csi is recognised by name)",rootModel:b,setLocation:P}),(0,o.jsx)(e.TextField,{className:c.field,value:u,onChange:a=>{I(a.target.value)},label:"Sample name in the graph",slotProps:{htmlInput:{"data-testid":"graph-sample-input"}},helperText:"Optional. The PanSN prefix the graph gives this assembly, e.g. GRCh38 for HPRC's GRCh38#0#chr1; leave blank when the graph's stable names are bare",placeholder:"GRCh38",fullWidth:!0}),(0,o.jsx)(e.TextField,{className:c.field,value:d,helperText:"Track name",slotProps:{htmlInput:{"data-testid":"graph-track-name-input"}},onChange:a=>{M(a.target.value)}}),(0,o.jsx)(i.AssemblySelector,{session:h,helperText:"Select assembly to add track to",selected:r.assembly,onChange:a=>{r.setAssembly(a)},fullWidth:!0}),(0,o.jsx)(e.Button,{variant:"contained",className:c.submit,disabled:!p||!d.trim()||!r.assembly,onClick:E,children:"Submit"})]})}),K=J;export{K as default};
2
- //# sourceMappingURL=AddTrackWorkflow-LRRSAVSX.js.map
1
+ import{a as F,b as T,f as y}from"./chunk-FX7PHSWL.js";import"./chunk-D7XFR2IV.js";import{a as N}from"./chunk-J4OLMLS5.js";import{a as W}from"./chunk-FCWXYIFC.js";import{a as C,b as B,c as H,d as _,e as O}from"./chunk-XEJ47DLD.js";import{a as w,b as t}from"./chunk-FY3BTKY4.js";var S=w((q,L)=>{L.exports=JBrowseExports["@jbrowse/core/util/tss-react"]});var s=t(O(),1),i=t(_(),1),l=t(N(),1),A=t(S(),1),R=t(W(),1),e=t(H(),1),x=t(B(),1);var o=t(C(),1),j=(0,A.makeStyles)()(n=>({paper:{margin:n.spacing(),padding:n.spacing()},field:{marginTop:n.spacing(2)},submit:{marginTop:25,marginBottom:100,display:"block"}})),D=["RgfaTabixAdapter","MinigraphBubbleAdapter"],J=(0,x.observer)(function({model:r}){let{classes:c}=j(),h=(0,l.getSession)(r),b=(0,R.getRoot)(r),[m,G]=(0,s.useState)("RgfaTabixAdapter"),[p,v]=(0,s.useState)(),[g,P]=(0,s.useState)(),[u,I]=(0,s.useState)(""),[d,M]=(0,s.useState)("Pangenome graph"),[f,k]=(0,s.useState)();function E(){if(!(!p||!r.assembly))try{k(void 0);let a=d.trim();(0,l.addTrackFromWidget)({model:r,session:h,conf:y({choice:m,loc:p,indexLoc:g,assembly:r.assembly,sample:u,trackId:(0,l.makeTrackId)({name:a}),name:a})})}catch(a){k(a)}}return(0,o.jsxs)(e.Paper,{className:c.paper,children:[f?(0,o.jsx)(i.ErrorMessage,{error:f}):null,(0,o.jsxs)(e.FormControl,{children:[(0,o.jsx)(e.FormLabel,{children:"File type"}),(0,o.jsx)(e.RadioGroup,{value:m,onChange:a=>{G(a.target.value)},children:D.map(a=>(0,o.jsx)(e.FormControlLabel,{value:a,control:(0,o.jsx)(e.Radio,{}),label:F[a]},a))})]}),(0,o.jsx)(i.FileSelector,{location:p,name:T[m],rootModel:b,setLocation:v}),(0,o.jsx)(i.FileSelector,{location:g,name:"Path to tabix index (optional; the sibling .tbi is assumed, a .csi is recognised by name)",rootModel:b,setLocation:P}),(0,o.jsx)(e.TextField,{className:c.field,value:u,onChange:a=>{I(a.target.value)},label:"Sample name in the graph",slotProps:{htmlInput:{"data-testid":"graph-sample-input"}},helperText:"Optional. The PanSN prefix the graph gives this assembly, e.g. GRCh38 for HPRC's GRCh38#0#chr1; leave blank when the graph's stable names are bare",placeholder:"GRCh38",fullWidth:!0}),(0,o.jsx)(e.TextField,{className:c.field,value:d,helperText:"Track name",slotProps:{htmlInput:{"data-testid":"graph-track-name-input"}},onChange:a=>{M(a.target.value)}}),(0,o.jsx)(i.AssemblySelector,{session:h,helperText:"Select assembly to add track to",selected:r.assembly,onChange:a=>{r.setAssembly(a)},fullWidth:!0}),(0,o.jsx)(e.Button,{variant:"contained",className:c.submit,disabled:!p||!d.trim()||!r.assembly,onClick:E,children:"Submit"})]})}),K=J;export{K as default};
2
+ //# sourceMappingURL=AddTrackWorkflow-7KLJNIAX.js.map
@@ -0,0 +1,8 @@
1
+ import{a as Cn,b as Rn,c as Pn,d as xo}from"./chunk-QRVREF7H.js";import{a as wo}from"./chunk-KWAXLUPQ.js";import"./chunk-LGKM2PZH.js";import{a as bo}from"./chunk-D7XFR2IV.js";import{a as Ce}from"./chunk-J4OLMLS5.js";import{a as kn,b as Mn}from"./chunk-REZGHXQH.js";import{a as _n,d as ue,e as me,f as qt}from"./chunk-F4C3BEPV.js";import{a as yo,b as Y}from"./chunk-FY3BTKY4.js";var fo=yo((Jc,ao)=>{ao.exports=JBrowseExports["@jbrowse/core/util/installClearHoverOnSurfaceMove"]});function V(r,e){return 2*r+(e==="reverse"?1:0)}function A(r){return Math.floor(r/2)}function ge(r){return r%2===0?"forward":"reverse"}function L(r){return r%2===1}function B(r){return r%2===0?r+1:r-1}function On(r){return r==="left"?"right":"left"}function $e(r){return r==="forward"?"left":"right"}function Ge(r){return r==="forward"?"right":"left"}function Ln(r){return r==="left"?"forward":"reverse"}function Tn(r){return r==="right"?"forward":"reverse"}function ye(r,e){let t=A(r),n=A(e);return L(r)?n>t||n===t&&!L(e):n>=t}function Nn(r){return Be(r[0],r[r.length-1])}function Be(r,e){return r===void 0||e===void 0?!0:L(r)===L(e)?!L(r):ye(r,e)}var Re=class{offset=0;bytes;constructor(e){this.bytes=e}get done(){return this.offset>=this.bytes.length}byte(){let e=this.bytes[this.offset];if(e!==void 0)return this.offset+=1,e}int(){let e=1,t=0;for(;this.offset<this.bytes.length;){let n=this.bytes[this.offset];if(this.offset+=1,t+=(n&127)*e,e*=128,(n&128)===0)return t}}},Fn=255,vo=256,De=class{source;sigma;threshold;constructor(e,t){this.source=new Re(e),this.sigma=t===0?Number.MAX_SAFE_INTEGER:t,this.threshold=this.sigma<Fn?Math.floor(vo/this.sigma):0}next(){if(this.sigma>=Fn){let o=this.source.int(),s=this.source.int();return o===void 0||s===void 0?void 0:{value:o,len:s+1}}let e=this.source.byte();if(e===void 0)return;let t=e%this.sigma,n=Math.floor(e/this.sigma)+1;if(n===this.threshold){let o=this.source.int();if(o===void 0)return;n+=o}return{value:t,len:n}}*[Symbol.iterator](){for(let e=this.next();e!==void 0;e=this.next())yield e}};function Hn(r){let e=new Re(r),t=e.int();if(t===void 0||t===0)return[];let n=[],o=0;for(let s=0;s<t;s++){let i=e.int(),a=e.int();if(i===void 0||a===void 0)throw new Error("GBWT edge list ends early");o+=i,n.push({node:o,offset:a})}return n}var ze=class{edges;bwt;constructor(e,t){this.edges=e,this.bwt=t}runs(){return new De(this.bwt,this.edges.length)}edge(e){let t=this.edges[e];if(t===void 0)throw new Error(`GBWT run refers to edge rank ${e} of ${this.edges.length}`);return t}lf(e){let t=this.edges.map(o=>o.offset),n=0;for(let o of this.runs()){let s=this.edge(o.value),i=t[o.value];if(n+o.len>e)return s.node===0?void 0:{node:s.node,offset:i+(e-n)};t[o.value]=i+o.len,n+=o.len}}edgeTo(e){let t=0,n=this.edges.length;for(;t<n;){let o=t+n>>1,s=this.edges[o];if(s.node===e)return o;s.node<e?t=o+1:n=o}}offsetTo(e){if(e.node===0)return;let t=this.edgeTo(e.node);if(t===void 0)return;let n=this.edges[t].offset;if(n>e.offset)return;let o=0;for(let s of this.runs())if(o+=s.len,s.value===t&&(n+=s.len,n>e.offset))return o-(n-e.offset)}predecessorAt(e){let t=this.edges.map(o=>({node:o.node===0?0:B(o.node),count:0}));for(let o of this.runs()){let s=t[o.value];s&&(s.count+=o.len)}for(let o=1;o<t.length;o++){let s=t[o-1],i=t[o];A(s.node)===A(i.node)&&(t[o-1]=i,t[o]=s)}let n=0;for(let o of t)if(n+=o.count,n>e)return o.node===0?void 0:o.node}decompressArrays(){let e=this.edges.map(i=>i.offset),t=0;for(let i of this.runs())t+=i.len;let n=new Int32Array(t),o=new Int32Array(t),s=0;for(let i of this.runs()){let a=this.edge(i.value),f=e[i.value];for(let c=0;c<i.len;c++)n[s]=a.node,o[s]=f,f+=1,s+=1;e[i.value]=f}return{nodes:n,offsets:o}}decompress(){let e=this.edges.map(n=>n.offset),t=[];for(let n of this.runs()){let o=this.edge(n.value);for(let s=0;s<n.len;s++)t.push({node:o.node,offset:e[n.value]}),e[n.value]=e[n.value]+1}return t}};var Io=["","A","C","G","T","N"];function qn(r){let e=r[r.length-1];if(e===void 0)return 0;let t=e,n=0;for(let o=0;o<3&&t%6!==0;o++)t=Math.floor(t/6),n+=1;return 3*(r.length-1)+n}function $n(r){let e="";for(let t of r){let n=t;for(let o=0;o<3;o++){let s=Io[n%6];if(s==="")return e;n=Math.floor(n/6),e+=s}}return e}var Ao={A:"T",C:"G",G:"C",T:"A",N:"N"};function je(r){let e="";for(let t=r.length-1;t>=0;t--)e+=Ao[r[t]]??"N";return e}function Gn(r,e){let t=new Map;if(r!==void 0)for(let n of r.split(";")){let o=n.split(","),[s,i]=o;if(o.length!==2||!s||!i)throw new Error(`Invalid ${e} relationship: ${n}`);let a=t.get(s);a||(a=new Set,t.set(s,a)),a.add(i)}return t}function zn(r){return{name:r.get("pggname"),subgraph:Gn(r.get("subgraph"),"subgraph"),translation:Gn(r.get("translation"),"translation")}}function Bn(r,e){for(let[t,n]of e){let o=r.get(t);o||(o=new Set,r.set(t,o));for(let s of n)o.add(s)}}function jn(r,e){let t={name:r,subgraph:new Map,translation:new Map};return e.name!==void 0&&(t.subgraph.set(r,new Set([e.name])),Bn(t.subgraph,e.subgraph),Bn(t.translation,e.translation)),t}function Dn(r){return[...r.entries()].sort(([e],[t])=>e<t?-1:e>t?1:0).flatMap(([e,t])=>[...t].sort().map(n=>[e,n]))}function Un(r){let e=[];r.name!==void 0&&e.push(`H NM:Z:${r.name}`);for(let[t,n]of Dn(r.subgraph))e.push(`H SG:Z:${t},${n}`);for(let[t,n]of Dn(r.translation))e.push(`H TL:Z:${t},${n}`);return e}async function Wn(r){let e=r.reduce((s,i)=>s+i.length,0),t=new Uint8Array(e),n=0;for(let s of r)t.set(s,n),n+=s.length;let o=await globalThis.crypto.subtle.digest("SHA-256",t);return[...new Uint8Array(o)].map(s=>s.toString(16).padStart(2,"0")).join("")}var Eo="_gbwt_ref";function q(r,e){return`${r.sample}#${r.haplotype}#${r.contig}[${r.fragment}-${e}]`}var Co=/^([^#]+)#(\d+)#([^#]+?)(?:\[\d+-\d+\])?$/,Ro=/^([^#]+?)(?:\[\d+-\d+\])?$/;function Po(r){let e=Co.exec(r);if(e)return{sample:e[1],haplotype:Number(e[2]),contig:e[3]};let t=Ro.exec(r);if(t)return{contig:t[1]};throw new Error(`"${r}" is not a path name; expected "sample#haplotype#contig" or a bare contig`)}function Qn(r){return typeof r=="string"?Po(r):r}function Pe(r,e){return{sample:r.sample??Eo,contig:r.contig,haplotype:r.haplotype??0,fragment:e}}function Ue(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>1;r[o]<e?t=o+1:n=o}return t}var We=class{ending;tree;constructor(e){this.ending=new Float64Array(e),this.tree=new Int32Array(e+1).fill(-1)}bestBefore(e){let t=-1;for(let n=e;n>0;n-=n&-n){let o=this.tree[n];o!==-1&&(t===-1||this.ending[o]>this.ending[t])&&(t=o)}return t}raise(e,t){this.ending[e]=t;for(let n=e+1;n<this.tree.length;n+=n&-n){let o=this.tree[n];(o===-1||t>this.ending[o])&&(this.tree[n]=e)}}},$t=class{pairs=[];total=0;a;b;weight;occurrences=new Map;constructor(e,t,n){this.a=e,this.b=t,this.weight=n,t.forEach((o,s)=>{let i=this.occurrences.get(o);i?i.push(s):this.occurrences.set(o,[s])})}solve(e,t,n,o){let s=0;for(;e+s<t&&n+s<o&&this.a[e+s]===this.b[n+s];)this.match(e+s,n+s),s+=1;let i=0;for(;t-i>e+s&&o-i>n+s&&this.a[t-i-1]===this.b[o-i-1];)i+=1;this.solveMiddle(e+s,t-i,n+s,o-i);for(let a=i;a>0;a--)this.match(t-a,o-a)}match(e,t){this.pairs.push([e,t]),this.total+=this.weight(this.a[e])}solveMiddle(e,t,n,o){if(e===t||n===o)return;let s=this.matchCount(e,t,n,o);if(s===0)return;if(s<=t-e+(o-n)){this.chain(e,t,n,o,s);return}let i=e+t>>1,a=this.split(e,i,t,n,o);this.solve(e,i,n,a),this.solve(i,t,a,o)}matchCount(e,t,n,o){let s=0;for(let i=e;i<t;i++){let a=this.occurrences.get(this.a[i]);a&&(s+=Ue(a,o)-Ue(a,n))}return s}sweep(e,t,n,o,s,i,a){for(let f=e;f!==t;f+=n){let c=this.occurrences.get(this.a[f]);if(!c)continue;let l=this.weight(this.a[f]),p=Ue(c,o),h=Ue(c,s);for(let d=0;d<h-p;d++){let u=n===1?c[h-1-d]-o:s-1-c[p+d],m=i.bestBefore(u),y=(m===-1?0:i.ending[m])+l;if(y>i.ending[u]&&(i.raise(u,y),a)){let x=a.count++;a.row[x]=f,a.column[x]=u,a.previous[x]=m===-1?-1:a.endingMatch[m],a.endingMatch[u]=x}}}}chain(e,t,n,o,s){let i=new We(o-n),a={row:new Int32Array(s),column:new Int32Array(s),previous:new Int32Array(s),endingMatch:new Int32Array(o-n),count:0};this.sweep(e,t,1,n,o,i,a);let f=i.bestBefore(o-n);if(f===-1)return;this.total+=i.ending[f];let c=[];for(let l=a.endingMatch[f];l!==-1;l=a.previous[l])c.push([a.row[l],n+a.column[l]]);for(let l=c.length-1;l>=0;l--)this.pairs.push(c[l])}frontier(e,t,n,o,s){let i=new We(s-o);this.sweep(e,t,n,o,s,i);let a=new Float64Array(s-o+1);for(let f=0;f<s-o;f++)a[f+1]=Math.max(a[f],i.ending[f]);return a}split(e,t,n,o,s){let i=s-o,a=this.frontier(e,t,1,o,s),f=this.frontier(n-1,t-1,-1,o,s),c=0,l=-1;for(let p=0;p<=i;p++){let h=a[p]+f[i-p];h>l&&(l=h,c=p)}return o+c}};function Yn(r,e,t){let n=new $t(r,e,t);return n.solve(0,r.length,0,e.length),[n.pairs,n.total]}var _o=100,Dt=4e6,ko=5e3,D=15,Mo=64,Oo=8,tr=1,zt=-4,G=-6,te=-1,we=-(2**30),Ye=0,Gt=1,nr=2;function ae(r,e,t){let n=r.at(-1);t>0&&(n?.[0]===e?n[1]+=t:r.push([e,t]))}function Qe(r,e,t){return r>=t&&r>=e?Ye:t>=e?nr:Gt}function rr(r,e,t){let n=r.length,o=e.length,s=o+1,i=new Uint8Array((n+1)*s),a=new Int32Array(s).fill(we),f=new Int32Array(s).fill(we),c=new Int32Array(s).fill(we);a[0]=0;for(let u=1;u<=o;u++)c[u]=G+(u-1)*te,i[u]=(u===1?Ye:nr)<<4;for(let u=1;u<=n;u++){let m=new Int32Array(s).fill(we),y=new Int32Array(s).fill(we),x=new Int32Array(s).fill(we);y[0]=G+(u-1)*te,i[u*s]=(u===1?Ye:Gt)<<2;let S=r.charCodeAt(u-1);for(let g=1;g<=o;g++){let b=Qe(a[g-1],f[g-1],c[g-1]);m[g]=Math.max(a[g-1],f[g-1],c[g-1])+(S===e.charCodeAt(g-1)?tr:zt);let w=Qe(a[g]+G,f[g]+te,c[g]+G);y[g]=Math.max(a[g]+G,f[g]+te,c[g]+G);let v=Qe(m[g-1]+G,y[g-1]+G,x[g-1]+te);x[g]=Math.max(m[g-1]+G,y[g-1]+G,x[g-1]+te),i[u*s+g]=b|w<<2|v<<4}a=m,f=y,c=x}let l=[],p=n,h=o,d=Qe(a[o],f[o],c[o]);for(;p>0||h>0;){let u=i[p*s+h]>>2*d&3;d===Ye?(l.push(r[p-1]===e[h-1]?"=":"X"),p-=1,h-=1):d===Gt?(l.push("I"),p-=1):(l.push("D"),h-=1),d=u}for(let u of l.reverse())ae(t,u,1)}function Lo(r,e){let t=Math.abs(r-e);return(t===0?0:Math.min(-G-(t-1)*te,-G+10*Math.log2(t)))+(Math.min(r,e)>0?-zt:0)}function or(r,e){let t=Math.abs(r-e);return t===0?0:.01*D*t+.5*Math.log2(t)}function Vn(r,e,t){return{qs:r.qs+e,qe:r.qs+t,ts:r.flipped?r.te-t:r.ts+e,te:r.flipped?r.te-e:r.ts+t,flipped:r.flipped}}function To(r,e,t){let n=r.qe-r.qs,o=[];for(let[a,f]of e){let c=Math.max(0,a-r.qs),l=Math.min(n,f-r.qs);c<l&&o.push([c,l])}for(let[a,f]of t){let c=Math.max(0,r.flipped?r.te-f:a-r.ts),l=Math.min(n,r.flipped?r.te-a:f-r.ts);c<l&&o.push([c,l])}if(o.length===0)return[r];o.sort((a,f)=>a[0]-f[0]);let s=[],i=0;for(let[a,f]of o)a-i>=D&&s.push(Vn(r,i,a)),i=Math.max(i,f);return n-i>=D&&s.push(Vn(r,i,n)),s}function jt(r,e,t,n,o=1/0){let s=[],i={query:[],target:[]},a={forward:{query:[],target:[]},flipped:{query:[],target:[]}},f=[...r].sort((c,l)=>c.qs-l.qs||c.ts-l.ts);for(;f.length>0&&s.length<o;){let c=f.map(g=>g.qe-g.qs),l=new Int32Array(f.length).fill(-1),p=new Int32Array(f.length);for(let g=0;g<f.length;g++){let b=f[g],w=b.qe-b.qs;for(let v=g-1;v>=Math.max(0,g-ko);v--){if(c[v]+w<=c[g])continue;let I=f[v];if(I.flipped===b.flipped&&I.qs<b.qs&&(b.flipped?b.te<I.te:I.ts<b.ts)){let C=Math.max(0,I.qe-b.qs,b.flipped?b.te-I.ts:I.te-b.ts),P=b.qs+C-I.qe,E=b.flipped?I.ts-(b.te-C):b.ts+C-I.te;if(C<w&&P<=e&&E<=e){let k=c[v]+w-C-n(P,E);k>c[g]&&(c[g]=k,l[g]=v,p[g]=C)}}}}let h=0;for(let g=1;g<f.length;g++)c[g]>c[h]&&(h=g);let d=[];for(let g=h;g>=0;g=l[g])d.push({run:f[g],trim:p[g]});if(d.reverse(),d.reduce((g,{run:b,trim:w})=>g+b.qe-b.qs-w,0)<t)break;s.push(d);let m=d[0],y=d.at(-1),{flipped:x}=m.run,S=x?a.flipped:a.forward;S.query.push([m.run.qs+m.trim,y.run.qe]),S.target.push(x?[y.run.ts,m.run.te-m.trim]:[m.run.ts+m.trim,y.run.te]);for(let{run:g,trim:b}of d)i.query.push([g.qs+b,g.qe]),i.target.push(g.flipped?[g.ts,g.te-b]:[g.ts+b,g.te]);f=f.flatMap(g=>{let b=g.flipped?a.flipped:a.forward;return To(g,[...i.query,...b.query],[...i.target,...b.target])}).sort((g,b)=>g.qs-b.qs||g.ts-b.ts)}return s}function Bt(r,e){let t=new Map;for(let s=0;s+D<=e.length;s++){let i=e.slice(s,s+D),a=t.get(i);a?a.push(s):t.set(i,[s])}let n=[],o=new Map;for(let s=0;s+D<=r.length;s++){let i=t.get(r.slice(s,s+D));if(i&&i.length<=Mo)for(let a of i){let f=a-s,c=o.get(f);if(c&&s<=c.qe)c.qe=s+D,c.te=a+D;else{let l={qs:s,qe:s+D,ts:a,te:a+D,flipped:!1};o.set(f,l),n.push(l)}}}return n}function No(r,e){return[...Bt(r,e),...Bt(r,je(e)).map(t=>({...t,ts:e.length-t.te,te:e.length-t.ts,flipped:!0}))]}function Ve(r,e,t,n,o){let s;for(let{run:i,trim:a}of r){let f=i.qs+a;if(s){let c=i.flipped?i.te-a:s.te,l=i.flipped?s.ts:i.ts+a,p=t.slice(c,l);o(e.slice(s.qe,f),i.flipped?je(p):p,n,s.qe,c)}ae(n,"=",i.qe-f),s=i}}function Ut(r,e,t){ae(t,"I",r.length),ae(t,"D",e.length)}function sr(r,e,t){r.length*e.length<=Dt?rr(r,e,t):Ut(r,e,t)}function Wt(r,e,t,n=0){let[o]=r.length*e.length>Dt&&n<Oo?jt(Bt(r,e),1/0,D,or,1):[];if(!o){sr(r,e,t);return}let s=(f,c,l)=>{Wt(f,c,l,n+1)},i=o[0].run,a=o.at(-1).run;s(r.slice(0,i.qs),e.slice(0,i.ts),t),Ve(o,r,e,t,s),s(r.slice(a.qe),e.slice(a.te),t)}function Fo(r,e,t){Wt(r,e,t)}function Ho(r,e,t){let n=[];Ve(r,e,t,n,Fo);let o=r[0],s=r.at(-1),{flipped:i}=o.run;return{queryStart:o.run.qs+o.trim,queryEnd:s.run.qe,targetStart:i?s.run.ts:o.run.ts+o.trim,targetEnd:i?o.run.te-o.trim:s.run.te,strand:i?"-":"+",edits:i?n.reverse():n,sharedBases:0}}function qo(r,e,t,n){let o=[];if(r.length*e.length<=Dt)rr(r,e,t);else{let s=jt(No(r,e),1/0,Math.max(n,D),or),i=s.find(a=>!a[0].run.flipped);if(o=s.filter(a=>a[0].run.flipped).map(a=>Ho(a,r,e)),i){let a=(l,p,h,d,u)=>{o.some(y=>d<y.queryEnd&&y.queryStart<d+l.length||u<y.targetEnd&&y.targetStart<u+p.length)?sr(l,p,h):Wt(l,p,h)},f=i[0].run,c=i.at(-1).run;a(r.slice(0,f.qs),e.slice(0,f.ts),t,0,0),Ve(i,r,e,t,a),a(r.slice(c.qe),e.slice(c.te),t,c.qe,c.te)}else Ut(r,e,t)}return o}function Qt(r,e){let t=r.strand==="-",n=0,o=0;for(let[s,i]of r.edits)e(s,i,t?r.queryEnd-1-n:r.queryStart+n,r.targetStart+o),s!=="D"&&(n+=i),s!=="I"&&(o+=i)}function Kn(r,e,t,n){let o=e==="query"&&r.strand==="-"?-1:1,s=0;return Qt(r,(i,a,f,c)=>{let l=e==="query"?f:c,p=h=>{let d=l+o*h;return d>=t&&d<n};if(i==="="||i==="X")for(let h=0;h<a;h++)p(h)&&(s+=i==="="?tr:zt);else if(i==="I"==(e==="query"))for(let h=0;h<a;h++)p(h)&&(s+=h===0?G:te);else p(0)&&(s+=G+(a-1)*te)}),s}function Xn(r,e){return e==="query"?[r.queryStart,r.queryEnd]:[r.targetStart,r.targetEnd]}function $o(r,e){let t=r.strand==="-",n=[],o=0,s=0,i=0,a=0,f=new Uint8Array(r.queryEnd-r.queryStart);for(let[d,u]of r.shared)f.fill(1,d-r.queryStart,u-r.queryStart);let c=d=>f[d-r.queryStart]===1,l=()=>{ae(n,"I",o),ae(n,"D",s),o=0,s=0};Qt(r,(d,u,m)=>{if(d==="I")o+=u;else if(d==="D")s+=u;else{for(let y=0;y<u;y++)e[i+y]?(o+=1,s+=1,c(t?m-y:m+y)&&(a+=1)):((o>0||s>0)&&l(),ae(n,d,1));i+=u}}),l();let p={I:0,D:0};for(;n[0]?.[0]==="I"||n[0]?.[0]==="D";){let[d,u]=n.shift();p[d]+=u}let h={I:0,D:0};for(;n.at(-1)?.[0]==="I"||n.at(-1)?.[0]==="D";){let[d,u]=n.pop();h[d]+=u}return n.length===0?void 0:{...r,queryStart:r.queryStart+(t?h.I:p.I),queryEnd:r.queryEnd-(t?p.I:h.I),targetStart:r.targetStart+p.D,targetEnd:r.targetEnd-h.D,edits:n,sharedBases:r.sharedBases-a}}function Go(r,e,t,n){let o={query:new Uint8Array(e),target:new Uint8Array(t)},s=r.map(c=>{let l=[];Qt(c,(p,h,d,u)=>{if(p==="="||p==="X")for(let m=0;m<h;m++)l.push([c.strand==="-"?d-m:d+m,u+m])});for(let[p,h]of l)o.query[p]=Math.min(255,o.query[p]+1),o.target[h]=Math.min(255,o.target[h]+1);return l}),i={query:new Map,target:new Map};s.forEach((c,l)=>{for(let[p,h]of c)for(let[d,u]of[["query",p],["target",h]])if(o[d][u]>1){let m=i[d].get(u);m?m.at(-1)!==l&&m.push(l):i[d].set(u,[l])}});let a=new Map,f=(c,l,p)=>{let h=`${p}:${c}:${l}`,d=a.get(h);if(d===void 0){let[u,m]=Xn(r[c],p),[y,x]=Xn(r[l],p),S=Math.max(u,y),g=Math.min(m,x),[b,w]=[r[c],r[l]];d=[Kn(w,p,S,g)-Kn(b,p,S,g),w.sharedBases-b.sharedBases,c-l].find(I=>I!==0)>0,a.set(h,d)}return d};return r.flatMap((c,l)=>{let p=s[l],h=new Uint8Array(p.length);if(p.forEach(([m,y],x)=>{for(let[S,g]of[["query",m],["target",y]])!h[x]&&i[S].get(g)?.some(b=>b!==l&&f(l,b,S))&&(h[x]=1)}),!h.includes(1))return[c];let d=$o(c,h),u=d?.edits.reduce((m,[y,x])=>m+(y==="="?x:0),0)??0;return d&&u>=n?[d]:[]})}function Zn(r,e){return r.map(t=>{let n=e(A(t));return L(t)?je(n):n}).join("")}function Jn(r,e){let t=[0];for(let n of r)t.push(t.at(-1)+e(A(n)).length);return t}function er(r){let e=new Map,t=new Map;r.forEach((i,a)=>{let f=A(i);e.has(f)?t.set(f,a):e.set(f,a)});let n=new Int32Array(r.length+1);for(let[i,a]of t)n[e.get(i)]+=1,n[a+1]-=1;let o=new Uint8Array(r.length),s=0;for(let i=0;i<r.length;i++)s+=n[i],o[i]=s>0?1:0;return o}function Bo(r,e,t,n){let o=er(r),s=er(e),i=new Map;e.forEach((p,h)=>{s[h]||i.set(A(p),[h])});let a=2*e.length,f=(p,h,d)=>p*a+2*h+(d?1:0),c=new Set;r.forEach((p,h)=>{for(let d of o[h]?[]:i.get(A(p))??[])c.add(f(h,d,L(p)!==L(e[d])))});let l=[];return r.forEach((p,h)=>{for(let d of o[h]?[]:i.get(A(p))??[]){let u=L(p)!==L(e[d]),m=u?-1:1;if(!c.has(f(h-1,d-m,u))){let y=h,x=d;for(;y<r.length&&x>=0&&x<e.length&&c.has(f(y,x,u));)y+=1,x+=m;let S=x-m;l.push({qs:t[h],qe:t[y],ts:n[Math.min(d,S)],te:n[Math.max(d,S)+1],flipped:u})}}}),l}function ir(r,e,t,n={}){let o=Zn(r,t),s=Zn(e,t),i=Bo(r,e,Jn(r,t),Jn(e,t)),a=n.minMatch??_o,f=n.bases??!0,c=[];for(let l of jt(i,n.maxGap??1/0,a,Lo)){let p=[],h=l[0],d=l.at(-1),{flipped:u}=h.run;Ve(l,o,s,p,f?(y,x,S,g,b)=>{for(let w of qo(y,x,S,a)){let v=b+x.length;c.push({...w,queryStart:g+w.queryStart,queryEnd:g+w.queryEnd,targetStart:u?v-w.targetEnd:b+w.targetStart,targetEnd:u?v-w.targetStart:b+w.targetEnd,strand:u?"+":"-",edits:u?w.edits.reverse():w.edits,shared:[]})}}:Ut),c.push({queryStart:h.run.qs+h.trim,queryEnd:d.run.qe,targetStart:u?d.run.ts:h.run.ts+h.trim,targetEnd:u?h.run.te-h.trim:d.run.te,strand:u?"-":"+",edits:u?p.reverse():p,sharedBases:l.reduce((y,{run:x,trim:S})=>y+x.qe-x.qs-S,0),shared:l.map(({run:y,trim:x})=>[y.qs+x,y.qe])})}return Go(c,o.length,s.length,a).map(({shared:l,...p})=>p).sort((l,p)=>l.queryStart-p.queryStart)}function ar(r){return r.map(([e,t])=>`${t}${e}`).join("")}var X=class extends Error{name="SubgraphLimitError";limit;windowBp;walkedBp;constructor(e,t){super(t===void 0?`Subgraph size limit of ${e} nodes exceeded`:`Subgraph size limit of ${e} nodes exceeded ${t.walkedBp} bp into a ${t.windowBp} bp window`),this.limit=e,this.windowBp=t?.windowBp,this.walkedBp=t?.walkedBp}};function Yt(r,e){return r[0]<e[0]||r[0]===e[0]&&(r[1]<e[1]||r[1]===e[1]&&r[2]<e[2])}var _e=class{heap=[];push(e,t,n){let o=this.heap;o.push([e,t,n]);let s=o.length-1;for(;s>0;){let i=s-1>>1;if(Yt(o[s],o[i]))[o[s],o[i]]=[o[i],o[s]],s=i;else break}}pop(){let e=this.heap,t=e[0],n=e.pop();if(e.length>0&&n!==void 0){e[0]=n;let o=0;for(;;){let s=2*o+1,i=s+1,a=o;if(s<e.length&&Yt(e[s],e[a])&&(a=s),i<e.length&&Yt(e[i],e[a])&&(a=i),a===o)break;[e[o],e[a]]=[e[a],e[o]],o=a}}return t}get size(){return this.heap.length}};function Do(r){let e=new Int32Array(r.length),t=new Int32Array(r.length);return r.forEach(([n,o],s)=>{e[s]=n,t[s]=o}),{pathAt:e,refAt:t,count:r.length}}function zo(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>1;r[o]>e?n=o:t=o+1}return r[t]}function fe(r){return`${r.node}:${r.offset}`}function jo(r,e){let t=e.identity.hapStart-r.identity.hapEnd,n=r.strand==="+"?e.refStart-r.refEnd:r.refStart-e.refEnd;return r.strand===e.strand&&t>=0&&n>=0?{insertion:t,deletion:n}:void 0}function Uo(r,e,t){let[n,o]=r.strand==="+"?[r,e]:[e,r],s=n.edits.map(([c,l])=>[c,l]);cr(s,t.insertion,t.deletion);for(let[c,l]of o.edits)z(s,c,l);let i=r.identity.walkForward,[a,f]=i?[r,e]:[e,r];return{strand:r.strand,refStart:n.refStart,refEnd:o.refEnd,edits:s,weight:void 0,path:[...a.path,...f.path],start:a.start,identity:{pathHandle:r.identity.pathHandle,name:r.identity.name,hapStart:r.identity.hapStart,hapEnd:e.identity.hapEnd,walkForward:i}}}function Wo(r){if(r.some(o=>o.weight!==void 0))return r;let e=new Map;r.forEach((o,s)=>{if(o.identity){let i=e.get(o.identity.pathHandle);i?i.push(s):e.set(o.identity.pathHandle,[s])}});let t=new Map,n=new Set;for(let o of e.values()){o.sort((a,f)=>r[a].identity.hapStart-r[f].identity.hapStart);let s=o[0],i=r[s];for(let a of o.slice(1)){let f=r[a],c=jo(i,f);c?(i=Uo(i,f,c),n.add(a)):(t.set(s,i),s=a,i=f)}t.set(s,i)}return r.flatMap((o,s)=>n.has(s)?[]:[t.get(s)??o])}function Ke(r,e){return{node:r.path[e],offset:r.offsets[e]}}var Qo=4096;function fr(r){let e=[];for(let t of r){let n=e[e.length-1];n&&t-n[1]<=Qo?n[1]=t:e.push([t,t])}return e}var Yo=32768,Vo=65536;function Ko(r){let e=[...r].sort((n,o)=>n-o),t=[];for(let n of e){let o=t[t.length-1];o&&n-o[1]<=Yo?o[1]=n:t.push([n,n])}return t}var ke=class{records=new Map;paths=[];twinStarts=new Set;refId;refPath;refHandle;refInterval;refIndexCache;refPrefixCache;walkedBp;stats={orderedAlignments:0,lcsAlignments:0,identificationSteps:0,identificationFetches:0,identification:{interval:0,scans:[],windowSamples:0,fragmentLengths:[],companionSeeks:0,companionMisses:0,graphLookups:0,graphFetches:0,chains:[]},anchorWalk:void 0};db;limit;signal;constructor(e,t={}){this.db=e,this.limit=t.limit,this.signal=t.signal}get nodeCount(){return this.records.size/2}get pathCount(){return this.paths.length}get referenceInterval(){return this.refInterval&&this.refPath?{name:this.refPath,start:this.refPath.fragment+this.refInterval[0],end:this.refPath.fragment+this.refInterval[1]}:void 0}hasNode(e){return this.records.has(V(e,"forward"))}hasHandle(e){return this.records.has(e)}record(e){let t=this.records.get(e);if(!t)throw new Error(`Subgraph has no record for handle ${e}`);return t}sortedHandles(){return[...this.records.keys()].sort((e,t)=>e-t)}async addNode(e){if(this.signal?.throwIfAborted(),this.limit!==void 0&&this.nodeCount>=this.limit)throw new X(this.limit);let t=await this.db.getRecord(V(e,"forward")),n=await this.db.getRecord(V(e,"reverse"));if(!t||!n)throw new Error(`Node ${e} does not exist in the graph`);this.records.set(t.handle,t),this.records.set(n.handle,n)}async ensureNode(e){this.hasNode(e)||await this.addNode(e)}clearPaths(){this.paths=[],this.twinStarts.clear(),this.refId=void 0,this.refPath=void 0,this.refHandle=void 0,this.refInterval=void 0,this.refIndexCache=void 0,this.refPrefixCache=void 0}async pathPosition(e){let t=await this.db.findPath(e);if(!t)throw new Error(`Cannot find a path covering ${q(e,e.fragment)}`);if(!t.isIndexed)throw new Error(`Path ${q(t.name,t.name.fragment)} has not been indexed for random access`);let n=e.fragment-t.name.fragment,o=await this.db.indexedPosition(t.handle,n);if(!o)throw new Error(`Path ${q(t.name,t.name.fragment)} has not been indexed for random access`);return this.findPathPosition(t,n,o.pathOffset,o.pos)}async findPathPosition(e,t,n,o){let s=n,i=o;for(;;){await this.ensureNode(A(i.node));let a=this.record(i.node);if(s+a.sequenceLen>t)return{position:{seqOffset:t,handle:i.node,nodeOffset:t-s,gbwtOffset:i.offset},name:e.name,handle:e.handle};s+=a.sequenceLen;let f=a.gbwt().lf(i.offset);if(!f)throw new Error(`Path ${q(e.name,e.name.fragment)} does not contain offset ${t}`);i=f}}async aroundPosition(e,t,n){let o=A(e);await this.ensureNode(o);let s=this.record(e),i=ge(e),a=new _e;return a.push(t,o,$e(i)),a.push(s.sequenceLen-t-1,o,Ge(i)),this.insertContext(a,n)}prefetchReferenceWalk(e,t){return this.prefetchReferenceRange(e.handle,e.position.seqOffset,e.position.seqOffset+t)}async prefetchReferenceRange(e,t,n){let[o,s]=await Promise.all([this.db.indexedPosition(e,t),this.db.indexedPosition(e,n)]);if(o&&s){let i=o.pos.node,a=s.pos.node;if(!await this.db.prefetchRecords(Math.min(i,a),Math.max(i,a)+1)){let c=await this.db.indexedPositionsBetween(e,t,n),l=Ko(c.map(p=>p.pos.node));await Promise.all(l.map(([p,h])=>this.db.prefetchRecords(p,h+2)))}}return o}async aroundInterval(e,t,n){if(t===0)throw new Error("Interval length must be greater than 0");this.walkedBp=0;try{return await this.walkInterval(e,t,n)}catch(o){throw o instanceof X&&o.windowBp===void 0?new X(o.limit,{windowBp:t,walkedBp:this.walkedBp}):o}}get referenceWalkedBp(){return this.walkedBp}async walkInterval(e,t,n){let o={node:e.handle,offset:e.gbwtOffset},s=e.nodeOffset,i=t,a=new _e;for(;;){let f=A(o.node),c=ge(o.node);this.walkedBp=t-i,await this.ensureNode(f);let l=this.record(o.node);if(s>=l.sequenceLen)throw new Error(`Offset ${s} in node ${f} of length ${l.sequenceLen}`);a.push(s,f,$e(c));let p=l.sequenceLen-s;if(i<=p){a.push(i===p?0:p-i-1,f,Ge(c));break}a.push(0,f,Ge(c));let h=l.gbwt().lf(o.offset);if(!h)throw new Error(`No successor for GBWT position (${o.node}, ${o.offset})`);o=h,s=0,i-=p}return this.walkedBp=t,this.insertContext(a,n)}async aroundNodes(e,t){let n=new _e;for(let o of e)await this.ensureNode(o),n.push(0,o,"left"),n.push(0,o,"right");return this.insertContext(n,t)}async insertContext(e,t){this.clearPaths();let n=new Set,o=new Set;for(let i of this.records.keys())o.add(A(i));let s=0;for(;e.size>0;){let[i,a,f]=e.pop(),c=`${a}:${f}`;if(n.has(c))continue;n.add(c),o.delete(a),this.hasNode(a)||(await this.addNode(a),s+=1);let l=On(f);if(!n.has(`${a}:${l}`)){let d=this.record(V(a,Ln(f))),u=i+d.sequenceLen-1;u<=t&&e.push(u,a,l)}let p=this.record(V(a,Tn(f))),h=i+1;if(h<=t)for(let d of p.successors()){let u=A(d),m=$e(ge(d));n.has(`${u}:${m}`)||e.push(h,u,m)}}for(let i of o)this.records.delete(V(i,"forward")),this.records.delete(V(i,"reverse"));return{inserted:s,removed:o.size}}async betweenNodes(e,t){this.clearPaths();let n=[e,B(t)],o=new Set([A(e),A(t)]),s=0;for(;n.length>0;){let i=n.pop(),a=A(i);this.hasNode(a)||(await this.addNode(a),s+=1);for(let f of this.record(i).successors()){let c=A(f);o.has(c)||(n.push(f,B(f)),o.add(c))}}return s}async extractSnarls(e){let t=0;for(let[n,o]of await this.overlappingSnarls(e))t+=await this.betweenNodes(n,o);return t}async overlappingSnarls(e){let t=[];if(e!=="none"){let n=!1;for(let o of this.sortedHandles()){let s=this.record(o),i=s.next;i!==void 0&&(n=!0,this.hasHandle(i)?ye(o,i)&&t.push([o,i]):e==="overlapping"&&this.isSnarlEntryInSubgraph(s)&&t.push([o,i]))}if(!n&&e==="overlapping"&&await this.db.hasChainLinks()){let o=await this.findCoveringSnarl();o&&t.push(o)}}return t}isSnarlEntryInSubgraph(e){let t=e.successors(),n=t.find(o=>this.hasHandle(o));return n===void 0?!1:t.length>1||this.record(B(n)).successors().length>1}recordReader(e){let t=new Map;return async n=>{let o=this.records.get(n);if(o)return o;let s=t.get(n);if(!s){if(s=await this.db.getRecord(n),e?.(),!s)throw new Error(`Node record ${n} is missing from the database`);t.set(n,s)}return s}}async findCoveringSnarl(){let e=this.recordReader(),t=async f=>{let c=f.successors(),l=c[0];return l===void 0?!1:c.length>1||(await e(B(l))).successors().length>1},n=async f=>{let c=await e(B(f));return c.next!==void 0?await t(c)?{kind:"snarl-exit",snarl:[B(f),c.next]}:{kind:"chain"}:(await e(f)).next!==void 0?{kind:"chain"}:{kind:"regular"}},o=new Set,s=this.sortedHandles().flatMap(f=>this.record(f).successors()),i,a=!1;for(;!a&&s.length>0;){let f=s.shift(),c=A(f);if(!this.hasHandle(f)&&!o.has(c)){o.add(c);let l=await n(f);if(l.kind==="snarl-exit")i=l.snarl,a=!0;else if(l.kind==="chain")a=!0;else for(let p of["forward","reverse"])s.push(...(await e(V(c,p))).successors())}}return i}extractPaths(e,t){if(this.clearPaths(),t==="none")return;let n=e?.position;this.refPath=e?.name,this.refHandle=e?.handle;let o=this.sortedHandles(),s=o.length,i=new Map;o.forEach((w,v)=>i.set(w,v));let a=new Int32Array(s+1),f=new Int32Array(s),c=[];for(let w=0;w<s;w++){let v=this.record(o[w]),I=v.gbwt().decompressArrays();f[w]=v.sequenceLen,c.push(I),a[w+1]=a[w]+I.nodes.length}let l=a[s],p=new Int32Array(l),h=new Int32Array(l),d=new Uint8Array(l);for(let w=0;w<s;w++){let v=c[w];p.set(v.nodes,a[w]),h.set(v.offsets,a[w])}c.length=0;for(let w=0;w<l;w++){let v=i.get(p[w]);v===void 0?p[w]=-1:(p[w]=v,d[a[v]+h[w]]=1)}let u=n===void 0?void 0:i.get(n.handle),m=n?.gbwtOffset,y,x=(w,v,I)=>{let R=[],C=0,P=0,E=-1,k=w,O=v;for(;;){k===u&&O===m&&(E=C),I&&(I.push(o[k]),R.push(O)),C+=1,P+=f[k];let N=a[k]+O,F=p[N];if(F<0)break;O=h[N],k=F}return{offsets:R,len:P,refAt:E,last:k}},S=(w,v,I,R)=>{R>=0&&(this.refId=this.paths.length,y=R),this.paths.push({path:w,offsets:v,len:I,weight:void 0,identity:void 0})},g=new Int32Array(s),b=u!==void 0&&L(o[u]);for(let w=0;w<s;w++){let v=o[w];if(!L(v)){let I=a[w],R=a[w+1]-I;for(let C=0;C<R;C++)if(d[I+C]===0){let P=[],{offsets:E,len:k,refAt:O,last:N}=x(w,C,P),F=o[N];if(O>=0||Be(v,F)){if(S(P,E,k,O),!L(F)){let H=i.get(B(F));g[H]=g[H]+1}}else this.twinStarts.add(fe({node:v,offset:C}))}}}for(let w=0;w<s;w++){let v=o[w];if(L(v)){let I=a[w],R=a[w+1]-I,C=0;for(let E=0;E<R;E++)d[I+E]===0&&(C+=1);let P=!b&&C===g[w];for(let E=0;E<R;E++)if(d[I+E]===0){let k=P?void 0:x(w,E,void 0);if(k&&(k.refAt>=0||Be(v,o[k.last]))){let O=[],{offsets:N,len:F,refAt:H}=x(w,E,O);S(O,N,F,H)}else this.twinStarts.add(fe({node:v,offset:E}))}}}if(n){if(y===void 0||this.refId===void 0)throw this.clearPaths(),new Error("Could not find the reference path");let w=this.paths[this.refId],v=n.nodeOffset;for(let R of w.path.slice(0,y))v+=this.record(R).sequenceLen;let I=n.seqOffset-v;this.refInterval=[I,I+w.len],w.identity={pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:I,hapEnd:I+w.len}}if(t==="distinct")this.distinctPaths();else if(t==="reference-only"){if(this.refId===void 0)throw new Error("Reference path is required for reference-only output");this.paths=[this.paths[this.refId]],this.refId=0}}distinctPaths(){let e=this.refId===void 0?void 0:this.paths[this.refId].path;this.paths.sort((o,s)=>Vt(o.path,s.path)||o.len-s.len);let t=[],n;for(let o of this.paths){let s=t[t.length-1];s&&Vt(s.path,o.path)===0?s.weight=(s.weight??0)+1:(e&&Vt(o.path,e)===0&&(n=t.length),t.push({...o,weight:1}))}this.paths=t,this.refId=n}keepHaplotypes(e){let t=this.refId===void 0?void 0:this.paths[this.refId],n=this.paths.filter((s,i)=>i===this.refId||s.identity!==void 0&&e(s.identity.name)),o=new Set;for(let s of n)for(let i of s.path)o.add(A(i));for(let s of[...this.records.keys()])o.has(A(s))||this.records.delete(s);this.paths=n,this.refId=t===void 0?void 0:n.indexOf(t)}async walkHaplotypesFromAnchor(e,t,n,o,s){let i=e.position.seqOffset,a=i+t,f=Math.floor(i/n)*n,c=Math.min(n,Vo),l=4*(n+t)+c,p={spacing:n,anchorOffset:f,anchorNodeOffset:-1,anchorHandle:-1,referenceSteps:0,rows:0,walks:[],graphFetches:0,scans:[],scanRows:0,fallback:void 0,ms:{reference:0,rows:0,walks:0,scan:0,sampled:0}};this.stats.anchorWalk=p;let h=performance.now(),d=()=>{let M=performance.now(),U=M-h;return h=M,U};this.clearPaths(),this.records.clear();let u=this.recordReader(()=>{p.graphFetches+=1}),m=await this.db.haplotypeAnchor(e.handle,f);if(m===void 0)throw new Error(`The haplotype index names no anchor for ${q(e.name,e.name.fragment)} at offset ${f}; it was not built with anchors at ${n} bp for this graph`);p.anchorNodeOffset=m.pathOffset;let y=await this.prefetchReferenceRange(e.handle,m.pathOffset,a+c);if(!y)throw new Error(`Path ${q(e.name,e.name.fragment)} has not been indexed for random access`);let x=await this.walkReference(u,y,m,i,a,a+c),{anchor:S,refOffsetOf:g,refHandles:b,windowSteps:w}=x;p.anchorHandle=S.pos.node,p.referenceSteps=x.steps,this.walkedBp=t;let v=[],I=[],R=0;for(let M of w)await this.ensureNode(A(M.pos.node)),v.push(M.pos.node),I.push(M.pos.offset),R+=this.record(M.pos.node).sequenceLen;let C=w[0];if(C===void 0)throw new Error("The reference walk has no node in the window");this.refPath=e.name,this.refHandle=e.handle,this.refInterval=[C.refOffset,C.refOffset+R],this.refId=0,this.paths.push({path:v,offsets:I,len:R,weight:void 0,identity:{pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:C.refOffset,hapEnd:C.refOffset+R}}),p.ms.reference=d();let P=await this.db.haplotypeSamplesAtNode(S.pos.node);p.rows=P.length,p.ms.rows=d();let E=P.find(M=>M.offset===S.pos.offset&&M.pathHandle===e.handle&&M.pathOffset===S.offset);if(E===void 0)throw new Error(`The haplotype index has no anchor row for ${q(e.name,e.name.fragment)} at offset ${S.offset} (node ${A(S.pos.node)}); it was not built with anchors at ${n} bp for this graph`);let k=await this.db.pathsByHandle(),O=M=>{let U=k.get(M);if(!U)throw new Error(`Path ${M} is missing from the database`);return U.name},N=new Set([e.handle]),F=new Map;for(let M of P)if(M!==E&&o(O(M.pathHandle))){let U=F.get(M.pathHandle);U?U.push(M):F.set(M.pathHandle,[M])}let H;for(let[M,U]of F)if(H===void 0){let he=ie=>Math.abs(ie.offset-E.offset);U.sort((ie,go)=>he(ie)-he(go));let de;for(let ie of U)N.has(M)||(de=await this.walkAndKeep(u,ie,"anchor",O(M),g,a,l,s,N,p));N.has(M)||(H=de)}p.ms.walks=d();let Ee=H===void 0?await this.samplesOfUnwalkedContigs(v,g,b,o,N,O,p):new Map;if(p.ms.scan=d(),Ee.size>0){await this.mapReferenceBefore(u,e.handle,Math.max(0,m.pathOffset-2*n),m.pathOffset,g,b);for(let[M,U]of Ee)if(H===void 0){let he=O(M),de;for(let ie of U)de??=await this.entryBefore(u,ie,g,b,this.refInterval[0],l);H=de===void 0?`no sample of ${q(he,he.fragment)} on the window's nodes runs with the reference`:await this.walkAndKeep(u,de,"sample",he,g,a,l,s,N,p)}p.ms.sampled=d()}return p.fallback=H,H}async walkAndKeep(e,t,n,o,s,i,a,f,c,l){let p=await this.walkFromRow(e,t,o,s,this.refInterval[0],i,a,f);l.walks.push({pathHandle:t.pathHandle,from:n,steps:p.steps,pieces:p.infos.length,end:p.end});let h;return p.end==="bound"||p.infos.length===0?h=`${q(o,t.pathOffset)} walked ${p.steps} steps from its ${n} without writing a walk through the window (${p.end})`:(c.add(t.pathHandle),this.paths.push(...p.infos)),h}async mapReferenceBefore(e,t,n,o,s,i){let a=await this.prefetchReferenceRange(t,n,o),f=a?.pos,c=a?.pathOffset??o;for(;f!==void 0&&f.node!==0&&c<o;){this.signal?.throwIfAborted();let l=await e(f.node),p=A(f.node);s.has(p)||(s.set(p,c),i.add(f.node)),c+=l.sequenceLen,f=l.gbwt().lf(f.offset)}}async runsWithReference(e,t,n,o,s){let i={node:t.node,offset:t.offset},a=0,f;for(;f===void 0;)if(this.signal?.throwIfAborted(),i===void 0||i.node===0||a>s)f=!1;else if(n.has(A(i.node)))f=o.has(i.node);else{let c=await e(i.node);a+=c.sequenceLen,i=c.gbwt().lf(i.offset)}return f}async entryBefore(e,t,n,o,s,i){let a=(await e(t.node)).sequenceLen,f=async(d,u)=>{let m=(await e(d.node)).sequenceLen;return{node:d.node,offset:d.offset,pathHandle:t.pathHandle,orientation:t.orientation,pathOffset:t.orientation==="forward"?t.pathOffset-u:t.pathOffset+a+u-m}},c={node:t.node,offset:t.offset},l=0,p,h=!await this.runsWithReference(e,t,n,o,i);for(;!h;){this.signal?.throwIfAborted();let d=n.get(A(c.node));if(d!==void 0&&d<s)p=await f(c,l),h=!0;else if(l>i)p={...t},h=!0;else{let m=(await e(B(c.node))).gbwt().predecessorAt(c.offset);if(m===void 0)p=await f(c,l),h=!0;else{let y=await e(m),x=y.gbwt().offsetTo(c);if(x===void 0)throw new Error(`No offset in ${m} leads to ${c.node}:${c.offset}`);c={node:m,offset:x},l+=y.sequenceLen}}}return p}async walkReference(e,t,n,o,s,i){let a=new Map,f=new Set,c=[],l,p=t.pos,h=t.pathOffset,d=0;for(;p!==void 0&&p.node!==0&&h<i;){this.signal?.throwIfAborted();let u=await e(p.node),m=h+u.sequenceLen;if(l===void 0&&h===n.pathOffset){if(p.node!==n.node)throw new Error(`The reference walk reaches node ${A(p.node)} at offset ${h} where the haplotype index names node ${A(n.node)} as the anchor`);l={pos:p,offset:h}}if(l!==void 0){d+=1;let y=A(p.node);a.has(y)||(a.set(y,h),f.add(p.node)),h<s&&m>o&&c.push({pos:p,refOffset:h})}h=m,p=u.gbwt().lf(p.offset)}if(l===void 0)throw new Error(`The reference walk from offset ${t.pathOffset} never starts a node at the anchor offset ${n.pathOffset}`);return{anchor:l,refOffsetOf:a,refHandles:f,windowSteps:c,steps:d}}async walkFromRow(e,t,n,o,s,i,a,f){let c=(await e(t.node)).sequenceLen,l=t.orientation==="forward"?t.pathOffset:t.pathOffset+c,p=[],h=[],d=[],u=0,m=0,y=0,x,S,g={node:t.node,offset:t.offset};for(;S===void 0;)if(this.signal?.throwIfAborted(),g===void 0||g.node===0)S=x===void 0?"before the window":"ended in the window";else if(m>a)S="bound";else{let w=o.get(A(g.node)),v=x!==void 0;if(w!==void 0&&w>=i)S=v?"through the window":"past the window";else{!v&&w!==void 0&&w>=s&&(x=m);let I=await e(g.node);if(x!==void 0){let R={pos:g,at:m,len:I.sequenceLen};w===void 0?(d.push(R),u+=R.len):(u>f&&w<s?(p.push(h),h=[]):h.push(...d),d=[],u=0,h.push(R))}y+=1,m+=I.sequenceLen,g=I.gbwt().lf(g.offset)}}p.push(h);let b=[];for(let w of p){let v=w[0],I=w[w.length-1];if(v!==void 0&&I!==void 0){let R=[],C=[],P=0;for(let O of w)await this.ensureNode(A(O.pos.node)),R.push(O.pos.node),C.push(O.pos.offset),P+=O.len;let E=v.at,k=I.at+I.len;b.push({path:R,offsets:C,len:P,weight:void 0,identity:t.orientation==="forward"?{pathHandle:t.pathHandle,name:n,orientation:"forward",hapStart:l+E,hapEnd:l+k}:{pathHandle:t.pathHandle,name:n,orientation:"reverse",hapStart:l-k,hapEnd:l-E}})}}return{steps:y,end:S,infos:b}}async samplesOfUnwalkedContigs(e,t,n,o,s,i,a){let f=fr([...e].sort((l,p)=>l-p));a.scans=f;let c=new Map;for(let[l,p]of f){let h=await this.db.haplotypeSamplesInRange(l,p);a.scanRows+=h.length;for(let d of h){let u=t.has(A(d.node));if(!s.has(d.pathHandle)&&(!u||n.has(d.node))&&o(i(d.pathHandle))){let m=c.get(d.pathHandle)??[];u?m.unshift(d):m.push(d),c.set(d.pathHandle,m)}}}return c}async identifyPaths(){if(!this.db.hasHaplotypeIndex)throw new Error("The database has no HaplotypeSamples table; run gbz-haplotype-index on it");let e=await this.db.haplotypeSampleInterval()??4096,t=fr(this.sortedHandles());if(t.length===0)return;let n=new Map;for(let[u,m]of t)for(let y of await this.db.haplotypeSamplesInRange(u,m))n.set(fe(y),y);let o=u=>{let m=0,y=t.length-1;for(;m<y;){let S=m+y+1>>1;t[S][0]<=u?m=S:y=S-1}let x=t[m];return x[0]<=u&&u<=x[1]},s=new Map;this.paths.forEach((u,m)=>{u.path.length>0&&m!==this.refId&&s.set(fe(Ke(u,0)),m)});let i=this.stats.identification;i.interval=e,i.scans=t,i.windowSamples=n.size,this.paths.forEach((u,m)=>{m!==this.refId&&i.fragmentLengths.push(u.len)});let a=this.recordReader(()=>{this.stats.identificationFetches+=1,i.graphFetches+=1}),f=u=>(i.graphLookups+=1,a(u)),c=async(u,m)=>{if(o(u.node))return n.get(fe(u));this.stats.identificationFetches+=1,i.companionSeeks+=1,m.seeks+=1;let y=await this.db.haplotypeSampleAt(u.node,u.offset);return y||(i.companionMisses+=1),y},l=new Map,p=async u=>{let m=l.get(u);if(!m){let y=await this.db.getPath(u);if(!y)throw new Error(`Path ${u} is missing from the database`);m=y.name,l.set(u,m)}return m},h=(u,m,y)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.pathOffset-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.pathOffset+m+y},d=(u,m)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.hapStart-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.hapEnd+m};for(let u=0;u<this.paths.length;u++){let m=this.paths[u];if(u===this.refId||m.identity)continue;let y=[],x=new Set,S={fragments:0,steps:0,seeks:0,reentries:0,twinLandings:0,end:"endmarker",pathHandle:void 0};i.chains.push(S);let g,b=0,w=u,v;for(;g===void 0;){if(this.signal?.throwIfAborted(),w!==void 0){if(x.has(w)){S.end="cycle";break}x.add(w);let E=this.paths[w];y.push({index:w,startBp:b}),S.fragments+=1;let k=b;for(let N=0;N<E.path.length;N++){let F=Ke(E,N),H=n.get(fe(F)),Ee=this.record(F.node).sequenceLen;if(H){g=h(H,k,Ee);break}k+=Ee}if(b+=E.len,g){S.end="in-fragment sample";break}let O=Ke(E,E.path.length-1);v=this.record(O.node).gbwt().lf(O.offset),w=void 0}if(v===void 0||v.node===0){S.end="endmarker";break}let I=fe(v),R=s.get(I);if(R!==void 0){let E=this.paths[R].identity;if(E){g=d(E,b),S.end="identified sibling";break}w=R;continue}this.records.has(v.node)&&(S.reentries+=1),this.twinStarts.has(I)&&(S.twinLandings+=1);let C=await c(v,S),P=await f(v.node);if(C){g=h(C,b,P.sequenceLen),S.end="out-of-window sample";break}if(this.stats.identificationSteps+=1,S.steps+=1,b-y[y.length-1].startBp>4*e+4*P.sequenceLen){S.end="bound";break}b+=P.sequenceLen,v=P.gbwt().lf(v.offset)}if(g){S.pathHandle=g.pathHandle;let I=await p(g.pathHandle);for(let{index:R,startBp:C}of y){let P=this.paths[R];P.identity=g.orientation==="forward"?{pathHandle:g.pathHandle,name:I,orientation:"forward",hapStart:g.base+C,hapEnd:g.base+C+P.len}:{pathHandle:g.pathHandle,name:I,orientation:"reverse",hapStart:g.base-C-P.len,hapEnd:g.base-C}}}}}refIndex(e){if(this.refIndexCache===void 0){let t=new Map;e.forEach((n,o)=>{let s=t.get(n);s?s.push(o):t.set(n,[o])}),this.refIndexCache=t}return this.refIndexCache}refPrefix(e){if(this.refPrefixCache===void 0){let t=[0];e.forEach((n,o)=>{t.push(t[o]+this.record(n).sequenceLen)}),this.refPrefixCache=t}return this.refPrefixCache}orderedMatches(e,t){let n=this.refIndex(t),o=new Int32Array(e.length),s=new Int32Array(e.length),i=0,a=-1;for(let f=0;f<e.length;f++){let c=n.get(e[f]);if(c){let l=zo(c,a);if(l===void 0)return;o[i]=f,s[i]=l,i+=1,a=l}}return{pathAt:o,refAt:s,count:i}}pathLen(e){let t=0;for(let n of e)t+=this.record(n).sequenceLen;return t}prefixMatches(e,t){let n=0,o=0,s=0,i=0,a=0;for(;o<e.length&&s<t.length;){let f=this.record(e[o]).sequence,c=this.record(t[s]).sequence;for(;i<f.length&&a<c.length;){if(f[i]!==c[a])return n;i+=1,a+=1,n+=1}i===f.length&&(o+=1,i=0),a===c.length&&(s+=1,a=0)}return n}suffixMatches(e,t){let n=0,o=0,s=0,i=0,a=0;for(;o<e.length&&s<t.length;){let f=this.record(e[e.length-o-1]).sequence,c=this.record(t[t.length-s-1]).sequence;for(;i<f.length&&a<c.length;){if(f[f.length-i-1]!==c[c.length-a-1])return n;i+=1,a+=1,n+=1}i===f.length&&(o+=1,i=0),a===c.length&&(s+=1,a=0)}return n}align(e,t,n){let o=this.pathLen(e),s=this.pathLen(t),i=this.prefixMatches(e,t),a=this.suffixMatches(e,t);i+a>o&&(a=o-i),i+a>s&&(a=s-i),z(n,"M",i),cr(n,o-i-a,s-i-a),z(n,"M",a)}sharedWeight(e,t){let n=this.refIndex(t),o=0;for(let s of e)n.has(s)&&(o+=this.record(s).sequenceLen);return o}editsAgainst(e,t){let n=this.orderedMatches(e,t);n?this.stats.orderedAlignments+=1:this.stats.lcsAlignments+=1;let o=n??Do(Yn(e,t,p=>this.record(p).sequenceLen)[0]),s=[],i=this.refPrefix(t),a=(p,h,d,u)=>{p===h?z(s,"D",i[u]-i[d]):d===u?z(s,"I",this.pathLen(e.slice(p,h))):this.align(e.slice(p,h),t.slice(d,u),s)},f=0,c=0,l=0;for(let p=0;p<o.count;p++){let h=o.pathAt[p],d=o.refAt[p];(c!==h||l!==d)&&a(c,h,l,d);let u=this.record(e[h]).sequenceLen;z(s,"M",u),f+=u,c=h+1,l=d+1}return a(c,e.length,l,t.length),{edits:s,matched:f}}alignment(e){let t=this.paths[e];if(this.refId===void 0||e===this.refId||!t)return;let n=this.paths[this.refId].path,o;if(Nn(n))o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else{let s=t.path.map(f=>B(f)).reverse(),i=this.sharedWeight(t.path,n);if(this.sharedWeight(s,n)===0)o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else if(i===0)o={edits:this.editsAgainst(s,n).edits,flipped:!0};else{let f=this.editsAgainst(t.path,n),c=this.editsAgainst(s,n);o=c.matched>f.matched?{edits:c.edits,flipped:!0}:{edits:f.edits,flipped:!1}}}return o}alignToRef(e){return this.alignment(e)?.edits.map(([t,n])=>`${n}${t}`).join("")}alignments(){let e=this.referenceInterval;if(this.refId===void 0||!e)throw new Error("Alignments need a reference path");let t=this.paths[this.refId].path,n=this.refPrefix(t)[t.length],o=[];return this.paths.forEach((s,i)=>{if(i===this.refId)return;let{edits:a,flipped:f}=this.alignment(i),c=0,l=0;for(;c<a.length&&a[c][0]==="D";)l+=a[c][1],c+=1;let p=a.length,h=0;for(;p>c&&a[p-1][0]==="D";)h+=a[p-1][1],p-=1;let d=s.identity,u=d?d.orientation==="forward"!==f:!f;o.push({strand:u?"+":"-",refStart:e.start+l,refEnd:e.start+n-h,edits:a.slice(c,p),weight:s.weight,path:s.path,start:Ke(s,0),identity:d===void 0?void 0:{pathHandle:d.pathHandle,name:d.name,hapStart:d.name.fragment+d.hapStart,hapEnd:d.name.fragment+d.hapEnd,walkForward:d.orientation==="forward"}})}),Wo(o).map(s=>{let{edits:i,identity:a,...f}=s,c={...f,cigar:Zo(i)};return a?{...c,resolved:!0,name:a.name,label:q({...a.name,fragment:a.hapStart},a.hapEnd),pathHandle:a.pathHandle,hapStart:a.hapStart,hapEnd:a.hapEnd}:{...c,resolved:!1}})}pairAlignments(e){let{target:t,query:n,...o}=e,s=this.paths.flatMap(l=>{let{identity:p}=l;return p?[{name:p.name,start:p.name.fragment+p.hapStart,steps:Ze(l,p)}]:[]}),i=l=>p=>p.sample===l.sample&&p.haplotype===l.haplotype,a=i(t),f=n?i(n):l=>!a(l),c=l=>this.record(V(l,"forward")).sequence;return s.filter(l=>a(l.name)).flatMap(l=>s.filter(p=>f(p.name)).flatMap(p=>ir(p.steps,l.steps,c,o).map(h=>({query:p.name,queryStart:p.start+h.queryStart,queryEnd:p.start+h.queryEnd,strand:h.strand,target:l.name,targetStart:l.start+h.targetStart,targetEnd:l.start+h.targetEnd,cigar:ar(h.edits),matches:h.edits.reduce((d,[u,m])=>d+(u==="="?m:0),0),columns:h.edits.reduce((d,[,u])=>d+u,0),sharedBases:h.sharedBases}))))}canonicalEdges(e){let t=[];for(let n of["forward","reverse"]){let o=V(e,n);for(let s of this.record(o).successors())this.hasHandle(s)&&ye(o,s)&&t.push([n==="reverse"?1:0,A(s),L(s)?1:0])}return t.sort((n,o)=>n[0]-o[0]||n[1]-o[1]||n[2]-o[2]),t.filter((n,o)=>o===0||n[0]!==t[o-1][0]||n[1]!==t[o-1][1]||n[2]!==t[o-1][2])}async stableName(){let e=new TextEncoder,t=[];for(let n of this.sortedHandles())if(!L(n)){let o=A(n),s=`S ${o} ${this.record(n).sequence}
2
+ `;for(let[i,a,f]of this.canonicalEdges(o))s+=`L ${o} ${i?"-":"+"} ${a} ${f?"-":"+"}
3
+ `;t.push(e.encode(s))}return Wn(t)}async toGFA(e={}){let t=e.cigar??!1,n=[this.refPath?`H VN:Z:1.1 RS:Z:${this.refPath.sample}`:"H VN:Z:1.1",...Un(jn(await this.stableName(),await this.db.graphName()))],o=this.sortedHandles();for(let c of o)L(c)||n.push(`S ${A(c)} ${this.record(c).sequence}`);let s=c=>L(c)?"-":"+";for(let c of o)for(let l of this.record(c).successors())this.hasHandle(l)&&ye(c,l)&&n.push(`L ${A(c)} ${s(c)} ${A(l)} ${s(l)} 0M`);let i=(c,l,p,h,d)=>{let u=Ze(c,l).map(x=>`${L(x)?"<":">"}${A(x)}`).join(""),m=c.weight===void 0?"":` WT:i:${c.weight}`,y=d===void 0?"":` CG:Z:${d}`;return`W ${p.sample} ${p.haplotype} ${p.contig} ${p.fragment} ${h} ${u}${m}${y}`},a=this.refPath?.contig??"unknown";this.refId!==void 0&&this.refPath&&this.refInterval&&n.push(i(this.paths[this.refId],void 0,{...this.refPath,fragment:this.refPath.fragment+this.refInterval[0]},this.refPath.fragment+this.refInterval[1],void 0));let f=1;return this.paths.forEach((c,l)=>{if(l!==this.refId){let p=e.names==="resolved"?c.identity:void 0,h=t?this.alignToRef(l):void 0;n.push(p?i(c,p,{...p.name,fragment:p.name.fragment+p.hapStart},p.name.fragment+p.hapEnd,h):i(c,void 0,{sample:"unknown",contig:a,haplotype:f,fragment:0},c.len,h)),f+=1}}),`${n.join(`
4
+ `)}
5
+ `}outputPaths(e){let t=e.cigar??!1,n=[],o=this.refPath?.contig??"unknown";if(this.refId!==void 0&&this.refPath&&this.refInterval){let i={...this.refPath,fragment:this.refPath.fragment+this.refInterval[0]};n.push({info:this.paths[this.refId],identity:void 0,name:q(i,this.refPath.fragment+this.refInterval[1]),cigar:void 0})}let s=1;return this.paths.forEach((i,a)=>{if(a===this.refId)return;let f=e.names==="resolved"?i.identity:void 0;n.push({info:i,identity:f,name:f?q({...f.name,fragment:f.name.fragment+f.hapStart},f.name.fragment+f.hapEnd):q({sample:"unknown",contig:o,haplotype:s,fragment:0},i.len),cigar:t?this.alignToRef(a):void 0}),s+=1}),n}*outputEdges(){for(let e of this.sortedHandles())for(let t of this.record(e).successors())this.hasHandle(t)&&ye(e,t)&&(yield[e,t])}toSubgraphJson(e={}){let t=this.sortedHandles().filter(s=>!L(s)).map(s=>({id:String(A(s)),sequence:this.record(s).sequence})),n=[];for(let[s,i]of this.outputEdges())n.push({from:String(A(s)),from_is_reverse:L(s),to:String(A(i)),to_is_reverse:L(i)});let o=this.outputPaths(e).map(s=>Xo(s.info,s.identity,s.name,s.cigar));return{nodes:t,edges:n,paths:o}}toCompactSubgraph(e={}){let t=this.sortedHandles().filter(i=>!L(i)),n=new Int32Array(t.length),o=[];t.forEach((i,a)=>{n[a]=A(i),o.push(this.record(i).sequence)});let s=[];for(let[i,a]of this.outputEdges())s.push(i,a);return{nodeIds:n,nodeSequences:o,edges:Int32Array.from(s),paths:this.outputPaths(e).map(i=>({name:i.name,weight:i.info.weight,cigar:i.cigar,steps:Int32Array.from(Ze(i.info,i.identity))}))}}};function Ze(r,e){return e?.orientation==="reverse"?r.path.map(t=>B(t)).reverse():r.path}function Xo(r,e,t,n){return{name:t,...r.weight===void 0?{}:{weight:r.weight},...n===void 0?{}:{cigar:n},path:Ze(r,e).map(o=>({id:String(A(o)),is_reverse:L(o)}))}}function Vt(r,e){let t=Math.min(r.length,e.length);for(let n=0;n<t;n++){let o=r[n],s=e[n];if(o!==s)return o<s?-1:1}return r.length-e.length}function z(r,e,t){if(t===0)return;let n=r[r.length-1];n?.[0]===e?n[1]+=t:r.push([e,t])}function Xe(r){return r===0?0:6+(r-1)}function cr(r,e,t){if(e===0)z(r,"D",t);else if(t===0)z(r,"I",e);else{let n=Math.min(e,t),o=4*n+Xe(e-n)+Xe(t-n),s=Xe(e)+Xe(t);o<=s?(z(r,"M",n),z(r,"I",e-n),z(r,"D",t-n)):(z(r,"I",e),z(r,"D",t))}}function Zo(r){return r.map(([e,t])=>`${t}${e}`).join("")}async function Je(r,e,t,n,o={}){let s=new ke(r,o);try{let i=await s.pathPosition(Pe(e,t));await s.prefetchReferenceWalk(i,n-t),await s.aroundInterval(i.position,n-t,o.context??100),await s.extractSnarls(o.snarls??"none"),s.extractPaths(i,o.haplotypes??"all")}catch(i){throw i instanceof X&&i.windowBp===void 0?new X(i.limit,{windowBp:n-t,walkedBp:s.referenceWalkedBp??0}):i}return s}async function lr(r,e,t,n,o){if(!r.hasHaplotypeIndex)throw new Error("keep needs the haplotype index: this database cannot name its walks");let s=await r.haplotypeAnchorSpacing(),i,a;if(s!==void 0&&(o.haplotypes??"all")==="all"){let f=new ke(r,o);try{let c=await f.pathPosition(Pe(e,t));a=await f.walkHaplotypesFromAnchor(c,n-t,s,o.keep,o.context??100)}catch(c){throw c instanceof X&&c.windowBp===void 0?new X(c.limit,{windowBp:n-t,walkedBp:f.referenceWalkedBp??0}):c}if(a===void 0)i=f;else{a=`${a}; identified from the per-path samples instead`;let c=await Je(r,e,t,n,o);await c.identifyPaths(),c.keepHaplotypes(o.keep),c.stats.anchorWalk=f.stats.anchorWalk,c.stats.anchorWalk&&(c.stats.anchorWalk.fallback=a),i=c}}else i=await Je(r,e,t,n,o),await i.identifyPaths(),i.keepHaplotypes(o.keep);return i}function Z(r,e){let t=0;for(let o=0;o<8;o++){let s=r[e+o];if(s===void 0)throw new Error("SQLite varint runs past the end of the buffer");if(t=t*128+(s&127),(s&128)===0)return[t,e+o+1]}let n=r[e+8];if(n===void 0)throw new Error("SQLite varint runs past the end of the buffer");if(t=t*256+n,!Number.isSafeInteger(t))throw new Error("SQLite varint exceeds the safe integer range");return[t,e+9]}function Jo(r,e,t){switch(t){case 1:return r.getInt8(e);case 2:return r.getInt16(e);case 3:return r.getInt8(e)<<16|r.getUint16(e+1);case 4:return r.getInt32(e);case 6:return r.getInt16(e)*4294967296+r.getUint32(e+2);default:{let n=r.getBigInt64(e);if(n>BigInt(Number.MAX_SAFE_INTEGER)||n<BigInt(Number.MIN_SAFE_INTEGER))throw new Error(`SQLite integer ${n} exceeds the safe integer range`);return Number(n)}}}var es=new TextDecoder;function et(r){let[e,t]=Z(r,0),n=[],o=t;for(;o<e;){let[a,f]=Z(r,o);n.push(a),o=f}let s=new DataView(r.buffer,r.byteOffset,r.byteLength),i=e;return n.map(a=>{if(a===0)return null;if(a>=1&&a<=6){let f=a<=4?a:a===5?6:8,c=Jo(s,i,f);return i+=f,c}if(a===7){let f=s.getFloat64(i);return i+=8,f}if(a===8)return 0;if(a===9)return 1;if(a>=12){let f=a-12>>1,c=r.subarray(i,i+f);return i+=f,a%2===0?c:es.decode(c)}throw new Error(`SQLite serial type ${a} is reserved`)})}var Me=2,nt=5,hr=10,tt=13;function dr(r,e){return r[e]*256+r[e+1]}function oe(r,e){return r[e]*16777216+r[e+1]*65536+r[e+2]*256+r[e+3]}function ts(r,e){let t=r[e];if(t!==Me&&t!==nt&&t!==hr&&t!==tt)throw new Error(`SQLite page has unknown b-tree type ${t}`);let n=t===Me||t===nt;return{type:t,cellCount:dr(r,e+3),rightChild:n?oe(r,e+8):0,cellPointers:e+(n?12:8)}}function ne(r,e,t){return dr(r,e.cellPointers+2*t)}var ns=4096,rs=4096,rt=class{usable;pager;decodedIndexPages=new Map;tableDepths=new Map;constructor(e,t){this.pager=e,this.usable=e.pageSize-t}localPayloadSize(e,t){let n=this.usable,o=t?Math.floor((n-12)*64/255)-23:n-35;if(e<=o)return e;let s=Math.floor((n-12)*32/255)-23,i=s+(e-s)%(n-4);return i<=o?i:s}async payload(e,t,n,o){let s=this.localPayloadSize(n,o);if(s===n)return e.subarray(t,t+n);let i=new Uint8Array(n);i.set(e.subarray(t,t+s),0);let a=s,f=oe(e,t+s);for(;f!==0&&a<n;){let c=await this.pager.page(f),l=c.subarray(4,4+Math.min(this.usable-4,n-a));i.set(l,a),a+=l.length,f=oe(c,0)}if(a!==n)throw new Error("SQLite overflow chain ended before the payload was complete");return i}async pageAt(e){let t=await this.pager.page(e);return{page:t,header:ts(t,e===1?100:0)}}tableDepth(e,t){let n=this.tableDepths.get(e);return n||(n=(async()=>{let o=e;for(let s=0;;s++){let{page:i,header:a}=await this.pageAt(o);if(a.type===tt)return s;if(a.type!==nt)throw new Error("SQLite table b-tree contains an index page");let f=this.childIndexFor(i,a,t);o=f===a.cellCount?a.rightChild:oe(i,ne(i,a,f))}})(),this.tableDepths.set(e,n),n.catch(()=>this.tableDepths.delete(e))),n}childIndexFor(e,t,n){let o=0,s=t.cellCount;for(;o<s;){let i=o+s>>1,[a]=Z(e,ne(e,t,i)+4);a<n?o=i+1:s=i}return o}async prefetchRowidRange(e,t,n){let o=await this.tableDepth(e,t),s=[e];for(let i=0;i<o;i++){let a=await Promise.all(s.map(c=>this.pageAt(c))),f=[];if(a.forEach(({page:c,header:l},p)=>{let h=p===0?this.childIndexFor(c,l,t):0,d=p===a.length-1?this.childIndexFor(c,l,n):l.cellCount;for(let u=h;u<=d;u++)f.push(u===l.cellCount?l.rightChild:oe(c,ne(c,l,u)))}),f.length>rs)return!1;this.pager.prefetch(f),s=f}return!0}async tableRowid(e,t){let n=e;for(;;){let{page:o,header:s}=await this.pageAt(n);if(s.type===tt){let f=0,c=s.cellCount;for(;f<c;){let l=f+c>>1,p=ne(o,s,l),[h,d]=Z(o,p),[u,m]=Z(o,d);if(u===t)return et(await this.payload(o,m,h,!1));u<t?f=l+1:c=l}return}if(s.type!==nt)throw new Error("SQLite table b-tree contains an index page");let i=0,a=s.cellCount;for(;i<a;){let f=i+a>>1,c=ne(o,s,f),[l]=Z(o,c+4);l<t?i=f+1:a=f}n=i===s.cellCount?s.rightChild:oe(o,ne(o,s,i))}}async*tableScan(e){let{page:t,header:n}=await this.pageAt(e);if(n.type===tt)for(let o=0;o<n.cellCount;o++){let s=ne(t,n,o),[i,a]=Z(t,s),[f,c]=Z(t,a);yield{rowid:f,values:et(await this.payload(t,c,i,!1))}}else{let o=[];for(let s=0;s<n.cellCount;s++)o.push(oe(t,ne(t,n,s)));o.push(n.rightChild),this.pager.prefetch(o);for(let s of o)yield*this.tableScan(s)}}decodedCells(e,t){let n=this.decodedIndexPages.get(e);if(n)this.decodedIndexPages.delete(e);else if(n=new Array(t.cellCount),this.decodedIndexPages.size>=ns){let o=this.decodedIndexPages.keys().next().value;o!==void 0&&this.decodedIndexPages.delete(o)}return this.decodedIndexPages.set(e,n),n}async indexCell(e,t,n,o){let s=this.decodedCells(e,n),i=s[o];if(!i){let a=ne(t,n,o),f=n.type===Me,[c,l]=Z(t,f?a+4:a);i={values:et(await this.payload(t,l,c,!0)),leftChild:f?oe(t,a):0},s[o]=i}return i}async*indexScanFrom(e,t){let{page:n,header:o}=await this.pageAt(e),s=0,i=o.cellCount;for(;s<i;){let a=s+i>>1,f=await this.indexCell(e,n,o,a);pr(f.values,t)<0?s=a+1:i=a}for(let a=s;a<o.cellCount;a++){let f=await this.indexCell(e,n,o,a);o.type===Me&&(yield*this.indexScanFrom(f.leftChild,t)),yield f.values}o.type===Me&&(yield*this.indexScanFrom(o.rightChild,t))}async indexSeekLE(e,t){let n,o=e;for(;;){let{page:s,header:i}=await this.pageAt(o),a=0,f=i.cellCount,c=0;for(;a<f;){let l=a+f>>1,p=await this.indexCell(o,s,i,l);pr(p.values,t)<=0?(n=p.values,a=l+1):(c=p.leftChild,f=l)}if(i.type===hr)return n;o=a===i.cellCount?i.rightChild:c}}};function pr(r,e){for(let t=0;t<e.length;t++){let n=r[t],o=e[t];if(typeof n!="number"||o===void 0)throw new Error("SQLite index key is not numeric");if(n!==o)return n<o?-1:1}return 0}var ot=class{blocks=new Map;blockSize;maxBlocks;bytesFetched=0;fetches=0;source;pageSize;fileSize;constructor(e,t,n,o={}){this.source=e,this.pageSize=t,this.fileSize=n;let s=o.blockSize??65536;this.blockSize=Math.max(t,Math.ceil(s/t)*t),this.maxBlocks=o.maxBlocks??256}async read(e,t){let n=0;for(;;)try{let o=await this.source.read(e,t);return this.bytesFetched+=o.length,o}catch(o){if(n+=1,n>=3)throw o;await new Promise(s=>setTimeout(s,200*n))}}seed(e,t){t.length===Math.min(this.blockSize,this.fileSize-e*this.blockSize)&&this.blocks.set(e,Promise.resolve(t))}block(e){let t=this.blocks.get(e);if(t)return this.blocks.delete(e),this.blocks.set(e,t),t;let n=e*this.blockSize,o=Math.min(this.blockSize,this.fileSize-n),s=this.read(o,n);return this.fetches+=1,this.blocks.set(e,s),this.forgetOnFailure(s,[e]),this.evict(),s}prefetch(e){let t=[...new Set(e.map(o=>Math.floor((o-1)*this.pageSize/this.blockSize)))].filter(o=>!this.blocks.has(o)).sort((o,s)=>o-s),n=0;for(;n<t.length;){let o=n+1;for(;o<t.length&&t[o]===t[o-1]+1;)o+=1;this.fetchRun(t[n],o-n),n=o}}fetchRun(e,t){let n=e*this.blockSize,o=Math.min(t*this.blockSize,this.fileSize-n),s=this.read(o,n);this.fetches+=1;let i=[];for(let a=0;a<t;a++){let f=a*this.blockSize;i.push(e+a),this.blocks.set(e+a,s.then(c=>c.subarray(f,f+this.blockSize)))}this.forgetOnFailure(s,i),this.evict()}forgetOnFailure(e,t){e.catch(()=>{for(let n of t)this.blocks.delete(n)})}evict(){for(;this.blocks.size>this.maxBlocks;){let e=this.blocks.keys().next().value;if(e===void 0)break;this.blocks.delete(e)}}async page(e){let t=(e-1)*this.pageSize;if(e<1||t+this.pageSize>this.fileSize)throw new Error(`SQLite page ${e} is outside the file`);let n=await this.block(Math.floor(t/this.blockSize)),o=t%this.blockSize;return n.subarray(o,o+this.pageSize)}};var Oe=class r{pager;btree;objects;constructor(e,t,n){this.pager=e,this.btree=t,this.objects=n}static async open(e,t={}){let{size:n}=await e.stat(),o=await e.read(Math.min(t.blockSize??65536,n),0),s=o.subarray(0,100);if(new TextDecoder().decode(s.subarray(0,15))!=="SQLite format 3")throw new Error("Not a SQLite database");let a=new DataView(s.buffer,s.byteOffset,s.byteLength),f=a.getUint16(16),c=f===1?65536:f,l=s[20]??0,p=a.getUint32(56);if(p!==1)throw new Error(`SQLite text encoding ${p} is not UTF-8`);let h=new ot(e,c,n,t);h.seed(0,o),h.fetches+=1,h.bytesFetched+=o.length;let d=new rt(h,l),u=new Map;for await(let{values:m}of d.tableScan(1)){let[y,x,S,g,b]=m;typeof y=="string"&&typeof x=="string"&&typeof S=="string"&&typeof g=="number"&&u.set(x,{type:y,name:x,tableName:S,rootPage:g,sql:typeof b=="string"?b:""})}return new r(h,d,u)}rootPage(e){let t=this.objects.get(e);if(!t)throw new Error(`SQLite database has no object named ${e}`);return t.rootPage}indexOn(e){let t=[...this.objects.values()].find(n=>n.type==="index"&&n.tableName===e);if(!t)throw new Error(`SQLite table ${e} has no index`);return t.rootPage}byRowid(e,t){return this.btree.tableRowid(this.rootPage(e),t)}prefetchRows(e,t,n){return this.btree.prefetchRowidRange(this.rootPage(e),t,n)}scan(e){return this.btree.tableScan(this.rootPage(e))}indexSeekLE(e,t){return this.btree.indexSeekLE(this.indexOn(e),t)}indexScanFrom(e,t){return this.btree.indexScanFrom(this.indexOn(e),t)}has(e){return this.objects.has(e)}};var Xt="GBZ-base version 4",st=class extends Error{name="ForwardOnlyIndexError";constructor(){super("the haplotype index was written with --forward-only, which cannot name the walks stored against their reference (about half of them); rebuild it with gbz-haplotype-index without --forward-only")}},it=class extends Error{name="SchemaVersionError";found;constructor(e){super(e===void 0?"not a gbz-base database: its Tags table has no version":`unsupported database schema "${e}"; this reader understands "${Xt}"`),this.found=e}},at=class{sequenceLen;handle;edges;bwt;encodedSequence;next;decoded;constructor(e,t,n,o,s){this.handle=e,this.edges=t,this.bwt=n,this.encodedSequence=o,this.next=s,this.sequenceLen=qn(o)}get id(){return A(this.handle)}get orientation(){return ge(this.handle)}get sequence(){return this.decoded??=$n(this.encodedSequence),this.decoded}successors(){return this.edges.filter(e=>e.node!==0).map(e=>e.node)}gbwt(){if(this.edges.length===0)throw new Error(`GBWT record for handle ${this.handle} is empty`);return new ze(this.edges,this.bwt)}};function T(r,e){if(typeof r!="number")throw new Error(`${e} is not a number in the database`);return r}function ft(r,e){if(typeof r!="string")throw new Error(`${e} is not text in the database`);return r}function Kt(r,e){if(!(r instanceof Uint8Array))throw new Error(`${e} is not a blob in the database`);return r}function ur(r,e){return{handle:r,fwStart:{node:T(e[1],"Paths.fw_node"),offset:T(e[2],"Paths.fw_offset")},revStart:{node:T(e[3],"Paths.rev_node"),offset:T(e[4],"Paths.rev_offset")},name:{sample:ft(e[5],"Paths.sample"),contig:ft(e[6],"Paths.contig"),haplotype:T(e[7],"Paths.haplotype"),fragment:T(e[8],"Paths.fragment")},isIndexed:T(e[9],"Paths.is_indexed")!==0}}async function mr(r){let e=new Map;for await(let{values:t}of r.scan("Tags"))e.set(ft(t[0],"Tags.key"),ft(t[1],"Tags.value"));return e}var Le=class r{tagCache;pathCache;pathMapCache;indexTags;sqlite;index;constructor(e,t){this.sqlite=e,this.index=t}static async open(e,t={}){let{haplotypeIndex:n,...o}=t,s=await Oe.open(e,o);for(let c of["Tags","Nodes","Paths","ReferenceIndex"])s.rootPage(c);let i=n?await Oe.open(n,o):s,a=new r(s,i),f=await a.tag("version");if(f!==Xt)throw new it(f);if(n){for(let d of["Tags","HaplotypeSamples","HaplotypeLengths"])i.rootPage(d);a.indexTags=await mr(i);let c=a.indexTags.get("haplotype_index_paths"),l=await a.tag("paths");if(c!==l)throw new Error(`haplotype index was built for ${c??"an unknown number of"} paths but the graph has ${l}`);let p=a.indexTags.get("haplotype_index_nodes"),h=await a.tag("nodes");if(p!==void 0&&p!==h)throw new Error(`haplotype index was built for a graph with ${p} nodes but this one has ${h}`)}if(a.hasHaplotypeIndex&&await a.haplotypeIndexTag("haplotype_index_orientations")==="forward")throw new st;return a}tags(){return this.tagCache??=mr(this.sqlite),this.tagCache}async tag(e){return(await this.tags()).get(e)}prefetchRecords(e,t){return this.sqlite.prefetchRows("Nodes",e,t)}async getRecord(e){let t=await this.sqlite.byRowid("Nodes",e);if(!t)return;let n=t[4];return new at(e,Hn(Kt(t[1],"Nodes.edges")),Kt(t[2],"Nodes.bwt"),Kt(t[3],"Nodes.sequence"),typeof n=="number"?n:void 0)}paths(){return this.pathCache??=(async()=>{let e=[];for await(let{rowid:t,values:n}of this.sqlite.scan("Paths"))e.push(ur(t,n));return e})(),this.pathCache}async getPath(e){let t=await this.sqlite.byRowid("Paths",e);return t?ur(e,t):void 0}pathsByHandle(){return this.pathMapCache??=this.paths().then(e=>new Map(e.map(t=>[t.handle,t]))),this.pathMapCache}async findPath(e){return(await this.paths()).filter(n=>n.name.sample===e.sample&&n.name.contig===e.contig&&n.name.haplotype===e.haplotype&&n.name.fragment<=e.fragment).sort((n,o)=>o.name.fragment-n.name.fragment)[0]}async pathsForSample(e){return(await this.paths()).filter(t=>t.name.sample===e)}async pathsNamed(e){let t=Pe(Qn(e),0);return(await this.paths()).filter(n=>n.name.sample===t.sample&&n.name.contig===t.contig&&n.name.haplotype===t.haplotype).sort((n,o)=>n.name.fragment-o.name.fragment)}async hasPath(e){return(await this.pathsNamed(e)).length>0}pathLengths=new Map;pathLength(e){let t=this.pathLengths.get(e);return t||(t=this.walkPathLength(e),this.pathLengths.set(e,t),t.catch(()=>this.pathLengths.delete(e))),t}async walkPathLength(e){let t=this.hasHaplotypeIndex?await this.haplotypeLength(e):void 0;if(t===void 0){let n=await this.indexedPosition(e,Number.MAX_SAFE_INTEGER);if(!n){let i=await this.getPath(e);throw new Error(`Path ${i?q(i.name,i.name.fragment):e} has not been indexed for random access`)}let o=n.pathOffset,s=n.pos;for(;;){let i=await this.getRecord(s.node);if(!i)throw new Error(`Node ${s.node} does not exist in the graph`);o+=i.sequenceLen;let a=i.gbwt().lf(s.offset);if(!a||a.node===0)return o;s=a}}return t}async pathFragmentsForRange(e,t,n){if(n<=t)return[];let o=await this.pathsNamed(e),s=o.filter(f=>f.name.fragment<=t).slice(-1),i=o.filter(f=>f.name.fragment>t&&f.name.fragment<n);return(await Promise.all([...s,...i].map(async f=>({path:f,start:f.name.fragment,end:f.name.fragment+await this.pathLength(f.handle)})))).filter(f=>t<f.end)}async subgraphForFragment(e,t,n,o){let{keep:s,...i}=o;if(s!==void 0&&!this.hasHaplotypeIndex)throw new Error("keep needs the haplotype index: this database cannot name its walks");let{sample:a,contig:f,haplotype:c}=e.path.name,l={sample:a,contig:f,haplotype:c},p=Math.max(t,e.start),h=Math.min(n,e.end),d=o.haplotypes??"all",u=d==="all"||d==="distinct",m;return s!==void 0&&d==="all"?m=await lr(this,l,p,h,{...i,keep:s}):(m=await Je(this,l,p,h,i),this.hasHaplotypeIndex&&u&&(await m.identifyPaths(),s!==void 0&&m.keepHaplotypes(s))),m}async getSubgraphForRange(e,t,n,o={}){let[s]=await this.pathFragmentsForRange(e,t,n);return s?this.subgraphForFragment(s,t,n,o):void 0}async getAlignmentsForRange(e,t,n,o={}){let s=[];for(let i of await this.pathFragmentsForRange(e,t,n)){let a=await this.subgraphForFragment(i,t,n,o);s.push(...a.alignments())}return s}async graphName(){let e=new Map;for(let[n,o]of await this.tags())n.startsWith("gbz_")&&e.set(n.slice(4),o);let t={name:void 0,subgraph:new Map,translation:new Map};try{t=zn(e)}catch{}return t}async hasChainLinks(){let e=await this.tag("chain_links");return e!==void 0&&Number(e)>0}get hasHaplotypeIndex(){return this.index.has("HaplotypeSamples")&&this.index.has("HaplotypeLengths")}async haplotypeIndexTag(e){return this.indexTags?this.indexTags.get(e):await this.tag(e)}async haplotypeSampleInterval(){let e=await this.haplotypeIndexTag("haplotype_index_interval");return e===void 0?void 0:Number(e)}async haplotypeAnchorSpacing(){let e=this.hasHaplotypeIndex&&this.index.has("HaplotypeAnchors")?await this.haplotypeIndexTag("haplotype_index_anchor_spacing"):void 0;return e===void 0?void 0:Number(e)}async haplotypeAnchor(e,t){let n=await this.index.indexSeekLE("HaplotypeAnchors",[e,t]),o=n?.[0]===e&&n[1]===t?await this.index.byRowid("HaplotypeAnchors",T(n[2],"HaplotypeAnchors rowid")):void 0;return o?{node:T(o[2],"HaplotypeAnchors.node_handle"),pathOffset:T(o[3],"HaplotypeAnchors.path_offset")}:void 0}haplotypeSamplesAtNode(e){return this.haplotypeSamplesInRange(e,e)}sampleFromRow(e){return{node:T(e[0],"HaplotypeSamples.node_handle"),offset:T(e[1],"HaplotypeSamples.node_offset"),pathHandle:T(e[2],"HaplotypeSamples.path_handle"),orientation:T(e[3],"HaplotypeSamples.orientation")===0?"forward":"reverse",pathOffset:T(e[4],"HaplotypeSamples.path_offset")}}async haplotypeSamplesInRange(e,t){let n=[];for await(let o of this.index.indexScanFrom("HaplotypeSamples",[e,0])){if(T(o[0],"HaplotypeSamples.node_handle")>t)break;let i=await this.index.byRowid("HaplotypeSamples",T(o[2],"HaplotypeSamples rowid"));i&&n.push(this.sampleFromRow(i))}return n}async haplotypeSampleAt(e,t){let n=await this.index.indexSeekLE("HaplotypeSamples",[e,t]);if(n?.[0]!==e||n[1]!==t)return;let o=await this.index.byRowid("HaplotypeSamples",T(n[2],"HaplotypeSamples rowid"));return o?this.sampleFromRow(o):void 0}async haplotypeLength(e){let t=await this.index.byRowid("HaplotypeLengths",e);return t?T(t[1],"HaplotypeLengths.length"):void 0}async indexedRow(e){let t=await this.sqlite.byRowid("ReferenceIndex",e);if(!t)throw new Error("ReferenceIndex row referenced by its index is missing");return{pathOffset:T(t[1],"ReferenceIndex.path_offset"),pos:{node:T(t[2],"ReferenceIndex.node_handle"),offset:T(t[3],"ReferenceIndex.node_offset")}}}async indexedRowid(e,t){let n=await this.sqlite.indexSeekLE("ReferenceIndex",[e,t]);return n?.[0]===e?T(n[2],"ReferenceIndex rowid"):void 0}async indexedPosition(e,t){let n=await this.indexedRowid(e,t);return n===void 0?void 0:this.indexedRow(n)}async indexedPositionsBetween(e,t,n){let[o,s]=await Promise.all([this.indexedRowid(e,t),this.indexedRowid(e,n)]),i=[];if(o!==void 0&&s!==void 0){await this.sqlite.prefetchRows("ReferenceIndex",o,s+1);for(let a=o;a<=s;a++)i.push(await this.indexedRow(a))}return i}};var bn=Y(Pn(),1),Sn=Y(Ce(),1),Ae=Y(wo(),1),mo=Y(xo(),1);var ct=class extends Error{constructor(t,n){super(n.length===0?`the graph names no reference sample (gbwt_reference_samples) and the anchor "${t}" maps to none; set referenceSample`:`the anchor "${t}" is none of the graph's reference samples (${n.join(", ")}); set referenceSample or map it through assemblyNameToPanSN`);this.name="NoReferenceSampleError"}},lt=class extends Error{constructor(t,n,o){super(`this ${n.toLocaleString()} bp window reads more than nodeLimit (${t.toLocaleString()}) graph nodes; zoom in to about ${o.toLocaleString()} bp or raise nodeLimit`);this.name="NodeLimitError"}};function J(r){return`${r.sample}#${r.haplotype}`}function gr(r,e){let t=J(r);return e===void 0||e.some(n=>ue(t,n))}async function yr(r){return(await r.tag("gbwt_reference_samples")??"").split(/\s+/).filter(e=>e!=="")}var os={hg38:"grch38",hg19:"grch37",hs1:"chm13","t2t-chm13":"chm13",chm13v2:"chm13"};function ss(r,e){let t=r.toLowerCase(),n=os[t];return e.find(o=>o===r)??e.find(o=>o.toLowerCase()===t)??e.find(o=>o.toLowerCase()===n)}function Zt({configured:r,anchorPrefix:e,referenceSamples:t}){if(r!=="")return r;let n=ss(_n(e),t)??(t.length===1?t[0]:void 0);if(n===void 0)throw new ct(e,t);return n}async function wr(r,e,t){let n=(await r.paths()).find(o=>o.isIndexed&&o.name.sample===e&&o.name.contig===t);return n?{sample:n.name.sample,contig:t,haplotype:n.name.haplotype}:void 0}function Te(r,e,t){if(r instanceof Error&&(r.name==="SubgraphLimitError"||/^Subgraph size limit of \d+ nodes exceeded/.test(r.message))){let o=r.walkedBp,s=typeof o=="number"&&o>0?Math.floor(o*.8):Math.floor(t/2);return new lt(e,t,Math.max(s,1))}else return}async function xr(r,e,t,n,{keep:o,...s}){let i=e?await r.getSubgraphForRange(e,t,n,{...s,haplotypes:"all",...o===void 0?{}:{keep:o}}).catch(a=>{throw Te(a,s.limit,n-t)??a}):void 0;return i?i.toGFA({names:"resolved"}):""}var is=5e3,as=50*2**20,Jt=class extends Error{constructor(t){super(`this GAF is ${(t/2**20).toFixed(0)} MB without an index; bgzip it and index it with tabix -p gaf`);this.name="UnindexedGafTooLargeError"}};function fs(r,e){if(r.length<=e)return r;let t=r.length/e;return Array.from({length:e},(n,o)=>r[Math.floor(o*t)])}var br=(r,e)=>r.path.some(t=>e.has(t.name)),pt=class{constructor(e,t){this.file=e;this.tabix=t}readWhole(e){return this.whole??=(async()=>{let{size:t}=await this.file.stat();if(t>as)throw new Jt(t);let n=await this.file.readFile({signal:e}),o=new TextDecoder().decode(n[0]===31&&n[1]===139?await Cn(n):n);return Mn(o)})().catch(t=>{throw this.whole=void 0,t}),this.whole}async readIndexed(e,t,n){let o=1/0,s=-1/0;for(let a of t){let f=Number(a);Number.isInteger(f)&&(o=Math.min(o,f),s=Math.max(s,f))}let i=[];return o<=s&&await e.getLines("{node}",o,s+1,{signal:n,lineCallback:a=>{let f=kn(a);f&&br(f,t)&&i.push(f)}}),i}async readsOver(e,{signal:t}={}){let n=this.tabix?await this.readIndexed(this.tabix,e,t):(await this.readWhole(t)).filter(o=>br(o,e));return{records:fs(n,is),total:n.length}}};var po=Y(Pn(),1),ho=Y(Ce(),1);var en=function(r,e){return en=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])},en(r,e)};function Ne(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");en(r,e);function t(){this.constructor=r}r.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}function Sr(r,e,t,n){function o(s){return s instanceof t?s:new t(function(i){i(s)})}return new(t||(t=Promise))(function(s,i){function a(l){try{c(n.next(l))}catch(p){i(p)}}function f(l){try{c(n.throw(l))}catch(p){i(p)}}function c(l){l.done?s(l.value):o(l.value).then(a,f)}c((n=n.apply(r,e||[])).next())})}function ht(r,e){var t={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},n,o,s,i=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return i.next=a(0),i.throw=a(1),i.return=a(2),typeof Symbol=="function"&&(i[Symbol.iterator]=function(){return this}),i;function a(c){return function(l){return f([c,l])}}function f(c){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(t=0)),t;)try{if(n=1,o&&(s=c[0]&2?o.return:c[0]?o.throw||((s=o.return)&&s.call(o),0):o.next)&&!(s=s.call(o,c[1])).done)return s;switch(o=0,s&&(c=[c[0]&2,s.value]),c[0]){case 0:case 1:s=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,o=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(s=t.trys,!(s=s.length>0&&s[s.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!s||c[1]>s[0]&&c[1]<s[3])){t.label=c[1];break}if(c[0]===6&&t.label<s[1]){t.label=s[1],s=c;break}if(s&&t.label<s[2]){t.label=s[2],t.ops.push(c);break}s[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(r,t)}catch(l){c=[6,l],o=0}finally{n=s=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}function ce(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function xe(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,s=[],i;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)s.push(o.value)}catch(a){i={error:a}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(i)throw i.error}}return s}function be(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,s;n<o;n++)(s||!(n in e))&&(s||(s=Array.prototype.slice.call(e,0,n)),s[n]=e[n]);return r.concat(s||Array.prototype.slice.call(e))}function le(r){return this instanceof le?(this.v=r,this):new le(r)}function vr(r,e,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t.apply(r,e||[]),o,s=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",i),o[Symbol.asyncIterator]=function(){return this},o;function i(d){return function(u){return Promise.resolve(u).then(d,p)}}function a(d,u){n[d]&&(o[d]=function(m){return new Promise(function(y,x){s.push([d,m,y,x])>1||f(d,m)})},u&&(o[d]=u(o[d])))}function f(d,u){try{c(n[d](u))}catch(m){h(s[0][3],m)}}function c(d){d.value instanceof le?Promise.resolve(d.value.v).then(l,p):h(s[0][2],d)}function l(d){f("next",d)}function p(d){f("throw",d)}function h(d,u){d(u),s.shift(),s.length&&f(s[0][0],s[0][1])}}function Ir(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof ce=="function"?ce(r):r[Symbol.iterator](),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(s){t[s]=r[s]&&function(i){return new Promise(function(a,f){i=r[s](i),o(a,f,i.done,i.value)})}}function o(s,i,a,f){Promise.resolve(f).then(function(c){s({value:c,done:a})},i)}}function _(r){return typeof r=="function"}function Ar(r){var e=function(n){Error.call(n),n.stack=new Error().stack},t=r(e);return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var dt=Ar(function(r){return function(t){r(this),this.message=t?t.length+` errors occurred during unsubscription:
6
+ `+t.map(function(n,o){return o+1+") "+n.toString()}).join(`
7
+ `):"",this.name="UnsubscriptionError",this.errors=t}});function tn(r,e){if(r){var t=r.indexOf(e);0<=t&&r.splice(t,1)}}var ut=(function(){function r(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}return r.prototype.unsubscribe=function(){var e,t,n,o,s;if(!this.closed){this.closed=!0;var i=this._parentage;if(i)if(this._parentage=null,Array.isArray(i))try{for(var a=ce(i),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(m){e={error:m}}finally{try{f&&!f.done&&(t=a.return)&&t.call(a)}finally{if(e)throw e.error}}else i.remove(this);var l=this.initialTeardown;if(_(l))try{l()}catch(m){s=m instanceof dt?m.errors:[m]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var h=ce(p),d=h.next();!d.done;d=h.next()){var u=d.value;try{Er(u)}catch(m){s=s??[],m instanceof dt?s=be(be([],xe(s)),xe(m.errors)):s.push(m)}}}catch(m){n={error:m}}finally{try{d&&!d.done&&(o=h.return)&&o.call(h)}finally{if(n)throw n.error}}}if(s)throw new dt(s)}},r.prototype.add=function(e){var t;if(e&&e!==this)if(this.closed)Er(e);else{if(e instanceof r){if(e.closed||e._hasParent(this))return;e._addParent(this)}(this._finalizers=(t=this._finalizers)!==null&&t!==void 0?t:[]).push(e)}},r.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},r.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},r.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&tn(t,e)},r.prototype.remove=function(e){var t=this._finalizers;t&&tn(t,e),e instanceof r&&e._removeParent(this)},r.EMPTY=(function(){var e=new r;return e.closed=!0,e})(),r})();var Ui=ut.EMPTY;function mt(r){return r instanceof ut||r&&"closed"in r&&_(r.remove)&&_(r.add)&&_(r.unsubscribe)}function Er(r){_(r)?r():r.unsubscribe()}var K={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Se={setTimeout:function(r,e){for(var t=[],n=2;n<arguments.length;n++)t[n-2]=arguments[n];var o=Se.delegate;return o?.setTimeout?o.setTimeout.apply(o,be([r,e],xe(t))):setTimeout.apply(void 0,be([r,e],xe(t)))},clearTimeout:function(r){var e=Se.delegate;return(e?.clearTimeout||clearTimeout)(r)},delegate:void 0};function gt(r){Se.setTimeout(function(){var e=K.onUnhandledError;if(e)e(r);else throw r})}function nn(){}var Cr=(function(){return rn("C",void 0,void 0)})();function Rr(r){return rn("E",void 0,r)}function Pr(r){return rn("N",r,void 0)}function rn(r,e,t){return{kind:r,value:e,error:t}}var pe=null;function _r(r){if(K.useDeprecatedSynchronousErrorHandling){var e=!pe;if(e&&(pe={errorThrown:!1,error:null}),r(),e){var t=pe,n=t.errorThrown,o=t.error;if(pe=null,n)throw o}}else r()}function kr(r){K.useDeprecatedSynchronousErrorHandling&&pe&&(pe.errorThrown=!0,pe.error=r)}var Fe=(function(r){Ne(e,r);function e(t){var n=r.call(this)||this;return n.isStopped=!1,t?(n.destination=t,mt(t)&&t.add(n)):n.destination=hs,n}return e.create=function(t,n,o){return new wt(t,n,o)},e.prototype.next=function(t){this.isStopped?sn(Pr(t),this):this._next(t)},e.prototype.error=function(t){this.isStopped?sn(Rr(t),this):(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped?sn(Cr,this):(this.isStopped=!0,this._complete())},e.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,r.prototype.unsubscribe.call(this),this.destination=null)},e.prototype._next=function(t){this.destination.next(t)},e.prototype._error=function(t){try{this.destination.error(t)}finally{this.unsubscribe()}},e.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},e})(ut);var cs=Function.prototype.bind;function on(r,e){return cs.call(r,e)}var ls=(function(){function r(e){this.partialObserver=e}return r.prototype.next=function(e){var t=this.partialObserver;if(t.next)try{t.next(e)}catch(n){yt(n)}},r.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(n){yt(n)}else yt(e)},r.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(t){yt(t)}},r})(),wt=(function(r){Ne(e,r);function e(t,n,o){var s=r.call(this)||this,i;if(_(t)||!t)i={next:t??void 0,error:n??void 0,complete:o??void 0};else{var a;s&&K.useDeprecatedNextContext?(a=Object.create(t),a.unsubscribe=function(){return s.unsubscribe()},i={next:t.next&&on(t.next,a),error:t.error&&on(t.error,a),complete:t.complete&&on(t.complete,a)}):i=t}return s.destination=new ls(i),s}return e})(Fe);function yt(r){K.useDeprecatedSynchronousErrorHandling?kr(r):gt(r)}function ps(r){throw r}function sn(r,e){var t=K.onStoppedNotification;t&&Se.setTimeout(function(){return t(r,e)})}var hs={closed:!0,next:nn,error:ps,complete:nn};var ve=(function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"})();function Mr(r){return r}function Or(r){return r.length===0?Mr:r.length===1?r[0]:function(t){return r.reduce(function(n,o){return o(n)},t)}}var j=(function(){function r(e){e&&(this._subscribe=e)}return r.prototype.lift=function(e){var t=new r;return t.source=this,t.operator=e,t},r.prototype.subscribe=function(e,t,n){var o=this,s=us(e)?e:new wt(e,t,n);return _r(function(){var i=o,a=i.operator,f=i.source;s.add(a?a.call(s,f):f?o._subscribe(s):o._trySubscribe(s))}),s},r.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.error(t)}},r.prototype.forEach=function(e,t){var n=this;return t=Lr(t),new t(function(o,s){var i=new wt({next:function(a){try{e(a)}catch(f){s(f),i.unsubscribe()}},error:s,complete:o});n.subscribe(i)})},r.prototype._subscribe=function(e){var t;return(t=this.source)===null||t===void 0?void 0:t.subscribe(e)},r.prototype[ve]=function(){return this},r.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Or(e)(this)},r.prototype.toPromise=function(e){var t=this;return e=Lr(e),new e(function(n,o){var s;t.subscribe(function(i){return s=i},function(i){return o(i)},function(){return n(s)})})},r.create=function(e){return new r(e)},r})();function Lr(r){var e;return(e=r??K.Promise)!==null&&e!==void 0?e:Promise}function ds(r){return r&&_(r.next)&&_(r.error)&&_(r.complete)}function us(r){return r&&r instanceof Fe||ds(r)&&mt(r)}function ms(r){return _(r?.lift)}function W(r){return function(e){if(ms(e))return e.lift(function(t){try{return r(t,this)}catch(n){this.error(n)}});throw new TypeError("Unable to lift unknown Observable type")}}function re(r,e,t,n,o){return new gs(r,e,t,n,o)}var gs=(function(r){Ne(e,r);function e(t,n,o,s,i,a){var f=r.call(this,t)||this;return f.onFinalize=i,f.shouldUnsubscribe=a,f._next=n?function(c){try{n(c)}catch(l){t.error(l)}}:r.prototype._next,f._error=s?function(c){try{s(c)}catch(l){t.error(l)}finally{this.unsubscribe()}}:r.prototype._error,f._complete=o?function(){try{o()}catch(c){t.error(c)}finally{this.unsubscribe()}}:r.prototype._complete,f}return e.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;r.prototype.unsubscribe.call(this),!n&&((t=this.onFinalize)===null||t===void 0||t.call(this))}},e})(Fe);var xt=(function(r){return r&&typeof r.length=="number"&&typeof r!="function"});function bt(r){return _(r?.then)}function St(r){return _(r[ve])}function vt(r){return Symbol.asyncIterator&&_(r?.[Symbol.asyncIterator])}function It(r){return new TypeError("You provided "+(r!==null&&typeof r=="object"?"an invalid object":"'"+r+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function ys(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var At=ys();function Et(r){return _(r?.[At])}function Ct(r){return vr(this,arguments,function(){var t,n,o,s;return ht(this,function(i){switch(i.label){case 0:t=r.getReader(),i.label=1;case 1:i.trys.push([1,,9,10]),i.label=2;case 2:return[4,le(t.read())];case 3:return n=i.sent(),o=n.value,s=n.done,s?[4,le(void 0)]:[3,5];case 4:return[2,i.sent()];case 5:return[4,le(o)];case 6:return[4,i.sent()];case 7:return i.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function Rt(r){return _(r?.getReader)}function ee(r){if(r instanceof j)return r;if(r!=null){if(St(r))return ws(r);if(xt(r))return xs(r);if(bt(r))return bs(r);if(vt(r))return Tr(r);if(Et(r))return Ss(r);if(Rt(r))return vs(r)}throw It(r)}function ws(r){return new j(function(e){var t=r[ve]();if(_(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function xs(r){return new j(function(e){for(var t=0;t<r.length&&!e.closed;t++)e.next(r[t]);e.complete()})}function bs(r){return new j(function(e){r.then(function(t){e.closed||(e.next(t),e.complete())},function(t){return e.error(t)}).then(null,gt)})}function Ss(r){return new j(function(e){var t,n;try{for(var o=ce(r),s=o.next();!s.done;s=o.next()){var i=s.value;if(e.next(i),e.closed)return}}catch(a){t={error:a}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}e.complete()})}function Tr(r){return new j(function(e){Is(r,e).catch(function(t){return e.error(t)})})}function vs(r){return Tr(Ct(r))}function Is(r,e){var t,n,o,s;return Sr(this,void 0,void 0,function(){var i,a;return ht(this,function(f){switch(f.label){case 0:f.trys.push([0,5,6,11]),t=Ir(r),f.label=1;case 1:return[4,t.next()];case 2:if(n=f.sent(),!!n.done)return[3,4];if(i=n.value,e.next(i),e.closed)return[2];f.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return a=f.sent(),o={error:a},[3,11];case 6:return f.trys.push([6,,9,10]),n&&!n.done&&(s=t.return)?[4,s.call(t)]:[3,8];case 7:f.sent(),f.label=8;case 8:return[3,10];case 9:if(o)throw o.error;return[7];case 10:return[7];case 11:return e.complete(),[2]}})})}function Q(r,e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1);var s=e.schedule(function(){t(),o?r.add(this.schedule(null,n)):this.unsubscribe()},n);if(r.add(s),!o)return s}function Pt(r,e){return e===void 0&&(e=0),W(function(t,n){t.subscribe(re(n,function(o){return Q(n,r,function(){return n.next(o)},e)},function(){return Q(n,r,function(){return n.complete()},e)},function(o){return Q(n,r,function(){return n.error(o)},e)}))})}function _t(r,e){return e===void 0&&(e=0),W(function(t,n){n.add(r.schedule(function(){return t.subscribe(n)},e))})}function Nr(r,e){return ee(r).pipe(_t(e),Pt(e))}function Fr(r,e){return ee(r).pipe(_t(e),Pt(e))}function Hr(r,e){return new j(function(t){var n=0;return e.schedule(function(){n===r.length?t.complete():(t.next(r[n++]),t.closed||this.schedule())})})}function qr(r,e){return new j(function(t){var n;return Q(t,e,function(){n=r[At](),Q(t,e,function(){var o,s,i;try{o=n.next(),s=o.value,i=o.done}catch(a){t.error(a);return}i?t.complete():t.next(s)},0,!0)}),function(){return _(n?.return)&&n.return()}})}function kt(r,e){if(!r)throw new Error("Iterable cannot be null");return new j(function(t){Q(t,e,function(){var n=r[Symbol.asyncIterator]();Q(t,e,function(){n.next().then(function(o){o.done?t.complete():t.next(o.value)})},0,!0)})})}function $r(r,e){return kt(Ct(r),e)}function Gr(r,e){if(r!=null){if(St(r))return Nr(r,e);if(xt(r))return Hr(r,e);if(bt(r))return Fr(r,e);if(vt(r))return kt(r,e);if(Et(r))return qr(r,e);if(Rt(r))return $r(r,e)}throw It(r)}function an(r,e){return e?Gr(r,e):ee(r)}function He(r,e){return W(function(t,n){var o=0;t.subscribe(re(n,function(s){n.next(r.call(e,s,o++))}))})}function Br(r,e,t,n,o,s,i,a){var f=[],c=0,l=0,p=!1,h=function(){p&&!f.length&&!c&&e.complete()},d=function(m){return c<n?u(m):f.push(m)},u=function(m){s&&e.next(m),c++;var y=!1;ee(t(m,l++)).subscribe(re(e,function(x){o?.(x),s?d(x):e.next(x)},function(){y=!0},void 0,function(){if(y)try{c--;for(var x=function(){var S=f.shift();i?Q(e,i,function(){return u(S)}):u(S)};f.length&&c<n;)x();h()}catch(S){e.error(S)}}))};return r.subscribe(re(e,d,function(){p=!0,h()})),function(){a?.()}}function Ie(r,e,t){return t===void 0&&(t=1/0),_(e)?Ie(function(n,o){return He(function(s,i){return e(n,s,o,i)})(ee(r(n,o)))},t):(typeof e=="number"&&(t=e),W(function(n,o){return Br(n,o,r,t)}))}function Dr(r,e,t,n,o){return function(s,i){var a=t,f=e,c=0;s.subscribe(re(i,function(l){var p=c++;f=a?r(f,l,p):(a=!0,l),n&&i.next(f)},o&&(function(){a&&i.next(f),i.complete()})))}}function zr(r,e){return W(Dr(r,e,arguments.length>=2,!1,!0))}var As=function(r,e){return r.push(e),r};function Mt(){return W(function(r,e){zr(As,[])(r).subscribe(e)})}function jr(r){let e=[],t=0,n;for(let o=0,s=r.length;o<s;o++){let i=r.charCodeAt(o);if(i>=48&&i<=57)t=t*10+i-48;else if(i===58)n=t,t=0;else{let a=r[o];a==="M"||a==="="||a==="X"?e.push({own:n===void 0?t:n,mate:t,op:"M"}):a==="I"?e.push({own:0,mate:t,op:a}):(a==="D"||a==="N")&&e.push({own:t,mate:0,op:a}),n=void 0,t=0}}return e}function ln(r){let e="";for(let{own:t,mate:n,op:o}of jr(r))e+=o==="M"?t===0?`${n}I`:n===0?`${t}D`:`${t}M`:`${o==="I"?n:t}${o}`;return e}var fn=2**28-1;function cn(r,e,t){for(let n=e;n>0;n-=fn)r.push((Math.min(n,fn)<<4|t)>>>0)}function Es(r,e,t){if(e===t)cn(r,e,0);else{let n=Math.ceil(Math.max(e,t)/fn);for(let o=0;o<n;o++){let s=Math.floor(e*(o+1)/n)-Math.floor(e*o/n),i=Math.floor(t*(o+1)/n)-Math.floor(t*o/n);r.push((s<<4|9)>>>0,(i<<4|9)>>>0)}}}function pn(r){let e=[];for(let{own:t,mate:n,op:o}of jr(r))o==="M"?Es(e,t,n):o==="I"?cn(e,n,1):cn(e,t,o==="N"?3:2);return Uint32Array.from(e)}function Cs(r){return r>=48&&r<=57}function Rs(r){return r!==void 0&&/[A-Za-z]/.test(r)}function Ur(r,e){let t=e;for(;t<r.length&&Rs(r[t]);)t++;return t}function Wr(r,e){let t=e,n=0;for(;t<r.length&&Cs(r.charCodeAt(t));)n=n*10+(r.charCodeAt(t)-48),t++;return{value:n,next:t}}function Xr(r,e){let t=0;for(;t<r.length;){let n=r[t];if(n===":"){let{value:o,next:s}=Wr(r,t+1);e(":",o,o,t+1,s),t=s}else if(n==="="){let o=Ur(r,t+1),s=o-t-1;e("=",s,s,t+1,o),t=o}else if(n==="*")e("*",1,1,t+1,Math.min(t+3,r.length)),t+=3;else if(n==="+"||n==="-"){let o=Ur(r,t+1),s=o-t-1;e(n,n==="-"?s:0,n==="+"?s:0,t+1,o),t=o}else if(n==="~"){let{value:o,next:s}=Wr(r,t+3),i=Math.min(s+2,r.length);e("~",o,0,t+1,i),t=i}else t++}}function hn(r,e,t,n){let o=t??Number.NEGATIVE_INFINITY,s=n??Number.POSITIVE_INFINITY,i=0;Xr(r,(a,f,c,l,p)=>{if(a==="*")i>=o&&i<s&&e(88,i,1,r[l+1]??"",-1,0,0);else if(a==="+"){if(i>=o&&i<=s){let h=r.slice(l,p);e(73,i,c,h,-1,0,c)}}else(a==="-"||a==="~")&&i<s&&i+f>o&&e(a==="-"?68:78,i,f,"",-1,0,0);i+=f})}function Zr(r,e,t,n){let o=0,s=0,i=[],a=t&&e;for(let f=0,c=r.length;f<c;f++){let l=r[f],p=l>>>4,h=l&15;if(h===0||h===7){if(a)for(let d=0;d<p;d++)(e.charCodeAt(s+d)|32)!==(t.charCodeAt(o+d)|32)&&i.push({start:o+d,type:"mismatch",base:e[s+d],altbase:t[o+d],length:1});s+=p,o+=p}else if(h===1)i.push({start:o,type:"insertion",insertlen:p,insertedBases:e?.slice(s,s+p),length:0}),s+=p;else if(h===2)i.push({start:o,type:"deletion",length:p}),o+=p;else if(h===3)i.push({start:o,type:"skip",length:p}),o+=p;else if(h===8){for(let d=0;d<p;d++)i.push({start:o+d,type:"mismatch",base:e?.[s+d]||"X",qual:n?.[s+d],length:1});s+=p,o+=p}else h===5?i.push({start:o,type:"hardclip",cliplen:p,length:1}):h===4&&(i.push({start:o,type:"softclip",cliplen:p,length:1}),s+=p)}return i}function Jr(r,e,t,n,o){if(!e)return[];let s=[],i=e.length,a=n.length,f=o!==void 0,c=t.length,l=!1;for(let S=0;S<c;S++)if(t[S].type==="skip"){l=!0;break}let p=0,h=0,d=0,u=0,m=0,y=0,x=r.length;for(;y<x;){let S=r.charCodeAt(y);if(S>=48&&S<=57){let g=0;for(;y<x;){let b=r.charCodeAt(y);if(b>=48&&b<=57)g=g*10+(b-48),y++;else break}p+=g}else if(S===94)for(y++;y<x&&r.charCodeAt(y)>=65;)y++,p++;else if(S>=65){let g=r[y];if(y++,l&&c>0)for(let R=m;R<c;R++){let C=t[R];C.type==="skip"&&p>=C.start&&(p+=C.length,m=R+1)}let b=d,w=u;for(let R=h;R<i&&w<=p;R++,h=R){let C=e[R],P=C>>>4,E=C&15;E===4||E===1?b+=P:E===2||E===6||E===3?w+=P:E!==5&&(b+=P,w+=P)}d=b,u=w;let v=b-(w-p),I=v<a?n[v]:"X";s.push({start:p,base:I,qual:f?o[v]:void 0,altbase:g,length:1,type:"mismatch"}),p++}else y++}return s}var eo={77:0,73:1,68:2,78:3,83:4,72:5,80:6,61:7,88:8};function to(r=""){let e=0,t=[];for(let n=0,o=r.length;n<o;n++){let s=r.charCodeAt(n);if(s>=48&&s<=57)e=e*10+(s-48);else{let i=eo[s];t.push(e<<4|i),e=0}}return t}function mn(r=""){let e=0;for(let s=0,i=r.length;s<i;s++){let a=r.charCodeAt(s);(a<48||a>57)&&e++}let t=new Uint32Array(e),n=0,o=0;for(let s=0,i=r.length;s<i;s++){let a=r.charCodeAt(s);a>=48&&a<=57?n=n*10+(a-48):(t[o++]=n<<4|eo[a],n=0)}return t}function Ft(r,e,t,n,o){let s=to(r),i=r?Zr(s,t,n,o):[];return e&&t?i.concat(Jr(e,s,i,t,o)):i}var ks=397,Ms=387,Os=385;function no(r){return(1<<r&ks)!==0}function ro(r){return(1<<r&Ms)!==0}function oo(r){return(1<<r&Os)!==0}function gn(r,e,t,n,o,s,i){let a=o===-1?-1:1,f=e,c=o===-1?n:t,l=[],p=1/0,h=-1/0,d=1/0,u=-1/0,m=(y,x)=>{d=Math.min(d,y,x),u=Math.max(u,y,x)};for(let y=0;y<r.length;y++){let x=r[y],S=x>>>4,g=x&15,b=g===9,w=b||no(g)?S:0,v=b?r[++y]>>>4:ro(g)?S:0,I=f+w,R=c+v*a,C=f,P=I;if(P>=s&&C<=i)if(w>0){let E=Math.max(C,s),k=Math.min(P,i);if(k>E)if(p=Math.min(p,E),h=Math.max(h,k),b){let O=v/S,N=k-E,F=Math.round(N*O),H=Math.round(c+(E-f)*O*a);l.push(N<<4|9,F<<4|9),m(H,H+F*a)}else l.push(k-E<<4|g),oo(g)?m(c+(E-f)*a,c+(k-f)*a):m(c,c)}else v>0&&(b?l.push(x,r[y]):l.push(x),p=Math.min(p,f),h=Math.max(h,f),m(c,R));if(f=I,c=R,f>i)break}if(l.length!==0)return{start:p,end:h,mateStart:d,mateEnd:u,cigar:Uint32Array.from(l)}}function Ls(r){return r===1||r===2||r===3}function yn(r,e,t,n,o,s){let i=o===-1?-1:1,a=[],f=e,c=o===-1?n:t,l,p=!1,h=()=>{l!==void 0&&p&&l.qHi>l.qLo&&a.push({start:l.qLo,end:l.qHi,mateStart:l.tLo,mateEnd:l.tHi,cigar:Uint32Array.from(l.ops)}),l=void 0,p=!1};for(let d=0;d<r.length;d++){let u=r[d],m=u>>>4,y=u&15,x=y===9,S=x?r[++d]:void 0,g=x||no(y)?m:0,b=S!==void 0?S>>>4:ro(y)?m:0,w=c+b*i;Ls(y)&&m>=s?h():(g>0||b>0)&&(l===void 0&&(l={qLo:f,qHi:f,tLo:c,tHi:c,ops:[]}),l.qHi=f+g,l.tLo=Math.min(l.tLo,c,w),l.tHi=Math.max(l.tHi,c,w),l.ops.push(u),S!==void 0&&l.ops.push(S),p=p||x||oo(y)),f+=g,c=w}return h(),a}function so(r){let e=r.get("CIGAR");return typeof e=="string"?e:void 0}function io(r){let e=r.get("coarseCigar");return typeof e=="string"?e:void 0}function wn(r){let e=so(r),t=e===void 0?io(r):void 0;return e!==void 0?mn(e):t!==void 0?pn(t):void 0}var Ts=Y(Ce(),1),Ns=Y(fo(),1);var Fs=Y(Ce(),1);var Hs=Y(bo(),1);var co=Y(Ce(),1),se=class extends co.SimpleFeature{get(e){return e==="mismatches"?Ft(this.walkableCigar):e==="clipLengthAtStartOfRead"?this.clipLengthAtStartOfRead:e==="name"?super.get("name")??this.mate?.refName:super.get(e)}get mate(){return super.get("mate")}get walkableCigar(){let e=super.get("CIGAR"),t=super.get("coarseCigar");return typeof e=="string"?e:typeof t=="string"?ln(t):void 0}get clipLengthAtStartOfRead(){return this.mate?.start??0}forEachMismatch(e,t){let n=this.get("start"),o=t?.start===void 0?void 0:t.start-n,s=t?.end===void 0?void 0:t.end-n,i=this.get("cs");if(i)hn(i,e,o,s);else{let a=o??Number.NEGATIVE_INFINITY,f=s??Number.POSITIVE_INFINITY;for(let c of Ft(this.walkableCigar))(c.type==="deletion"||c.type==="skip"?c.start<f&&c.start+c.length>a:c.start>=a&&c.start<=f)&&(c.type==="mismatch"?e(88,c.start,c.length,c.base,c.qual??-1,0,0):c.type==="insertion"?e(73,c.start,c.length,c.insertedBases??"",-1,0,c.insertlen):c.type==="deletion"?e(68,c.start,c.length,"",-1,0,0):c.type==="skip"&&e(78,c.start,c.length,"",-1,0,0))}}};var qs=["CIGAR","cs","coarseCigar","cg","cr"];function $s(r){return typeof r=="object"&&r!==null&&"refName"in r&&"start"in r&&"end"in r&&typeof r.refName=="string"&&typeof r.start=="number"&&typeof r.end=="number"}function Gs(r){let e=r.get("mate");return $s(e)?e:void 0}function Bs(r,e,t,n){let o=Math.max(r.start,n.start),s=Math.min(r.end,n.end),i=(e.end-e.start)/Math.max(r.end-r.start,1),a=l=>t===-1?e.end-(l-r.start)*i:e.start+(l-r.start)*i,f=Math.round(a(o)),c=Math.round(a(s));return s>o?{start:o,end:s,mateStart:Math.min(f,c),mateEnd:Math.max(f,c)}:void 0}function Ds(r,e,t,n,o){let s={start:r.get("start"),end:r.get("end")},i=r.get("strand")===-1?-1:1,a=s.start>=t.start&&s.end<=t.end,f=a&&n===void 0&&!o?void 0:wn(r);if(f===void 0){let c=a?{...s,mateStart:e.start,mateEnd:e.end}:Bs(s,e,i,t);return c===void 0?[]:[c]}else return(n===void 0?[{...s,mateStart:e.start,mateEnd:e.end,cigar:f}]:yn(f,s.start,e.start,e.end,i,n)).flatMap(l=>{let p=gn(l.cigar,l.start,l.mateStart,l.mateEnd,i,t.start,t.end);return p===void 0?[]:[p]})}function zs(r,e,t,n,o,s){let i=`:${n.start}-${n.end}${o}`,a=r.toJSON(),f={...a,uniqueId:`${r.id()}${i}`,start:t.start,end:t.end,mate:{...e,start:t.mateStart,end:t.mateEnd}};a.syntenyId!==void 0&&(f.syntenyId=`${String(a.syntenyId)}${i}`);for(let c of qs)delete f[c];return s&&t.cigar&&(f.alignmentOps=t.cigar),new se(f)}function lo(r,e,t,n=!1){let o=Gs(r);if(o===void 0)return[r];{let s=Ds(r,o,e,t,n);return s.map((i,a)=>zs(r,o,i,e,s.length>1?`/${a}`:"",n))}}var Ht=class extends po.BaseFeatureDataAdapter{constructor(){super(...arguments);this.recordsAreAlignments=!0}static{this.capabilities=["getFeatures","getRefNames"]}async hasDataForRefName(){return!0}getFeaturesInMultipleRegions(t,n={}){let{clipToRegion:o,splitAtGapBp:s,keepAlignment:i,...a}=n,f=o&&this.recordsAreAlignments,c=(0,ho.createStatusFanOut)(a.statusCallback);return an(t).pipe(Ie((l,p)=>this.getFeatures(l,{...a,statusCallback:c()}).pipe(Ie(h=>f?lo(h,h.get("assemblyName")===l.assemblyName?l:{start:h.get("start"),end:h.get("end")},s,i):[h]),Mt(),He(h=>({index:p,features:h})))),Mt(),Ie(l=>l.sort((p,h)=>p.index-h.index).flatMap(p=>p.features)))}};var vn=class extends Error{constructor(){super("this .gbz.db has no HaplotypeSamples/HaplotypeLengths tables, so its walks cannot be named; run gbz-haplotype-index (from @gmod/gbz-base) over it first");this.name="NoHaplotypeIndexError"}},In=class extends Error{constructor(t){super(`a pair query names both lanes: queryAssemblyName ${t} came without a targetAssemblyName`);this.name="PairTargetError"}},An=class extends Error{constructor(t,n){super(`the graph is cut on its reference, ${n}; a window on ${t} has no reference coordinates to cut at. Open the graph from a ${n} view, and find this haplotype's lane there`);this.name="HaplotypeWindowError"}};function uo(r,e){let t=J(e);return r[t]??r[e.sample]??t}function js(r,e){return`${J(r)}#${r.contig}@${e.start.node}.${e.start.offset}`}function Us({alignment:r,assemblyName:e,refName:t,lane:n}){let{refStart:o,refEnd:s,strand:i,cigar:a}=r;if(!(!r.resolved||s<=o)){let{name:f,hapStart:c,hapEnd:l}=r,p=js(f,r),h={uniqueId:p,assemblyName:e,refName:t,start:o,end:s,type:"match",strand:i==="-"?-1:1,CIGAR:a,syntenyId:p,mate:{refName:f.contig,start:c,end:l,assemblyName:n}};return new se(h)}}function Ws({pair:r,lane:e,mateLane:t}){let n=`${J(r.target)}#${r.target.contig}:${r.targetStart}-${r.targetEnd}|${J(r.query)}#${r.query.contig}:${r.queryStart}-${r.queryEnd}`;return new se({uniqueId:n,assemblyName:e,refName:r.target.contig,start:r.targetStart,end:r.targetEnd,type:"match",strand:r.strand==="-"?-1:1,CIGAR:r.cigar,syntenyId:n,identity:r.matches/Math.max(r.columns,1),numMatches:r.matches,blockLen:r.columns,mate:{refName:r.query.contig,start:r.queryStart,end:r.queryEnd,assemblyName:t}})}var xn=r=>!("uri"in r)||r.uri!=="",En=class extends Ht{constructor(){super(...arguments);this.graph=(0,bn.cachedSetup)({label:"Opening pangenome database",setup:async()=>{let t=this.getConf("haplotypeIndexLocation"),n=xn(t),o=await Le.open((0,Ae.openLocation)(this.getConf("gbzDbLocation"),this.pluginManager),n?{haplotypeIndex:(0,Ae.openLocation)(t,this.pluginManager)}:{}),s=this.getConf("assemblyNames")[0];if(s===void 0)throw new Error("GbzBaseSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as");let i=await yr(o),a=Zt({configured:this.getConf("referenceSample"),anchorPrefix:me(this,s),referenceSamples:i});return{db:o,anchor:s,referenceSample:a,referenceSamples:i}}});this.gaf=(0,bn.cachedSetup)({label:"Opening reads",setup:async()=>{let t=this.getConf("readsLocation"),n=this.getConf(["readsIndex","location"]),o=this.pluginManager;if(!xn(t))return;let s=(0,Ae.openLocation)(t,o);return new pt(s,xn(n)?new Rn({filehandle:s,...(0,Ae.openTabixIndexFilehandle)(n,this.getConf(["readsIndex","indexType"]),o)}):void 0)}})}async referenceQuery(t,n){let{db:o,referenceSample:s}=await this.graph(n);return wr(o,s,t)}async getHaplotypes(t={}){let{db:n,referenceSamples:o}=await this.graph(t),s=new Map;for(let i of await n.paths()){let a=J(i.name),f=s.get(a);f?f.contigs.includes(i.name.contig)||f.contigs.push(i.name.contig):s.set(a,{prefix:a,sample:i.name.sample,haplotype:i.name.haplotype,contigs:[i.name.contig],isReference:o.includes(i.name.sample)})}return[...s.values()]}async getHeader(t={}){let{anchor:n,referenceSample:o,referenceSamples:s}=await this.graph(t),i=qt(this),a=[];for(let f of await this.getHaplotypes(t))f.sample!==o&&a.push({name:uo(i,f),label:f.prefix,group:f.sample});return{hasCoarseTier:!1,anchorAssemblyName:n,referenceSample:o,referenceSamples:s,lanes:a}}async getRefNames(t={}){let{db:n,anchor:o,referenceSample:s}=await this.graph(t),{assemblyName:i}=t,a=i===o?void 0:me(this,i),f=(await n.paths()).filter(c=>i===o?c.isIndexed&&c.name.sample===s:ue(J(c.name),a)).map(c=>c.name.contig);return[...new Set(f)]}keepPredicate(t,n){let o=t===void 0||t.length===0?void 0:t.map(s=>me(this,s));return o===void 0&&n===void 0?void 0:s=>gr(s,o)&&(n===void 0||ue(J(s),n))}async getSubgraph(t,n={}){let{db:o,anchor:s}=await this.graph(),{assemblyName:i,refName:a,start:f,end:c}=t;if(i!==s)throw new An(i,s);let l=await this.referenceQuery(a,{}),p=this.keepPredicate(n.haplotypes);return xr(o,l,f,c,{context:this.getConf("context"),snarls:this.getConf("subgraphSnarls"),limit:this.getConf("nodeLimit"),signal:n.signal,...p===void 0?{}:{keep:p}})}async getReads(t,n={}){let o=await this.gaf(n);return o?o.readsOver(new Set(t),n):{records:[],total:0}}async laneHaplotypes(t,n){let o=me(this,t);return(await this.getHaplotypes(n)).filter(s=>ue(s.prefix,o))}async referencePieces(t,n,o,s){let{db:i,referenceSample:a}=await this.graph(s),f=(await i.paths()).filter(l=>l.isIndexed&&l.name.sample===a&&l.name.contig===t&&l.name.fragment>n&&l.name.fragment<o).map(l=>l.name.fragment),c=[n,...[...new Set(f)].sort((l,p)=>l-p),o];return c.slice(1).map((l,p)=>({start:c[p],end:l}))}async anchorFeatures(t,n){let{db:o}=await this.graph(n),{assemblyName:s,refName:i,start:a,end:f}=t,c=me(this,n.targetAssemblyName),l=qt(this),p=this.keepPredicate(n.haplotypes,c),h=await this.referenceQuery(i,n),d=this.getConf("nodeLimit");return(h?await(0,Sn.updateStatus)(`Reading graph ${i}:${a.toLocaleString()}-${f.toLocaleString()}`,n.statusCallback,()=>o.getAlignmentsForRange(h,a,f,{context:this.getConf("context"),haplotypes:"all",limit:d,signal:n.signal,...p===void 0?{}:{keep:p}}).catch(m=>{throw Te(m,d,f-a)??m})):[]).flatMap(m=>{let y=m.resolved?Us({alignment:m,assemblyName:s,refName:i,lane:uo(l,m.name)}):void 0;return y===void 0?[]:[y]})}async pairFeatures(t,n,o){let{targetAssemblyName:s}=o;if(s===void 0)throw new In(n);let{db:i}=await this.graph(o),{refName:a,start:f,end:c}=t,l=await this.laneHaplotypes(n,o),p=await this.laneHaplotypes(s,o),h=[...l,...p],d=await this.referenceQuery(a,o),u=this.getConf("nodeLimit"),m=await i.haplotypeAnchorSpacing()!==void 0,y=(g,b)=>i.getSubgraphForRange(g,b.start,b.end,{context:this.getConf("context"),haplotypes:"all",limit:u,signal:o.signal,keep:w=>h.some(v=>v.sample===w.sample&&v.haplotype===w.haplotype)}).catch(w=>{throw Te(w,u,c-f)??w}),x=d&&m&&l.length>0&&p.length>0?(await(0,Sn.updateStatus)(`Reading ${n} against ${s}`,o.statusCallback,async()=>Promise.all((await this.referencePieces(a,f,c,o)).map(g=>y(d,g))))).filter(g=>g!==void 0):[];return x.every(g=>{let b=g.stats.anchorWalk;return b!==void 0&&b.fallback===void 0})?x.flatMap(g=>l.flatMap(b=>p.flatMap(w=>g.pairAlignments({target:b,query:w,bases:!1}).map(v=>Ws({pair:v,lane:n,mateLane:s}))))):[]}getFeatures(t,n={}){return(0,mo.ObservableCreate)(async o=>{let{db:s,anchor:i}=await this.graph(n);if(!s.hasHaplotypeIndex)throw new vn;if(t.assemblyName===i){let a=n.queryAssemblyName===void 0?await this.anchorFeatures(t,n):await this.pairFeatures(t,n.queryAssemblyName,n);for(let f of a)o.next(f)}o.complete()},n.signal)}};export{An as HaplotypeWindowError,vn as NoHaplotypeIndexError,ct as NoReferenceSampleError,lt as NodeLimitError,In as PairTargetError,En as default,Us as fragmentFeature,J as haplotypePrefix,uo as laneAssemblyName,Te as nodeLimitError,Ws as pairFeature,Zt as resolveReferenceSample};
8
+ //# sourceMappingURL=GbzBaseSyntenyAdapter-O7AKR55X.js.map