docs: public long mark(long readLimit) throws IOException {
      if (readLimit < 0L) {
        throw new IllegalArgumentException("readLimit < 0: " + readLimit);
      }
  
      if (closed) {
        throw new IllegalStateException("closed");
      }
  
      // Mark the current position in the buffered source.
      long userOffset = offset - userBuffer.size();
  
      // If this is a new mark promote userBuffer data into the markBuffer.
      if (mark == -1L) {
        markBuffer.writeAll(userBuffer);
        mark = userOffset;
        offset = userOffset;
      }
  
      // Grow the limit if necessary.
      long newMarkBufferLimit = userOffset + readLimit;
      if (newMarkBufferLimit < 0) newMarkBufferLimit = Long.MAX_VALUE; // Long overflow!
      limit = Math.max(limit, newMarkBufferLimit);
  
      return userOffset;
    }