// Code generated by protoc-gen-go. DO NOT EDIT.
// source: api/bbsim/bbsim.proto

package bbsim

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	openolt "github.com/opencord/voltha-protos/v5/go/openolt"
	tech_profile "github.com/opencord/voltha-protos/v5/go/tech_profile"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type SubActionTypes int32

const (
	SubActionTypes_JOIN   SubActionTypes = 0
	SubActionTypes_LEAVE  SubActionTypes = 1
	SubActionTypes_JOINV3 SubActionTypes = 2
)

var SubActionTypes_name = map[int32]string{
	0: "JOIN",
	1: "LEAVE",
	2: "JOINV3",
}

var SubActionTypes_value = map[string]int32{
	"JOIN":   0,
	"LEAVE":  1,
	"JOINV3": 2,
}

func (x SubActionTypes) String() string {
	return proto.EnumName(SubActionTypes_name, int32(x))
}

func (SubActionTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{0}
}

type OltAllocatedResourceType_Type int32

const (
	OltAllocatedResourceType_UNKNOWN  OltAllocatedResourceType_Type = 0
	OltAllocatedResourceType_ALLOC_ID OltAllocatedResourceType_Type = 1
	OltAllocatedResourceType_GEM_PORT OltAllocatedResourceType_Type = 2
)

var OltAllocatedResourceType_Type_name = map[int32]string{
	0: "UNKNOWN",
	1: "ALLOC_ID",
	2: "GEM_PORT",
}

var OltAllocatedResourceType_Type_value = map[string]int32{
	"UNKNOWN":  0,
	"ALLOC_ID": 1,
	"GEM_PORT": 2,
}

func (x OltAllocatedResourceType_Type) String() string {
	return proto.EnumName(OltAllocatedResourceType_Type_name, int32(x))
}

func (OltAllocatedResourceType_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{4, 0}
}

// These types correspond to the messages permitted in the oneof
// in AlarmIndication in the openolt protos
type AlarmType_Types int32

const (
	AlarmType_LOS                                   AlarmType_Types = 0
	AlarmType_DYING_GASP                            AlarmType_Types = 1
	AlarmType_ONU_ALARM                             AlarmType_Types = 2
	AlarmType_ONU_STARTUP_FAILURE                   AlarmType_Types = 3
	AlarmType_ONU_SIGNAL_DEGRADE                    AlarmType_Types = 4
	AlarmType_ONU_DRIFT_OF_WINDOW                   AlarmType_Types = 5
	AlarmType_ONU_LOSS_OF_OMCI_CHANNEL              AlarmType_Types = 6
	AlarmType_ONU_SIGNALS_FAILURE                   AlarmType_Types = 7
	AlarmType_ONU_TRANSMISSION_INTERFERENCE_WARNING AlarmType_Types = 8
	AlarmType_ONU_ACTIVATION_FAILURE                AlarmType_Types = 9
	AlarmType_ONU_PROCESSING_ERROR                  AlarmType_Types = 10
	AlarmType_ONU_LOSS_OF_KEY_SYNC_FAILURE          AlarmType_Types = 11
	AlarmType_ONU_ITU_PON_STATS                     AlarmType_Types = 12
	// These break out ONU_ALARM, which is a single message, but
	// includes statuses for these six alarms.
	AlarmType_ONU_ALARM_LOS            AlarmType_Types = 13
	AlarmType_ONU_ALARM_LOB            AlarmType_Types = 14
	AlarmType_ONU_ALARM_LOPC_MISS      AlarmType_Types = 15
	AlarmType_ONU_ALARM_LOPC_MIC_ERROR AlarmType_Types = 16
	AlarmType_ONU_ALARM_LOFI           AlarmType_Types = 17
	AlarmType_ONU_ALARM_LOAMI          AlarmType_Types = 18
)

var AlarmType_Types_name = map[int32]string{
	0:  "LOS",
	1:  "DYING_GASP",
	2:  "ONU_ALARM",
	3:  "ONU_STARTUP_FAILURE",
	4:  "ONU_SIGNAL_DEGRADE",
	5:  "ONU_DRIFT_OF_WINDOW",
	6:  "ONU_LOSS_OF_OMCI_CHANNEL",
	7:  "ONU_SIGNALS_FAILURE",
	8:  "ONU_TRANSMISSION_INTERFERENCE_WARNING",
	9:  "ONU_ACTIVATION_FAILURE",
	10: "ONU_PROCESSING_ERROR",
	11: "ONU_LOSS_OF_KEY_SYNC_FAILURE",
	12: "ONU_ITU_PON_STATS",
	13: "ONU_ALARM_LOS",
	14: "ONU_ALARM_LOB",
	15: "ONU_ALARM_LOPC_MISS",
	16: "ONU_ALARM_LOPC_MIC_ERROR",
	17: "ONU_ALARM_LOFI",
	18: "ONU_ALARM_LOAMI",
}

var AlarmType_Types_value = map[string]int32{
	"LOS":                                   0,
	"DYING_GASP":                            1,
	"ONU_ALARM":                             2,
	"ONU_STARTUP_FAILURE":                   3,
	"ONU_SIGNAL_DEGRADE":                    4,
	"ONU_DRIFT_OF_WINDOW":                   5,
	"ONU_LOSS_OF_OMCI_CHANNEL":              6,
	"ONU_SIGNALS_FAILURE":                   7,
	"ONU_TRANSMISSION_INTERFERENCE_WARNING": 8,
	"ONU_ACTIVATION_FAILURE":                9,
	"ONU_PROCESSING_ERROR":                  10,
	"ONU_LOSS_OF_KEY_SYNC_FAILURE":          11,
	"ONU_ITU_PON_STATS":                     12,
	"ONU_ALARM_LOS":                         13,
	"ONU_ALARM_LOB":                         14,
	"ONU_ALARM_LOPC_MISS":                   15,
	"ONU_ALARM_LOPC_MIC_ERROR":              16,
	"ONU_ALARM_LOFI":                        17,
	"ONU_ALARM_LOAMI":                       18,
}

func (x AlarmType_Types) String() string {
	return proto.EnumName(AlarmType_Types_name, int32(x))
}

func (AlarmType_Types) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{17, 0}
}

type PONPort struct {
	ID            int32  `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	OperState     string `protobuf:"bytes,2,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState string `protobuf:"bytes,3,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	PacketCount   uint64 `protobuf:"varint,4,opt,name=PacketCount,proto3" json:"PacketCount,omitempty"`
	// ONU ID are reported by VOLTHA in the ActivateOnu call
	AllocatedOnuIds []*PonAllocatedResources `protobuf:"bytes,5,rep,name=AllocatedOnuIds,proto3" json:"AllocatedOnuIds,omitempty"`
	// these are the stored resource IDs as reported via OMCI
	AllocatedGemPorts    []*PonAllocatedResources `protobuf:"bytes,6,rep,name=AllocatedGemPorts,proto3" json:"AllocatedGemPorts,omitempty"`
	AllocatedAllocIds    []*PonAllocatedResources `protobuf:"bytes,7,rep,name=AllocatedAllocIds,proto3" json:"AllocatedAllocIds,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *PONPort) Reset()         { *m = PONPort{} }
func (m *PONPort) String() string { return proto.CompactTextString(m) }
func (*PONPort) ProtoMessage()    {}
func (*PONPort) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{0}
}

func (m *PONPort) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PONPort.Unmarshal(m, b)
}
func (m *PONPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PONPort.Marshal(b, m, deterministic)
}
func (m *PONPort) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PONPort.Merge(m, src)
}
func (m *PONPort) XXX_Size() int {
	return xxx_messageInfo_PONPort.Size(m)
}
func (m *PONPort) XXX_DiscardUnknown() {
	xxx_messageInfo_PONPort.DiscardUnknown(m)
}

var xxx_messageInfo_PONPort proto.InternalMessageInfo

func (m *PONPort) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

func (m *PONPort) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *PONPort) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *PONPort) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *PONPort) GetAllocatedOnuIds() []*PonAllocatedResources {
	if m != nil {
		return m.AllocatedOnuIds
	}
	return nil
}

func (m *PONPort) GetAllocatedGemPorts() []*PonAllocatedResources {
	if m != nil {
		return m.AllocatedGemPorts
	}
	return nil
}

func (m *PONPort) GetAllocatedAllocIds() []*PonAllocatedResources {
	if m != nil {
		return m.AllocatedAllocIds
	}
	return nil
}

type PonAllocatedResources struct {
	SerialNumber         string   `protobuf:"bytes,1,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	Id                   int32    `protobuf:"varint,2,opt,name=Id,proto3" json:"Id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PonAllocatedResources) Reset()         { *m = PonAllocatedResources{} }
func (m *PonAllocatedResources) String() string { return proto.CompactTextString(m) }
func (*PonAllocatedResources) ProtoMessage()    {}
func (*PonAllocatedResources) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{1}
}

func (m *PonAllocatedResources) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PonAllocatedResources.Unmarshal(m, b)
}
func (m *PonAllocatedResources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PonAllocatedResources.Marshal(b, m, deterministic)
}
func (m *PonAllocatedResources) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PonAllocatedResources.Merge(m, src)
}
func (m *PonAllocatedResources) XXX_Size() int {
	return xxx_messageInfo_PonAllocatedResources.Size(m)
}
func (m *PonAllocatedResources) XXX_DiscardUnknown() {
	xxx_messageInfo_PonAllocatedResources.DiscardUnknown(m)
}

var xxx_messageInfo_PonAllocatedResources proto.InternalMessageInfo

func (m *PonAllocatedResources) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

func (m *PonAllocatedResources) GetId() int32 {
	if m != nil {
		return m.Id
	}
	return 0
}

type NNIPort struct {
	ID                   int32    `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	OperState            string   `protobuf:"bytes,2,opt,name=OperState,proto3" json:"OperState,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NNIPort) Reset()         { *m = NNIPort{} }
func (m *NNIPort) String() string { return proto.CompactTextString(m) }
func (*NNIPort) ProtoMessage()    {}
func (*NNIPort) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{2}
}

func (m *NNIPort) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NNIPort.Unmarshal(m, b)
}
func (m *NNIPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NNIPort.Marshal(b, m, deterministic)
}
func (m *NNIPort) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NNIPort.Merge(m, src)
}
func (m *NNIPort) XXX_Size() int {
	return xxx_messageInfo_NNIPort.Size(m)
}
func (m *NNIPort) XXX_DiscardUnknown() {
	xxx_messageInfo_NNIPort.DiscardUnknown(m)
}

var xxx_messageInfo_NNIPort proto.InternalMessageInfo

func (m *NNIPort) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

func (m *NNIPort) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

type Olt struct {
	ID                   int32      `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	SerialNumber         string     `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	OperState            string     `protobuf:"bytes,3,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState        string     `protobuf:"bytes,4,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	IP                   string     `protobuf:"bytes,7,opt,name=IP,proto3" json:"IP,omitempty"`
	NNIPorts             []*NNIPort `protobuf:"bytes,5,rep,name=NNIPorts,proto3" json:"NNIPorts,omitempty"`
	PONPorts             []*PONPort `protobuf:"bytes,6,rep,name=PONPorts,proto3" json:"PONPorts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Olt) Reset()         { *m = Olt{} }
func (m *Olt) String() string { return proto.CompactTextString(m) }
func (*Olt) ProtoMessage()    {}
func (*Olt) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{3}
}

func (m *Olt) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Olt.Unmarshal(m, b)
}
func (m *Olt) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Olt.Marshal(b, m, deterministic)
}
func (m *Olt) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Olt.Merge(m, src)
}
func (m *Olt) XXX_Size() int {
	return xxx_messageInfo_Olt.Size(m)
}
func (m *Olt) XXX_DiscardUnknown() {
	xxx_messageInfo_Olt.DiscardUnknown(m)
}

var xxx_messageInfo_Olt proto.InternalMessageInfo

func (m *Olt) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

func (m *Olt) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

func (m *Olt) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *Olt) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *Olt) GetIP() string {
	if m != nil {
		return m.IP
	}
	return ""
}

func (m *Olt) GetNNIPorts() []*NNIPort {
	if m != nil {
		return m.NNIPorts
	}
	return nil
}

func (m *Olt) GetPONPorts() []*PONPort {
	if m != nil {
		return m.PONPorts
	}
	return nil
}

type OltAllocatedResourceType struct {
	Type                 OltAllocatedResourceType_Type `protobuf:"varint,1,opt,name=type,proto3,enum=bbsim.OltAllocatedResourceType_Type" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *OltAllocatedResourceType) Reset()         { *m = OltAllocatedResourceType{} }
