view x/static/js/8965.51db703f.chunk.js.map @ 125:49f3d3878413 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 5ea1f9c1eef1de76232e69aa6d34cda77d90d566
author fubar
date Sat, 05 Oct 2024 23:58:05 +0000
parents
children
line wrap: on
line source

{"version":3,"file":"static/js/8965.51db703f.chunk.js","mappings":"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","sources":["../../../plugins/comparative-adapters/src/MCScanAnchorsAdapter/MCScanAnchorsAdapter.ts","../../../plugins/comparative-adapters/src/util.ts","../../../node_modules/@gmod/bgzf-filehandle/src/unzip-pako.ts","../../../node_modules/@gmod/bgzf-filehandle/src/gziIndex.ts","../../../node_modules/@gmod/bgzf-filehandle/src/bgzFilehandle.ts"],"sourcesContent":["import {\n  BaseFeatureDataAdapter,\n  BaseOptions,\n} from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport {\n  doesIntersect2,\n  SimpleFeature,\n  Feature,\n  Region,\n} from '@jbrowse/core/util'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\nimport { readFile, parseBed } from '../util'\n\ninterface BareFeature {\n  strand: number\n  refName: string\n  start: number\n  end: number\n  score: number\n  name: string\n}\n\ntype Row = [BareFeature, BareFeature, number, number]\n\nexport default class MCScanAnchorsAdapter extends BaseFeatureDataAdapter {\n  private setupP?: Promise<{\n    assemblyNames: string[]\n    feats: Row[]\n  }>\n\n  public static capabilities = ['getFeatures', 'getRefNames']\n\n  async setup(opts: BaseOptions) {\n    if (!this.setupP) {\n      this.setupP = this.setupPre(opts).catch((e: unknown) => {\n        this.setupP = undefined\n        throw e\n      })\n    }\n    return this.setupP\n  }\n  async setupPre(opts: BaseOptions) {\n    const assemblyNames = this.getConf('assemblyNames') as string[]\n\n    const pm = this.pluginManager\n    const bed1 = openLocation(this.getConf('bed1Location'), pm)\n    const bed2 = openLocation(this.getConf('bed2Location'), pm)\n    const mcscan = openLocation(this.getConf('mcscanAnchorsLocation'), pm)\n    const [bed1text, bed2text, mcscantext] = await Promise.all(\n      [bed1, bed2, mcscan].map(r => readFile(r, opts)),\n    )\n\n    const bed1Map = parseBed(bed1text!)\n    const bed2Map = parseBed(bed2text!)\n    const feats = mcscantext!\n      .split(/\\n|\\r\\n|\\r/)\n      .filter(f => !!f && f !== '###')\n      .map((line, index) => {\n        const [name1, name2, score] = line.split('\\t')\n        const r1 = bed1Map.get(name1)\n        const r2 = bed2Map.get(name2)\n        if (!r1 || !r2) {\n          throw new Error(`feature not found, ${name1} ${name2} ${r1} ${r2}`)\n        }\n        return [r1, r2, +score!, index] as Row\n      })\n\n    return {\n      assemblyNames,\n      feats,\n    }\n  }\n\n  async hasDataForRefName() {\n    // determining this properly is basically a call to getFeatures\n    // so is not really that important, and has to be true or else\n    // getFeatures is never called (BaseFeatureDataAdapter filters it out)\n    return true\n  }\n\n  async getRefNames() {\n    // we cannot determine this accurately\n    return []\n  }\n\n  getFeatures(region: Region, opts: BaseOptions = {}) {\n    return ObservableCreate<Feature>(async observer => {\n      const { assemblyNames, feats } = await this.setup(opts)\n\n      // The index of the assembly name in the region list corresponds to\n      // the adapter in the subadapters list\n      const index = assemblyNames.indexOf(region.assemblyName)\n      if (index !== -1) {\n        const flip = index === 0\n        feats.forEach(f => {\n          const [r1, r2, score, rowNum] = f\n          const [f1, f2] = !flip ? [r2, r1] : [r1, r2]\n          if (\n            f1.refName === region.refName &&\n            doesIntersect2(region.start, region.end, f1.start, f1.end)\n          ) {\n            observer.next(\n              new SimpleFeature({\n                ...f1,\n                uniqueId: `${index}-${rowNum}`,\n                syntenyId: rowNum,\n\n                // note: strand would be -1 if the two features are on opposite\n                // strands, indicating inverted alignment\n                strand: f1.strand * f2.strand,\n                assemblyName: assemblyNames[+!flip],\n                score,\n                mate: {\n                  ...f2,\n                  assemblyName: assemblyNames[+flip],\n                },\n              }),\n            )\n          }\n        })\n      }\n\n      observer.complete()\n    })\n  }\n\n  /**\n   * called to provide a hint that data tied to a certain region\n   * will not be needed for the foreseeable future and can be purged\n   * from caches, etc\n   */\n  freeResources(/* { region } */): void {}\n}\n","import { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { GenericFilehandle } from 'generic-filehandle'\nimport { unzip } from '@gmod/bgzf-filehandle'\nimport { isGzip } from '@jbrowse/core/util'\nimport type { Buffer } from 'buffer'\n\nimport { PAFRecord } from './PAFAdapter/util'\n\nexport function parseBed(text: string) {\n  return new Map(\n    text\n      .split(/\\n|\\r\\n|\\r/)\n      .filter(f => !!f || f.startsWith('#'))\n      .map(line => {\n        const [refName, start, end, name, score, strand] = line.split('\\t')\n        return [\n          name,\n          {\n            refName,\n            start: +start!,\n            end: +end!,\n            score: +score!,\n            name,\n            strand: strand === '-' ? -1 : 1,\n          },\n        ]\n      }),\n  )\n}\n\nexport async function readFile(file: GenericFilehandle, opts?: BaseOptions) {\n  const buffer = (await file.readFile(opts)) as Buffer\n  return new TextDecoder('utf8', { fatal: true }).decode(\n    isGzip(buffer) ? await unzip(buffer) : buffer,\n  )\n}\n\nexport function zip(a: number[], b: number[]) {\n  return a.map((e, i) => [e, b[i]] as [number, number])\n}\n\nconst decoder =\n  typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined\n\nexport function parseLineByLine(\n  buffer: Buffer,\n  cb: (line: string) => PAFRecord,\n) {\n  let blockStart = 0\n  const entries = []\n  while (blockStart < buffer.length) {\n    const n = buffer.indexOf('\\n', blockStart)\n    if (n === -1) {\n      break\n    }\n    const b = buffer.subarray(blockStart, n)\n    const line = (decoder?.decode(b) || b.toString()).trim()\n    if (line) {\n      entries.push(cb(line))\n    }\n\n    blockStart = n + 1\n  }\n  return entries\n}\n\nexport function parsePAFLine(line: string) {\n  const [\n    qname,\n    ,\n    qstart,\n    qend,\n    strand,\n    tname,\n    ,\n    tstart,\n    tend,\n    numMatches,\n    blockLen,\n    mappingQual,\n    ...fields\n  ] = line.split('\\t')\n\n  const rest = Object.fromEntries(\n    fields.map(field => {\n      const r = field.indexOf(':')\n      const fieldName = field.slice(0, r)\n      const fieldValue = field.slice(r + 3)\n      return [fieldName, fieldValue]\n    }),\n  )\n\n  return {\n    tname,\n    tstart: +tstart!,\n    tend: +tend!,\n    qname,\n    qstart: +qstart!,\n    qend: +qend!,\n    strand: strand === '-' ? -1 : 1,\n    extra: {\n      numMatches: +numMatches!,\n      blockLen: +blockLen!,\n      mappingQual: +mappingQual!,\n      ...rest,\n    },\n  } as PAFRecord\n}\n\nexport function flipCigar(cigar: string[]) {\n  const arr = []\n  for (let i = cigar.length - 2; i >= 0; i -= 2) {\n    arr.push(cigar[i])\n    const op = cigar[i + 1]\n    if (op === 'D') {\n      arr.push('I')\n    } else if (op === 'I') {\n      arr.push('D')\n    } else {\n      arr.push(op)\n    }\n  }\n  return arr\n}\n\nexport function swapIndelCigar(cigar: string) {\n  return cigar.replaceAll('D', 'K').replaceAll('I', 'D').replaceAll('K', 'I')\n}\n","import { Buffer } from 'buffer'\n//@ts-ignore\nimport { Z_SYNC_FLUSH, Inflate } from 'pako'\n\ninterface VirtualOffset {\n  blockPosition: number\n  dataPosition: number\n}\ninterface Chunk {\n  minv: VirtualOffset\n  maxv: VirtualOffset\n}\n\n// browserify-zlib, which is the zlib shim used by default in webpacked code,\n// does not properly uncompress bgzf chunks that contain more than\n// one bgzf block, so export an unzip function that uses pako directly\n// if we are running in a browser.\nasync function unzip(inputData: Buffer) {\n  try {\n    let strm\n    let pos = 0\n    let i = 0\n    const chunks = []\n    let totalSize = 0\n    let inflator\n    do {\n      const remainingInput = inputData.subarray(pos)\n      inflator = new Inflate()\n      //@ts-ignore\n      ;({ strm } = inflator)\n      inflator.push(remainingInput, Z_SYNC_FLUSH)\n      if (inflator.err) {\n        throw new Error(inflator.msg)\n      }\n\n      pos += strm.next_in\n      chunks[i] = inflator.result as Uint8Array\n      totalSize += chunks[i].length\n      i += 1\n    } while (strm.avail_in)\n\n    const result = new Uint8Array(totalSize)\n    for (let i = 0, offset = 0; i < chunks.length; i++) {\n      result.set(chunks[i], offset)\n      offset += chunks[i].length\n    }\n    return Buffer.from(result)\n  } catch (e) {\n    //cleanup error message\n    if (`${e}`.match(/incorrect header check/)) {\n      throw new Error(\n        'problem decompressing block: incorrect gzip header check',\n      )\n    }\n    throw e\n  }\n}\n\n// similar to pakounzip, except it does extra counting\n// to return the positions of compressed and decompressed\n// data offsets\nasync function unzipChunk(inputData: Buffer) {\n  try {\n    let strm\n    let cpos = 0\n    let dpos = 0\n    const blocks = []\n    const cpositions = []\n    const dpositions = []\n    do {\n      const remainingInput = inputData.slice(cpos)\n      const inflator = new Inflate()\n      // @ts-ignore\n      ;({ strm } = inflator)\n      inflator.push(remainingInput, Z_SYNC_FLUSH)\n      if (inflator.err) {\n        throw new Error(inflator.msg)\n      }\n\n      const buffer = Buffer.from(inflator.result)\n      blocks.push(buffer)\n\n      cpositions.push(cpos)\n      dpositions.push(dpos)\n\n      cpos += strm.next_in\n      dpos += buffer.length\n    } while (strm.avail_in)\n\n    const buffer = Buffer.concat(blocks)\n    return { buffer, cpositions, dpositions }\n  } catch (e) {\n    //cleanup error message\n    if (`${e}`.match(/incorrect header check/)) {\n      throw new Error(\n        'problem decompressing block: incorrect gzip header check',\n      )\n    }\n    throw e\n  }\n}\n\n// similar to unzipChunk above but slices (0,minv.dataPosition) and\n// (maxv.dataPosition,end) off\nasync function unzipChunkSlice(inputData: Buffer, chunk: Chunk) {\n  try {\n    let strm\n    const { minv, maxv } = chunk\n    let cpos = minv.blockPosition\n    let dpos = minv.dataPosition\n    const chunks = []\n    const cpositions = []\n    const dpositions = []\n\n    let totalSize = 0\n    let i = 0\n    do {\n      const remainingInput = inputData.subarray(cpos - minv.blockPosition)\n      const inflator = new Inflate()\n      // @ts-ignore\n      ;({ strm } = inflator)\n      inflator.push(remainingInput, Z_SYNC_FLUSH)\n      if (inflator.err) {\n        throw new Error(inflator.msg)\n      }\n\n      const buffer = inflator.result\n      chunks.push(buffer as Uint8Array)\n      let len = buffer.length\n\n      cpositions.push(cpos)\n      dpositions.push(dpos)\n      if (chunks.length === 1 && minv.dataPosition) {\n        // this is the first chunk, trim it\n        chunks[0] = chunks[0].subarray(minv.dataPosition)\n        len = chunks[0].length\n      }\n      const origCpos = cpos\n      cpos += strm.next_in\n      dpos += len\n\n      if (origCpos >= maxv.blockPosition) {\n        // this is the last chunk, trim it and stop decompressing\n        // note if it is the same block is minv it subtracts that already\n        // trimmed part of the slice length\n\n        chunks[i] = chunks[i].subarray(\n          0,\n          maxv.blockPosition === minv.blockPosition\n            ? maxv.dataPosition - minv.dataPosition + 1\n            : maxv.dataPosition + 1,\n        )\n\n        cpositions.push(cpos)\n        dpositions.push(dpos)\n        totalSize += chunks[i].length\n        break\n      }\n      totalSize += chunks[i].length\n      i++\n    } while (strm.avail_in)\n\n    const result = new Uint8Array(totalSize)\n    for (let i = 0, offset = 0; i < chunks.length; i++) {\n      result.set(chunks[i], offset)\n      offset += chunks[i].length\n    }\n    const buffer = Buffer.from(result)\n\n    return { buffer, cpositions, dpositions }\n  } catch (e) {\n    //cleanup error message\n    if (`${e}`.match(/incorrect header check/)) {\n      throw new Error(\n        'problem decompressing block: incorrect gzip header check',\n      )\n    }\n    throw e\n  }\n}\n\nfunction nodeUnzip() {\n  throw new Error('nodeUnzip not implemented.')\n}\n\nexport { unzip, unzipChunk, unzipChunkSlice, unzip as pakoUnzip, nodeUnzip }\n","import Long from 'long'\nimport { Buffer } from 'buffer'\nimport { LocalFile, GenericFilehandle } from 'generic-filehandle'\n\n// const COMPRESSED_POSITION = 0\nconst UNCOMPRESSED_POSITION = 1\n\nexport default class GziIndex {\n  filehandle: GenericFilehandle\n\n  index?: any\n\n  constructor({\n    filehandle,\n    path,\n  }: {\n    filehandle?: GenericFilehandle\n    path?: string\n  }) {\n    if (filehandle) {\n      this.filehandle = filehandle\n    } else if (path) {\n      this.filehandle = new LocalFile(path)\n    } else {\n      throw new TypeError('either filehandle or path must be defined')\n    }\n  }\n\n  _readLongWithOverflow(buf: Buffer, offset = 0, unsigned = true) {\n    //@ts-ignore\n    const long = Long.fromBytesLE(buf.slice(offset, offset + 8), unsigned)\n    if (\n      long.greaterThan(Number.MAX_SAFE_INTEGER) ||\n      long.lessThan(Number.MIN_SAFE_INTEGER)\n    ) {\n      throw new TypeError('integer overflow')\n    }\n\n    return long.toNumber()\n  }\n\n  _getIndex() {\n    if (!this.index) {\n      this.index = this._readIndex()\n    }\n    return this.index\n  }\n\n  async _readIndex() {\n    let buf = Buffer.allocUnsafe(8)\n    await this.filehandle.read(buf, 0, 8, 0)\n    const numEntries = this._readLongWithOverflow(buf, 0, true)\n    if (!numEntries) {\n      return [[0, 0]]\n    }\n\n    const entries = new Array(numEntries + 1)\n    entries[0] = [0, 0]\n\n    // TODO rewrite this to make an index-index that stays in memory\n    const bufSize = 8 * 2 * numEntries\n    if (bufSize > Number.MAX_SAFE_INTEGER) {\n      throw new TypeError('integer overflow')\n    }\n    buf = Buffer.allocUnsafe(bufSize)\n    await this.filehandle.read(buf, 0, bufSize, 8)\n    for (let entryNumber = 0; entryNumber < numEntries; entryNumber += 1) {\n      const compressedPosition = this._readLongWithOverflow(\n        buf,\n        entryNumber * 16,\n      )\n      const uncompressedPosition = this._readLongWithOverflow(\n        buf,\n        entryNumber * 16 + 8,\n      )\n      entries[entryNumber + 1] = [compressedPosition, uncompressedPosition]\n    }\n\n    return entries\n  }\n\n  async getLastBlock() {\n    const entries = await this._getIndex()\n    if (!entries.length) {\n      return undefined\n    }\n    return entries[entries.length - 1]\n  }\n\n  async getRelevantBlocksForRead(length: number, position: number) {\n    const endPosition = position + length\n    if (length === 0) {\n      return []\n    }\n    const entries = await this._getIndex()\n    const relevant = []\n\n    // binary search to find the block that the\n    // read starts in and extend forward from that\n    const compare = (entry: any, nextEntry: any) => {\n      const uncompressedPosition = entry[UNCOMPRESSED_POSITION]\n      const nextUncompressedPosition = nextEntry\n        ? nextEntry[UNCOMPRESSED_POSITION]\n        : Infinity\n      // block overlaps read start\n      if (\n        uncompressedPosition <= position &&\n        nextUncompressedPosition > position\n      ) {\n        return 0\n        // block is before read start\n      }\n      if (uncompressedPosition < position) {\n        return -1\n      }\n      // block is after read start\n      return 1\n    }\n\n    let lowerBound = 0\n    let upperBound = entries.length - 1\n    let searchPosition = Math.floor(entries.length / 2)\n\n    let comparison = compare(\n      entries[searchPosition],\n      entries[searchPosition + 1],\n    )\n    while (comparison !== 0) {\n      if (comparison > 0) {\n        upperBound = searchPosition - 1\n      } else if (comparison < 0) {\n        lowerBound = searchPosition + 1\n      }\n      searchPosition = Math.ceil((upperBound - lowerBound) / 2) + lowerBound\n      comparison = compare(entries[searchPosition], entries[searchPosition + 1])\n    }\n\n    // here's where we read forward\n    relevant.push(entries[searchPosition])\n    let i = searchPosition + 1\n    for (; i < entries.length; i += 1) {\n      relevant.push(entries[i])\n      if (entries[i][UNCOMPRESSED_POSITION] >= endPosition) {\n        break\n      }\n    }\n    if (relevant[relevant.length - 1][UNCOMPRESSED_POSITION] < endPosition) {\n      relevant.push([])\n    }\n    return relevant\n  }\n}\n","import { Buffer } from 'buffer'\nimport { LocalFile, GenericFilehandle } from 'generic-filehandle'\n\n// locals\nimport { unzip } from './unzip'\nimport GziIndex from './gziIndex'\n\nexport default class BgzFilehandle {\n  filehandle: GenericFilehandle\n  gzi: GziIndex\n\n  constructor({\n    filehandle,\n    path,\n    gziFilehandle,\n    gziPath,\n  }: {\n    filehandle?: GenericFilehandle\n    path?: string\n    gziFilehandle?: GenericFilehandle\n    gziPath?: string\n  }) {\n    if (filehandle) {\n      this.filehandle = filehandle\n    } else if (path) {\n      this.filehandle = new LocalFile(path)\n    } else {\n      throw new TypeError('either filehandle or path must be defined')\n    }\n\n    if (!gziFilehandle && !gziPath && !path) {\n      throw new TypeError('either gziFilehandle or gziPath must be defined')\n    }\n\n    this.gzi = new GziIndex({\n      filehandle: gziFilehandle,\n      path: !gziFilehandle && !gziPath && path ? gziPath : `${path}.gzi`,\n    })\n  }\n\n  async stat() {\n    const compressedStat = await this.filehandle.stat()\n    return Object.assign(compressedStat, {\n      size: await this.getUncompressedFileSize(),\n      blocks: undefined,\n      blksize: undefined,\n    })\n  }\n\n  async getUncompressedFileSize() {\n    // read the last block's ISIZE (see gzip RFC),\n    // and add it to its uncompressedPosition\n    const [, uncompressedPosition] = await this.gzi.getLastBlock()\n\n    const { size } = await this.filehandle.stat()\n\n    const buf = Buffer.allocUnsafe(4)\n    // note: there should be a 28-byte EOF marker (an empty block) at\n    // the end of the file, so we skip backward past that\n    const { bytesRead } = await this.filehandle.read(buf, 0, 4, size - 28 - 4)\n    if (bytesRead !== 4) {\n      throw new Error('read error')\n    }\n    const lastBlockUncompressedSize = buf.readUInt32LE(0)\n    return uncompressedPosition + lastBlockUncompressedSize\n  }\n\n  async _readAndUncompressBlock(\n    blockBuffer: Buffer,\n    [compressedPosition]: [number],\n    [nextCompressedPosition]: [number],\n  ) {\n    let next = nextCompressedPosition\n    if (!next) {\n      next = (await this.filehandle.stat()).size\n    }\n\n    // read the compressed data into the block buffer\n    const blockCompressedLength = next - compressedPosition\n\n    await this.filehandle.read(\n      blockBuffer,\n      0,\n      blockCompressedLength,\n      compressedPosition,\n    )\n\n    // uncompress it\n    const unzippedBuffer = await unzip(\n      blockBuffer.slice(0, blockCompressedLength),\n    )\n\n    return unzippedBuffer as Buffer\n  }\n\n  async read(buf: Buffer, offset: number, length: number, position: number) {\n    // get the block positions for this read\n    const blockPositions = await this.gzi.getRelevantBlocksForRead(\n      length,\n      position,\n    )\n    const blockBuffer = Buffer.allocUnsafe(32768 * 2)\n    // uncompress the blocks and read from them one at a time to keep memory usage down\n    let destinationOffset = offset\n    let bytesRead = 0\n    for (\n      let blockNum = 0;\n      blockNum < blockPositions.length - 1;\n      blockNum += 1\n    ) {\n      // eslint-disable-next-line no-await-in-loop\n      const uncompressedBuffer = await this._readAndUncompressBlock(\n        blockBuffer,\n        blockPositions[blockNum],\n        blockPositions[blockNum + 1],\n      )\n      const [, uncompressedPosition] = blockPositions[blockNum]\n      const sourceOffset =\n        uncompressedPosition >= position ? 0 : position - uncompressedPosition\n      const sourceEnd =\n        Math.min(\n          position + length,\n          uncompressedPosition + uncompressedBuffer.length,\n        ) - uncompressedPosition\n      if (sourceOffset >= 0 && sourceOffset < uncompressedBuffer.length) {\n        uncompressedBuffer.copy(buf, destinationOffset, sourceOffset, sourceEnd)\n        destinationOffset += sourceEnd - sourceOffset\n        bytesRead += sourceEnd - sourceOffset\n      }\n    }\n\n    return { bytesRead, buffer: buf }\n  }\n}\n"],"names":["MCScanAnchorsAdapter","BaseFeatureDataAdapter","setup","opts","this","setupP","setupPre","catch","e","undefined","assemblyNames","getConf","pm","pluginManager","bed1","openLocation","bed2","mcscan","bed1text","bed2text","mcscantext","Promise","all","map","r","readFile","bed1Map","parseBed","bed2Map","feats","split","filter","f","line","index","name1","name2","score","r1","get","r2","Error","hasDataForRefName","getRefNames","getFeatures","region","ObservableCreate","async","indexOf","assemblyName","flip","forEach","rowNum","f1","f2","refName","doesIntersect2","start","end","observer","next","SimpleFeature","uniqueId","syntenyId","strand","mate","complete","freeResources","text","Map","startsWith","name","file","buffer","TextDecoder","fatal","decode","isGzip","unzip","zip","a","b","i","decoder","parseLineByLine","cb","blockStart","entries","length","n","subarray","toString","trim","push","parsePAFLine","qname","qstart","qend","tname","tstart","tend","numMatches","blockLen","mappingQual","fields","extra","Object","fromEntries","field","slice","flipCigar","cigar","arr","op","swapIndelCigar","replaceAll","inputData","strm","pos","chunks","inflator","totalSize","remainingInput","Inflate","Z_SYNC_FLUSH","err","msg","next_in","result","avail_in","Uint8Array","offset","set","from","match","unzipChunkSlice","chunk","minv","maxv","cpos","blockPosition","dpos","dataPosition","cpositions","dpositions","len","origCpos","GziIndex","constructor","filehandle","path","TypeError","_readLongWithOverflow","buf","unsigned","long","greaterThan","Number","MAX_SAFE_INTEGER","lessThan","MIN_SAFE_INTEGER","toNumber","_getIndex","_readIndex","allocUnsafe","read","numEntries","Array","bufSize","entryNumber","compressedPosition","uncompressedPosition","getLastBlock","getRelevantBlocksForRead","position","endPosition","relevant","compare","entry","nextEntry","nextUncompressedPosition","Infinity","lowerBound","upperBound","searchPosition","Math","floor","comparison","ceil","BgzFilehandle","gziFilehandle","gziPath","gzi","stat","compressedStat","assign","size","getUncompressedFileSize","blocks","blksize","bytesRead","readUInt32LE","_readAndUncompressBlock","blockBuffer","nextCompressedPosition","blockCompressedLength","blockPositions","destinationOffset","blockNum","uncompressedBuffer","sourceOffset","sourceEnd","min","copy"],"sourceRoot":""}