anchor.diff:  	}
   
   	final _Node _root;
  -	final ctl = new List(); //TODO StreamController();
  -	final stack = new List();
  +	final _buffer = new StringBuffer();
  +	final _stack = new List();
   	final _htmlEscapeMap = new Map<int, String>();
   
   	render(values) {
  -		ctl.clear();
  -		stack.clear();
  -		stack.add(values);	
  -		_root.children.forEach(_render_Node);
  -		return ctl.join('');
  +		_buffer.clear();
  +		_stack.clear();
  +		_stack.add(values);	
  +		_root.children.forEach(_renderNode);
  +		var s = _buffer.toString();
  +		_buffer.clear();
  +		return s;
   	}
   
  -	_render_Node(node) {
  +	_write(String output) => _buffer.write(output);
  +
  +	_renderNode(node) {
   		switch (node.type) {
   			case _TEXT:
   				_renderText(node);
  
positive.code: }
  
  _visit(_Node root, visitor(_Node n)) {
  	var stack = new List<_Node>()..add(root);
  	while (!stack.isEmpty) {
  		var node = stack.removeLast();
  		stack.addAll(node.children);
  		visitor(node);
  	}
  }
  
negative.code: 	}
  
  	_renderInvSection(node) {
  		final value = _stack.last[node.value];
  		if ((value is List && value.isEmpty)
  				|| value == null
  				|| value == false) {
  