func (m *OltAllocatedResourceType) String() string { return proto.CompactTextString(m) }
func (*OltAllocatedResourceType) ProtoMessage()    {}
func (*OltAllocatedResourceType) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{4}
}

func (m *OltAllocatedResourceType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OltAllocatedResourceType.Unmarshal(m, b)
}
func (m *OltAllocatedResourceType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OltAllocatedResourceType.Marshal(b, m, deterministic)
}
func (m *OltAllocatedResourceType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OltAllocatedResourceType.Merge(m, src)
}
func (m *OltAllocatedResourceType) XXX_Size() int {
	return xxx_messageInfo_OltAllocatedResourceType.Size(m)
}
func (m *OltAllocatedResourceType) XXX_DiscardUnknown() {
	xxx_messageInfo_OltAllocatedResourceType.DiscardUnknown(m)
}

var xxx_messageInfo_OltAllocatedResourceType proto.InternalMessageInfo

func (m *OltAllocatedResourceType) GetType() OltAllocatedResourceType_Type {
	if m != nil {
		return m.Type
	}
	return OltAllocatedResourceType_UNKNOWN
}

type OltAllocatedResource struct {
	Type                 string   `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
	PonPortId            uint32   `protobuf:"varint,2,opt,name=PonPortId,proto3" json:"PonPortId,omitempty"`
	OnuId                uint32   `protobuf:"varint,3,opt,name=OnuId,proto3" json:"OnuId,omitempty"`
	PortNo               uint32   `protobuf:"varint,4,opt,name=PortNo,proto3" json:"PortNo,omitempty"`
	ResourceId           int32    `protobuf:"varint,5,opt,name=ResourceId,proto3" json:"ResourceId,omitempty"`
	FlowId               uint64   `protobuf:"varint,6,opt,name=FlowId,proto3" json:"FlowId,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OltAllocatedResource) Reset()         { *m = OltAllocatedResource{} }
func (m *OltAllocatedResource) String() string { return proto.CompactTextString(m) }
func (*OltAllocatedResource) ProtoMessage()    {}
func (*OltAllocatedResource) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{5}
}

func (m *OltAllocatedResource) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OltAllocatedResource.Unmarshal(m, b)
}
func (m *OltAllocatedResource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OltAllocatedResource.Marshal(b, m, deterministic)
}
func (m *OltAllocatedResource) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OltAllocatedResource.Merge(m, src)
}
func (m *OltAllocatedResource) XXX_Size() int {
	return xxx_messageInfo_OltAllocatedResource.Size(m)
}
func (m *OltAllocatedResource) XXX_DiscardUnknown() {
	xxx_messageInfo_OltAllocatedResource.DiscardUnknown(m)
}

var xxx_messageInfo_OltAllocatedResource proto.InternalMessageInfo

func (m *OltAllocatedResource) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *OltAllocatedResource) GetPonPortId() uint32 {
	if m != nil {
		return m.PonPortId
	}
	return 0
}

func (m *OltAllocatedResource) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OltAllocatedResource) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OltAllocatedResource) GetResourceId() int32 {
	if m != nil {
		return m.ResourceId
	}
	return 0
}

func (m *OltAllocatedResource) GetFlowId() uint64 {
	if m != nil {
		return m.FlowId
	}
	return 0
}

type OltAllocatedResources struct {
	Resources            []*OltAllocatedResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *OltAllocatedResources) Reset()         { *m = OltAllocatedResources{} }
func (m *OltAllocatedResources) String() string { return proto.CompactTextString(m) }
func (*OltAllocatedResources) ProtoMessage()    {}
func (*OltAllocatedResources) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{6}
}

func (m *OltAllocatedResources) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OltAllocatedResources.Unmarshal(m, b)
}
func (m *OltAllocatedResources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OltAllocatedResources.Marshal(b, m, deterministic)
}
func (m *OltAllocatedResources) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OltAllocatedResources.Merge(m, src)
}
func (m *OltAllocatedResources) XXX_Size() int {
	return xxx_messageInfo_OltAllocatedResources.Size(m)
}
func (m *OltAllocatedResources) XXX_DiscardUnknown() {
	xxx_messageInfo_OltAllocatedResources.DiscardUnknown(m)
}

var xxx_messageInfo_OltAllocatedResources proto.InternalMessageInfo

func (m *OltAllocatedResources) GetResources() []*OltAllocatedResource {
	if m != nil {
		return m.Resources
	}
	return nil
}

type ONU struct {
	ID                            int32      `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	SerialNumber                  string     `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	OperState                     string     `protobuf:"bytes,3,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState                 string     `protobuf:"bytes,4,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	PonPortID                     int32      `protobuf:"varint,5,opt,name=PonPortID,proto3" json:"PonPortID,omitempty"`
	HwAddress                     string     `protobuf:"bytes,8,opt,name=HwAddress,proto3" json:"HwAddress,omitempty"` // Deprecated: Do not use.
	PortNo                        int32      `protobuf:"varint,9,opt,name=PortNo,proto3" json:"PortNo,omitempty"`      // Deprecated: Do not use.
	Services                      []*Service `protobuf:"bytes,10,rep,name=services,proto3" json:"services,omitempty"`  // Deprecated: Do not use.
	ImageSoftwareExpectedSections int32      `protobuf:"varint,11,opt,name=ImageSoftwareExpectedSections,proto3" json:"ImageSoftwareExpectedSections,omitempty"`
	ImageSoftwareReceivedSections int32      `protobuf:"varint,12,opt,name=ImageSoftwareReceivedSections,proto3" json:"ImageSoftwareReceivedSections,omitempty"`
	ActiveImageEntityId           int32      `protobuf:"varint,13,opt,name=ActiveImageEntityId,proto3" json:"ActiveImageEntityId,omitempty"`
	CommittedImageEntityId        int32      `protobuf:"varint,14,opt,name=CommittedImageEntityId,proto3" json:"CommittedImageEntityId,omitempty"`
	Unis                          []*UNI     `protobuf:"bytes,15,rep,name=unis,proto3" json:"unis,omitempty"`
	XXX_NoUnkeyedLiteral          struct{}   `json:"-"`
	XXX_unrecognized              []byte     `json:"-"`
	XXX_sizecache                 int32      `json:"-"`
}

func (m *ONU) Reset()         { *m = ONU{} }
func (m *ONU) String() string { return proto.CompactTextString(m) }
func (*ONU) ProtoMessage()    {}
func (*ONU) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{7}
}

func (m *ONU) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ONU.Unmarshal(m, b)
}
func (m *ONU) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ONU.Marshal(b, m, deterministic)
}
func (m *ONU) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ONU.Merge(m, src)
}
func (m *ONU) XXX_Size() int {
	return xxx_messageInfo_ONU.Size(m)
}
func (m *ONU) XXX_DiscardUnknown() {
	xxx_messageInfo_ONU.DiscardUnknown(m)
}

var xxx_messageInfo_ONU proto.InternalMessageInfo

func (m *ONU) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

func (m *ONU) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

func (m *ONU) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *ONU) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *ONU) GetPonPortID() int32 {
	if m != nil {
		return m.PonPortID
	}
	return 0
}

// Deprecated: Do not use.
func (m *ONU) GetHwAddress() string {
	if m != nil {
		return m.HwAddress
	}
	return ""
}

// Deprecated: Do not use.
func (m *ONU) GetPortNo() int32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

// Deprecated: Do not use.
func (m *ONU) GetServices() []*Service {
	if m != nil {
		return m.Services
	}
	return nil
}

func (m *ONU) GetImageSoftwareExpectedSections() int32 {
	if m != nil {
		return m.ImageSoftwareExpectedSections
	}
	return 0
}

func (m *ONU) GetImageSoftwareReceivedSections() int32 {
	if m != nil {
		return m.ImageSoftwareReceivedSections
	}
	return 0
}

func (m *ONU) GetActiveImageEntityId() int32 {
	if m != nil {
		return m.ActiveImageEntityId
	}
	return 0
}

func (m *ONU) GetCommittedImageEntityId() int32 {
	if m != nil {
		return m.CommittedImageEntityId
	}
	return 0
}

func (m *ONU) GetUnis() []*UNI {
	if m != nil {
		return m.Unis
	}
	return nil
}

type UNI struct {
	ID                   int32      `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	OnuID                int32      `protobuf:"varint,2,opt,name=OnuID,proto3" json:"OnuID,omitempty"`
	OnuSn                string     `protobuf:"bytes,3,opt,name=OnuSn,proto3" json:"OnuSn,omitempty"`
	MeID                 uint32     `protobuf:"varint,4,opt,name=MeID,proto3" json:"MeID,omitempty"`
	OperState            string     `protobuf:"bytes,5,opt,name=OperState,proto3" json:"OperState,omitempty"`
	PortNo               int32      `protobuf:"varint,6,opt,name=PortNo,proto3" json:"PortNo,omitempty"`
	Services             []*Service `protobuf:"bytes,7,rep,name=services,proto3" json:"services,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *UNI) Reset()         { *m = UNI{} }
func (m *UNI) String() string { return proto.CompactTextString(m) }
func (*UNI) ProtoMessage()    {}
func (*UNI) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{8}
}

func (m *UNI) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UNI.Unmarshal(m, b)
}
func (m *UNI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UNI.Marshal(b, m, deterministic)
}
func (m *UNI) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UNI.Merge(m, src)
}
func (m *UNI) XXX_Size() int {
	return xxx_messageInfo_UNI.Size(m)
}
func (m *UNI) XXX_DiscardUnknown() {
	xxx_messageInfo_UNI.DiscardUnknown(m)
}

var xxx_messageInfo_UNI proto.InternalMessageInfo

func (m *UNI) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

func (m *UNI) GetOnuID() int32 {
	if m != nil {
		return m.OnuID
	}
	return 0
}

func (m *UNI) GetOnuSn() string {
	if m != nil {
		return m.OnuSn
	}
	return ""
}

func (m *UNI) GetMeID() uint32 {
	if m != nil {
		return m.MeID
	}
	return 0
}

func (m *UNI) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *UNI) GetPortNo() int32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *UNI) GetServices() []*Service {
	if m != nil {
		return m.Services
	}
	return nil
}

