@Override
    Object unpack(Info vi, Buffer opb) {
        int acc = 0;
        InfoResidue0 info = new InfoResidue0();
        info.begin = opb.read(24);
        info.end = opb.read(24);
        info.grouping = opb.read(24) + 1;
        info.partitions = opb.read(6) + 1;
        info.groupbook = opb.read(8);

        for (int j = 0; j < info.partitions; j++) {
            int cascade = opb.read(3);
            if (opb.read(1) != 0) {
                cascade |= (opb.read(5) << 3);
            }
            info.secondstages[j] = cascade;
            acc += Util.icount(cascade);
        }

        for (int j = 0; j < acc; j++) {
            info.booklist[j] = opb.read(8);
        }

        if (info.groupbook >= vi.books) {
            free_info(info);
            return (null);
        }

        for (int j = 0; j < acc; j++) {
            if (info.booklist[j] >= vi.books) {
                free_info(info);
                return (null);
            }
        }
        return (info);
    }