func (tr *TemplateRecord) unmarshal(r *reader.Reader) error {
	var (
		th  = TemplateHeader{}
		tf  = TemplateFieldSpecifier{}
		err error
	)
	if err = th.unmarshal(r); err != nil {
		return err
	}
	tr.TemplateID = th.TemplateID
	tr.FieldCount = th.FieldCount
	for i := th.FieldCount; i > 0; i-- {
		if err = tf.unmarshal(r); err != nil {
			return err
		}
		tr.FieldSpecifiers = append(tr.FieldSpecifiers, tf)
	}
	return nil
}
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Template ID 256          |         Field Count           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Field Type 1           |         Field Length 1        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Field Type 2           |         Field Length 2        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             ...               |              ...              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Field Type N           |         Field Length N        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
package netflow9
import (
	"bytes"
	"errors"
	"fmt"
	"io"
	"net"
	"github.com/EdgeCast/vflow/ipfix"
	"github.com/EdgeCast/vflow/reader"
)
type nonfatalError error
type PacketHeader struct {
	Version   uint16  
	Count     uint16  
	SysUpTime uint32  
	UNIXSecs  uint32  
	SeqNum    uint32  
	SrcID     uint32  
}
type SetHeader struct {
	FlowSetID uint16  
	Length    uint16  
}
type TemplateHeader struct {
	TemplateID     uint16  
	FieldCount     uint16  
	OptionLen      uint16  
	OptionScopeLen uint16  
}
type TemplateFieldSpecifier struct {
	ElementID uint16
	Length    uint16
}
type TemplateRecord struct {
	TemplateID           uint16
	FieldCount           uint16
	FieldSpecifiers      []TemplateFieldSpecifier
	ScopeFieldCount      uint16
	ScopeFieldSpecifiers []TemplateFieldSpecifier
}
type DecodedField struct {
	ID    uint16
	Value interface{}
}
type Decoder struct {
	raddr  net.IP
	reader *reader.Reader
}
type Message struct {
	AgentID  string
	Header   PacketHeader
	DataSets [][]DecodedField
}
func (h *PacketHeader) unmarshal(r *reader.Reader) error {
	var err error
	if h.Version, err = r.Uint16(); err != nil {
		return err
	}
	if h.Count, err = r.Uint16(); err != nil {
		return err
	}
	if h.SysUpTime, err = r.Uint32(); err != nil {
		return err
	}
	if h.UNIXSecs, err = r.Uint32(); err != nil {
		return err
	}
	if h.SeqNum, err = r.Uint32(); err != nil {
		return err
	}
	if h.SrcID, err = r.Uint32(); err != nil {
		return err
	}
	return nil
}
func (h *PacketHeader) validate() error {
	if h.Version != 9 {
		return fmt.Errorf("invalid netflow version (%d)", h.Version)
	}
	return nil
}
func (h *SetHeader) unmarshal(r *reader.Reader) error {
	var err error
	if h.FlowSetID, err = r.Uint16(); err != nil {
		return err
	}
	if h.Length, err = r.Uint16(); err != nil {
		return err
	}
	return nil
}
func (t *TemplateHeader) unmarshal(r *reader.Reader) error {
	var err error
	if t.TemplateID, err = r.Uint16(); err != nil {
		return err
	}
	if t.FieldCount, err = r.Uint16(); err != nil {
		return err
	}
	return nil
}
func (t *TemplateHeader) unmarshalOpts(r *reader.Reader) error {
	var err error
	if t.TemplateID, err = r.Uint16(); err != nil {
		return err
	}
	if t.OptionScopeLen, err = r.Uint16(); err != nil {
		return err
	}
	if t.OptionLen, err = r.Uint16(); err != nil {
		return err
	}
	return nil
}
func (f *TemplateFieldSpecifier) unmarshal(r *reader.Reader) error {
	var err error
	if f.ElementID, err = r.Uint16(); err != nil {
		return err
	}
	if f.Length, err = r.Uint16(); err != nil {
		return err
	}
	return nil
}