code: func (p *Parser) Start() (err error) {
  	var msg *outerMessage
  
  	defer p.afterStop()
  
  	defer func() {
  		if x, ok := recover().(error); ok {
  			err = x
  		}
  	}()
  
  	// Loop through all outer messages until we're signaled to stop. Stopping
  	// happens when either the OnCDemoStop message is encountered or
  	// parser.Stop() is called programatically.
  	for !p.isStopping {
  		if p.stopAtTick > 0 && p.Tick > p.stopAtTick {
  			return
  		}
  
  		msg, err = p.readOuterMessage()
  		if err != nil {
  			if err == io.EOF {
  				err = nil
  			}
  			return
  		}
  
  		p.Tick = msg.tick
  
  		if err = p.Callbacks.callByDemoType(msg.typeId, msg.data); err != nil {
  			return
  		}
  	}
  
  	return
  }
docs: // Start parsing the replay. Will stop processing new events after Stop() is called.