@Nullable
 @Override
 public SReference create(@NotNull TemplateGenerator generator) {
   if (myInputTargetNode != null) {
     // output target node might has been copied (reduced) from the input target node
     // here accept only one-to-one copying
     SNode ultimateTarget = generator.findCopiedOutputNodeForInputNode_unique(myInputTargetNode);
     if (ultimateTarget != null) {
       return createStaticReference(ultimateTarget);
     }
     String resolveInfo = jetbrains.mps.util.SNodeOperations.getResolveInfo(myInputTargetNode);
     if (resolveInfo != null) {
       return createDynamicReference(resolveInfo, getTargetModelReference(generator), null);
     }
     // if input was copied - return one of its copies
     // this can easy produce incorrect references
     SNode ambiguousTarget = generator.findCopiedOutputNodeForInputNode(myInputTargetNode);
     if (ambiguousTarget != null) {
       // RI_CIN is the only case doResolve_Tricky was implemented and hence checkResolveTarget
       // check moved here.
       if (checkResolvedTarget(generator, ambiguousTarget)) {
         return createStaticReference(ambiguousTarget);
       } else {
         return jetbrains.mps.smodel.SReference.create(
             getReferenceRole(),
             getOutputSourceNode(),
             generator.getOutputModel().getReference(),
             null,
             null);
       }
     }
   }
   return createInvalidReference(generator, null);
 }