private void doPaintRange(Address paintStart, Address paintEnd, Field value)
			throws IOException {
		// Eliminating wrapping records makes the following logic much simpler
		splitAddressWrappingRecordIfExists();

		// examine the record before start to see if it merges with or is truncated by the new range
		paintStart = checkRecordBeforeRange(paintStart, paintEnd, value);
		if (paintStart == null) {
			// a returned null startAddr means the new range is already painted with that value
			return;
		}

		// eliminate ranges that are being painted over. Last range may need to be truncated
		paintEnd = fixupIntersectingRecords(paintStart, paintEnd, value);

		// see if there is a range just after this range that can be merged
		paintEnd = possiblyMergeWithNextRecord(paintEnd, value);

		// insert new range entry if value was specified, otherwise this was really a delete
		if (value != null) {
			createRecord(paintStart, paintEnd, value);
		}

		// remove table if empty
		if (rangeMapTable.getRecordCount() == 0) {
			dbHandle.deleteTable(tableName);
			rangeMapTable = null;
		}
	}
Returns a list of AddressRanges that this record represents. This record's key is the 
encoded start key and it "TO_COL" has the end address key. But since a non-zero image base
can cause that key range to be backwards in address space which means it represents a range
that starts in the upper addresses and then "wraps" to a lower address, resulting in two
address ranges, one and the bottom of the address space and one at the top of the address
space.
@param record a record that represents a contiguous range (in key space) of same values 
@return a list of AddressRanges that this record represents.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/util/AddressRangeMapDB.java