anchor.diff:              | true, TemplateHole.AfterRender (_, handler) ->
                   e.RemoveAttribute("ws-onafterrender")
                   addAttr e (Attr.OnAfterRender handler)
  -            | _ -> Console.Warn("Unfilled onafterrender", name)
  +            | true, _ -> Console.Warn("onafterrender hole filled with non-onafterrender data", name)
  +            | false, _ -> ()
   
           DomUtility.IterSelector el "[ws-var]" <| fun e ->
               let name = e.GetAttribute("ws-var")
  
positive.code:             e.RemoveAttribute("ws-attr")
              match fw.TryGetValue(name) with
              | true, TemplateHole.Attribute (_, attr) -> addAttr e attr
              | _ -> Console.Warn("Unfilled attr", name)
  
          DomUtility.IterSelector el "[ws-on]" <| fun e ->
              e.GetAttribute("ws-on").Split([|' '|], StringSplitOptions.RemoveEmptyEntries)
  
negative.code:             | true, TemplateHole.VarIntUnchecked (_, var) -> addAttr e (Attr.IntValueUnchecked var)
              | true, TemplateHole.VarFloat (_, var) -> addAttr e (Attr.FloatValue var)
              | true, TemplateHole.VarFloatUnchecked (_, var) -> addAttr e (Attr.FloatValueUnchecked var)
              | true, _ -> Console.Warn("Var hole filled with non-Var data", name)
              | false, _ -> ()
  
          DomUtility.IterSelector el "[ws-attr-holes]" <| fun e ->
              let re = new RegExp(Docs.TextHoleRE, "g")
  