docs: def seek(self, ofs, whence=0):
          """Seek in data.
  
          On uncompressed files, the seeking works by actual
          seeks so it's fast.  On compresses files its slow
          - forward seeking happends by reading ahead,
          backwards by re-opening and decompressing from the start.
          """
  
          # disable crc check when seeking
          self._md_context = NoHashContext()
  
          fsize = self._inf.file_size
          cur_ofs = self.tell()
  
          if whence == 0:     # seek from beginning of file
              new_ofs = ofs
          elif whence == 1:   # seek from current position
              new_ofs = cur_ofs + ofs
          elif whence == 2:   # seek from end of file
              new_ofs = fsize + ofs
          else:
              raise ValueError('Invalid value for whence')
  
          # sanity check
          if new_ofs < 0:
              new_ofs = 0
          elif new_ofs > fsize:
              new_ofs = fsize
  
          # do the actual seek
          if new_ofs >= cur_ofs:
              self._skip(new_ofs - cur_ofs)
          else:
              # reopen and seek
              self._open()
              self._skip(new_ofs)
          return self.tell()