private List<Integer> deserializedCompressedHashBuckets(PdbByteReader reader)
			throws PdbException, CancelledException {

		List<Integer> hashBucketOffsets = new ArrayList<>();

		PdbByteReader bitEncoderReader = reader.getSubPdbByteReader(hashRecordsBitMapLength);
		// Throw away extra bytes between bit map and buckets.
		reader.getSubPdbByteReader(numExtraBytes);
		while (bitEncoderReader.hasMore() && reader.hasMore()) {
			pdb.checkCancelled();
			long val = bitEncoderReader.parseUnsignedIntVal();
			//bitEncoded[index++] = val;
			for (int bit = 0; bit < 32 && reader.hasMore(); bit++) {
				pdb.checkCancelled();
				if ((val & 0x01L) == 0x01L) {
					hashBucketOffsets.add(reader.parseInt());
				}
				else {
					hashBucketOffsets.add(-1);
				}
				val >>= 1;
			}
		}
		// Both readers should run out of data at the same time.  We can have more bit encoder
		// data as long as there are not more bits set in the values.  The following logic
		// checks this integrity.
		if (reader.hasMore()) {
			throw new PdbException("Compressed GSI Hash Buckets corrupt");
		}
		while (bitEncoderReader.hasMore()) {
			pdb.checkCancelled();
			if (bitEncoderReader.parseUnsignedIntVal() != 0) {
				throw new PdbException("Compressed GSI Hash Buckets corrupt");
			}
		}
		return hashBucketOffsets;

	}
Deserializes a compressed set of hash buckets from the {@link PdbByteReader} provided.  The
data comes as a bit-mapped representation of which indices should contain the data followed
by a flat set of hash buckets that will be set at those indices in the order provided
@param reader {@link PdbByteReader} containing the data buffer to process
@throws PdbException upon not enough data left to parse
@throws CancelledException upon user cancellation
Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/AbstractSymbolInformation.java