type Service struct {
	Name                 string   `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
	HwAddress            string   `protobuf:"bytes,2,opt,name=HwAddress,proto3" json:"HwAddress,omitempty"`
	OnuSn                string   `protobuf:"bytes,3,opt,name=OnuSn,proto3" json:"OnuSn,omitempty"`
	STag                 int32    `protobuf:"varint,4,opt,name=STag,proto3" json:"STag,omitempty"`
	CTag                 int32    `protobuf:"varint,5,opt,name=CTag,proto3" json:"CTag,omitempty"`
	NeedsEapol           bool     `protobuf:"varint,6,opt,name=NeedsEapol,proto3" json:"NeedsEapol,omitempty"`
	NeedsDhcp            bool     `protobuf:"varint,7,opt,name=NeedsDhcp,proto3" json:"NeedsDhcp,omitempty"`
	NeedsIgmp            bool     `protobuf:"varint,8,opt,name=NeedsIgmp,proto3" json:"NeedsIgmp,omitempty"`
	GemPort              int32    `protobuf:"varint,9,opt,name=GemPort,proto3" json:"GemPort,omitempty"`
	EapolState           string   `protobuf:"bytes,10,opt,name=EapolState,proto3" json:"EapolState,omitempty"`
	DhcpState            string   `protobuf:"bytes,11,opt,name=DhcpState,proto3" json:"DhcpState,omitempty"`
	InternalState        string   `protobuf:"bytes,12,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	IGMPState            string   `protobuf:"bytes,13,opt,name=IGMPState,proto3" json:"IGMPState,omitempty"`
	UniId                uint32   `protobuf:"varint,14,opt,name=UniId,proto3" json:"UniId,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Service) Reset()         { *m = Service{} }
func (m *Service) String() string { return proto.CompactTextString(m) }
func (*Service) ProtoMessage()    {}
func (*Service) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{9}
}

func (m *Service) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Service.Unmarshal(m, b)
}
func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Service.Marshal(b, m, deterministic)
}
func (m *Service) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Service.Merge(m, src)
}
func (m *Service) XXX_Size() int {
	return xxx_messageInfo_Service.Size(m)
}
func (m *Service) XXX_DiscardUnknown() {
	xxx_messageInfo_Service.DiscardUnknown(m)
}

var xxx_messageInfo_Service proto.InternalMessageInfo

func (m *Service) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Service) GetHwAddress() string {
	if m != nil {
		return m.HwAddress
	}
	return ""
}

func (m *Service) GetOnuSn() string {
	if m != nil {
		return m.OnuSn
	}
	return ""
}

func (m *Service) GetSTag() int32 {
	if m != nil {
		return m.STag
	}
	return 0
}

func (m *Service) GetCTag() int32 {
	if m != nil {
		return m.CTag
	}
	return 0
}

func (m *Service) GetNeedsEapol() bool {
	if m != nil {
		return m.NeedsEapol
	}
	return false
}

func (m *Service) GetNeedsDhcp() bool {
	if m != nil {
		return m.NeedsDhcp
	}
	return false
}

func (m *Service) GetNeedsIgmp() bool {
	if m != nil {
		return m.NeedsIgmp
	}
	return false
}

func (m *Service) GetGemPort() int32 {
	if m != nil {
		return m.GemPort
	}
	return 0
}

func (m *Service) GetEapolState() string {
	if m != nil {
		return m.EapolState
	}
	return ""
}

func (m *Service) GetDhcpState() string {
	if m != nil {
		return m.DhcpState
	}
	return ""
}

func (m *Service) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *Service) GetIGMPState() string {
	if m != nil {
		return m.IGMPState
	}
	return ""
}

func (m *Service) GetUniId() uint32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

type ONUTrafficSchedulers struct {
	TraffSchedulers      *tech_profile.TrafficSchedulers `protobuf:"bytes,1,opt,name=traffSchedulers,proto3" json:"traffSchedulers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *ONUTrafficSchedulers) Reset()         { *m = ONUTrafficSchedulers{} }
func (m *ONUTrafficSchedulers) String() string { return proto.CompactTextString(m) }
func (*ONUTrafficSchedulers) ProtoMessage()    {}
func (*ONUTrafficSchedulers) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{10}
}

func (m *ONUTrafficSchedulers) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ONUTrafficSchedulers.Unmarshal(m, b)
}
func (m *ONUTrafficSchedulers) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ONUTrafficSchedulers.Marshal(b, m, deterministic)
}
func (m *ONUTrafficSchedulers) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ONUTrafficSchedulers.Merge(m, src)
}
func (m *ONUTrafficSchedulers) XXX_Size() int {
	return xxx_messageInfo_ONUTrafficSchedulers.Size(m)
}
func (m *ONUTrafficSchedulers) XXX_DiscardUnknown() {
	xxx_messageInfo_ONUTrafficSchedulers.DiscardUnknown(m)
}

var xxx_messageInfo_ONUTrafficSchedulers proto.InternalMessageInfo

func (m *ONUTrafficSchedulers) GetTraffSchedulers() *tech_profile.TrafficSchedulers {
	if m != nil {
		return m.TraffSchedulers
	}
	return nil
}

type ONUs struct {
	Items                []*ONU   `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ONUs) Reset()         { *m = ONUs{} }
func (m *ONUs) String() string { return proto.CompactTextString(m) }
func (*ONUs) ProtoMessage()    {}
func (*ONUs) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{11}
}

func (m *ONUs) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ONUs.Unmarshal(m, b)
}
func (m *ONUs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ONUs.Marshal(b, m, deterministic)
}
func (m *ONUs) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ONUs.Merge(m, src)
}
func (m *ONUs) XXX_Size() int {
	return xxx_messageInfo_ONUs.Size(m)
}
func (m *ONUs) XXX_DiscardUnknown() {
	xxx_messageInfo_ONUs.DiscardUnknown(m)
}

var xxx_messageInfo_ONUs proto.InternalMessageInfo

func (m *ONUs) GetItems() []*ONU {
	if m != nil {
		return m.Items
	}
	return nil
}

type Services struct {
	Items                []*Service `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Services) Reset()         { *m = Services{} }
func (m *Services) String() string { return proto.CompactTextString(m) }
func (*Services) ProtoMessage()    {}
func (*Services) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{12}
}

func (m *Services) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Services.Unmarshal(m, b)
}
func (m *Services) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Services.Marshal(b, m, deterministic)
}
func (m *Services) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Services.Merge(m, src)
}
func (m *Services) XXX_Size() int {
	return xxx_messageInfo_Services.Size(m)
}
func (m *Services) XXX_DiscardUnknown() {
	xxx_messageInfo_Services.DiscardUnknown(m)
}

var xxx_messageInfo_Services proto.InternalMessageInfo

func (m *Services) GetItems() []*Service {
	if m != nil {
		return m.Items
	}
	return nil
}

type UNIs struct {
	Items                []*UNI   `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UNIs) Reset()         { *m = UNIs{} }
func (m *UNIs) String() string { return proto.CompactTextString(m) }
func (*UNIs) ProtoMessage()    {}
func (*UNIs) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{13}
}

func (m *UNIs) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UNIs.Unmarshal(m, b)
}
func (m *UNIs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UNIs.Marshal(b, m, deterministic)
}
func (m *UNIs) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UNIs.Merge(m, src)
}
func (m *UNIs) XXX_Size() int {
	return xxx_messageInfo_UNIs.Size(m)
}
func (m *UNIs) XXX_DiscardUnknown() {
	xxx_messageInfo_UNIs.DiscardUnknown(m)
}

var xxx_messageInfo_UNIs proto.InternalMessageInfo

func (m *UNIs) GetItems() []*UNI {
	if m != nil {
		return m.Items
	}
	return nil
}

type ONURequest struct {
	SerialNumber         string   `protobuf:"bytes,1,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ONURequest) Reset()         { *m = ONURequest{} }
func (m *ONURequest) String() string { return proto.CompactTextString(m) }
func (*ONURequest) ProtoMessage()    {}
func (*ONURequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{14}
}

func (m *ONURequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ONURequest.Unmarshal(m, b)
}
func (m *ONURequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ONURequest.Marshal(b, m, deterministic)
}
func (m *ONURequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ONURequest.Merge(m, src)
}
func (m *ONURequest) XXX_Size() int {
	return xxx_messageInfo_ONURequest.Size(m)
}
func (m *ONURequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ONURequest.DiscardUnknown(m)
}

var xxx_messageInfo_ONURequest proto.InternalMessageInfo

func (m *ONURequest) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

type PONRequest struct {
	PonPortId            uint32   `protobuf:"varint,1,opt,name=PonPortId,proto3" json:"PonPortId,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PONRequest) Reset()         { *m = PONRequest{} }
func (m *PONRequest) String() string { return proto.CompactTextString(m) }
func (*PONRequest) ProtoMessage()    {}
func (*PONRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{15}
}

func (m *PONRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PONRequest.Unmarshal(m, b)
}
func (m *PONRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PONRequest.Marshal(b, m, deterministic)
}
func (m *PONRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PONRequest.Merge(m, src)
}
func (m *PONRequest) XXX_Size() int {
	return xxx_messageInfo_PONRequest.Size(m)
}
func (m *PONRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_PONRequest.DiscardUnknown(m)
}

var xxx_messageInfo_PONRequest proto.InternalMessageInfo

func (m *PONRequest) GetPonPortId() uint32 {
	if m != nil {
		return m.PonPortId
	}
	return 0
}

type UNIRequest struct {
	OnuSerialNumber      string   `protobuf:"bytes,1,opt,name=OnuSerialNumber,proto3" json:"OnuSerialNumber,omitempty"`
	UniID                string   `protobuf:"bytes,2,opt,name=UniID,proto3" json:"UniID,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UNIRequest) Reset()         { *m = UNIRequest{} }
func (m *UNIRequest) String() string { return proto.CompactTextString(m) }
func (*UNIRequest) ProtoMessage()    {}
func (*UNIRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{16}
}

func (m *UNIRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UNIRequest.Unmarshal(m, b)
}
func (m *UNIRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UNIRequest.Marshal(b, m, deterministic)
}
func (m *UNIRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UNIRequest.Merge(m, src)
}
func (m *UNIRequest) XXX_Size() int {
	return xxx_messageInfo_UNIRequest.Size(m)
}
func (m *UNIRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_UNIRequest.DiscardUnknown(m)
}

var xxx_messageInfo_UNIRequest proto.InternalMessageInfo

func (m *UNIRequest) GetOnuSerialNumber() string {
	if m != nil {
		return m.OnuSerialNumber
	}
	return ""
}

func (m *UNIRequest) GetUniID() string {
	if m != nil {
		return m.UniID
	}
	return ""
}

type AlarmType struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AlarmType) Reset()         { *m = AlarmType{} }
func (m *AlarmType) String() string { return proto.CompactTextString(m) }
func (*AlarmType) ProtoMessage()    {}
func (*AlarmType) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{17}
}

func (m *AlarmType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AlarmType.Unmarshal(m, b)
}
func (m *AlarmType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AlarmType.Marshal(b, m, deterministic)
}
func (m *AlarmType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AlarmType.Merge(m, src)
}
func (m *AlarmType) XXX_Size() int {
	return xxx_messageInfo_AlarmType.Size(m)
}
func (m *AlarmType) XXX_DiscardUnknown() {
	xxx_messageInfo_AlarmType.DiscardUnknown(m)
}

var xxx_messageInfo_AlarmType proto.InternalMessageInfo

