private void performMergeData(Data data, boolean copyBytes)
			throws CodeUnitInsertionException, MemoryAccessException {
		Address minAddress = data.getMinAddress();
		Address maxAddress = data.getMaxAddress();
		Program fromPgm = data.getProgram();
		DataType dt = data.getDataType();
		DataTypeManager fromDTM = fromPgm.getDataTypeManager();
		long dtID = fromDTM.getID(dt);
		if (!(dt instanceof BuiltInDataType)) {
			dt = (dt != DataType.DEFAULT) ? getResultDataType(dtID, fromPgm) : DataType.DEFAULT;
		}
		boolean hasNewData = false;
		Listing resultListing = resultPgm.getListing();

		if (copyBytes && !resultUninitSet.intersects(minAddress, maxAddress)) {
			ProgramMemoryUtil.copyBytesInRanges(resultPgm, fromPgm, minAddress, maxAddress);
		}
		if (!(dt.equals(DataType.DEFAULT))) {
			DataType tmpDt = dt;
			resultListing.createData(minAddress, tmpDt, data.getLength());
			hasNewData = true;
		}
		if (hasNewData) {
			Data newData = resultListing.getDataAt(minAddress);
			String[] settingNames = data.getNames();
			for (String settingName : settingNames) {
				Object obj = data.getValue(settingName);
				if (obj != null) {
					newData.setValue(settingName, obj);
				}
			}
		}
	}
<CODE>performMergeData</CODE> merges the indicated defined data
into the merge program. The bytes in the merge program are not affected
by this method.

@param data the defined data to be merged
@param copyBytes whether or not bytes should be copied.
@throws CodeUnitInsertionException if the defined data can't be created
in the merge program.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/CodeUnitMerger.java