public static void decompressOverMemory(Program program, ArtCompression compression,
			TaskMonitor monitor) throws Exception {
		if (compression.getStorageMode() != ArtStorageMode.kStorageModeUncompressed) {
			Address sourceAddress = program.getMinAddress().add(compression.getCompressedOffset());
			byte[] compressedBytes = new byte[compression.getCompressedSize()];
			program.getMemory().getBytes(sourceAddress, compressedBytes);

			byte[] decompressedBytes = Decompressor.decompress(compression.getStorageMode(),
				compressedBytes, compression.getDecompressedSize(), monitor);

			Address destinationAddress =
				program.getMinAddress().add(compression.getDecompressedOffset());

			//make block exists for bytes...
			AddressSet destinationSet = new AddressSet(destinationAddress,
				destinationAddress.add(decompressedBytes.length));
			AddressSet uncreatedSet = destinationSet.subtract(program.getMemory());
			for (AddressRange range : uncreatedSet) {
				monitor.checkCancelled();
				program.getMemory()
						.createInitializedBlock(toBlockName(range), range.getMinAddress(),
							range.getLength(), (byte) 0x00, monitor, false);
			}

			program.getMemory().setBytes(destinationAddress, decompressedBytes);
		}
	}
Decompress the block bytes and lay over program memory. 
@param program the program to overwrite
@param compression type of compression
@param monitor task monitor for controlling the task
@throws Exception should an error occur reading the bytes
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/util/DecompressionManager.java