final int read(int len, int off, int i_3_, byte[] dest) throws IOException {
	anInt4555++;
	if ((len ^ 0xffffffff) > -1 || (off ^ 0xffffffff) > -1 || (off + len ^ 0xffffffff) < (dest.length ^ 0xffffffff))
	    throw new IOException();
	synchronized (this) {
	    int i_4_;
	    if ((anInt4558 ^ 0xffffffff) <= (anInt4556 ^ 0xffffffff))
		i_4_ = anInt4558 - anInt4556;
	    else
		i_4_ = bufferSize + (-anInt4556 - -anInt4558);
	    if ((len ^ 0xffffffff) < (i_4_ ^ 0xffffffff))
		len = i_4_;
	    if (i_3_ == len && ioexception != null)
		throw new IOException(ioexception.toString());
	    if (bufferSize < len + anInt4556) {
		int bufferOff = bufferSize - anInt4556;
		ArrayUtils.arrayCopy(buffer, anInt4556, dest, off, bufferOff);
		ArrayUtils.arrayCopy(buffer, 0, dest, off + bufferOff, len - bufferOff);
	    } else
		ArrayUtils.arrayCopy(buffer, anInt4556, dest, off, len);
	    anInt4556 = (anInt4556 + len) % bufferSize;
	    this.notifyAll();
	    return len;
	}
    }