code: func (fs *Filters) Install(watcher *Filter) (string, error) {
  	if watcher.KeySym != nil && watcher.KeyAsym != nil {
  		return "", fmt.Errorf("filters must choose between symmetric and asymmetric keys")
  	}
  
  	if watcher.Messages == nil {
  		watcher.Messages = make(map[common.Hash]*ReceivedMessage)
  	}
  
  	id, err := GenerateRandomID()
  	if err != nil {
  		return "", err
  	}
  
  	fs.mutex.Lock()
  	defer fs.mutex.Unlock()
  
  	if fs.watchers[id] != nil {
  		return "", fmt.Errorf("failed to generate unique ID")
  	}
  
  	if watcher.expectsSymmetricEncryption() {
  		watcher.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym)
  	}
  
  	watcher.id = id
  	fs.watchers[id] = watcher
  	fs.addTopicMatcher(watcher)
  	return id, err
  }
docs: // Install will add a new filter to the filter collection