type AlarmParameter struct {
	Key                  string   `protobuf:"bytes,1,opt,name=Key,proto3" json:"Key,omitempty"`
	Value                string   `protobuf:"bytes,2,opt,name=Value,proto3" json:"Value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AlarmParameter) Reset()         { *m = AlarmParameter{} }
func (m *AlarmParameter) String() string { return proto.CompactTextString(m) }
func (*AlarmParameter) ProtoMessage()    {}
func (*AlarmParameter) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{18}
}

func (m *AlarmParameter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AlarmParameter.Unmarshal(m, b)
}
func (m *AlarmParameter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AlarmParameter.Marshal(b, m, deterministic)
}
func (m *AlarmParameter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AlarmParameter.Merge(m, src)
}
func (m *AlarmParameter) XXX_Size() int {
	return xxx_messageInfo_AlarmParameter.Size(m)
}
func (m *AlarmParameter) XXX_DiscardUnknown() {
	xxx_messageInfo_AlarmParameter.DiscardUnknown(m)
}

var xxx_messageInfo_AlarmParameter proto.InternalMessageInfo

func (m *AlarmParameter) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *AlarmParameter) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

// ONUAlarmRequest includes fields common to every Onu alarm,
// plus an optional list of AlarmParameter list that can be used
// to set additional fields in alarms that support them.
type ONUAlarmRequest struct {
	AlarmType            string            `protobuf:"bytes,1,opt,name=AlarmType,proto3" json:"AlarmType,omitempty"`
	SerialNumber         string            `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	Status               string            `protobuf:"bytes,3,opt,name=Status,proto3" json:"Status,omitempty"`
	Parameters           []*AlarmParameter `protobuf:"bytes,4,rep,name=Parameters,proto3" json:"Parameters,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *ONUAlarmRequest) Reset()         { *m = ONUAlarmRequest{} }
func (m *ONUAlarmRequest) String() string { return proto.CompactTextString(m) }
func (*ONUAlarmRequest) ProtoMessage()    {}
func (*ONUAlarmRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{19}
}

func (m *ONUAlarmRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ONUAlarmRequest.Unmarshal(m, b)
}
func (m *ONUAlarmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ONUAlarmRequest.Marshal(b, m, deterministic)
}
func (m *ONUAlarmRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ONUAlarmRequest.Merge(m, src)
}
func (m *ONUAlarmRequest) XXX_Size() int {
	return xxx_messageInfo_ONUAlarmRequest.Size(m)
}
func (m *ONUAlarmRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ONUAlarmRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ONUAlarmRequest proto.InternalMessageInfo

func (m *ONUAlarmRequest) GetAlarmType() string {
	if m != nil {
		return m.AlarmType
	}
	return ""
}

func (m *ONUAlarmRequest) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

func (m *ONUAlarmRequest) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *ONUAlarmRequest) GetParameters() []*AlarmParameter {
	if m != nil {
		return m.Parameters
	}
	return nil
}

// OLT alarm request
type OLTAlarmRequest struct {
	InterfaceID          uint32   `protobuf:"varint,1,opt,name=InterfaceID,proto3" json:"InterfaceID,omitempty"`
	InterfaceType        string   `protobuf:"bytes,2,opt,name=InterfaceType,proto3" json:"InterfaceType,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=Status,proto3" json:"Status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OLTAlarmRequest) Reset()         { *m = OLTAlarmRequest{} }
func (m *OLTAlarmRequest) String() string { return proto.CompactTextString(m) }
func (*OLTAlarmRequest) ProtoMessage()    {}
func (*OLTAlarmRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{20}
}

func (m *OLTAlarmRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OLTAlarmRequest.Unmarshal(m, b)
}
func (m *OLTAlarmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OLTAlarmRequest.Marshal(b, m, deterministic)
}
func (m *OLTAlarmRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OLTAlarmRequest.Merge(m, src)
}
func (m *OLTAlarmRequest) XXX_Size() int {
	return xxx_messageInfo_OLTAlarmRequest.Size(m)
}
func (m *OLTAlarmRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OLTAlarmRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OLTAlarmRequest proto.InternalMessageInfo

func (m *OLTAlarmRequest) GetInterfaceID() uint32 {
	if m != nil {
		return m.InterfaceID
	}
	return 0
}

func (m *OLTAlarmRequest) GetInterfaceType() string {
	if m != nil {
		return m.InterfaceType
	}
	return ""
}

func (m *OLTAlarmRequest) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type VersionNumber struct {
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	BuildTime            string   `protobuf:"bytes,2,opt,name=buildTime,proto3" json:"buildTime,omitempty"`
	CommitHash           string   `protobuf:"bytes,3,opt,name=commitHash,proto3" json:"commitHash,omitempty"`
	GitStatus            string   `protobuf:"bytes,4,opt,name=gitStatus,proto3" json:"gitStatus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *VersionNumber) Reset()         { *m = VersionNumber{} }
func (m *VersionNumber) String() string { return proto.CompactTextString(m) }
func (*VersionNumber) ProtoMessage()    {}
func (*VersionNumber) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{21}
}

func (m *VersionNumber) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VersionNumber.Unmarshal(m, b)
}
func (m *VersionNumber) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VersionNumber.Marshal(b, m, deterministic)
}
func (m *VersionNumber) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VersionNumber.Merge(m, src)
}
func (m *VersionNumber) XXX_Size() int {
	return xxx_messageInfo_VersionNumber.Size(m)
}
func (m *VersionNumber) XXX_DiscardUnknown() {
	xxx_messageInfo_VersionNumber.DiscardUnknown(m)
}

var xxx_messageInfo_VersionNumber proto.InternalMessageInfo

func (m *VersionNumber) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *VersionNumber) GetBuildTime() string {
	if m != nil {
		return m.BuildTime
	}
	return ""
}

func (m *VersionNumber) GetCommitHash() string {
	if m != nil {
		return m.CommitHash
	}
	return ""
}

func (m *VersionNumber) GetGitStatus() string {
	if m != nil {
		return m.GitStatus
	}
	return ""
}

type LogLevel struct {
	Level                string   `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"`
	Caller               bool     `protobuf:"varint,2,opt,name=caller,proto3" json:"caller,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LogLevel) Reset()         { *m = LogLevel{} }
func (m *LogLevel) String() string { return proto.CompactTextString(m) }
func (*LogLevel) ProtoMessage()    {}
func (*LogLevel) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{22}
}

func (m *LogLevel) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogLevel.Unmarshal(m, b)
}
func (m *LogLevel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogLevel.Marshal(b, m, deterministic)
}
func (m *LogLevel) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogLevel.Merge(m, src)
}
func (m *LogLevel) XXX_Size() int {
	return xxx_messageInfo_LogLevel.Size(m)
}
func (m *LogLevel) XXX_DiscardUnknown() {
	xxx_messageInfo_LogLevel.DiscardUnknown(m)
}

var xxx_messageInfo_LogLevel proto.InternalMessageInfo

func (m *LogLevel) GetLevel() string {
	if m != nil {
		return m.Level
	}
	return ""
}

func (m *LogLevel) GetCaller() bool {
	if m != nil {
		return m.Caller
	}
	return false
}

type Response struct {
	StatusCode           int32    `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"`
	Message              string   `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Response) Reset()         { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage()    {}
func (*Response) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{23}
}

func (m *Response) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Response.Unmarshal(m, b)
}
func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Response.Marshal(b, m, deterministic)
}
func (m *Response) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Response.Merge(m, src)
}
func (m *Response) XXX_Size() int {
	return xxx_messageInfo_Response.Size(m)
}
func (m *Response) XXX_DiscardUnknown() {
	xxx_messageInfo_Response.DiscardUnknown(m)
}

var xxx_messageInfo_Response proto.InternalMessageInfo

func (m *Response) GetStatusCode() int32 {
	if m != nil {
		return m.StatusCode
	}
	return 0
}

func (m *Response) GetMessage() string {
	if m != nil {
		return m.Message
	}
	return ""
}

type IgmpRequest struct {
	OnuReq               *ONURequest    `protobuf:"bytes,1,opt,name=OnuReq,proto3" json:"OnuReq,omitempty"`
	SubActionVal         SubActionTypes `protobuf:"varint,2,opt,name=SubActionVal,proto3,enum=bbsim.SubActionTypes" json:"SubActionVal,omitempty"`
	GroupAddress         string         `protobuf:"bytes,3,opt,name=GroupAddress,proto3" json:"GroupAddress,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *IgmpRequest) Reset()         { *m = IgmpRequest{} }
func (m *IgmpRequest) String() string { return proto.CompactTextString(m) }
func (*IgmpRequest) ProtoMessage()    {}
func (*IgmpRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{24}
}

func (m *IgmpRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IgmpRequest.Unmarshal(m, b)
}
func (m *IgmpRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IgmpRequest.Marshal(b, m, deterministic)
}
func (m *IgmpRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IgmpRequest.Merge(m, src)
}
func (m *IgmpRequest) XXX_Size() int {
	return xxx_messageInfo_IgmpRequest.Size(m)
}
func (m *IgmpRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_IgmpRequest.DiscardUnknown(m)
}

var xxx_messageInfo_IgmpRequest proto.InternalMessageInfo

func (m *IgmpRequest) GetOnuReq() *ONURequest {
	if m != nil {
		return m.OnuReq
	}
	return nil
}

func (m *IgmpRequest) GetSubActionVal() SubActionTypes {
	if m != nil {
		return m.SubActionVal
	}
	return SubActionTypes_JOIN
}

func (m *IgmpRequest) GetGroupAddress() string {
	if m != nil {
		return m.GroupAddress
	}
	return ""
}

type Flows struct {
	FlowCount            uint32          `protobuf:"varint,1,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	Flows                []*openolt.Flow `protobuf:"bytes,2,rep,name=flows,proto3" json:"flows,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Flows) Reset()         { *m = Flows{} }
func (m *Flows) String() string { return proto.CompactTextString(m) }
func (*Flows) ProtoMessage()    {}
func (*Flows) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{25}
}

func (m *Flows) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Flows.Unmarshal(m, b)
}
func (m *Flows) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Flows.Marshal(b, m, deterministic)
}
func (m *Flows) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Flows.Merge(m, src)
}
func (m *Flows) XXX_Size() int {
	return xxx_messageInfo_Flows.Size(m)
}
func (m *Flows) XXX_DiscardUnknown() {
	xxx_messageInfo_Flows.DiscardUnknown(m)
}

var xxx_messageInfo_Flows proto.InternalMessageInfo

func (m *Flows) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

func (m *Flows) GetFlows() []*openolt.Flow {
	if m != nil {
		return m.Flows
	}
	return nil
}

