static vInteger intParse(byte[] data, int i, int j) {
private static vInteger intParse(byte[] data, int i, int j) {
static vInteger intParse(byte[] data, int i, int j) {	// parse as integer    byte c;    int n;    long v;    boolean neg = false;    if (i >= j) {	return null;		// empty    }    c = data[i];    if (c == '-') {	neg = true;	i++;    }    if ((i < j) && ((v = data[i] - '0') >= 0) && (v < 10)) {	i++;    } else {	return null;	// failed; no digit    }    while ((i < j) && ((n = data[i] - '0') >= 0) && (n < 10)) {	if (v > Long.MAX_VALUE / 10) {	    break;	}	v = 10 * v + n;	i++;    }    if (i >= j) {		// if successful parse	return vInteger.New(neg ? -v : v);    }    c = data[i++];    if ((i >= j) || (v < 2) || (v > 36) || (c != 'r' && c != 'R')) {	return null;		// unsuccessful    }    // parse remainder of string using specified radix    int base = (int) v;		// radix    v = 0;			// value    long lim = Long.MAX_VALUE / base;    while (i < j) {	if (v > lim) {		// this overflow check is slightly too simple	    return null;	}	c = data[i++];	if (c >= '0' && c <= '9') {	    n = c - '0';	} else if (c >= 'A' && c <= 'Z') {	    n = c - 'A' + 10;	} else if (c >= 'a' && c <= 'z') {	    n = c - 'a' + 10;	} else {	    return null;	// illegal digit	}	if (n >= base) {	    return null;	}	v = base * v + n;    }    return vInteger.New(neg ? -v : v);}