code: func (i *item) toMsg(m *dns.Msg) *dns.Msg {
  	m1 := new(dns.Msg)
  	m1.SetReply(m)
  
  	m1.Authoritative = false
  	m1.AuthenticatedData = i.AuthenticatedData
  	m1.RecursionAvailable = i.RecursionAvailable
  	m1.Rcode = i.Rcode
  	m1.Compress = true
  
  	m1.Answer = make([]dns.RR, len(i.Answer))
  	m1.Ns = make([]dns.RR, len(i.Ns))
  	m1.Extra = make([]dns.RR, len(i.Extra))
  
  	ttl := uint32(i.ttl(time.Now()))
  	if ttl < minTTL {
  		ttl = minTTL
  	}
  
  	for j, r := range i.Answer {
  		m1.Answer[j] = dns.Copy(r)
  		m1.Answer[j].Header().Ttl = ttl
  	}
  	for j, r := range i.Ns {
  		m1.Ns[j] = dns.Copy(r)
  		m1.Ns[j].Header().Ttl = ttl
  	}
  	for j, r := range i.Extra {
  		m1.Extra[j] = dns.Copy(r)
  		if m1.Extra[j].Header().Rrtype != dns.TypeOPT {
  			m1.Extra[j].Header().Ttl = ttl
  		}
  	}
  	return m1
  }
docs: // toMsg turns i into a message, it tailors the reply to m.
  // The Authoritative bit is always set to 0, because the answer is from the cache.