code: func separateChange(zones map[string]*dns.ManagedZone, change *dns.Change) map[string]*dns.Change {
  	changes := make(map[string]*dns.Change)
  	zoneNameIDMapper := zoneIDName{}
  	for _, z := range zones {
  		zoneNameIDMapper[z.Name] = z.DnsName
  		changes[z.Name] = &dns.Change{
  			Additions: []*dns.ResourceRecordSet{},
  			Deletions: []*dns.ResourceRecordSet{},
  		}
  	}
  	for _, a := range change.Additions {
  		if zoneName, _ := zoneNameIDMapper.FindZone(ensureTrailingDot(a.Name)); zoneName != "" {
  			changes[zoneName].Additions = append(changes[zoneName].Additions, a)
  		} else {
  			log.Warnf("No matching zone for record addition: %s %s %s %d", a.Name, a.Type, a.Rrdatas, a.Ttl)
  		}
  	}
  
  	for _, d := range change.Deletions {
  		if zoneName, _ := zoneNameIDMapper.FindZone(ensureTrailingDot(d.Name)); zoneName != "" {
  			changes[zoneName].Deletions = append(changes[zoneName].Deletions, d)
  		} else {
  			log.Warnf("No matching zone for record deletion: %s %s %s %d", d.Name, d.Type, d.Rrdatas, d.Ttl)
  		}
  	}
  
  	// separating a change could lead to empty sub changes, remove them here.
  	for zone, change := range changes {
  		if len(change.Additions) == 0 && len(change.Deletions) == 0 {
  			delete(changes, zone)
  		}
  	}
  
  	return changes
  }
docs: // separateChange separates a multi-zone change into a single change per zone.