type Timeout struct {
	Delay                uint32   `protobuf:"varint,1,opt,name=delay,proto3" json:"delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Timeout) Reset()         { *m = Timeout{} }
func (m *Timeout) String() string { return proto.CompactTextString(m) }
func (*Timeout) ProtoMessage()    {}
func (*Timeout) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{26}
}

func (m *Timeout) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Timeout.Unmarshal(m, b)
}
func (m *Timeout) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Timeout.Marshal(b, m, deterministic)
}
func (m *Timeout) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Timeout.Merge(m, src)
}
func (m *Timeout) XXX_Size() int {
	return xxx_messageInfo_Timeout.Size(m)
}
func (m *Timeout) XXX_DiscardUnknown() {
	xxx_messageInfo_Timeout.DiscardUnknown(m)
}

var xxx_messageInfo_Timeout proto.InternalMessageInfo

func (m *Timeout) GetDelay() uint32 {
	if m != nil {
		return m.Delay
	}
	return 0
}

type Empty struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Empty) Reset()         { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage()    {}
func (*Empty) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{27}
}

func (m *Empty) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Empty.Unmarshal(m, b)
}
func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
}
func (m *Empty) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Empty.Merge(m, src)
}
func (m *Empty) XXX_Size() int {
	return xxx_messageInfo_Empty.Size(m)
}
func (m *Empty) XXX_DiscardUnknown() {
	xxx_messageInfo_Empty.DiscardUnknown(m)
}

var xxx_messageInfo_Empty proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("bbsim.SubActionTypes", SubActionTypes_name, SubActionTypes_value)
	proto.RegisterEnum("bbsim.OltAllocatedResourceType_Type", OltAllocatedResourceType_Type_name, OltAllocatedResourceType_Type_value)
	proto.RegisterEnum("bbsim.AlarmType_Types", AlarmType_Types_name, AlarmType_Types_value)
	proto.RegisterType((*PONPort)(nil), "bbsim.PONPort")
	proto.RegisterType((*PonAllocatedResources)(nil), "bbsim.PonAllocatedResources")
	proto.RegisterType((*NNIPort)(nil), "bbsim.NNIPort")
	proto.RegisterType((*Olt)(nil), "bbsim.Olt")
	proto.RegisterType((*OltAllocatedResourceType)(nil), "bbsim.OltAllocatedResourceType")
	proto.RegisterType((*OltAllocatedResource)(nil), "bbsim.OltAllocatedResource")
	proto.RegisterType((*OltAllocatedResources)(nil), "bbsim.OltAllocatedResources")
	proto.RegisterType((*ONU)(nil), "bbsim.ONU")
	proto.RegisterType((*UNI)(nil), "bbsim.UNI")
	proto.RegisterType((*Service)(nil), "bbsim.Service")
	proto.RegisterType((*ONUTrafficSchedulers)(nil), "bbsim.ONUTrafficSchedulers")
	proto.RegisterType((*ONUs)(nil), "bbsim.ONUs")
	proto.RegisterType((*Services)(nil), "bbsim.Services")
	proto.RegisterType((*UNIs)(nil), "bbsim.UNIs")
	proto.RegisterType((*ONURequest)(nil), "bbsim.ONURequest")
	proto.RegisterType((*PONRequest)(nil), "bbsim.PONRequest")
	proto.RegisterType((*UNIRequest)(nil), "bbsim.UNIRequest")
	proto.RegisterType((*AlarmType)(nil), "bbsim.AlarmType")
	proto.RegisterType((*AlarmParameter)(nil), "bbsim.AlarmParameter")
	proto.RegisterType((*ONUAlarmRequest)(nil), "bbsim.ONUAlarmRequest")
	proto.RegisterType((*OLTAlarmRequest)(nil), "bbsim.OLTAlarmRequest")
	proto.RegisterType((*VersionNumber)(nil), "bbsim.VersionNumber")
	proto.RegisterType((*LogLevel)(nil), "bbsim.LogLevel")
	proto.RegisterType((*Response)(nil), "bbsim.Response")
	proto.RegisterType((*IgmpRequest)(nil), "bbsim.IgmpRequest")
	proto.RegisterType((*Flows)(nil), "bbsim.Flows")
	proto.RegisterType((*Timeout)(nil), "bbsim.Timeout")
	proto.RegisterType((*Empty)(nil), "bbsim.Empty")
}

func init() { proto.RegisterFile("api/bbsim/bbsim.proto", fileDescriptor_ef7750073d18011b) }

var fileDescriptor_ef7750073d18011b = []byte{
	// 2106 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdb, 0x6e, 0xdb, 0xc8,
	0x19, 0xb6, 0x4e, 0x96, 0xf4, 0xcb, 0x92, 0xe8, 0xd9, 0xd8, 0x4b, 0x38, 0xde, 0x8d, 0xc1, 0xcd,
	0x16, 0x4e, 0xd0, 0x75, 0x36, 0x49, 0x77, 0x9b, 0x5c, 0xca, 0x92, 0xac, 0x70, 0x2d, 0x93, 0xc2,
	0x50, 0x72, 0x90, 0xf6, 0x42, 0xa0, 0xc5, 0xb1, 0x4d, 0x94, 0x22, 0x15, 0x72, 0x64, 0xd7, 0x0f,
	0x50, 0xf4, 0x11, 0x7a, 0xb9, 0x40, 0x1f, 0xa0, 0xb7, 0x7d, 0x8d, 0x3e, 0x41, 0x7b, 0xd5, 0xf7,
	0x28, 0x66, 0x38, 0x3c, 0x49, 0x74, 0xe2, 0x5c, 0xf5, 0x46, 0xe0, 0xff, 0xfd, 0xe7, 0xc3, 0x9c,
	0x04, 0x3b, 0xe6, 0xc2, 0x7e, 0x71, 0x71, 0x11, 0xd8, 0xf3, 0xf0, 0xf7, 0x68, 0xe1, 0x7b, 0xd4,
	0x43, 0x15, 0x4e, 0xec, 0x3d, 0xbe, 0xf1, 0x1c, 0x7a, 0x6d, 0x4e, 0x39, 0x18, 0xbc, 0xf0, 0x16,
	0xc4, 0xf5, 0x1c, 0x1a, 0xca, 0xec, 0x1d, 0x64, 0x99, 0x94, 0xcc, 0xae, 0xd9, 0xf7, 0xa5, 0xed,
	0x90, 0x50, 0x42, 0xf9, 0x4f, 0x11, 0xaa, 0x23, 0x5d, 0x1b, 0x79, 0x3e, 0x45, 0x2d, 0x28, 0xaa,
	0x3d, 0xb9, 0x70, 0x50, 0x38, 0xac, 0xe0, 0xa2, 0xda, 0x43, 0xfb, 0x50, 0xd7, 0x17, 0xc4, 0x37,
	0xa8, 0x49, 0x89, 0x5c, 0x3c, 0x28, 0x1c, 0xd6, 0x71, 0x02, 0xa0, 0xa7, 0xd0, 0x54, 0x5d, 0x4a,
	0x7c, 0xd7, 0x74, 0x42, 0x89, 0x12, 0x97, 0xc8, 0x82, 0xe8, 0x00, 0x1a, 0x23, 0x73, 0xf6, 0x27,
	0x42, 0xbb, 0xde, 0xd2, 0xa5, 0x72, 0xf9, 0xa0, 0x70, 0x58, 0xc6, 0x69, 0x08, 0x9d, 0x40, 0xbb,
	0xe3, 0x38, 0xde, 0xcc, 0xa4, 0xc4, 0xd2, 0xdd, 0xa5, 0x6a, 0x05, 0x72, 0xe5, 0xa0, 0x74, 0xd8,
	0x78, 0xb5, 0x7f, 0x14, 0xa6, 0x3b, 0xf2, 0xdc, 0x58, 0x00, 0x93, 0xc0, 0x5b, 0xfa, 0x33, 0x12,
	0xe0, 0x55, 0x25, 0xf4, 0x0b, 0x6c, 0xc7, 0xd0, 0x80, 0xcc, 0x59, 0x46, 0x81, 0xbc, 0xf9, 0x00,
	0x4b, 0xeb, 0x6a, 0x19, 0x5b, 0xfc, 0x83, 0x45, 0x55, 0xfd, 0x22, 0x5b, 0x91, 0x9a, 0x72, 0x0a,
	0x3b, 0xb9, 0xb2, 0x48, 0x81, 0x2d, 0x83, 0xf8, 0xb6, 0xe9, 0x68, 0xcb, 0xf9, 0x05, 0xf1, 0x79,
	0xe1, 0xeb, 0x38, 0x83, 0xf1, 0x96, 0x58, 0xbc, 0xf6, 0xac, 0x25, 0x96, 0xf2, 0x7b, 0xa8, 0x6a,
	0x9a, 0xfa, 0xe5, 0xdd, 0x52, 0xfe, 0x5b, 0x80, 0x92, 0xee, 0xac, 0x6b, 0xad, 0x06, 0x51, 0xcc,
	0x09, 0x22, 0x63, 0xb9, 0xf4, 0xd9, 0x39, 0x28, 0xe7, 0xcd, 0x01, 0xf3, 0x3b, 0x92, 0xab, 0x9c,
	0x55, 0x54, 0x47, 0xe8, 0x39, 0xd4, 0x44, 0x22, 0x51, 0xbb, 0x5b, 0xa2, 0xb0, 0x02, 0xc6, 0x31,
	0x9f, 0xc9, 0x8a, 0x11, 0x8d, 0x1a, 0x1a, 0xc9, 0x0a, 0x18, 0xc7, 0x7c, 0xe5, 0x2f, 0x05, 0x90,
	0x75, 0x87, 0xae, 0x95, 0x7b, 0x7c, 0xb7, 0x20, 0xe8, 0x0d, 0x94, 0xe9, 0xdd, 0x82, 0xf0, 0xf4,
	0x5b, 0xaf, 0x9e, 0x0a, 0x23, 0xf7, 0x89, 0x1f, 0xb1, 0x1f, 0xcc, 0x35, 0x94, 0x17, 0x50, 0xe6,
	0x16, 0x1a, 0x50, 0x9d, 0x68, 0xa7, 0x9a, 0xfe, 0x5e, 0x93, 0x36, 0xd0, 0x16, 0xd4, 0x3a, 0xc3,
	0xa1, 0xde, 0x9d, 0xaa, 0x3d, 0xa9, 0xc0, 0xa8, 0x41, 0xff, 0x6c, 0x3a, 0xd2, 0xf1, 0x58, 0x2a,
	0x2a, 0xff, 0x28, 0xc0, 0xa3, 0x3c, 0xc3, 0x08, 0x85, 0x96, 0x44, 0xb7, 0x43, 0xab, 0xfb, 0x50,
	0x1f, 0x79, 0x2e, 0x4b, 0x40, 0x34, 0xbb, 0x89, 0x13, 0x00, 0x3d, 0x82, 0x0a, 0x1f, 0x71, 0x5e,
	0xfa, 0x26, 0x0e, 0x09, 0xb4, 0x0b, 0x9b, 0x8c, 0xaf, 0x79, 0xbc, 0xde, 0x4d, 0x2c, 0x28, 0xf4,
	0x2d, 0x40, 0xe4, 0x4b, 0xb5, 0xe4, 0x0a, 0x6f, 0x74, 0x0a, 0x61, 0x7a, 0x27, 0x8e, 0x77, 0xab,
	0x5a, 0xf2, 0x26, 0x5f, 0x8b, 0x82, 0x52, 0x30, 0xec, 0xe4, 0xc5, 0x1b, 0xa0, 0xb7, 0x50, 0xf7,
	0x23, 0x42, 0x2e, 0xf0, 0xf2, 0x3f, 0xfe, 0x44, 0xe5, 0x70, 0x22, 0xad, 0xfc, 0x5a, 0x86, 0x92,
	0xae, 0x4d, 0xfe, 0x6f, 0x43, 0x97, 0xaa, 0x6b, 0x4f, 0x94, 0x22, 0x01, 0xd0, 0x01, 0xd4, 0xdf,
	0xdd, 0x76, 0x2c, 0xcb, 0x27, 0x41, 0x20, 0xd7, 0x98, 0xfe, 0x71, 0x51, 0x2e, 0xe0, 0x04, 0x44,
	0x7b, 0x71, 0x8d, 0xeb, 0x4c, 0x99, 0xb3, 0xa3, 0x3a, 0x1f, 0x41, 0x2d, 0x20, 0xfe, 0x8d, 0xcd,
	0xaa, 0x02, 0x99, 0xa1, 0x34, 0x42, 0x98, 0x4b, 0xc7, 0x32, 0xa8, 0x07, 0xdf, 0xa8, 0x73, 0xf3,
	0x8a, 0x18, 0xde, 0x25, 0xbd, 0x35, 0x7d, 0xd2, 0xff, 0xf3, 0x82, 0xcc, 0x28, 0xb1, 0x0c, 0x32,
	0xa3, 0xb6, 0xe7, 0x06, 0x72, 0x83, 0xc7, 0xf7, 0x69, 0xa1, 0x35, 0x2b, 0x98, 0xcc, 0x88, 0x7d,
	0x93, 0xb2, 0xb2, 0x95, 0x63, 0x65, 0x55, 0x08, 0xfd, 0x08, 0x5f, 0x75, 0x66, 0xd4, 0xbe, 0x21,
	0x5c, 0xac, 0xef, 0x52, 0x9b, 0xde, 0xa9, 0x96, 0xdc, 0xe4, 0xba, 0x79, 0x2c, 0xf4, 0x33, 0xec,
	0x76, 0xbd, 0xf9, 0xdc, 0xa6, 0x94, 0x58, 0x59, 0xa5, 0x16, 0x57, 0xba, 0x87, 0x8b, 0xbe, 0x85,
	0xf2, 0xd2, 0xb5, 0x03, 0xb9, 0xcd, 0x2b, 0x04, 0xa2, 0x42, 0x13, 0x4d, 0xc5, 0x1c, 0x57, 0xfe,
	0x59, 0x80, 0xd2, 0x44, 0x53, 0xd7, 0x26, 0x44, 0xcc, 0x7c, 0x4f, 0x6c, 0x7d, 0x21, 0x21, 0x50,
	0xc3, 0x15, 0xf3, 0x10, 0x12, 0x6c, 0x45, 0x9d, 0x11, 0xb5, 0x27, 0xd6, 0x01, 0xff, 0xce, 0x4e,
	0x4f, 0x65, 0x75, 0x7a, 0x92, 0xb5, 0xb3, 0xc9, 0xcd, 0x47, 0x3d, 0x7d, 0x9e, 0xea, 0x69, 0x35,
	0xaf, 0xa7, 0x49, 0x3f, 0x95, 0xbf, 0x96, 0xa0, 0x2a, 0x50, 0x16, 0x81, 0x66, 0xce, 0xe3, 0x35,
	0xcd, 0xbe, 0x59, 0x04, 0xc9, 0x74, 0x89, 0xed, 0x38, 0x99, 0xac, 0x7b, 0x33, 0x31, 0xc6, 0xe6,
	0x15, 0xcf, 0xa4, 0x82, 0xf9, 0x37, 0xc3, 0xba, 0x0c, 0x0b, 0xc7, 0x97, 0x7f, 0xb3, 0x35, 0xae,
	0x11, 0x62, 0x05, 0x7d, 0x73, 0xe1, 0x39, 0x3c, 0x87, 0x1a, 0x4e, 0x21, 0xcc, 0x37, 0xa7, 0x7a,
	0xd7, 0xb3, 0x05, 0xdf, 0x73, 0x6b, 0x38, 0x01, 0x62, 0xae, 0x7a, 0x35, 0x5f, 0xf0, 0xb9, 0x8f,
	0xb8, 0x0c, 0x40, 0x32, 0x54, 0xc5, 0x31, 0x18, 0x0e, 0x3d, 0x8e, 0x48, 0xe6, 0x95, 0x9b, 0x0f,
	0x8b, 0x0a, 0x3c, 0xf0, 0x14, 0xc2, 0xec, 0x32, 0xfb, 0x21, 0xbb, 0x11, 0x66, 0x1c, 0x03, 0xeb,
	0x2b, 0x76, 0xeb, 0x9e, 0x15, 0xab, 0x0e, 0xce, 0x46, 0xa1, 0x44, 0x33, 0xb4, 0x11, 0x03, 0xac,
	0x6a, 0x13, 0xd7, 0x16, 0x43, 0xd7, 0xc4, 0x21, 0xa1, 0x98, 0xf0, 0x48, 0xd7, 0x26, 0x63, 0xdf,
	0xbc, 0xbc, 0xb4, 0x67, 0xc6, 0xec, 0x9a, 0x58, 0x4b, 0x87, 0xf8, 0x01, 0x52, 0xa1, 0x4d, 0x19,
	0x98, 0x40, 0xbc, 0x41, 0x8d, 0x57, 0x4f, 0x8e, 0x32, 0x17, 0xa1, 0x35, 0x4d, 0xbc, 0xaa, 0xa7,
	0x1c, 0x42, 0x59, 0xd7, 0x26, 0x01, 0x3a, 0x80, 0x8a, 0x4d, 0xc9, 0x3c, 0xda, 0x07, 0xa3, 0x79,
	0xd6, 0xb5, 0x09, 0x0e, 0x19, 0xca, 0x8f, 0x50, 0x33, 0xa2, 0x25, 0xff, 0x34, 0x2b, 0xbd, 0x3a,
	0x4b, 0x42, 0xe3, 0x10, 0xca, 0x13, 0x4d, 0xbd, 0xd7, 0x36, 0x5b, 0x2b, 0xb1, 0x6d, 0x60, 0x9e,
	0xc8, 0xc7, 0x25, 0x09, 0xe8, 0x43, 0xae, 0x0f, 0xca, 0x73, 0x80, 0x91, 0xae, 0x45, 0x1a, 0x99,
	0x63, 0xa6, 0xb0, 0x72, 0xcc, 0x28, 0x43, 0x00, 0xe6, 0x4b, 0xc8, 0x1e, 0x42, 0x9b, 0xcd, 0xe4,
	0xba, 0x83, 0x55, 0x38, 0x6a, 0x4a, 0x4f, 0x0c, 0x79, 0x48, 0x28, 0xff, 0x2e, 0x41, 0xbd, 0xe3,
	0x98, 0xfe, 0x9c, 0x1d, 0x70, 0xca, 0xbf, 0x4a, 0x50, 0x61, 0x1f, 0x01, 0xaa, 0x42, 0x69, 0xa8,
	0x1b, 0xd2, 0x06, 0x6a, 0x01, 0xf4, 0x3e, 0xa8, 0xda, 0x60, 0x3a, 0xe8, 0x18, 0x23, 0xa9, 0x80,
	0x9a, 0x50, 0xd7, 0xb5, 0xc9, 0xb4, 0x33, 0xec, 0xe0, 0x33, 0xa9, 0x88, 0xbe, 0x86, 0xaf, 0x18,
	0x69, 0x8c, 0x3b, 0x78, 0x3c, 0x19, 0x4d, 0x4f, 0x3a, 0xea, 0x70, 0x82, 0xfb, 0x52, 0x09, 0xed,
	0x02, 0xe2, 0x0c, 0x75, 0xa0, 0x75, 0x86, 0xd3, 0x5e, 0x7f, 0x80, 0x3b, 0xbd, 0xbe, 0x54, 0x8e,
	0x14, 0x7a, 0x58, 0x3d, 0x19, 0x4f, 0xf5, 0x93, 0xe9, 0x7b, 0x55, 0xeb, 0xe9, 0xef, 0xa5, 0x0a,
	0xda, 0x07, 0x99, 0x31, 0x86, 0xba, 0x61, 0x30, 0x5c, 0x3f, 0xeb, 0xaa, 0xd3, 0xee, 0xbb, 0x8e,
	0xa6, 0xf5, 0x87, 0xd2, 0x66, 0xec, 0x87, 0x9b, 0x33, 0x62, 0x3f, 0x55, 0xf4, 0x0c, 0xbe, 0x67,
	0x8c, 0x31, 0xee, 0x68, 0xc6, 0x99, 0x6a, 0x18, 0xaa, 0xae, 0x4d, 0x55, 0x6d, 0xdc, 0xc7, 0x27,
	0x7d, 0xdc, 0xd7, 0xba, 0xfd, 0xe9, 0xfb, 0x0e, 0xd6, 0x54, 0x6d, 0x20, 0xd5, 0xd0, 0x1e, 0xec,
	0xf2, 0xd0, 0xbb, 0x63, 0xf5, 0xbc, 0x33, 0x66, 0x82, 0x91, 0x99, 0x3a, 0x92, 0xf9, 0x70, 0x4e,
	0x47, 0x58, 0xef, 0xf6, 0x0d, 0x83, 0xe5, 0xdb, 0xc7, 0x58, 0xc7, 0x12, 0xa0, 0x03, 0xd8, 0x4f,
	0xc7, 0x75, 0xda, 0xff, 0x30, 0x35, 0x3e, 0x68, 0xdd, 0x58, 0xb7, 0x81, 0x76, 0x60, 0x9b, 0x49,
	0xa8, 0xe3, 0xc9, 0x74, 0xa4, 0x6b, 0xac, 0x16, 0x63, 0x43, 0xda, 0x42, 0xdb, 0xd0, 0x8c, 0x2b,
	0xc5, 0xd4, 0xa5, 0xe6, 0x2a, 0x74, 0x2c, 0xb5, 0xa2, 0xc4, 0x22, 0x68, 0xd4, 0x9d, 0xb2, 0x2c,
	0xa4, 0x76, 0x54, 0x8f, 0x0c, 0xa3, 0x2b, 0xa2, 0x92, 0x10, 0x82, 0x56, 0x9a, 0x7b, 0xa2, 0x4a,
	0xdb, 0xe8, 0x2b, 0x68, 0xa7, 0xb1, 0xce, 0x99, 0x2a, 0x21, 0xe5, 0x0d, 0xb4, 0x78, 0x7f, 0x47,
	0xa6, 0x6f, 0xce, 0x09, 0x25, 0x3e, 0x92, 0xa0, 0x74, 0x4a, 0xee, 0xc4, 0x98, 0xb0, 0x4f, 0x36,
	0x1a, 0xe7, 0xa6, 0xb3, 0x8c, 0xae, 0xa3, 0x21, 0xa1, 0xfc, 0xbd, 0xc0, 0xed, 0x71, 0xed, 0xd4,
	0x68, 0xc6, 0xd3, 0x22, 0x2c, 0x24, 0xc0, 0x83, 0xee, 0x0b, 0xbb, 0xb0, 0xc9, 0x36, 0x89, 0x65,
	0x20, 0xb6, 0x54, 0x41, 0xa1, 0x9f, 0x00, 0xe2, 0x10, 0x03, 0xb9, 0xcc, 0xd7, 0xd6, 0x8e, 0x58,
	0x5b, 0xd9, 0x04, 0x70, 0x4a, 0x50, 0xf9, 0x08, 0x6d, 0x7d, 0x38, 0xce, 0xc4, 0x78, 0x00, 0x0d,
	0xbe, 0x59, 0x5d, 0x9a, 0x33, 0x22, 0x0e, 0xab, 0x26, 0x4e, 0x43, 0xf1, 0x1e, 0xc7, 0x48, 0x9e,
	0x49, 0x31, 0xb5, 0xc7, 0x45, 0xe0, 0x7d, 0x91, 0xb2, 0xab, 0x6b, 0xf3, 0x9c, 0xf8, 0x81, 0xed,
	0xb9, 0x22, 0x27, 0x19, 0xaa, 0x37, 0x21, 0x20, 0x6a, 0x12, 0x91, 0xac, 0x5e, 0x17, 0x4b, 0xdb,
	0xb1, 0xc6, 0xf6, 0x3c, 0xbe, 0xec, 0xc7, 0x00, 0xdb, 0xa9, 0x67, 0xfc, 0x3c, 0x7e, 0x67, 0x06,
	0xd7, 0xc2, 0x4b, 0x0a, 0x61, 0xda, 0x57, 0x36, 0x15, 0x41, 0x84, 0x37, 0xa7, 0x04, 0x50, 0xde,
	0x40, 0x6d, 0xe8, 0x5d, 0x0d, 0xc9, 0x0d, 0x71, 0x58, 0x07, 0x1d, 0xf6, 0x21, 0xfc, 0x87, 0x04,
	0xcb, 0x60, 0x66, 0x3a, 0x8e, 0xe8, 0x44, 0x0d, 0x0b, 0x4a, 0xe9, 0x43, 0x0d, 0x93, 0x60, 0xe1,
	0xb9, 0x01, 0x41, 0x4f, 0xa0, 0x11, 0x70, 0x7b, 0xd3, 0x99, 0x67, 0x11, 0x71, 0xb4, 0x43, 0x08,
	0x75, 0x3d, 0x8b, 0xb0, 0xe4, 0xe6, 0x24, 0x08, 0xcc, 0xab, 0x28, 0x81, 0x88, 0x54, 0xfe, 0x56,
	0x80, 0x06, 0x3b, 0x8b, 0xa2, 0xc2, 0x3f, 0x83, 0x4d, 0xdd, 0x5d, 0x62, 0xf2, 0x51, 0xec, 0xdf,
	0xdb, 0xa9, 0x6d, 0x37, 0x14, 0xc1, 0x42, 0x00, 0xbd, 0x85, 0x2d, 0x63, 0x79, 0xd1, 0xe1, 0xf7,
	0x9c, 0x73, 0xd3, 0xe1, 0x96, 0x5b, 0x71, 0xbf, 0x63, 0x16, 0xdf, 0x8b, 0x70, 0x46, 0x94, 0x0d,
	0xd9, 0xc0, 0xf7, 0x96, 0x8b, 0xe8, 0xcc, 0x0e, 0xcb, 0x96, 0xc1, 0x94, 0x53, 0xa8, 0xb0, 0xeb,
	0x72, 0x80, 0xbe, 0x01, 0xb8, 0x74, 0xbc, 0xdb, 0xe9, 0x8c, 0xbf, 0x6a, 0xc5, 0x5e, 0xca, 0x90,
	0xf0, 0x4d, 0xfb, 0x1d, 0x54, 0x18, 0xc1, 0x0e, 0x7e, 0x36, 0x6f, 0xcd, 0xa3, 0xe8, 0x59, 0xce,
	0xb4, 0x71, 0xc8, 0x53, 0x9e, 0x40, 0x95, 0x75, 0xcb, 0x5b, 0x52, 0x56, 0x66, 0x8b, 0x38, 0xe6,
	0x9d, 0xb0, 0x14, 0x12, 0x4a, 0x15, 0x2a, 0xfd, 0xf9, 0x82, 0xde, 0x3d, 0x7f, 0x09, 0xad, 0x6c,
	0xe8, 0xa8, 0x06, 0xe5, 0x5f, 0x74, 0x95, 0x3d, 0x42, 0xea, 0x50, 0x19, 0xf6, 0x3b, 0xe7, 0x7d,
	0xa9, 0x80, 0x00, 0x36, 0x19, 0x78, 0xfe, 0x5a, 0x2a, 0xbe, 0xfa, 0x75, 0x0b, 0x2a, 0xc7, 0xc7,
	0x86, 0x3d, 0x47, 0x2f, 0xa0, 0x2a, 0xa6, 0x0a, 0x6d, 0x89, 0x3a, 0x70, 0xab, 0x7b, 0x8f, 0x04,
	0x95, 0x99, 0x39, 0x65, 0x03, 0xbd, 0x84, 0x86, 0x41, 0x68, 0x3c, 0x02, 0x6d, 0x21, 0x16, 0x01,
	0x7b, 0xab, 0x80, 0xb2, 0x81, 0x9e, 0xc2, 0xe6, 0x80, 0x50, 0xf6, 0xbe, 0xcc, 0xba, 0x80, 0xe4,
	0xa1, 0xa0, 0x6c, 0xa0, 0x3f, 0x82, 0x1c, 0x4a, 0xe5, 0xbc, 0x32, 0x9e, 0x7c, 0xe6, 0x31, 0xb6,
	0xb7, 0xff, 0x09, 0x81, 0x40, 0xd9, 0x40, 0x3f, 0x00, 0x8c, 0xbc, 0x5b, 0xe2, 0x7b, 0xee, 0x7a,
	0x18, 0x51, 0xc4, 0xd1, 0x70, 0x2a, 0x1b, 0xe8, 0x08, 0x1a, 0xc6, 0xf5, 0x92, 0x5a, 0xde, 0xed,
	0xc3, 0xe4, 0x7f, 0x0b, 0x75, 0x4c, 0x2e, 0x3c, 0x8f, 0x3e, 0x48, 0x9a, 0x35, 0x8c, 0x7a, 0x8b,
	0x2b, 0x3c, 0xea, 0xb2, 0xd3, 0x9e, 0xf8, 0x9f, 0x57, 0x79, 0x05, 0x6d, 0x83, 0x9a, 0x3e, 0xfd,
	0x12, 0x9d, 0x9f, 0x61, 0x1b, 0x93, 0x60, 0x45, 0x2b, 0xba, 0x66, 0x88, 0xd9, 0xca, 0xd3, 0x7b,
	0x16, 0xb6, 0x4b, 0x9b, 0xa0, 0xf5, 0xa5, 0xb4, 0x97, 0xba, 0xd4, 0x28, 0x1b, 0xe8, 0x37, 0xec,
	0x3a, 0x48, 0xf9, 0xe5, 0x27, 0x1b, 0x4e, 0x23, 0x11, 0x63, 0xe5, 0x7f, 0x0d, 0x8d, 0x01, 0xa1,
	0xf1, 0xd5, 0x67, 0x3b, 0x75, 0x7b, 0x11, 0x76, 0xdb, 0xd9, 0xeb, 0x4f, 0xc0, 0x9b, 0x00, 0xcc,
	0xb8, 0xbb, 0x9c, 0xb8, 0x76, 0x90, 0x17, 0x4b, 0x23, 0x31, 0x23, 0x9c, 0xc4, 0x4d, 0xcb, 0x0f,
	0xfe, 0x9e, 0xc2, 0x0a, 0xa5, 0x8e, 0xe3, 0xe4, 0x64, 0x92, 0xa3, 0xf3, 0x16, 0xb6, 0x53, 0x8e,
	0x02, 0xdd, 0x1d, 0xe9, 0x5a, 0xec, 0x2e, 0xb9, 0x51, 0xe5, 0xbb, 0x8b, 0xe7, 0xf0, 0xc1, 0x21,
	0xbe, 0x84, 0x96, 0xd0, 0x79, 0x70, 0x84, 0x6f, 0x40, 0x4a, 0xdc, 0x7c, 0x51, 0x80, 0xbf, 0x83,
	0x2d, 0x31, 0x34, 0xe1, 0x63, 0xe1, 0x13, 0xad, 0x4a, 0x69, 0xbd, 0x86, 0x86, 0xd0, 0xe2, 0x6f,
	0x88, 0x87, 0x29, 0x1d, 0xc3, 0x8e, 0xc1, 0xfb, 0xcb, 0xcf, 0x51, 0xd5, 0xb5, 0xec, 0x99, 0xc9,
	0xf6, 0x30, 0xb4, 0x9b, 0x94, 0x25, 0x7d, 0xc4, 0x7e, 0xc2, 0x06, 0x5b, 0xf5, 0xf7, 0xd8, 0xc8,
	0x1e, 0xd3, 0x79, 0x36, 0x7e, 0x80, 0xda, 0x80, 0xd0, 0x70, 0xe7, 0xce, 0xe9, 0x48, 0x54, 0x6c,
	0x2e, 0xc0, 0x6b, 0xdb, 0xee, 0x5e, 0x9b, 0xee, 0x15, 0x61, 0x87, 0x50, 0xf8, 0xf2, 0x40, 0x42,
	0x24, 0x75, 0x2c, 0xe5, 0x39, 0x3a, 0x85, 0xaf, 0xc3, 0x81, 0x5e, 0x7f, 0x8d, 0xe4, 0xf8, 0x7d,
	0x9c, 0x40, 0x6b, 0xf2, 0xf1, 0xd2, 0xe3, 0x4b, 0x23, 0x7f, 0xe9, 0x89, 0x55, 0xf1, 0x13, 0xbb,
	0x75, 0xdc, 0x98, 0x8e, 0x6d, 0x99, 0x94, 0x9c, 0x59, 0xc1, 0xc3, 0x86, 0xee, 0xf8, 0xfb, 0x3f,
	0x7c, 0x77, 0x65, 0xd3, 0xeb, 0xe5, 0xc5, 0xd1, 0xcc, 0x9b, 0xf3, 0xff, 0x8d, 0x67, 0x9e, 0x6f,
	0x89, 0x3f, 0x9a, 0xe3, 0xbf, 0x9c, 0x2f, 0x36, 0xf9, 0xff, 0xc4, 0xaf, 0xff, 0x17, 0x00, 0x00,
	0xff, 0xff, 0xa6, 0x6b, 0x61, 0xb9, 0x86, 0x16, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// BBSimClient is the client API for BBSim service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type BBSimClient interface {
	// Get BBSim version
	Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionNumber, error)
	// Set BBSim log level
	SetLogLevel(ctx context.Context, in *LogLevel, opts ...grpc.CallOption) (*LogLevel, error)
	// Get current status of OLT
	GetOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Olt, error)
	GetOltAllocatedResources(ctx context.Context, in *OltAllocatedResourceType, opts ...grpc.CallOption) (*OltAllocatedResources, error)
	// Poweron OLT
	PoweronOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Shutdown OLT
	ShutdownOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Reboot OLT
	RebootOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Closes the Openolt gRPC server
	StopgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Start the Openolt gRPC server
	StartgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Restart the Openolt gRPC server after the given timeout
	RestartgRPCServer(ctx context.Context, in *Timeout, opts ...grpc.CallOption) (*Response, error)
	// Get status of an ONU by serial number
	GetONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONU, error)
	// Get status of all ONUs
	GetONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ONUs, error)
	// Get all the Services by Uni ID
	GetServices(ctx context.Context, in *UNIRequest, opts ...grpc.CallOption) (*Services, error)
	// Get all the UNIs of an ONU by serial number
	GetOnuUnis(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*UNIs, error)
	// Shutdown an ONU by serial number
	ShutdownONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
	// Shutdown all ONUs in OLT
	ShutdownAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Shutdown all ONUs under a PON by pon-port-ID
	ShutdownONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error)
	// Poweron an ONU by serial number
	PoweronONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
	// Poweron all ONUs in OLT
	PoweronAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Poweron all ONUs under a PON by pon-port-ID
	PoweronONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error)
	// Restart EAPOL for ONU
	RestartEapol(ctx context.Context, in *UNIRequest, opts ...grpc.CallOption) (*Response, error)
	// Restart DHCP for ONU
	RestartDhcp(ctx context.Context, in *UNIRequest, opts ...grpc.CallOption) (*Response, error)
	// Send ONU alarm indication
	SetOnuAlarmIndication(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*Response, error)
	// Send OLT alarm indication for Interface type NNI or PON
	SetOltAlarmIndication(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*Response, error)
	// Get all flows or ONU specific flows
	GetFlows(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Flows, error)
	// Change IGMP state
	ChangeIgmpState(ctx context.Context, in *IgmpRequest, opts ...grpc.CallOption) (*Response, error)
	// Get Traffic scheduler information for ONU
	GetOnuTrafficSchedulers(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUTrafficSchedulers, error)
	//Return all the UNIs for all the ONUs
	GetUnis(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UNIs, error)
	//Invalidate the MDS counter for the ONU
	InvalidateMds(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
}

type bBSimClient struct {
	cc *grpc.ClientConn
}

func NewBBSimClient(cc *grpc.ClientConn) BBSimClient {
	return &bBSimClient{cc}
}

func (c *bBSimClient) Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionNumber, error) {
	out := new(VersionNumber)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/Version", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) SetLogLevel(ctx context.Context, in *LogLevel, opts ...grpc.CallOption) (*LogLevel, error) {
	out := new(LogLevel)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/SetLogLevel", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Olt, error) {
	out := new(Olt)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOltAllocatedResources(ctx context.Context, in *OltAllocatedResourceType, opts ...grpc.CallOption) (*OltAllocatedResources, error) {
	out := new(OltAllocatedResources)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOltAllocatedResources", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RebootOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RebootOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) StopgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/StopgRPCServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) StartgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/StartgRPCServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RestartgRPCServer(ctx context.Context, in *Timeout, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RestartgRPCServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONU, error) {
	out := new(ONU)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetONU", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ONUs, error) {
	out := new(ONUs)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetONUs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetServices(ctx context.Context, in *UNIRequest, opts ...grpc.CallOption) (*Services, error) {
	out := new(Services)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetServices", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOnuUnis(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*UNIs, error) {
	out := new(UNIs)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOnuUnis", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownONU", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownAllONUs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownONUsOnPON", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronONU", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronAllONUs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronONUsOnPON", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RestartEapol(ctx context.Context, in *UNIRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RestartEapol", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RestartDhcp(ctx context.Context, in *UNIRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RestartDhcp", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) SetOnuAlarmIndication(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/SetOnuAlarmIndication", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) SetOltAlarmIndication(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/SetOltAlarmIndication", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetFlows(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Flows, error) {
	out := new(Flows)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetFlows", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ChangeIgmpState(ctx context.Context, in *IgmpRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ChangeIgmpState", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOnuTrafficSchedulers(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUTrafficSchedulers, error) {
	out := new(ONUTrafficSchedulers)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOnuTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetUnis(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UNIs, error) {
	out := new(UNIs)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetUnis", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) InvalidateMds(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/InvalidateMds", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// BBSimServer is the server API for BBSim service.
type BBSimServer interface {
	// Get BBSim version
	Version(context.Context, *Empty) (*VersionNumber, error)
	// Set BBSim log level
	SetLogLevel(context.Context, *LogLevel) (*LogLevel, error)
	// Get current status of OLT
	GetOlt(context.Context, *Empty) (*Olt, error)
	GetOltAllocatedResources(context.Context, *OltAllocatedResourceType) (*OltAllocatedResources, error)
	// Poweron OLT
	PoweronOlt(context.Context, *Empty) (*Response, error)
	// Shutdown OLT
	ShutdownOlt(context.Context, *Empty) (*Response, error)
	// Reboot OLT
	RebootOlt(context.Context, *Empty) (*Response, error)
	// Closes the Openolt gRPC server
	StopgRPCServer(context.Context, *Empty) (*Response, error)
	// Start the Openolt gRPC server
	StartgRPCServer(context.Context, *Empty) (*Response, error)
	// Restart the Openolt gRPC server after the given timeout
	RestartgRPCServer(context.Context, *Timeout) (*Response, error)
	// Get status of an ONU by serial number
	GetONU(context.Context, *ONURequest) (*ONU, error)
	// Get status of all ONUs
	GetONUs(context.Context, *Empty) (*ONUs, error)
	// Get all the Services by Uni ID
	GetServices(context.Context, *UNIRequest) (*Services, error)
	// Get all the UNIs of an ONU by serial number
	GetOnuUnis(context.Context, *ONURequest) (*UNIs, error)
	// Shutdown an ONU by serial number
	ShutdownONU(context.Context, *ONURequest) (*Response, error)
	// Shutdown all ONUs in OLT
	ShutdownAllONUs(context.Context, *Empty) (*Response, error)
	// Shutdown all ONUs under a PON by pon-port-ID
	ShutdownONUsOnPON(context.Context, *PONRequest) (*Response, error)
	// Poweron an ONU by serial number
	PoweronONU(context.Context, *ONURequest) (*Response, error)
	// Poweron all ONUs in OLT
	PoweronAllONUs(context.Context, *Empty) (*Response, error)
	// Poweron all ONUs under a PON by pon-port-ID
	PoweronONUsOnPON(context.Context, *PONRequest) (*Response, error)
	// Restart EAPOL for ONU
	RestartEapol(context.Context, *UNIRequest) (*Response, error)
	// Restart DHCP for ONU
	RestartDhcp(context.Context, *UNIRequest) (*Response, error)
	// Send ONU alarm indication
	SetOnuAlarmIndication(context.Context, *ONUAlarmRequest) (*Response, error)
	// Send OLT alarm indication for Interface type NNI or PON
	SetOltAlarmIndication(context.Context, *OLTAlarmRequest) (*Response, error)
	// Get all flows or ONU specific flows
	GetFlows(context.Context, *ONURequest) (*Flows, error)
	// Change IGMP state
	ChangeIgmpState(context.Context, *IgmpRequest) (*Response, error)
	// Get Traffic scheduler information for ONU
	GetOnuTrafficSchedulers(context.Context, *ONURequest) (*ONUTrafficSchedulers, error)
	//Return all the UNIs for all the ONUs
	GetUnis(context.Context, *Empty) (*UNIs, error)
	//Invalidate the MDS counter for the ONU
	InvalidateMds(context.Context, *ONURequest) (*Response, error)
}

// UnimplementedBBSimServer can be embedded to have forward compatible implementations.
type UnimplementedBBSimServer struct {
}

func (*UnimplementedBBSimServer) Version(ctx context.Context, req *Empty) (*VersionNumber, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Version not implemented")
}
func (*UnimplementedBBSimServer) SetLogLevel(ctx context.Context, req *LogLevel) (*LogLevel, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetLogLevel not implemented")
}
func (*UnimplementedBBSimServer) GetOlt(ctx context.Context, req *Empty) (*Olt, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOlt not implemented")
}
func (*UnimplementedBBSimServer) GetOltAllocatedResources(ctx context.Context, req *OltAllocatedResourceType) (*OltAllocatedResources, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOltAllocatedResources not implemented")
}
func (*UnimplementedBBSimServer) PoweronOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronOlt not implemented")
}
func (*UnimplementedBBSimServer) ShutdownOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownOlt not implemented")
}
func (*UnimplementedBBSimServer) RebootOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RebootOlt not implemented")
}
func (*UnimplementedBBSimServer) StopgRPCServer(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method StopgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) StartgRPCServer(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method StartgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) RestartgRPCServer(ctx context.Context, req *Timeout) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) GetONU(ctx context.Context, req *ONURequest) (*ONU, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONU not implemented")
}
func (*UnimplementedBBSimServer) GetONUs(ctx context.Context, req *Empty) (*ONUs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONUs not implemented")
}
func (*UnimplementedBBSimServer) GetServices(ctx context.Context, req *UNIRequest) (*Services, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetServices not implemented")
}
func (*UnimplementedBBSimServer) GetOnuUnis(ctx context.Context, req *ONURequest) (*UNIs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuUnis not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONU not implemented")
}
func (*UnimplementedBBSimServer) ShutdownAllONUs(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownAllONUs not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONUsOnPON(ctx context.Context, req *PONRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONUsOnPON not implemented")
}
func (*UnimplementedBBSimServer) PoweronONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONU not implemented")
}
func (*UnimplementedBBSimServer) PoweronAllONUs(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronAllONUs not implemented")
}
func (*UnimplementedBBSimServer) PoweronONUsOnPON(ctx context.Context, req *PONRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONUsOnPON not implemented")
}
func (*UnimplementedBBSimServer) RestartEapol(ctx context.Context, req *UNIRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartEapol not implemented")
}
func (*UnimplementedBBSimServer) RestartDhcp(ctx context.Context, req *UNIRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartDhcp not implemented")
}
func (*UnimplementedBBSimServer) SetOnuAlarmIndication(ctx context.Context, req *ONUAlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetOnuAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) SetOltAlarmIndication(ctx context.Context, req *OLTAlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetOltAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) GetFlows(ctx context.Context, req *ONURequest) (*Flows, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetFlows not implemented")
}
func (*UnimplementedBBSimServer) ChangeIgmpState(ctx context.Context, req *IgmpRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ChangeIgmpState not implemented")
}
func (*UnimplementedBBSimServer) GetOnuTrafficSchedulers(ctx context.Context, req *ONURequest) (*ONUTrafficSchedulers, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuTrafficSchedulers not implemented")
}
func (*UnimplementedBBSimServer) GetUnis(ctx context.Context, req *Empty) (*UNIs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetUnis not implemented")
}
func (*UnimplementedBBSimServer) InvalidateMds(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InvalidateMds not implemented")
}

func RegisterBBSimServer(s *grpc.Server, srv BBSimServer) {
	s.RegisterService(&_BBSim_serviceDesc, srv)
}

func _BBSim_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).Version(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/Version",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).Version(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_SetLogLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(LogLevel)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).SetLogLevel(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetLogLevel",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetLogLevel(ctx, req.(*LogLevel))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOlt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOltAllocatedResources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OltAllocatedResourceType)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetOltAllocatedResources(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOltAllocatedResources",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOltAllocatedResources(ctx, req.(*OltAllocatedResourceType))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronOlt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).PoweronOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownOlt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ShutdownOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RebootOlt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).RebootOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RebootOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RebootOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_StopgRPCServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).StopgRPCServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/StopgRPCServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).StopgRPCServer(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_StartgRPCServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).StartgRPCServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/StartgRPCServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).StartgRPCServer(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RestartgRPCServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Timeout)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).RestartgRPCServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RestartgRPCServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RestartgRPCServer(ctx, req.(*Timeout))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetONU_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetONU(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetONU",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetONU(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetONUs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetONUs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetONUs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetONUs(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UNIRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetServices(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetServices",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetServices(ctx, req.(*UNIRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOnuUnis_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetOnuUnis(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOnuUnis",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOnuUnis(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownONU_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ShutdownONU(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownONU",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownONU(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownAllONUs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ShutdownAllONUs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownAllONUs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownAllONUs(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownONUsOnPON_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PONRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ShutdownONUsOnPON(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownONUsOnPON",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownONUsOnPON(ctx, req.(*PONRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronONU_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).PoweronONU(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronONU",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronONU(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronAllONUs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).PoweronAllONUs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronAllONUs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronAllONUs(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronONUsOnPON_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PONRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).PoweronONUsOnPON(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronONUsOnPON",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronONUsOnPON(ctx, req.(*PONRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RestartEapol_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UNIRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).RestartEapol(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RestartEapol",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RestartEapol(ctx, req.(*UNIRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RestartDhcp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UNIRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).RestartDhcp(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RestartDhcp",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RestartDhcp(ctx, req.(*UNIRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_SetOnuAlarmIndication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONUAlarmRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).SetOnuAlarmIndication(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetOnuAlarmIndication",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetOnuAlarmIndication(ctx, req.(*ONUAlarmRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_SetOltAlarmIndication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OLTAlarmRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).SetOltAlarmIndication(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetOltAlarmIndication",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetOltAlarmIndication(ctx, req.(*OLTAlarmRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetFlows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetFlows(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetFlows",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetFlows(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ChangeIgmpState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(IgmpRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ChangeIgmpState(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ChangeIgmpState",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ChangeIgmpState(ctx, req.(*IgmpRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOnuTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetOnuTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOnuTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOnuTrafficSchedulers(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetUnis_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).GetUnis(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetUnis",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetUnis(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_InvalidateMds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).InvalidateMds(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/InvalidateMds",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).InvalidateMds(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _BBSim_serviceDesc = grpc.ServiceDesc{
	ServiceName: "bbsim.BBSim",
	HandlerType: (*BBSimServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Version",
			Handler:    _BBSim_Version_Handler,
		},
		{
			MethodName: "SetLogLevel",
			Handler:    _BBSim_SetLogLevel_Handler,
		},
		{
			MethodName: "GetOlt",
			Handler:    _BBSim_GetOlt_Handler,
		},
		{
			MethodName: "GetOltAllocatedResources",
			Handler:    _BBSim_GetOltAllocatedResources_Handler,
		},
		{
			MethodName: "PoweronOlt",
			Handler:    _BBSim_PoweronOlt_Handler,
		},
		{
			MethodName: "ShutdownOlt",
			Handler:    _BBSim_ShutdownOlt_Handler,
		},
		{
			MethodName: "RebootOlt",
			Handler:    _BBSim_RebootOlt_Handler,
		},
		{
			MethodName: "StopgRPCServer",
			Handler:    _BBSim_StopgRPCServer_Handler,
		},
		{
			MethodName: "StartgRPCServer",
			Handler:    _BBSim_StartgRPCServer_Handler,
		},
		{
			MethodName: "RestartgRPCServer",
			Handler:    _BBSim_RestartgRPCServer_Handler,
		},
		{
			MethodName: "GetONU",
			Handler:    _BBSim_GetONU_Handler,
		},
		{
			MethodName: "GetONUs",
			Handler:    _BBSim_GetONUs_Handler,
		},
		{
			MethodName: "GetServices",
			Handler:    _BBSim_GetServices_Handler,
		},
		{
			MethodName: "GetOnuUnis",
			Handler:    _BBSim_GetOnuUnis_Handler,
		},
		{
			MethodName: "ShutdownONU",
			Handler:    _BBSim_ShutdownONU_Handler,
		},
		{
			MethodName: "ShutdownAllONUs",
			Handler:    _BBSim_ShutdownAllONUs_Handler,
		},
		{
			MethodName: "ShutdownONUsOnPON",
			Handler:    _BBSim_ShutdownONUsOnPON_Handler,
		},
		{
			MethodName: "PoweronONU",
			Handler:    _BBSim_PoweronONU_Handler,
		},
		{
			MethodName: "PoweronAllONUs",
			Handler:    _BBSim_PoweronAllONUs_Handler,
		},
		{
			MethodName: "PoweronONUsOnPON",
			Handler:    _BBSim_PoweronONUsOnPON_Handler,
		},
		{
			MethodName: "RestartEapol",
			Handler:    _BBSim_RestartEapol_Handler,
		},
		{
			MethodName: "RestartDhcp",
			Handler:    _BBSim_RestartDhcp_Handler,
		},
		{
			MethodName: "SetOnuAlarmIndication",
			Handler:    _BBSim_SetOnuAlarmIndication_Handler,
		},
		{
			MethodName: "SetOltAlarmIndication",
			Handler:    _BBSim_SetOltAlarmIndication_Handler,
		},
		{
			MethodName: "GetFlows",
			Handler:    _BBSim_GetFlows_Handler,
		},
		{
			MethodName: "ChangeIgmpState",
			Handler:    _BBSim_ChangeIgmpState_Handler,
		},
		{
			MethodName: "GetOnuTrafficSchedulers",
			Handler:    _BBSim_GetOnuTrafficSchedulers_Handler,
		},
		{
			MethodName: "GetUnis",
			Handler:    _BBSim_GetUnis_Handler,
		},
		{
			MethodName: "InvalidateMds",
			Handler:    _BBSim_InvalidateMds_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/bbsim/bbsim.proto",
}
