code: public int drainTo(@NotNull byte[] dest, int destOffset, int maxSize) {
  		int s = maxSize;
  		while (hasRemaining()) {
  			ByteBuf buf = bufs[first];
  			int remaining = buf.readRemaining();
  			if (s < remaining) {
  				arraycopy(buf.array(), buf.head(), dest, destOffset, s);
  				buf.moveHead(s);
  				return maxSize;
  			} else {
  				arraycopy(buf.array(), buf.head(), dest, destOffset, remaining);
  				buf.recycle();
  				first = next(first);
  				s -= remaining;
  				destOffset += remaining;
  			}
  		}
  		return maxSize - s;
  	}
docs: Adds {@code maxSize} bytes from this queue to {@code dest} if queue
  contains more than {@code maxSize} bytes. Otherwise adds all
  bytes from queue to {@code dest}. In both cases increases queue's
  position to the number of drained bytes.
  
  @param dest       array to drain to
  @param destOffset start position for adding to dest
  @param maxSize    number of bytes for adding
  @return number of drained bytes