private int get() throws IOException {
		if (start > end) {
			if (end > BACK) {
				int len = Math.min(BACK, end - BACK  + 1);
				System.arraycopy(buf, end + 1 - len, buf, BACK - len, len);
				back = BACK - len;
			}
			if (in != null) {
				if (!in.markSupported()) in = new BufferedInputStream(in);
				this.reader = new InputStreamReader(in, determineEncoding(in));
				this.in = null;
			}
			int size = reader.read(buf, BACK, buf.length-BACK);
			if (size != -1) {
				mark = (mark > end - BACK) ? BACK - (end - mark + 1) : -1;
				start = BACK;
				end = BACK + size - 1;
			} else {
				start++;
				return -1;
			}
		}
		return buf[start++];
	}