code: private void registerSTV(String source,
                               String target,
                               String variant) {
          // assert(source.length() > 0);
          // assert(target.length() > 0);
          CaseInsensitiveString cisrc = new CaseInsensitiveString(source);
          CaseInsensitiveString citrg = new CaseInsensitiveString(target);
          CaseInsensitiveString civar = new CaseInsensitiveString(variant);
          Map<CaseInsensitiveString, List<CaseInsensitiveString>> targets = specDAG.get(cisrc);
          if (targets == null) {
              targets = Collections.synchronizedMap(new HashMap<CaseInsensitiveString, List<CaseInsensitiveString>>());
              specDAG.put(cisrc, targets);
          }
          List<CaseInsensitiveString> variants = targets.get(citrg);
          if (variants == null) {
              variants = new ArrayList<CaseInsensitiveString>();
              targets.put(citrg, variants);
          }
          // assert(NO_VARIANT == "");
          // We add the variant string.  If it is the special "no variant"
          // string, that is, the empty string, we add it at position zero.
          if (!variants.contains(civar)) {
              if (variant.length() > 0) {
                  variants.add(civar);
              } else {
                  variants.add(0, civar);
              }
          }
      }
docs: Register a source-target/variant in the specDAG.  Variant may be
  empty, but source and target must not be.  If variant is empty then
  the special variant NO_VARIANT is stored in slot zero of the
  UVector of variants.