@Override
	public ListingField getField(ProxyObj<?> proxy, int varWidth) {
		Object obj = proxy.getObject();
		if (!enabled || !(obj instanceof CodeUnit)) {
			return null;
		}
		CodeUnit cu = (CodeUnit) obj;

		StringPropertyMap taintMap =
			cu.getProgram().getUsrPropertyManager().getStringPropertyMap(PROPERTY_NAME);
		if (taintMap == null) {
			return null;
		}

		TaintVec vec = new TaintVec(cu.getLength());
		for (int i = 0; i < vec.length; i++) {
			String taintString = taintMap.getString(cu.getAddress().add(i));
			vec.set(i, taintString == null ? TaintSet.EMPTY : TaintSet.parse(taintString));
		}

		return ListingTextField.createSingleLineTextField(this, proxy,
			new TextFieldElement(new AttributedString(vec.toDisplay(), COLOR, getMetrics()), 0, 0),
			startX + varWidth, width, hlProvider);
	}
{@inheritDoc}

<p>
This is where the most of the rendering logic is. Here, we access the property map and
deserialize into a {@link TaintVec} manually (as compared to using a state piece as we did in
{@link TaintDebuggerRegisterColumnFactory}). Once we have the complete vector, we render it
for display.
Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/taint/gui/field/TaintFieldFactory.java