// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/openolt.proto

package openolt

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	common "github.com/opencord/voltha-protos/v4/go/common"
	config "github.com/opencord/voltha-protos/v4/go/ext/config"
	tech_profile "github.com/opencord/voltha-protos/v4/go/tech_profile"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	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

// SchedulerConfig from public import voltha_protos/tech_profile.proto
type SchedulerConfig = tech_profile.SchedulerConfig

// TrafficShapingInfo from public import voltha_protos/tech_profile.proto
type TrafficShapingInfo = tech_profile.TrafficShapingInfo

// TrafficScheduler from public import voltha_protos/tech_profile.proto
type TrafficScheduler = tech_profile.TrafficScheduler

// TrafficSchedulers from public import voltha_protos/tech_profile.proto
type TrafficSchedulers = tech_profile.TrafficSchedulers

// TailDropDiscardConfig from public import voltha_protos/tech_profile.proto
type TailDropDiscardConfig = tech_profile.TailDropDiscardConfig

// RedDiscardConfig from public import voltha_protos/tech_profile.proto
type RedDiscardConfig = tech_profile.RedDiscardConfig

// WRedDiscardConfig from public import voltha_protos/tech_profile.proto
type WRedDiscardConfig = tech_profile.WRedDiscardConfig

// DiscardConfig from public import voltha_protos/tech_profile.proto
type DiscardConfig = tech_profile.DiscardConfig
type DiscardConfig_TailDropDiscardConfig = tech_profile.DiscardConfig_TailDropDiscardConfig
type DiscardConfig_RedDiscardConfig = tech_profile.DiscardConfig_RedDiscardConfig
type DiscardConfig_WredDiscardConfig = tech_profile.DiscardConfig_WredDiscardConfig

// TrafficQueue from public import voltha_protos/tech_profile.proto
type TrafficQueue = tech_profile.TrafficQueue

// TrafficQueues from public import voltha_protos/tech_profile.proto
type TrafficQueues = tech_profile.TrafficQueues

// Direction from public import voltha_protos/tech_profile.proto
type Direction = tech_profile.Direction

var Direction_name = tech_profile.Direction_name
var Direction_value = tech_profile.Direction_value

const Direction_UPSTREAM = Direction(tech_profile.Direction_UPSTREAM)
const Direction_DOWNSTREAM = Direction(tech_profile.Direction_DOWNSTREAM)
const Direction_BIDIRECTIONAL = Direction(tech_profile.Direction_BIDIRECTIONAL)

// SchedulingPolicy from public import voltha_protos/tech_profile.proto
type SchedulingPolicy = tech_profile.SchedulingPolicy

var SchedulingPolicy_name = tech_profile.SchedulingPolicy_name
var SchedulingPolicy_value = tech_profile.SchedulingPolicy_value

const SchedulingPolicy_WRR = SchedulingPolicy(tech_profile.SchedulingPolicy_WRR)
const SchedulingPolicy_StrictPriority = SchedulingPolicy(tech_profile.SchedulingPolicy_StrictPriority)
const SchedulingPolicy_Hybrid = SchedulingPolicy(tech_profile.SchedulingPolicy_Hybrid)

// AdditionalBW from public import voltha_protos/tech_profile.proto
type AdditionalBW = tech_profile.AdditionalBW

var AdditionalBW_name = tech_profile.AdditionalBW_name
var AdditionalBW_value = tech_profile.AdditionalBW_value

const AdditionalBW_AdditionalBW_None = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_None)
const AdditionalBW_AdditionalBW_NA = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_NA)
const AdditionalBW_AdditionalBW_BestEffort = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_BestEffort)
const AdditionalBW_AdditionalBW_Auto = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_Auto)

// DiscardPolicy from public import voltha_protos/tech_profile.proto
type DiscardPolicy = tech_profile.DiscardPolicy

var DiscardPolicy_name = tech_profile.DiscardPolicy_name
var DiscardPolicy_value = tech_profile.DiscardPolicy_value

const DiscardPolicy_TailDrop = DiscardPolicy(tech_profile.DiscardPolicy_TailDrop)
const DiscardPolicy_WTailDrop = DiscardPolicy(tech_profile.DiscardPolicy_WTailDrop)
const DiscardPolicy_Red = DiscardPolicy(tech_profile.DiscardPolicy_Red)
const DiscardPolicy_WRed = DiscardPolicy(tech_profile.DiscardPolicy_WRed)

// InferredAdditionBWIndication from public import voltha_protos/tech_profile.proto
type InferredAdditionBWIndication = tech_profile.InferredAdditionBWIndication

var InferredAdditionBWIndication_name = tech_profile.InferredAdditionBWIndication_name
var InferredAdditionBWIndication_value = tech_profile.InferredAdditionBWIndication_value

const InferredAdditionBWIndication_InferredAdditionBWIndication_None = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_None)
const InferredAdditionBWIndication_InferredAdditionBWIndication_Assured = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_Assured)
const InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort)

// ID from public import voltha_protos/common.proto
type ID = common.ID

// IDs from public import voltha_protos/common.proto
type IDs = common.IDs

// AdminState from public import voltha_protos/common.proto
type AdminState = common.AdminState

// OperStatus from public import voltha_protos/common.proto
type OperStatus = common.OperStatus

// ConnectStatus from public import voltha_protos/common.proto
type ConnectStatus = common.ConnectStatus

// OperationResp from public import voltha_protos/common.proto
type OperationResp = common.OperationResp

// ValueType from public import voltha_protos/common.proto
type ValueType = common.ValueType

// ValueSpecifier from public import voltha_protos/common.proto
type ValueSpecifier = common.ValueSpecifier

// ReturnValues from public import voltha_protos/common.proto
type ReturnValues = common.ReturnValues

// TestModeKeys from public import voltha_protos/common.proto
type TestModeKeys = common.TestModeKeys

var TestModeKeys_name = common.TestModeKeys_name
var TestModeKeys_value = common.TestModeKeys_value

const TestModeKeys_api_test = TestModeKeys(common.TestModeKeys_api_test)

// AdminState_Types from public import voltha_protos/common.proto
type AdminState_Types = common.AdminState_Types

var AdminState_Types_name = common.AdminState_Types_name
var AdminState_Types_value = common.AdminState_Types_value

const AdminState_UNKNOWN = AdminState_Types(common.AdminState_UNKNOWN)
const AdminState_PREPROVISIONED = AdminState_Types(common.AdminState_PREPROVISIONED)
const AdminState_ENABLED = AdminState_Types(common.AdminState_ENABLED)
const AdminState_DISABLED = AdminState_Types(common.AdminState_DISABLED)
const AdminState_DOWNLOADING_IMAGE = AdminState_Types(common.AdminState_DOWNLOADING_IMAGE)
const AdminState_DELETED = AdminState_Types(common.AdminState_DELETED)
const AdminState_DELETING = AdminState_Types(common.AdminState_DELETING)

// OperStatus_Types from public import voltha_protos/common.proto
type OperStatus_Types = common.OperStatus_Types

var OperStatus_Types_name = common.OperStatus_Types_name
var OperStatus_Types_value = common.OperStatus_Types_value

const OperStatus_UNKNOWN = OperStatus_Types(common.OperStatus_UNKNOWN)
const OperStatus_DISCOVERED = OperStatus_Types(common.OperStatus_DISCOVERED)
const OperStatus_ACTIVATING = OperStatus_Types(common.OperStatus_ACTIVATING)
const OperStatus_TESTING = OperStatus_Types(common.OperStatus_TESTING)
const OperStatus_ACTIVE = OperStatus_Types(common.OperStatus_ACTIVE)
const OperStatus_FAILED = OperStatus_Types(common.OperStatus_FAILED)

// ConnectStatus_Types from public import voltha_protos/common.proto
type ConnectStatus_Types = common.ConnectStatus_Types

var ConnectStatus_Types_name = common.ConnectStatus_Types_name
var ConnectStatus_Types_value = common.ConnectStatus_Types_value

const ConnectStatus_UNKNOWN = ConnectStatus_Types(common.ConnectStatus_UNKNOWN)
const ConnectStatus_UNREACHABLE = ConnectStatus_Types(common.ConnectStatus_UNREACHABLE)
const ConnectStatus_REACHABLE = ConnectStatus_Types(common.ConnectStatus_REACHABLE)

// OperationResp_OperationReturnCode from public import voltha_protos/common.proto
type OperationResp_OperationReturnCode = common.OperationResp_OperationReturnCode

var OperationResp_OperationReturnCode_name = common.OperationResp_OperationReturnCode_name
var OperationResp_OperationReturnCode_value = common.OperationResp_OperationReturnCode_value

const OperationResp_OPERATION_SUCCESS = OperationResp_OperationReturnCode(common.OperationResp_OPERATION_SUCCESS)
const OperationResp_OPERATION_FAILURE = OperationResp_OperationReturnCode(common.OperationResp_OPERATION_FAILURE)
const OperationResp_OPERATION_UNSUPPORTED = OperationResp_OperationReturnCode(common.OperationResp_OPERATION_UNSUPPORTED)

// ValueType_Type from public import voltha_protos/common.proto
type ValueType_Type = common.ValueType_Type

var ValueType_Type_name = common.ValueType_Type_name
var ValueType_Type_value = common.ValueType_Type_value

const ValueType_EMPTY = ValueType_Type(common.ValueType_EMPTY)
const ValueType_DISTANCE = ValueType_Type(common.ValueType_DISTANCE)

//* activation fail reason.
type OnuIndication_ActivationFailReason int32

const (
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE                    OnuIndication_ActivationFailReason = 0
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_RANGING                 OnuIndication_ActivationFailReason = 1
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION OnuIndication_ActivationFailReason = 2
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_LOS                     OnuIndication_ActivationFailReason = 3
	OnuIndication_ONU_ACTIVATION_FAIL_ONU_ALARM                      OnuIndication_ActivationFailReason = 4
	OnuIndication_ONU_ACTIVATION_FAIL_SWITCH_OVER                    OnuIndication_ActivationFailReason = 5
)

var OnuIndication_ActivationFailReason_name = map[int32]string{
	0: "ONU_ACTIVATION_FAIL_REASON_NONE",
	1: "ONU_ACTIVATION_FAIL_REASON_RANGING",
	2: "ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION",
	3: "ONU_ACTIVATION_FAIL_REASON_LOS",
	4: "ONU_ACTIVATION_FAIL_ONU_ALARM",
	5: "ONU_ACTIVATION_FAIL_SWITCH_OVER",
}

var OnuIndication_ActivationFailReason_value = map[string]int32{
	"ONU_ACTIVATION_FAIL_REASON_NONE":                    0,
	"ONU_ACTIVATION_FAIL_REASON_RANGING":                 1,
	"ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION": 2,
	"ONU_ACTIVATION_FAIL_REASON_LOS":                     3,
	"ONU_ACTIVATION_FAIL_ONU_ALARM":                      4,
	"ONU_ACTIVATION_FAIL_SWITCH_OVER":                    5,
}

func (x OnuIndication_ActivationFailReason) String() string {
	return proto.EnumName(OnuIndication_ActivationFailReason_name, int32(x))
}

func (OnuIndication_ActivationFailReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{5, 0}
}

type DeviceInfo_DeviceResourceRanges_Pool_PoolType int32

const (
	DeviceInfo_DeviceResourceRanges_Pool_ONU_ID     DeviceInfo_DeviceResourceRanges_Pool_PoolType = 0
	DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID   DeviceInfo_DeviceResourceRanges_Pool_PoolType = 1
	DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID DeviceInfo_DeviceResourceRanges_Pool_PoolType = 2
	DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID    DeviceInfo_DeviceResourceRanges_Pool_PoolType = 3
)

var DeviceInfo_DeviceResourceRanges_Pool_PoolType_name = map[int32]string{
	0: "ONU_ID",
	1: "ALLOC_ID",
	2: "GEMPORT_ID",
	3: "FLOW_ID",
}

var DeviceInfo_DeviceResourceRanges_Pool_PoolType_value = map[string]int32{
	"ONU_ID":     0,
	"ALLOC_ID":   1,
	"GEMPORT_ID": 2,
	"FLOW_ID":    3,
}

func (x DeviceInfo_DeviceResourceRanges_Pool_PoolType) String() string {
	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, int32(x))
}

func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0, 0}
}

type DeviceInfo_DeviceResourceRanges_Pool_SharingType int32

const (
	DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF           DeviceInfo_DeviceResourceRanges_Pool_SharingType = 0
	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH  DeviceInfo_DeviceResourceRanges_Pool_SharingType = 1
	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH DeviceInfo_DeviceResourceRanges_Pool_SharingType = 2
)

var DeviceInfo_DeviceResourceRanges_Pool_SharingType_name = map[int32]string{
	0: "DEDICATED_PER_INTF",
	1: "SHARED_BY_ALL_INTF_ALL_TECH",
	2: "SHARED_BY_ALL_INTF_SAME_TECH",
}

var DeviceInfo_DeviceResourceRanges_Pool_SharingType_value = map[string]int32{
	"DEDICATED_PER_INTF":           0,
	"SHARED_BY_ALL_INTF_ALL_TECH":  1,
	"SHARED_BY_ALL_INTF_SAME_TECH": 2,
}

func (x DeviceInfo_DeviceResourceRanges_Pool_SharingType) String() string {
	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, int32(x))
}

func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0, 1}
}

type GroupMember_InterfaceType int32

const (
	GroupMember_PON           GroupMember_InterfaceType = 0
	GroupMember_EPON_1G_PATH  GroupMember_InterfaceType = 1
	GroupMember_EPON_10G_PATH GroupMember_InterfaceType = 2
)

var GroupMember_InterfaceType_name = map[int32]string{
	0: "PON",
	1: "EPON_1G_PATH",
	2: "EPON_10G_PATH",
}

var GroupMember_InterfaceType_value = map[string]int32{
	"PON":           0,
	"EPON_1G_PATH":  1,
	"EPON_10G_PATH": 2,
}

func (x GroupMember_InterfaceType) String() string {
	return proto.EnumName(GroupMember_InterfaceType_name, int32(x))
}

func (GroupMember_InterfaceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{44, 0}
}

type Group_GroupMembersCommand int32

const (
	Group_ADD_MEMBERS    Group_GroupMembersCommand = 0
	Group_REMOVE_MEMBERS Group_GroupMembersCommand = 1
	Group_SET_MEMBERS    Group_GroupMembersCommand = 2
)

var Group_GroupMembersCommand_name = map[int32]string{
	0: "ADD_MEMBERS",
	1: "REMOVE_MEMBERS",
	2: "SET_MEMBERS",
}

var Group_GroupMembersCommand_value = map[string]int32{
	"ADD_MEMBERS":    0,
	"REMOVE_MEMBERS": 1,
	"SET_MEMBERS":    2,
}

func (x Group_GroupMembersCommand) String() string {
	return proto.EnumName(Group_GroupMembersCommand_name, int32(x))
}

func (Group_GroupMembersCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{45, 0}
}

type Indication struct {
	// Types that are valid to be assigned to Data:
	//	*Indication_OltInd
	//	*Indication_IntfInd
	//	*Indication_IntfOperInd
	//	*Indication_OnuDiscInd
	//	*Indication_OnuInd
	//	*Indication_OmciInd
	//	*Indication_PktInd
	//	*Indication_PortStats
	//	*Indication_FlowStats
	//	*Indication_AlarmInd
	Data                 isIndication_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Indication proto.InternalMessageInfo

type isIndication_Data interface {
	isIndication_Data()
}

type Indication_OltInd struct {
	OltInd *OltIndication `protobuf:"bytes,1,opt,name=olt_ind,json=oltInd,proto3,oneof"`
}

type Indication_IntfInd struct {
	IntfInd *IntfIndication `protobuf:"bytes,2,opt,name=intf_ind,json=intfInd,proto3,oneof"`
}

type Indication_IntfOperInd struct {
	IntfOperInd *IntfOperIndication `protobuf:"bytes,3,opt,name=intf_oper_ind,json=intfOperInd,proto3,oneof"`
}

type Indication_OnuDiscInd struct {
	OnuDiscInd *OnuDiscIndication `protobuf:"bytes,4,opt,name=onu_disc_ind,json=onuDiscInd,proto3,oneof"`
}

type Indication_OnuInd struct {
	OnuInd *OnuIndication `protobuf:"bytes,5,opt,name=onu_ind,json=onuInd,proto3,oneof"`
}

type Indication_OmciInd struct {
	OmciInd *OmciIndication `protobuf:"bytes,6,opt,name=omci_ind,json=omciInd,proto3,oneof"`
}

type Indication_PktInd struct {
	PktInd *PacketIndication `protobuf:"bytes,7,opt,name=pkt_ind,json=pktInd,proto3,oneof"`
}

type Indication_PortStats struct {
	PortStats *PortStatistics `protobuf:"bytes,8,opt,name=port_stats,json=portStats,proto3,oneof"`
}

type Indication_FlowStats struct {
	FlowStats *FlowStatistics `protobuf:"bytes,9,opt,name=flow_stats,json=flowStats,proto3,oneof"`
}

type Indication_AlarmInd struct {
	AlarmInd *AlarmIndication `protobuf:"bytes,10,opt,name=alarm_ind,json=alarmInd,proto3,oneof"`
}

func (*Indication_OltInd) isIndication_Data() {}

func (*Indication_IntfInd) isIndication_Data() {}

func (*Indication_IntfOperInd) isIndication_Data() {}

func (*Indication_OnuDiscInd) isIndication_Data() {}

func (*Indication_OnuInd) isIndication_Data() {}

func (*Indication_OmciInd) isIndication_Data() {}

func (*Indication_PktInd) isIndication_Data() {}

func (*Indication_PortStats) isIndication_Data() {}

func (*Indication_FlowStats) isIndication_Data() {}

func (*Indication_AlarmInd) isIndication_Data() {}

func (m *Indication) GetData() isIndication_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Indication) GetOltInd() *OltIndication {
	if x, ok := m.GetData().(*Indication_OltInd); ok {
		return x.OltInd
	}
	return nil
}

func (m *Indication) GetIntfInd() *IntfIndication {
	if x, ok := m.GetData().(*Indication_IntfInd); ok {
		return x.IntfInd
	}
	return nil
}

func (m *Indication) GetIntfOperInd() *IntfOperIndication {
	if x, ok := m.GetData().(*Indication_IntfOperInd); ok {
		return x.IntfOperInd
	}
	return nil
}

func (m *Indication) GetOnuDiscInd() *OnuDiscIndication {
	if x, ok := m.GetData().(*Indication_OnuDiscInd); ok {
		return x.OnuDiscInd
	}
	return nil
}

func (m *Indication) GetOnuInd() *OnuIndication {
	if x, ok := m.GetData().(*Indication_OnuInd); ok {
		return x.OnuInd
	}
	return nil
}

func (m *Indication) GetOmciInd() *OmciIndication {
	if x, ok := m.GetData().(*Indication_OmciInd); ok {
		return x.OmciInd
	}
	return nil
}

func (m *Indication) GetPktInd() *PacketIndication {
	if x, ok := m.GetData().(*Indication_PktInd); ok {
		return x.PktInd
	}
	return nil
}

func (m *Indication) GetPortStats() *PortStatistics {
	if x, ok := m.GetData().(*Indication_PortStats); ok {
		return x.PortStats
	}
	return nil
}

func (m *Indication) GetFlowStats() *FlowStatistics {
	if x, ok := m.GetData().(*Indication_FlowStats); ok {
		return x.FlowStats
	}
	return nil
}

func (m *Indication) GetAlarmInd() *AlarmIndication {
	if x, ok := m.GetData().(*Indication_AlarmInd); ok {
		return x.AlarmInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Indication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Indication_OltInd)(nil),
		(*Indication_IntfInd)(nil),
		(*Indication_IntfOperInd)(nil),
		(*Indication_OnuDiscInd)(nil),
		(*Indication_OnuInd)(nil),
		(*Indication_OmciInd)(nil),
		(*Indication_PktInd)(nil),
		(*Indication_PortStats)(nil),
		(*Indication_FlowStats)(nil),
		(*Indication_AlarmInd)(nil),
	}
}

type AlarmIndication struct {
	// Types that are valid to be assigned to Data:
	//	*AlarmIndication_LosInd
	//	*AlarmIndication_DyingGaspInd
	//	*AlarmIndication_OnuAlarmInd
	//	*AlarmIndication_OnuStartupFailInd
	//	*AlarmIndication_OnuSignalDegradeInd
	//	*AlarmIndication_OnuDriftOfWindowInd
	//	*AlarmIndication_OnuLossOmciInd
	//	*AlarmIndication_OnuSignalsFailInd
	//	*AlarmIndication_OnuTiwiInd
	//	*AlarmIndication_OnuActivationFailInd
	//	*AlarmIndication_OnuProcessingErrorInd
	//	*AlarmIndication_OnuLossOfSyncFailInd
	//	*AlarmIndication_OnuItuPonStatsInd
	//	*AlarmIndication_OnuDeactivationFailureInd
	//	*AlarmIndication_OnuRemoteDefectInd
	//	*AlarmIndication_OnuLossGemDelineationInd
	//	*AlarmIndication_OnuPhysicalEquipmentErrorInd
	//	*AlarmIndication_OnuLossOfAckInd
	//	*AlarmIndication_OnuDiffReachExceededInd
	Data                 isAlarmIndication_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_AlarmIndication proto.InternalMessageInfo

type isAlarmIndication_Data interface {
	isAlarmIndication_Data()
}

type AlarmIndication_LosInd struct {
	LosInd *LosIndication `protobuf:"bytes,1,opt,name=los_ind,json=losInd,proto3,oneof"`
}

type AlarmIndication_DyingGaspInd struct {
	DyingGaspInd *DyingGaspIndication `protobuf:"bytes,2,opt,name=dying_gasp_ind,json=dyingGaspInd,proto3,oneof"`
}

type AlarmIndication_OnuAlarmInd struct {
	OnuAlarmInd *OnuAlarmIndication `protobuf:"bytes,3,opt,name=onu_alarm_ind,json=onuAlarmInd,proto3,oneof"`
}

type AlarmIndication_OnuStartupFailInd struct {
	OnuStartupFailInd *OnuStartupFailureIndication `protobuf:"bytes,4,opt,name=onu_startup_fail_ind,json=onuStartupFailInd,proto3,oneof"`
}

type AlarmIndication_OnuSignalDegradeInd struct {
	OnuSignalDegradeInd *OnuSignalDegradeIndication `protobuf:"bytes,5,opt,name=onu_signal_degrade_ind,json=onuSignalDegradeInd,proto3,oneof"`
}

type AlarmIndication_OnuDriftOfWindowInd struct {
	OnuDriftOfWindowInd *OnuDriftOfWindowIndication `protobuf:"bytes,6,opt,name=onu_drift_of_window_ind,json=onuDriftOfWindowInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOmciInd struct {
	OnuLossOmciInd *OnuLossOfOmciChannelIndication `protobuf:"bytes,7,opt,name=onu_loss_omci_ind,json=onuLossOmciInd,proto3,oneof"`
}

type AlarmIndication_OnuSignalsFailInd struct {
	OnuSignalsFailInd *OnuSignalsFailureIndication `protobuf:"bytes,8,opt,name=onu_signals_fail_ind,json=onuSignalsFailInd,proto3,oneof"`
}

type AlarmIndication_OnuTiwiInd struct {
	OnuTiwiInd *OnuTransmissionInterferenceWarning `protobuf:"bytes,9,opt,name=onu_tiwi_ind,json=onuTiwiInd,proto3,oneof"`
}

type AlarmIndication_OnuActivationFailInd struct {
	OnuActivationFailInd *OnuActivationFailureIndication `protobuf:"bytes,10,opt,name=onu_activation_fail_ind,json=onuActivationFailInd,proto3,oneof"`
}

type AlarmIndication_OnuProcessingErrorInd struct {
	OnuProcessingErrorInd *OnuProcessingErrorIndication `protobuf:"bytes,11,opt,name=onu_processing_error_ind,json=onuProcessingErrorInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOfSyncFailInd struct {
	OnuLossOfSyncFailInd *OnuLossOfKeySyncFailureIndication `protobuf:"bytes,12,opt,name=onu_loss_of_sync_fail_ind,json=onuLossOfSyncFailInd,proto3,oneof"`
}

type AlarmIndication_OnuItuPonStatsInd struct {
	OnuItuPonStatsInd *OnuItuPonStatsIndication `protobuf:"bytes,13,opt,name=onu_itu_pon_stats_ind,json=onuItuPonStatsInd,proto3,oneof"`
}

type AlarmIndication_OnuDeactivationFailureInd struct {
	OnuDeactivationFailureInd *OnuDeactivationFailureIndication `protobuf:"bytes,14,opt,name=onu_deactivation_failure_ind,json=onuDeactivationFailureInd,proto3,oneof"`
}

type AlarmIndication_OnuRemoteDefectInd struct {
	OnuRemoteDefectInd *OnuRemoteDefectIndication `protobuf:"bytes,15,opt,name=onu_remote_defect_ind,json=onuRemoteDefectInd,proto3,oneof"`
}

type AlarmIndication_OnuLossGemDelineationInd struct {
	OnuLossGemDelineationInd *OnuLossOfGEMChannelDelineationIndication `protobuf:"bytes,16,opt,name=onu_loss_gem_delineation_ind,json=onuLossGemDelineationInd,proto3,oneof"`
}

type AlarmIndication_OnuPhysicalEquipmentErrorInd struct {
	OnuPhysicalEquipmentErrorInd *OnuPhysicalEquipmentErrorIndication `protobuf:"bytes,17,opt,name=onu_physical_equipment_error_ind,json=onuPhysicalEquipmentErrorInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOfAckInd struct {
	OnuLossOfAckInd *OnuLossOfAcknowledgementIndication `protobuf:"bytes,18,opt,name=onu_loss_of_ack_ind,json=onuLossOfAckInd,proto3,oneof"`
}

type AlarmIndication_OnuDiffReachExceededInd struct {
	OnuDiffReachExceededInd *OnuDifferentialReachExceededIndication `protobuf:"bytes,19,opt,name=onu_diff_reach_exceeded_ind,json=onuDiffReachExceededInd,proto3,oneof"`
}

func (*AlarmIndication_LosInd) isAlarmIndication_Data() {}

func (*AlarmIndication_DyingGaspInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuAlarmInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuStartupFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuSignalDegradeInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDriftOfWindowInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOmciInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuSignalsFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuTiwiInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuActivationFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuProcessingErrorInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOfSyncFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuItuPonStatsInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDeactivationFailureInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuRemoteDefectInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossGemDelineationInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuPhysicalEquipmentErrorInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOfAckInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDiffReachExceededInd) isAlarmIndication_Data() {}

func (m *AlarmIndication) GetData() isAlarmIndication_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *AlarmIndication) GetLosInd() *LosIndication {
	if x, ok := m.GetData().(*AlarmIndication_LosInd); ok {
		return x.LosInd
	}
	return nil
}

func (m *AlarmIndication) GetDyingGaspInd() *DyingGaspIndication {
	if x, ok := m.GetData().(*AlarmIndication_DyingGaspInd); ok {
		return x.DyingGaspInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuAlarmInd() *OnuAlarmIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuAlarmInd); ok {
		return x.OnuAlarmInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuStartupFailInd() *OnuStartupFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuStartupFailInd); ok {
		return x.OnuStartupFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuSignalDegradeInd() *OnuSignalDegradeIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuSignalDegradeInd); ok {
		return x.OnuSignalDegradeInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDriftOfWindowInd() *OnuDriftOfWindowIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDriftOfWindowInd); ok {
		return x.OnuDriftOfWindowInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOmciInd() *OnuLossOfOmciChannelIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOmciInd); ok {
		return x.OnuLossOmciInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuSignalsFailInd() *OnuSignalsFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuSignalsFailInd); ok {
		return x.OnuSignalsFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuTiwiInd() *OnuTransmissionInterferenceWarning {
	if x, ok := m.GetData().(*AlarmIndication_OnuTiwiInd); ok {
		return x.OnuTiwiInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuActivationFailInd() *OnuActivationFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuActivationFailInd); ok {
		return x.OnuActivationFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuProcessingErrorInd() *OnuProcessingErrorIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuProcessingErrorInd); ok {
		return x.OnuProcessingErrorInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOfSyncFailInd() *OnuLossOfKeySyncFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfSyncFailInd); ok {
		return x.OnuLossOfSyncFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuItuPonStatsInd() *OnuItuPonStatsIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuItuPonStatsInd); ok {
		return x.OnuItuPonStatsInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDeactivationFailureInd() *OnuDeactivationFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDeactivationFailureInd); ok {
		return x.OnuDeactivationFailureInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuRemoteDefectInd() *OnuRemoteDefectIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuRemoteDefectInd); ok {
		return x.OnuRemoteDefectInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossGemDelineationInd() *OnuLossOfGEMChannelDelineationIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossGemDelineationInd); ok {
		return x.OnuLossGemDelineationInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuPhysicalEquipmentErrorInd() *OnuPhysicalEquipmentErrorIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuPhysicalEquipmentErrorInd); ok {
		return x.OnuPhysicalEquipmentErrorInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOfAckInd() *OnuLossOfAcknowledgementIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfAckInd); ok {
		return x.OnuLossOfAckInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDiffReachExceededInd() *OnuDifferentialReachExceededIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDiffReachExceededInd); ok {
		return x.OnuDiffReachExceededInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AlarmIndication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AlarmIndication_LosInd)(nil),
		(*AlarmIndication_DyingGaspInd)(nil),
		(*AlarmIndication_OnuAlarmInd)(nil),
		(*AlarmIndication_OnuStartupFailInd)(nil),
		(*AlarmIndication_OnuSignalDegradeInd)(nil),
		(*AlarmIndication_OnuDriftOfWindowInd)(nil),
		(*AlarmIndication_OnuLossOmciInd)(nil),
		(*AlarmIndication_OnuSignalsFailInd)(nil),
		(*AlarmIndication_OnuTiwiInd)(nil),
		(*AlarmIndication_OnuActivationFailInd)(nil),
		(*AlarmIndication_OnuProcessingErrorInd)(nil),
		(*AlarmIndication_OnuLossOfSyncFailInd)(nil),
		(*AlarmIndication_OnuItuPonStatsInd)(nil),
		(*AlarmIndication_OnuDeactivationFailureInd)(nil),
		(*AlarmIndication_OnuRemoteDefectInd)(nil),
		(*AlarmIndication_OnuLossGemDelineationInd)(nil),
		(*AlarmIndication_OnuPhysicalEquipmentErrorInd)(nil),
		(*AlarmIndication_OnuLossOfAckInd)(nil),
		(*AlarmIndication_OnuDiffReachExceededInd)(nil),
	}
}

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

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

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

var xxx_messageInfo_OltIndication proto.InternalMessageInfo

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

type IntfIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OperState            string   `protobuf:"bytes,2,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_IntfIndication proto.InternalMessageInfo

func (m *IntfIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type OnuDiscIndication struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,2,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_OnuDiscIndication proto.InternalMessageInfo

func (m *OnuDiscIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuDiscIndication) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

type OnuIndication struct {
	IntfId               uint32                             `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32                             `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	OperState            string                             `protobuf:"bytes,3,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	AdminState           string                             `protobuf:"bytes,5,opt,name=admin_state,json=adminState,proto3" json:"admin_state,omitempty"`
	SerialNumber         *SerialNumber                      `protobuf:"bytes,4,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	FailReason           OnuIndication_ActivationFailReason `protobuf:"varint,6,opt,name=fail_reason,json=failReason,proto3,enum=openolt.OnuIndication_ActivationFailReason" json:"fail_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

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

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

var xxx_messageInfo_OnuIndication proto.InternalMessageInfo

func (m *OnuIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuIndication) GetAdminState() string {
	if m != nil {
		return m.AdminState
	}
	return ""
}

func (m *OnuIndication) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

func (m *OnuIndication) GetFailReason() OnuIndication_ActivationFailReason {
	if m != nil {
		return m.FailReason
	}
	return OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE
}

type IntfOperIndication struct {
	Type                 string   `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	IntfId               uint32   `protobuf:"fixed32,2,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OperState            string   `protobuf:"bytes,3,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_IntfOperIndication proto.InternalMessageInfo

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

func (m *IntfOperIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type OmciIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OmciIndication proto.InternalMessageInfo

func (m *OmciIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OmciIndication) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type PacketIndication struct {
	IntfType             string   `protobuf:"bytes,5,opt,name=intf_type,json=intfType,proto3" json:"intf_type,omitempty"`
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,2,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	FlowId               uint32   `protobuf:"fixed32,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	PortNo               uint32   `protobuf:"fixed32,6,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	Cookie               uint64   `protobuf:"fixed64,7,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,4,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PacketIndication proto.InternalMessageInfo

func (m *PacketIndication) GetIntfType() string {
	if m != nil {
		return m.IntfType
	}
	return ""
}

func (m *PacketIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PacketIndication) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

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

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

func (m *PacketIndication) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *PacketIndication) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type Interface struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Interface proto.InternalMessageInfo

func (m *Interface) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

type Heartbeat struct {
	HeartbeatSignature   uint32   `protobuf:"fixed32,1,opt,name=heartbeat_signature,json=heartbeatSignature,proto3" json:"heartbeat_signature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Heartbeat proto.InternalMessageInfo

func (m *Heartbeat) GetHeartbeatSignature() uint32 {
	if m != nil {
		return m.HeartbeatSignature
	}
	return 0
}

type Onu struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32        `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,3,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	Pir                  uint32        `protobuf:"fixed32,4,opt,name=pir,proto3" json:"pir,omitempty"`
	OmccEncryption       bool          `protobuf:"varint,5,opt,name=omcc_encryption,json=omccEncryption,proto3" json:"omcc_encryption,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_c072e7aa0dfd74d5, []int{11}
}

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) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *Onu) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

func (m *Onu) GetPir() uint32 {
	if m != nil {
		return m.Pir
	}
	return 0
}

func (m *Onu) GetOmccEncryption() bool {
	if m != nil {
		return m.OmccEncryption
	}
	return false
}

type OnuLogicalDistance struct {
	IntfId                 uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                  uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	LogicalOnuDistanceZero uint32   `protobuf:"fixed32,3,opt,name=logical_onu_distance_zero,json=logicalOnuDistanceZero,proto3" json:"logical_onu_distance_zero,omitempty"`
	LogicalOnuDistance     uint32   `protobuf:"fixed32,4,opt,name=logical_onu_distance,json=logicalOnuDistance,proto3" json:"logical_onu_distance,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_OnuLogicalDistance proto.InternalMessageInfo

func (m *OnuLogicalDistance) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OnuLogicalDistance) GetLogicalOnuDistanceZero() uint32 {
	if m != nil {
		return m.LogicalOnuDistanceZero
	}
	return 0
}

func (m *OnuLogicalDistance) GetLogicalOnuDistance() uint32 {
	if m != nil {
		return m.LogicalOnuDistance
	}
	return 0
}

type OmciMsg struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OmciMsg proto.InternalMessageInfo

func (m *OmciMsg) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OmciMsg) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type OnuPacket struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	PortNo               uint32   `protobuf:"fixed32,4,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,5,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OnuPacket proto.InternalMessageInfo

func (m *OnuPacket) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuPacket) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *OnuPacket) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type UplinkPacket struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,2,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UplinkPacket proto.InternalMessageInfo

func (m *UplinkPacket) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *UplinkPacket) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type DeviceInfo struct {
	Vendor             string `protobuf:"bytes,1,opt,name=vendor,proto3" json:"vendor,omitempty"`
	Model              string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
	HardwareVersion    string `protobuf:"bytes,3,opt,name=hardware_version,json=hardwareVersion,proto3" json:"hardware_version,omitempty"`
	FirmwareVersion    string `protobuf:"bytes,4,opt,name=firmware_version,json=firmwareVersion,proto3" json:"firmware_version,omitempty"`
	DeviceId           string `protobuf:"bytes,16,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
	DeviceSerialNumber string `protobuf:"bytes,17,opt,name=device_serial_number,json=deviceSerialNumber,proto3" json:"device_serial_number,omitempty"`
	// Total number of pon intf ports on the device
	PonPorts uint32 `protobuf:"fixed32,12,opt,name=pon_ports,json=ponPorts,proto3" json:"pon_ports,omitempty"`
	// If using global per-device technology profile. To be deprecated
	Technology           string                             `protobuf:"bytes,5,opt,name=technology,proto3" json:"technology,omitempty"`
	OnuIdStart           uint32                             `protobuf:"fixed32,6,opt,name=onu_id_start,json=onuIdStart,proto3" json:"onu_id_start,omitempty"`
	OnuIdEnd             uint32                             `protobuf:"fixed32,7,opt,name=onu_id_end,json=onuIdEnd,proto3" json:"onu_id_end,omitempty"`
	AllocIdStart         uint32                             `protobuf:"fixed32,8,opt,name=alloc_id_start,json=allocIdStart,proto3" json:"alloc_id_start,omitempty"`
	AllocIdEnd           uint32                             `protobuf:"fixed32,9,opt,name=alloc_id_end,json=allocIdEnd,proto3" json:"alloc_id_end,omitempty"`
	GemportIdStart       uint32                             `protobuf:"fixed32,10,opt,name=gemport_id_start,json=gemportIdStart,proto3" json:"gemport_id_start,omitempty"`
	GemportIdEnd         uint32                             `protobuf:"fixed32,11,opt,name=gemport_id_end,json=gemportIdEnd,proto3" json:"gemport_id_end,omitempty"`
	FlowIdStart          uint32                             `protobuf:"fixed32,13,opt,name=flow_id_start,json=flowIdStart,proto3" json:"flow_id_start,omitempty"`
	FlowIdEnd            uint32                             `protobuf:"fixed32,14,opt,name=flow_id_end,json=flowIdEnd,proto3" json:"flow_id_end,omitempty"`
	Ranges               []*DeviceInfo_DeviceResourceRanges `protobuf:"bytes,15,rep,name=ranges,proto3" json:"ranges,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

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

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

var xxx_messageInfo_DeviceInfo proto.InternalMessageInfo

func (m *DeviceInfo) GetVendor() string {
	if m != nil {
		return m.Vendor
	}
	return ""
}

func (m *DeviceInfo) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

func (m *DeviceInfo) GetHardwareVersion() string {
	if m != nil {
		return m.HardwareVersion
	}
	return ""
}

func (m *DeviceInfo) GetFirmwareVersion() string {
	if m != nil {
		return m.FirmwareVersion
	}
	return ""
}

func (m *DeviceInfo) GetDeviceId() string {
	if m != nil {
		return m.DeviceId
	}
	return ""
}

func (m *DeviceInfo) GetDeviceSerialNumber() string {
	if m != nil {
		return m.DeviceSerialNumber
	}
	return ""
}

func (m *DeviceInfo) GetPonPorts() uint32 {
	if m != nil {
		return m.PonPorts
	}
	return 0
}

func (m *DeviceInfo) GetTechnology() string {
	if m != nil {
		return m.Technology
	}
	return ""
}

func (m *DeviceInfo) GetOnuIdStart() uint32 {
	if m != nil {
		return m.OnuIdStart
	}
	return 0
}

func (m *DeviceInfo) GetOnuIdEnd() uint32 {
	if m != nil {
		return m.OnuIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetAllocIdStart() uint32 {
	if m != nil {
		return m.AllocIdStart
	}
	return 0
}

func (m *DeviceInfo) GetAllocIdEnd() uint32 {
	if m != nil {
		return m.AllocIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetGemportIdStart() uint32 {
	if m != nil {
		return m.GemportIdStart
	}
	return 0
}

func (m *DeviceInfo) GetGemportIdEnd() uint32 {
	if m != nil {
		return m.GemportIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetFlowIdStart() uint32 {
	if m != nil {
		return m.FlowIdStart
	}
	return 0
}

func (m *DeviceInfo) GetFlowIdEnd() uint32 {
	if m != nil {
		return m.FlowIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetRanges() []*DeviceInfo_DeviceResourceRanges {
	if m != nil {
		return m.Ranges
	}
	return nil
}

type DeviceInfo_DeviceResourceRanges struct {
	// List of 0 or more intf_ids that use the same technology and pools.
	// If 0 intf_ids supplied, it implies ALL interfaces
	IntfIds []uint32 `protobuf:"fixed32,1,rep,packed,name=intf_ids,json=intfIds,proto3" json:"intf_ids,omitempty"`
	// Technology profile for this pool
	Technology           string                                  `protobuf:"bytes,2,opt,name=technology,proto3" json:"technology,omitempty"`
	Pools                []*DeviceInfo_DeviceResourceRanges_Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_DeviceInfo_DeviceResourceRanges proto.InternalMessageInfo

func (m *DeviceInfo_DeviceResourceRanges) GetIntfIds() []uint32 {
	if m != nil {
		return m.IntfIds
	}
	return nil
}

func (m *DeviceInfo_DeviceResourceRanges) GetTechnology() string {
	if m != nil {
		return m.Technology
	}
	return ""
}

func (m *DeviceInfo_DeviceResourceRanges) GetPools() []*DeviceInfo_DeviceResourceRanges_Pool {
	if m != nil {
		return m.Pools
	}
	return nil
}

type DeviceInfo_DeviceResourceRanges_Pool struct {
	Type                 DeviceInfo_DeviceResourceRanges_Pool_PoolType    `protobuf:"varint,1,opt,name=type,proto3,enum=openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType" json:"type,omitempty"`
	Sharing              DeviceInfo_DeviceResourceRanges_Pool_SharingType `protobuf:"varint,2,opt,name=sharing,proto3,enum=openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType" json:"sharing,omitempty"`
	Start                uint32                                           `protobuf:"fixed32,3,opt,name=start,proto3" json:"start,omitempty"`
	End                  uint32                                           `protobuf:"fixed32,4,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

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

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

var xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool proto.InternalMessageInfo

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetType() DeviceInfo_DeviceResourceRanges_Pool_PoolType {
	if m != nil {
		return m.Type
	}
	return DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetSharing() DeviceInfo_DeviceResourceRanges_Pool_SharingType {
	if m != nil {
		return m.Sharing
	}
	return DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetStart() uint32 {
	if m != nil {
		return m.Start
	}
	return 0
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetEnd() uint32 {
	if m != nil {
		return m.End
	}
	return 0
}

type Classifier struct {
	OTpid                uint32   `protobuf:"fixed32,1,opt,name=o_tpid,json=oTpid,proto3" json:"o_tpid,omitempty"`
	OVid                 uint32   `protobuf:"fixed32,2,opt,name=o_vid,json=oVid,proto3" json:"o_vid,omitempty"`
	ITpid                uint32   `protobuf:"fixed32,3,opt,name=i_tpid,json=iTpid,proto3" json:"i_tpid,omitempty"`
	IVid                 uint32   `protobuf:"fixed32,4,opt,name=i_vid,json=iVid,proto3" json:"i_vid,omitempty"`
	OPbits               uint32   `protobuf:"fixed32,5,opt,name=o_pbits,json=oPbits,proto3" json:"o_pbits,omitempty"`
	IPbits               uint32   `protobuf:"fixed32,6,opt,name=i_pbits,json=iPbits,proto3" json:"i_pbits,omitempty"`
	EthType              uint32   `protobuf:"fixed32,7,opt,name=eth_type,json=ethType,proto3" json:"eth_type,omitempty"`
	DstMac               []byte   `protobuf:"bytes,8,opt,name=dst_mac,json=dstMac,proto3" json:"dst_mac,omitempty"`
	SrcMac               []byte   `protobuf:"bytes,9,opt,name=src_mac,json=srcMac,proto3" json:"src_mac,omitempty"`
	IpProto              uint32   `protobuf:"fixed32,10,opt,name=ip_proto,json=ipProto,proto3" json:"ip_proto,omitempty"`
	DstIp                uint32   `protobuf:"fixed32,11,opt,name=dst_ip,json=dstIp,proto3" json:"dst_ip,omitempty"`
	SrcIp                uint32   `protobuf:"fixed32,12,opt,name=src_ip,json=srcIp,proto3" json:"src_ip,omitempty"`
	SrcPort              uint32   `protobuf:"fixed32,13,opt,name=src_port,json=srcPort,proto3" json:"src_port,omitempty"`
	DstPort              uint32   `protobuf:"fixed32,14,opt,name=dst_port,json=dstPort,proto3" json:"dst_port,omitempty"`
	PktTagType           string   `protobuf:"bytes,15,opt,name=pkt_tag_type,json=pktTagType,proto3" json:"pkt_tag_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Classifier proto.InternalMessageInfo

func (m *Classifier) GetOTpid() uint32 {
	if m != nil {
		return m.OTpid
	}
	return 0
}

func (m *Classifier) GetOVid() uint32 {
	if m != nil {
		return m.OVid
	}
	return 0
}

func (m *Classifier) GetITpid() uint32 {
	if m != nil {
		return m.ITpid
	}
	return 0
}

func (m *Classifier) GetIVid() uint32 {
	if m != nil {
		return m.IVid
	}
	return 0
}

func (m *Classifier) GetOPbits() uint32 {
	if m != nil {
		return m.OPbits
	}
	return 0
}

func (m *Classifier) GetIPbits() uint32 {
	if m != nil {
		return m.IPbits
	}
	return 0
}

func (m *Classifier) GetEthType() uint32 {
	if m != nil {
		return m.EthType
	}
	return 0
}

func (m *Classifier) GetDstMac() []byte {
	if m != nil {
		return m.DstMac
	}
	return nil
}

func (m *Classifier) GetSrcMac() []byte {
	if m != nil {
		return m.SrcMac
	}
	return nil
}

func (m *Classifier) GetIpProto() uint32 {
	if m != nil {
		return m.IpProto
	}
	return 0
}

func (m *Classifier) GetDstIp() uint32 {
	if m != nil {
		return m.DstIp
	}
	return 0
}

func (m *Classifier) GetSrcIp() uint32 {
	if m != nil {
		return m.SrcIp
	}
	return 0
}

func (m *Classifier) GetSrcPort() uint32 {
	if m != nil {
		return m.SrcPort
	}
	return 0
}

func (m *Classifier) GetDstPort() uint32 {
	if m != nil {
		return m.DstPort
	}
	return 0
}

func (m *Classifier) GetPktTagType() string {
	if m != nil {
		return m.PktTagType
	}
	return ""
}

type ActionCmd struct {
	AddOuterTag          bool     `protobuf:"varint,1,opt,name=add_outer_tag,json=addOuterTag,proto3" json:"add_outer_tag,omitempty"`
	RemoveOuterTag       bool     `protobuf:"varint,2,opt,name=remove_outer_tag,json=removeOuterTag,proto3" json:"remove_outer_tag,omitempty"`
	TrapToHost           bool     `protobuf:"varint,3,opt,name=trap_to_host,json=trapToHost,proto3" json:"trap_to_host,omitempty"`
	RemarkOuterPbits     bool     `protobuf:"varint,4,opt,name=remark_outer_pbits,json=remarkOuterPbits,proto3" json:"remark_outer_pbits,omitempty"`
	RemarkInnerPbits     bool     `protobuf:"varint,5,opt,name=remark_inner_pbits,json=remarkInnerPbits,proto3" json:"remark_inner_pbits,omitempty"`
	AddInnerTag          bool     `protobuf:"varint,6,opt,name=add_inner_tag,json=addInnerTag,proto3" json:"add_inner_tag,omitempty"`
	RemoveInnerTag       bool     `protobuf:"varint,7,opt,name=remove_inner_tag,json=removeInnerTag,proto3" json:"remove_inner_tag,omitempty"`
	TranslateInnerTag    bool     `protobuf:"varint,8,opt,name=translate_inner_tag,json=translateInnerTag,proto3" json:"translate_inner_tag,omitempty"`
	TranslateOuterTag    bool     `protobuf:"varint,9,opt,name=translate_outer_tag,json=translateOuterTag,proto3" json:"translate_outer_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ActionCmd proto.InternalMessageInfo

func (m *ActionCmd) GetAddOuterTag() bool {
	if m != nil {
		return m.AddOuterTag
	}
	return false
}

func (m *ActionCmd) GetRemoveOuterTag() bool {
	if m != nil {
		return m.RemoveOuterTag
	}
	return false
}

func (m *ActionCmd) GetTrapToHost() bool {
	if m != nil {
		return m.TrapToHost
	}
	return false
}

func (m *ActionCmd) GetRemarkOuterPbits() bool {
	if m != nil {
		return m.RemarkOuterPbits
	}
	return false
}

func (m *ActionCmd) GetRemarkInnerPbits() bool {
	if m != nil {
		return m.RemarkInnerPbits
	}
	return false
}

func (m *ActionCmd) GetAddInnerTag() bool {
	if m != nil {
		return m.AddInnerTag
	}
	return false
}

func (m *ActionCmd) GetRemoveInnerTag() bool {
	if m != nil {
		return m.RemoveInnerTag
	}
	return false
}

func (m *ActionCmd) GetTranslateInnerTag() bool {
	if m != nil {
		return m.TranslateInnerTag
	}
	return false
}

func (m *ActionCmd) GetTranslateOuterTag() bool {
	if m != nil {
		return m.TranslateOuterTag
	}
	return false
}

type Action struct {
	Cmd                  *ActionCmd `protobuf:"bytes,1,opt,name=cmd,proto3" json:"cmd,omitempty"`
	OVid                 uint32     `protobuf:"fixed32,2,opt,name=o_vid,json=oVid,proto3" json:"o_vid,omitempty"`
	OPbits               uint32     `protobuf:"fixed32,3,opt,name=o_pbits,json=oPbits,proto3" json:"o_pbits,omitempty"`
	OTpid                uint32     `protobuf:"fixed32,4,opt,name=o_tpid,json=oTpid,proto3" json:"o_tpid,omitempty"`
	IVid                 uint32     `protobuf:"fixed32,5,opt,name=i_vid,json=iVid,proto3" json:"i_vid,omitempty"`
	IPbits               uint32     `protobuf:"fixed32,6,opt,name=i_pbits,json=iPbits,proto3" json:"i_pbits,omitempty"`
	ITpid                uint32     `protobuf:"fixed32,7,opt,name=i_tpid,json=iTpid,proto3" json:"i_tpid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Action proto.InternalMessageInfo

func (m *Action) GetCmd() *ActionCmd {
	if m != nil {
		return m.Cmd
	}
	return nil
}

func (m *Action) GetOVid() uint32 {
	if m != nil {
		return m.OVid
	}
	return 0
}

func (m *Action) GetOPbits() uint32 {
	if m != nil {
		return m.OPbits
	}
	return 0
}

func (m *Action) GetOTpid() uint32 {
	if m != nil {
		return m.OTpid
	}
	return 0
}

func (m *Action) GetIVid() uint32 {
	if m != nil {
		return m.IVid
	}
	return 0
}

func (m *Action) GetIPbits() uint32 {
	if m != nil {
		return m.IPbits
	}
	return 0
}

func (m *Action) GetITpid() uint32 {
	if m != nil {
		return m.ITpid
	}
	return 0
}

type Flow struct {
	AccessIntfId         int32             `protobuf:"fixed32,1,opt,name=access_intf_id,json=accessIntfId,proto3" json:"access_intf_id,omitempty"`
	OnuId                int32             `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	UniId                int32             `protobuf:"fixed32,11,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	FlowId               uint64            `protobuf:"fixed64,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	SymmetricFlowId      uint64            `protobuf:"fixed64,18,opt,name=symmetric_flow_id,json=symmetricFlowId,proto3" json:"symmetric_flow_id,omitempty"`
	FlowType             string            `protobuf:"bytes,4,opt,name=flow_type,json=flowType,proto3" json:"flow_type,omitempty"`
	AllocId              int32             `protobuf:"fixed32,10,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
	NetworkIntfId        int32             `protobuf:"fixed32,5,opt,name=network_intf_id,json=networkIntfId,proto3" json:"network_intf_id,omitempty"`
	GemportId            int32             `protobuf:"fixed32,6,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	Classifier           *Classifier       `protobuf:"bytes,7,opt,name=classifier,proto3" json:"classifier,omitempty"`
	Action               *Action           `protobuf:"bytes,8,opt,name=action,proto3" json:"action,omitempty"`
	Priority             int32             `protobuf:"fixed32,9,opt,name=priority,proto3" json:"priority,omitempty"`
	Cookie               uint64            `protobuf:"fixed64,12,opt,name=cookie,proto3" json:"cookie,omitempty"`
	PortNo               uint32            `protobuf:"fixed32,13,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	GroupId              uint32            `protobuf:"fixed32,14,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	TechProfileId        uint32            `protobuf:"fixed32,15,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
	ReplicateFlow        bool              `protobuf:"varint,16,opt,name=replicate_flow,json=replicateFlow,proto3" json:"replicate_flow,omitempty"`
	PbitToGemport        map[uint32]uint32 `protobuf:"bytes,17,rep,name=pbit_to_gemport,json=pbitToGemport,proto3" json:"pbit_to_gemport,omitempty" protobuf_key:"fixed32,1,opt,name=key,proto3" protobuf_val:"fixed32,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Flow proto.InternalMessageInfo

func (m *Flow) GetAccessIntfId() int32 {
	if m != nil {
		return m.AccessIntfId
	}
	return 0
}

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

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

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

func (m *Flow) GetSymmetricFlowId() uint64 {
	if m != nil {
		return m.SymmetricFlowId
	}
	return 0
}

func (m *Flow) GetFlowType() string {
	if m != nil {
		return m.FlowType
	}
	return ""
}

func (m *Flow) GetAllocId() int32 {
	if m != nil {
		return m.AllocId
	}
	return 0
}

func (m *Flow) GetNetworkIntfId() int32 {
	if m != nil {
		return m.NetworkIntfId
	}
	return 0
}

func (m *Flow) GetGemportId() int32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *Flow) GetClassifier() *Classifier {
	if m != nil {
		return m.Classifier
	}
	return nil
}

func (m *Flow) GetAction() *Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *Flow) GetPriority() int32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *Flow) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

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

func (m *Flow) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *Flow) GetTechProfileId() uint32 {
	if m != nil {
		return m.TechProfileId
	}
	return 0
}

func (m *Flow) GetReplicateFlow() bool {
	if m != nil {
		return m.ReplicateFlow
	}
	return false
}

func (m *Flow) GetPbitToGemport() map[uint32]uint32 {
	if m != nil {
		return m.PbitToGemport
	}
	return nil
}

type SerialNumber struct {
	VendorId             []byte   `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
	VendorSpecific       []byte   `protobuf:"bytes,2,opt,name=vendor_specific,json=vendorSpecific,proto3" json:"vendor_specific,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SerialNumber proto.InternalMessageInfo

func (m *SerialNumber) GetVendorId() []byte {
	if m != nil {
		return m.VendorId
	}
	return nil
}

func (m *SerialNumber) GetVendorSpecific() []byte {
	if m != nil {
		return m.VendorSpecific
	}
	return nil
}

type PortStatistics struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	RxUcastPackets       uint64   `protobuf:"fixed64,4,opt,name=rx_ucast_packets,json=rxUcastPackets,proto3" json:"rx_ucast_packets,omitempty"`
	RxMcastPackets       uint64   `protobuf:"fixed64,5,opt,name=rx_mcast_packets,json=rxMcastPackets,proto3" json:"rx_mcast_packets,omitempty"`
	RxBcastPackets       uint64   `protobuf:"fixed64,6,opt,name=rx_bcast_packets,json=rxBcastPackets,proto3" json:"rx_bcast_packets,omitempty"`
	RxErrorPackets       uint64   `protobuf:"fixed64,7,opt,name=rx_error_packets,json=rxErrorPackets,proto3" json:"rx_error_packets,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,8,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,9,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	TxUcastPackets       uint64   `protobuf:"fixed64,10,opt,name=tx_ucast_packets,json=txUcastPackets,proto3" json:"tx_ucast_packets,omitempty"`
	TxMcastPackets       uint64   `protobuf:"fixed64,11,opt,name=tx_mcast_packets,json=txMcastPackets,proto3" json:"tx_mcast_packets,omitempty"`
	TxBcastPackets       uint64   `protobuf:"fixed64,12,opt,name=tx_bcast_packets,json=txBcastPackets,proto3" json:"tx_bcast_packets,omitempty"`
	TxErrorPackets       uint64   `protobuf:"fixed64,13,opt,name=tx_error_packets,json=txErrorPackets,proto3" json:"tx_error_packets,omitempty"`
	RxCrcErrors          uint64   `protobuf:"fixed64,14,opt,name=rx_crc_errors,json=rxCrcErrors,proto3" json:"rx_crc_errors,omitempty"`
	BipErrors            uint64   `protobuf:"fixed64,15,opt,name=bip_errors,json=bipErrors,proto3" json:"bip_errors,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,16,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PortStatistics proto.InternalMessageInfo

func (m *PortStatistics) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PortStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *PortStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *PortStatistics) GetRxUcastPackets() uint64 {
	if m != nil {
		return m.RxUcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxMcastPackets() uint64 {
	if m != nil {
		return m.RxMcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxBcastPackets() uint64 {
	if m != nil {
		return m.RxBcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxErrorPackets() uint64 {
	if m != nil {
		return m.RxErrorPackets
	}
	return 0
}

func (m *PortStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *PortStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *PortStatistics) GetTxUcastPackets() uint64 {
	if m != nil {
		return m.TxUcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxMcastPackets() uint64 {
	if m != nil {
		return m.TxMcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxBcastPackets() uint64 {
	if m != nil {
		return m.TxBcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxErrorPackets() uint64 {
	if m != nil {
		return m.TxErrorPackets
	}
	return 0
}

func (m *PortStatistics) GetRxCrcErrors() uint64 {
	if m != nil {
		return m.RxCrcErrors
	}
	return 0
}

func (m *PortStatistics) GetBipErrors() uint64 {
	if m != nil {
		return m.BipErrors
	}
	return 0
}

func (m *PortStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type FlowStatistics struct {
	FlowId               uint32   `protobuf:"fixed32,1,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,8,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,9,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,16,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_FlowStatistics proto.InternalMessageInfo

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

func (m *FlowStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *FlowStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *FlowStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *FlowStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *FlowStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type LosIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LosIndication proto.InternalMessageInfo

func (m *LosIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type DyingGaspIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *DyingGaspIndication) Reset()         { *m = DyingGaspIndication{} }
func (m *DyingGaspIndication) String() string { return proto.CompactTextString(m) }
func (*DyingGaspIndication) ProtoMessage()    {}
func (*DyingGaspIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{25}
}

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

var xxx_messageInfo_DyingGaspIndication proto.InternalMessageInfo

func (m *DyingGaspIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuAlarmIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	LosStatus            string   `protobuf:"bytes,3,opt,name=los_status,json=losStatus,proto3" json:"los_status,omitempty"`
	LobStatus            string   `protobuf:"bytes,4,opt,name=lob_status,json=lobStatus,proto3" json:"lob_status,omitempty"`
	LopcMissStatus       string   `protobuf:"bytes,5,opt,name=lopc_miss_status,json=lopcMissStatus,proto3" json:"lopc_miss_status,omitempty"`
	LopcMicErrorStatus   string   `protobuf:"bytes,6,opt,name=lopc_mic_error_status,json=lopcMicErrorStatus,proto3" json:"lopc_mic_error_status,omitempty"`
	LofiStatus           string   `protobuf:"bytes,7,opt,name=lofi_status,json=lofiStatus,proto3" json:"lofi_status,omitempty"`
	LoamiStatus          string   `protobuf:"bytes,8,opt,name=loami_status,json=loamiStatus,proto3" json:"loami_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OnuAlarmIndication proto.InternalMessageInfo

func (m *OnuAlarmIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OnuAlarmIndication) GetLosStatus() string {
	if m != nil {
		return m.LosStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLobStatus() string {
	if m != nil {
		return m.LobStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLopcMissStatus() string {
	if m != nil {
		return m.LopcMissStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLopcMicErrorStatus() string {
	if m != nil {
		return m.LopcMicErrorStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLofiStatus() string {
	if m != nil {
		return m.LofiStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLoamiStatus() string {
	if m != nil {
		return m.LoamiStatus
	}
	return ""
}

type OnuStartupFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuStartupFailureIndication) Reset()         { *m = OnuStartupFailureIndication{} }
func (m *OnuStartupFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuStartupFailureIndication) ProtoMessage()    {}
func (*OnuStartupFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{27}
}

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

var xxx_messageInfo_OnuStartupFailureIndication proto.InternalMessageInfo

func (m *OnuStartupFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuSignalDegradeIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	InverseBitErrorRate  uint32   `protobuf:"fixed32,4,opt,name=inverse_bit_error_rate,json=inverseBitErrorRate,proto3" json:"inverse_bit_error_rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuSignalDegradeIndication) Reset()         { *m = OnuSignalDegradeIndication{} }
func (m *OnuSignalDegradeIndication) String() string { return proto.CompactTextString(m) }
func (*OnuSignalDegradeIndication) ProtoMessage()    {}
func (*OnuSignalDegradeIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{28}
}

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

var xxx_messageInfo_OnuSignalDegradeIndication proto.InternalMessageInfo

func (m *OnuSignalDegradeIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuSignalDegradeIndication) GetInverseBitErrorRate() uint32 {
	if m != nil {
		return m.InverseBitErrorRate
	}
	return 0
}

type OnuDriftOfWindowIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Drift                uint32   `protobuf:"fixed32,4,opt,name=drift,proto3" json:"drift,omitempty"`
	NewEqd               uint32   `protobuf:"fixed32,5,opt,name=new_eqd,json=newEqd,proto3" json:"new_eqd,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuDriftOfWindowIndication) Reset()         { *m = OnuDriftOfWindowIndication{} }
func (m *OnuDriftOfWindowIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDriftOfWindowIndication) ProtoMessage()    {}
func (*OnuDriftOfWindowIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{29}
}

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

var xxx_messageInfo_OnuDriftOfWindowIndication proto.InternalMessageInfo

func (m *OnuDriftOfWindowIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuDriftOfWindowIndication) GetDrift() uint32 {
	if m != nil {
		return m.Drift
	}
	return 0
}

func (m *OnuDriftOfWindowIndication) GetNewEqd() uint32 {
	if m != nil {
		return m.NewEqd
	}
	return 0
}

type OnuLossOfOmciChannelIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuLossOfOmciChannelIndication) Reset()         { *m = OnuLossOfOmciChannelIndication{} }
func (m *OnuLossOfOmciChannelIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfOmciChannelIndication) ProtoMessage()    {}
func (*OnuLossOfOmciChannelIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{30}
}

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

var xxx_messageInfo_OnuLossOfOmciChannelIndication proto.InternalMessageInfo

func (m *OnuLossOfOmciChannelIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuSignalsFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	InverseBitErrorRate  uint32   `protobuf:"fixed32,4,opt,name=inverse_bit_error_rate,json=inverseBitErrorRate,proto3" json:"inverse_bit_error_rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuSignalsFailureIndication) Reset()         { *m = OnuSignalsFailureIndication{} }
func (m *OnuSignalsFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuSignalsFailureIndication) ProtoMessage()    {}
func (*OnuSignalsFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{31}
}

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

var xxx_messageInfo_OnuSignalsFailureIndication proto.InternalMessageInfo

func (m *OnuSignalsFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuSignalsFailureIndication) GetInverseBitErrorRate() uint32 {
	if m != nil {
		return m.InverseBitErrorRate
	}
	return 0
}

type OnuTransmissionInterferenceWarning struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Drift                uint32   `protobuf:"fixed32,4,opt,name=drift,proto3" json:"drift,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuTransmissionInterferenceWarning) Reset()         { *m = OnuTransmissionInterferenceWarning{} }
func (m *OnuTransmissionInterferenceWarning) String() string { return proto.CompactTextString(m) }
func (*OnuTransmissionInterferenceWarning) ProtoMessage()    {}
func (*OnuTransmissionInterferenceWarning) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{32}
}

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

var xxx_messageInfo_OnuTransmissionInterferenceWarning proto.InternalMessageInfo

func (m *OnuTransmissionInterferenceWarning) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuTransmissionInterferenceWarning) GetDrift() uint32 {
	if m != nil {
		return m.Drift
	}
	return 0
}

type OnuActivationFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	FailReason           uint32   `protobuf:"fixed32,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuActivationFailureIndication) Reset()         { *m = OnuActivationFailureIndication{} }
func (m *OnuActivationFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuActivationFailureIndication) ProtoMessage()    {}
func (*OnuActivationFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{33}
}

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

var xxx_messageInfo_OnuActivationFailureIndication proto.InternalMessageInfo

func (m *OnuActivationFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OnuActivationFailureIndication) GetFailReason() uint32 {
	if m != nil {
		return m.FailReason
	}
	return 0
}

type OnuLossOfKeySyncFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuLossOfKeySyncFailureIndication) Reset()         { *m = OnuLossOfKeySyncFailureIndication{} }
func (m *OnuLossOfKeySyncFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfKeySyncFailureIndication) ProtoMessage()    {}
func (*OnuLossOfKeySyncFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{34}
}

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

var xxx_messageInfo_OnuLossOfKeySyncFailureIndication proto.InternalMessageInfo

func (m *OnuLossOfKeySyncFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type RdiErrorIndication struct {
	RdiErrorCount        uint64   `protobuf:"fixed64,1,opt,name=rdi_error_count,json=rdiErrorCount,proto3" json:"rdi_error_count,omitempty"`
	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RdiErrorIndication) Reset()         { *m = RdiErrorIndication{} }
func (m *RdiErrorIndication) String() string { return proto.CompactTextString(m) }
func (*RdiErrorIndication) ProtoMessage()    {}
func (*RdiErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{35}
}

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

var xxx_messageInfo_RdiErrorIndication proto.InternalMessageInfo

func (m *RdiErrorIndication) GetRdiErrorCount() uint64 {
	if m != nil {
		return m.RdiErrorCount
	}
	return 0
}

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

type OnuItuPonStatsIndication struct {
	IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId  uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	// Types that are valid to be assigned to Stats:
	//	*OnuItuPonStatsIndication_RdiErrorInd
	Stats                isOnuItuPonStatsIndication_Stats `protobuf_oneof:"stats"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *OnuItuPonStatsIndication) Reset()         { *m = OnuItuPonStatsIndication{} }
func (m *OnuItuPonStatsIndication) String() string { return proto.CompactTextString(m) }
func (*OnuItuPonStatsIndication) ProtoMessage()    {}
func (*OnuItuPonStatsIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{36}
}

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

var xxx_messageInfo_OnuItuPonStatsIndication proto.InternalMessageInfo

func (m *OnuItuPonStatsIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type isOnuItuPonStatsIndication_Stats interface {
	isOnuItuPonStatsIndication_Stats()
}

type OnuItuPonStatsIndication_RdiErrorInd struct {
	RdiErrorInd *RdiErrorIndication `protobuf:"bytes,3,opt,name=rdi_error_ind,json=rdiErrorInd,proto3,oneof"`
}

func (*OnuItuPonStatsIndication_RdiErrorInd) isOnuItuPonStatsIndication_Stats() {}

func (m *OnuItuPonStatsIndication) GetStats() isOnuItuPonStatsIndication_Stats {
	if m != nil {
		return m.Stats
	}
	return nil
}

func (m *OnuItuPonStatsIndication) GetRdiErrorInd() *RdiErrorIndication {
	if x, ok := m.GetStats().(*OnuItuPonStatsIndication_RdiErrorInd); ok {
		return x.RdiErrorInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OnuItuPonStatsIndication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OnuItuPonStatsIndication_RdiErrorInd)(nil),
	}
}

type OnuProcessingErrorIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuProcessingErrorIndication) Reset()         { *m = OnuProcessingErrorIndication{} }
func (m *OnuProcessingErrorIndication) String() string { return proto.CompactTextString(m) }
func (*OnuProcessingErrorIndication) ProtoMessage()    {}
func (*OnuProcessingErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
}

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

var xxx_messageInfo_OnuProcessingErrorIndication proto.InternalMessageInfo

func (m *OnuProcessingErrorIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type OnuDeactivationFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuDeactivationFailureIndication) Reset()         { *m = OnuDeactivationFailureIndication{} }
func (m *OnuDeactivationFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDeactivationFailureIndication) ProtoMessage()    {}
func (*OnuDeactivationFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
}

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

var xxx_messageInfo_OnuDeactivationFailureIndication proto.InternalMessageInfo

func (m *OnuDeactivationFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuRemoteDefectIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	RdiErrors            uint64   `protobuf:"fixed64,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuRemoteDefectIndication) Reset()         { *m = OnuRemoteDefectIndication{} }
func (m *OnuRemoteDefectIndication) String() string { return proto.CompactTextString(m) }
func (*OnuRemoteDefectIndication) ProtoMessage()    {}
func (*OnuRemoteDefectIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{39}
}

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

var xxx_messageInfo_OnuRemoteDefectIndication proto.InternalMessageInfo

func (m *OnuRemoteDefectIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OnuRemoteDefectIndication) GetRdiErrors() uint64 {
	if m != nil {
		return m.RdiErrors
	}
	return 0
}

type OnuLossOfGEMChannelDelineationIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	DelineationErrors    uint32   `protobuf:"fixed32,4,opt,name=delineation_errors,json=delineationErrors,proto3" json:"delineation_errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuLossOfGEMChannelDelineationIndication) Reset() {
	*m = OnuLossOfGEMChannelDelineationIndication{}
}
func (m *OnuLossOfGEMChannelDelineationIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfGEMChannelDelineationIndication) ProtoMessage()    {}
func (*OnuLossOfGEMChannelDelineationIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{40}
}

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

var xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication proto.InternalMessageInfo

func (m *OnuLossOfGEMChannelDelineationIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuLossOfGEMChannelDelineationIndication) GetDelineationErrors() uint32 {
	if m != nil {
		return m.DelineationErrors
	}
	return 0
}

type OnuPhysicalEquipmentErrorIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuPhysicalEquipmentErrorIndication) Reset()         { *m = OnuPhysicalEquipmentErrorIndication{} }
func (m *OnuPhysicalEquipmentErrorIndication) String() string { return proto.CompactTextString(m) }
func (*OnuPhysicalEquipmentErrorIndication) ProtoMessage()    {}
func (*OnuPhysicalEquipmentErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{41}
}

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

var xxx_messageInfo_OnuPhysicalEquipmentErrorIndication proto.InternalMessageInfo

func (m *OnuPhysicalEquipmentErrorIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuLossOfAcknowledgementIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuLossOfAcknowledgementIndication) Reset()         { *m = OnuLossOfAcknowledgementIndication{} }
func (m *OnuLossOfAcknowledgementIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfAcknowledgementIndication) ProtoMessage()    {}
func (*OnuLossOfAcknowledgementIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{42}
}

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

var xxx_messageInfo_OnuLossOfAcknowledgementIndication proto.InternalMessageInfo

func (m *OnuLossOfAcknowledgementIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuDifferentialReachExceededIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Distance             uint32   `protobuf:"fixed32,4,opt,name=distance,proto3" json:"distance,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuDifferentialReachExceededIndication) Reset() {
	*m = OnuDifferentialReachExceededIndication{}
}
func (m *OnuDifferentialReachExceededIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDifferentialReachExceededIndication) ProtoMessage()    {}
func (*OnuDifferentialReachExceededIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{43}
}

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

var xxx_messageInfo_OnuDifferentialReachExceededIndication proto.InternalMessageInfo

func (m *OnuDifferentialReachExceededIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuDifferentialReachExceededIndication) GetDistance() uint32 {
	if m != nil {
		return m.Distance
	}
	return 0
}

type GroupMember struct {
	InterfaceId          uint32                    `protobuf:"varint,1,opt,name=interface_id,json=interfaceId,proto3" json:"interface_id,omitempty"`
	InterfaceType        GroupMember_InterfaceType `protobuf:"varint,2,opt,name=interface_type,json=interfaceType,proto3,enum=openolt.GroupMember_InterfaceType" json:"interface_type,omitempty"`
	GemPortId            uint32                    `protobuf:"varint,3,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
	Priority             uint32                    `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *GroupMember) Reset()         { *m = GroupMember{} }
func (m *GroupMember) String() string { return proto.CompactTextString(m) }
func (*GroupMember) ProtoMessage()    {}
func (*GroupMember) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{44}
}

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

var xxx_messageInfo_GroupMember proto.InternalMessageInfo

func (m *GroupMember) GetInterfaceId() uint32 {
	if m != nil {
		return m.InterfaceId
	}
	return 0
}

func (m *GroupMember) GetInterfaceType() GroupMember_InterfaceType {
	if m != nil {
		return m.InterfaceType
	}
	return GroupMember_PON
}

func (m *GroupMember) GetGemPortId() uint32 {
	if m != nil {
		return m.GemPortId
	}
	return 0
}

func (m *GroupMember) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

type Group struct {
	GroupId              uint32                    `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	Command              Group_GroupMembersCommand `protobuf:"varint,2,opt,name=command,proto3,enum=openolt.Group_GroupMembersCommand" json:"command,omitempty"`
	Members              []*GroupMember            `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"`
	Action               *Action                   `protobuf:"bytes,4,opt,name=action,proto3" json:"action,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *Group) Reset()         { *m = Group{} }
func (m *Group) String() string { return proto.CompactTextString(m) }
func (*Group) ProtoMessage()    {}
func (*Group) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{45}
}

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

var xxx_messageInfo_Group proto.InternalMessageInfo

func (m *Group) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *Group) GetCommand() Group_GroupMembersCommand {
	if m != nil {
		return m.Command
	}
	return Group_ADD_MEMBERS
}

func (m *Group) GetMembers() []*GroupMember {
	if m != nil {
		return m.Members
	}
	return nil
}

func (m *Group) GetAction() *Action {
	if m != nil {
		return m.Action
	}
	return nil
}

type ValueParam struct {
	Onu                  *Onu                  `protobuf:"bytes,1,opt,name=onu,proto3" json:"onu,omitempty"`
	Value                common.ValueType_Type `protobuf:"varint,2,opt,name=value,proto3,enum=common.ValueType_Type" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ValueParam) Reset()         { *m = ValueParam{} }
func (m *ValueParam) String() string { return proto.CompactTextString(m) }
func (*ValueParam) ProtoMessage()    {}
func (*ValueParam) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{46}
}

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

var xxx_messageInfo_ValueParam proto.InternalMessageInfo

func (m *ValueParam) GetOnu() *Onu {
	if m != nil {
		return m.Onu
	}
	return nil
}

func (m *ValueParam) GetValue() common.ValueType_Type {
	if m != nil {
		return m.Value
	}
	return common.ValueType_EMPTY
}

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_c072e7aa0dfd74d5, []int{47}
}

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("openolt.OnuIndication_ActivationFailReason", OnuIndication_ActivationFailReason_name, OnuIndication_ActivationFailReason_value)
	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType", DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, DeviceInfo_DeviceResourceRanges_Pool_PoolType_value)
	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType", DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, DeviceInfo_DeviceResourceRanges_Pool_SharingType_value)
	proto.RegisterEnum("openolt.GroupMember_InterfaceType", GroupMember_InterfaceType_name, GroupMember_InterfaceType_value)
	proto.RegisterEnum("openolt.Group_GroupMembersCommand", Group_GroupMembersCommand_name, Group_GroupMembersCommand_value)
	proto.RegisterType((*Indication)(nil), "openolt.Indication")
	proto.RegisterType((*AlarmIndication)(nil), "openolt.AlarmIndication")
	proto.RegisterType((*OltIndication)(nil), "openolt.OltIndication")
	proto.RegisterType((*IntfIndication)(nil), "openolt.IntfIndication")
	proto.RegisterType((*OnuDiscIndication)(nil), "openolt.OnuDiscIndication")
	proto.RegisterType((*OnuIndication)(nil), "openolt.OnuIndication")
	proto.RegisterType((*IntfOperIndication)(nil), "openolt.IntfOperIndication")
	proto.RegisterType((*OmciIndication)(nil), "openolt.OmciIndication")
	proto.RegisterType((*PacketIndication)(nil), "openolt.PacketIndication")
	proto.RegisterType((*Interface)(nil), "openolt.Interface")
	proto.RegisterType((*Heartbeat)(nil), "openolt.Heartbeat")
	proto.RegisterType((*Onu)(nil), "openolt.Onu")
	proto.RegisterType((*OnuLogicalDistance)(nil), "openolt.OnuLogicalDistance")
	proto.RegisterType((*OmciMsg)(nil), "openolt.OmciMsg")
	proto.RegisterType((*OnuPacket)(nil), "openolt.OnuPacket")
	proto.RegisterType((*UplinkPacket)(nil), "openolt.UplinkPacket")
	proto.RegisterType((*DeviceInfo)(nil), "openolt.DeviceInfo")
	proto.RegisterType((*DeviceInfo_DeviceResourceRanges)(nil), "openolt.DeviceInfo.DeviceResourceRanges")
	proto.RegisterType((*DeviceInfo_DeviceResourceRanges_Pool)(nil), "openolt.DeviceInfo.DeviceResourceRanges.Pool")
	proto.RegisterType((*Classifier)(nil), "openolt.Classifier")
	proto.RegisterType((*ActionCmd)(nil), "openolt.ActionCmd")
	proto.RegisterType((*Action)(nil), "openolt.Action")
	proto.RegisterType((*Flow)(nil), "openolt.Flow")
	proto.RegisterMapType((map[uint32]uint32)(nil), "openolt.Flow.PbitToGemportEntry")
	proto.RegisterType((*SerialNumber)(nil), "openolt.SerialNumber")
	proto.RegisterType((*PortStatistics)(nil), "openolt.PortStatistics")
	proto.RegisterType((*FlowStatistics)(nil), "openolt.FlowStatistics")
	proto.RegisterType((*LosIndication)(nil), "openolt.LosIndication")
	proto.RegisterType((*DyingGaspIndication)(nil), "openolt.DyingGaspIndication")
	proto.RegisterType((*OnuAlarmIndication)(nil), "openolt.OnuAlarmIndication")
	proto.RegisterType((*OnuStartupFailureIndication)(nil), "openolt.OnuStartupFailureIndication")
	proto.RegisterType((*OnuSignalDegradeIndication)(nil), "openolt.OnuSignalDegradeIndication")
	proto.RegisterType((*OnuDriftOfWindowIndication)(nil), "openolt.OnuDriftOfWindowIndication")
	proto.RegisterType((*OnuLossOfOmciChannelIndication)(nil), "openolt.OnuLossOfOmciChannelIndication")
	proto.RegisterType((*OnuSignalsFailureIndication)(nil), "openolt.OnuSignalsFailureIndication")
	proto.RegisterType((*OnuTransmissionInterferenceWarning)(nil), "openolt.OnuTransmissionInterferenceWarning")
	proto.RegisterType((*OnuActivationFailureIndication)(nil), "openolt.OnuActivationFailureIndication")
	proto.RegisterType((*OnuLossOfKeySyncFailureIndication)(nil), "openolt.OnuLossOfKeySyncFailureIndication")
	proto.RegisterType((*RdiErrorIndication)(nil), "openolt.RdiErrorIndication")
	proto.RegisterType((*OnuItuPonStatsIndication)(nil), "openolt.OnuItuPonStatsIndication")
	proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
	proto.RegisterType((*OnuDeactivationFailureIndication)(nil), "openolt.OnuDeactivationFailureIndication")
	proto.RegisterType((*OnuRemoteDefectIndication)(nil), "openolt.OnuRemoteDefectIndication")
	proto.RegisterType((*OnuLossOfGEMChannelDelineationIndication)(nil), "openolt.OnuLossOfGEMChannelDelineationIndication")
	proto.RegisterType((*OnuPhysicalEquipmentErrorIndication)(nil), "openolt.OnuPhysicalEquipmentErrorIndication")
	proto.RegisterType((*OnuLossOfAcknowledgementIndication)(nil), "openolt.OnuLossOfAcknowledgementIndication")
	proto.RegisterType((*OnuDifferentialReachExceededIndication)(nil), "openolt.OnuDifferentialReachExceededIndication")
	proto.RegisterType((*GroupMember)(nil), "openolt.GroupMember")
	proto.RegisterType((*Group)(nil), "openolt.Group")
	proto.RegisterType((*ValueParam)(nil), "openolt.ValueParam")
	proto.RegisterType((*Empty)(nil), "openolt.Empty")
}

func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }

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

// OpenoltClient is the client API for Openolt service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type OpenoltClient interface {
	DisableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	ReenableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	ActivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	DeactivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	DeleteOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	OmciMsgOut(ctx context.Context, in *OmciMsg, opts ...grpc.CallOption) (*Empty, error)
	OnuPacketOut(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*Empty, error)
	UplinkPacketOut(ctx context.Context, in *UplinkPacket, opts ...grpc.CallOption) (*Empty, error)
	FlowAdd(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error)
	FlowRemove(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error)
	HeartbeatCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Heartbeat, error)
	EnablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error)
	DisablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error)
	GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error)
	Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
	RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
	CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
	RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
	EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error)
	PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
	DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
	GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*common.ReturnValues, error)
	OnuItuPonAlarmSet(ctx context.Context, in *config.OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error)
	GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
	GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
}

type openoltClient struct {
	cc *grpc.ClientConn
}

func NewOpenoltClient(cc *grpc.ClientConn) OpenoltClient {
	return &openoltClient{cc}
}

func (c *openoltClient) DisableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisableOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) ReenableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/ReenableOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) ActivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/ActivateOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeactivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeactivateOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeleteOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OmciMsgOut(ctx context.Context, in *OmciMsg, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OmciMsgOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OnuPacketOut(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuPacketOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) UplinkPacketOut(ctx context.Context, in *UplinkPacket, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/UplinkPacketOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) FlowAdd(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/FlowAdd", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) FlowRemove(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/FlowRemove", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) HeartbeatCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Heartbeat, error) {
	out := new(Heartbeat)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/HeartbeatCheck", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) EnablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/EnablePonIf", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DisablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisablePonIf", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error) {
	out := new(DeviceInfo)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetDeviceInfo", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/Reboot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CollectStatistics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error) {
	stream, err := c.cc.NewStream(ctx, &_Openolt_serviceDesc.Streams[0], "/openolt.Openolt/EnableIndication", opts...)
	if err != nil {
		return nil, err
	}
	x := &openoltEnableIndicationClient{stream}
	if err := x.ClientStream.SendMsg(in); err != nil {
		return nil, err
	}
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	return x, nil
}

type Openolt_EnableIndicationClient interface {
	Recv() (*Indication, error)
	grpc.ClientStream
}

type openoltEnableIndicationClient struct {
	grpc.ClientStream
}

func (x *openoltEnableIndicationClient) Recv() (*Indication, error) {
	m := new(Indication)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

func (c *openoltClient) PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/PerformGroupOperation", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteGroup", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*common.ReturnValues, error) {
	out := new(common.ReturnValues)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetExtValue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OnuItuPonAlarmSet(ctx context.Context, in *config.OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuItuPonAlarmSet", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
	out := new(OnuLogicalDistance)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistanceZero", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
	out := new(OnuLogicalDistance)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistance", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// OpenoltServer is the server API for Openolt service.
type OpenoltServer interface {
	DisableOlt(context.Context, *Empty) (*Empty, error)
	ReenableOlt(context.Context, *Empty) (*Empty, error)
	ActivateOnu(context.Context, *Onu) (*Empty, error)
	DeactivateOnu(context.Context, *Onu) (*Empty, error)
	DeleteOnu(context.Context, *Onu) (*Empty, error)
	OmciMsgOut(context.Context, *OmciMsg) (*Empty, error)
	OnuPacketOut(context.Context, *OnuPacket) (*Empty, error)
	UplinkPacketOut(context.Context, *UplinkPacket) (*Empty, error)
	FlowAdd(context.Context, *Flow) (*Empty, error)
	FlowRemove(context.Context, *Flow) (*Empty, error)
	HeartbeatCheck(context.Context, *Empty) (*Heartbeat, error)
	EnablePonIf(context.Context, *Interface) (*Empty, error)
	DisablePonIf(context.Context, *Interface) (*Empty, error)
	GetDeviceInfo(context.Context, *Empty) (*DeviceInfo, error)
	Reboot(context.Context, *Empty) (*Empty, error)
	CollectStatistics(context.Context, *Empty) (*Empty, error)
	CreateTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
	RemoveTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
	CreateTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
	RemoveTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
	EnableIndication(*Empty, Openolt_EnableIndicationServer) error
	PerformGroupOperation(context.Context, *Group) (*Empty, error)
	DeleteGroup(context.Context, *Group) (*Empty, error)
	GetExtValue(context.Context, *ValueParam) (*common.ReturnValues, error)
	OnuItuPonAlarmSet(context.Context, *config.OnuItuPonAlarm) (*Empty, error)
	GetLogicalOnuDistanceZero(context.Context, *Onu) (*OnuLogicalDistance, error)
	GetLogicalOnuDistance(context.Context, *Onu) (*OnuLogicalDistance, error)
}

func RegisterOpenoltServer(s *grpc.Server, srv OpenoltServer) {
	s.RegisterService(&_Openolt_serviceDesc, srv)
}

func _Openolt_DisableOlt_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.(OpenoltServer).DisableOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DisableOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DisableOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_ReenableOlt_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.(OpenoltServer).ReenableOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/ReenableOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).ReenableOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_ActivateOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).ActivateOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/ActivateOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).ActivateOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeactivateOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeactivateOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeactivateOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeactivateOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeleteOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeleteOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeleteOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeleteOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OmciMsgOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OmciMsg)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OmciMsgOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OmciMsgOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OmciMsgOut(ctx, req.(*OmciMsg))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OnuPacketOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OnuPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OnuPacketOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OnuPacketOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OnuPacketOut(ctx, req.(*OnuPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_UplinkPacketOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UplinkPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).UplinkPacketOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/UplinkPacketOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).UplinkPacketOut(ctx, req.(*UplinkPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_FlowAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Flow)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).FlowAdd(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/FlowAdd",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).FlowAdd(ctx, req.(*Flow))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_FlowRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Flow)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).FlowRemove(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/FlowRemove",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).FlowRemove(ctx, req.(*Flow))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_HeartbeatCheck_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.(OpenoltServer).HeartbeatCheck(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/HeartbeatCheck",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).HeartbeatCheck(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_EnablePonIf_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Interface)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).EnablePonIf(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/EnablePonIf",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).EnablePonIf(ctx, req.(*Interface))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DisablePonIf_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Interface)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DisablePonIf(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DisablePonIf",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DisablePonIf(ctx, req.(*Interface))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetDeviceInfo_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.(OpenoltServer).GetDeviceInfo(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetDeviceInfo",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetDeviceInfo(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_Reboot_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.(OpenoltServer).Reboot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/Reboot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).Reboot(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CollectStatistics_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.(OpenoltServer).CollectStatistics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CollectStatistics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CollectStatistics(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CreateTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficSchedulers)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CreateTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_RemoveTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficSchedulers)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/RemoveTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CreateTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficQueues)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CreateTrafficQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CreateTrafficQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CreateTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_RemoveTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficQueues)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).RemoveTrafficQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/RemoveTrafficQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).RemoveTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_EnableIndication_Handler(srv interface{}, stream grpc.ServerStream) error {
	m := new(Empty)
	if err := stream.RecvMsg(m); err != nil {
		return err
	}
	return srv.(OpenoltServer).EnableIndication(m, &openoltEnableIndicationServer{stream})
}

type Openolt_EnableIndicationServer interface {
	Send(*Indication) error
	grpc.ServerStream
}

type openoltEnableIndicationServer struct {
	grpc.ServerStream
}

func (x *openoltEnableIndicationServer) Send(m *Indication) error {
	return x.ServerStream.SendMsg(m)
}

func _Openolt_PerformGroupOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Group)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).PerformGroupOperation(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/PerformGroupOperation",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).PerformGroupOperation(ctx, req.(*Group))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Group)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeleteGroup(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeleteGroup",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeleteGroup(ctx, req.(*Group))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ValueParam)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetExtValue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetExtValue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetExtValue(ctx, req.(*ValueParam))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OnuItuPonAlarmSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(config.OnuItuPonAlarm)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OnuItuPonAlarmSet",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, req.(*config.OnuItuPonAlarm))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetLogicalOnuDistanceZero_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetLogicalOnuDistanceZero",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetLogicalOnuDistance_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetLogicalOnuDistance",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

var _Openolt_serviceDesc = grpc.ServiceDesc{
	ServiceName: "openolt.Openolt",
	HandlerType: (*OpenoltServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "DisableOlt",
			Handler:    _Openolt_DisableOlt_Handler,
		},
		{
			MethodName: "ReenableOlt",
			Handler:    _Openolt_ReenableOlt_Handler,
		},
		{
			MethodName: "ActivateOnu",
			Handler:    _Openolt_ActivateOnu_Handler,
		},
		{
			MethodName: "DeactivateOnu",
			Handler:    _Openolt_DeactivateOnu_Handler,
		},
		{
			MethodName: "DeleteOnu",
			Handler:    _Openolt_DeleteOnu_Handler,
		},
		{
			MethodName: "OmciMsgOut",
			Handler:    _Openolt_OmciMsgOut_Handler,
		},
		{
			MethodName: "OnuPacketOut",
			Handler:    _Openolt_OnuPacketOut_Handler,
		},
		{
			MethodName: "UplinkPacketOut",
			Handler:    _Openolt_UplinkPacketOut_Handler,
		},
		{
			MethodName: "FlowAdd",
			Handler:    _Openolt_FlowAdd_Handler,
		},
		{
			MethodName: "FlowRemove",
			Handler:    _Openolt_FlowRemove_Handler,
		},
		{
			MethodName: "HeartbeatCheck",
			Handler:    _Openolt_HeartbeatCheck_Handler,
		},
		{
			MethodName: "EnablePonIf",
			Handler:    _Openolt_EnablePonIf_Handler,
		},
		{
			MethodName: "DisablePonIf",
			Handler:    _Openolt_DisablePonIf_Handler,
		},
		{
			MethodName: "GetDeviceInfo",
			Handler:    _Openolt_GetDeviceInfo_Handler,
		},
		{
			MethodName: "Reboot",
			Handler:    _Openolt_Reboot_Handler,
		},
		{
			MethodName: "CollectStatistics",
			Handler:    _Openolt_CollectStatistics_Handler,
		},
		{
			MethodName: "CreateTrafficSchedulers",
			Handler:    _Openolt_CreateTrafficSchedulers_Handler,
		},
		{
			MethodName: "RemoveTrafficSchedulers",
			Handler:    _Openolt_RemoveTrafficSchedulers_Handler,
		},
		{
			MethodName: "CreateTrafficQueues",
			Handler:    _Openolt_CreateTrafficQueues_Handler,
		},
		{
			MethodName: "RemoveTrafficQueues",
			Handler:    _Openolt_RemoveTrafficQueues_Handler,
		},
		{
			MethodName: "PerformGroupOperation",
			Handler:    _Openolt_PerformGroupOperation_Handler,
		},
		{
			MethodName: "DeleteGroup",
			Handler:    _Openolt_DeleteGroup_Handler,
		},
		{
			MethodName: "GetExtValue",
			Handler:    _Openolt_GetExtValue_Handler,
		},
		{
			MethodName: "OnuItuPonAlarmSet",
			Handler:    _Openolt_OnuItuPonAlarmSet_Handler,
		},
		{
			MethodName: "GetLogicalOnuDistanceZero",
			Handler:    _Openolt_GetLogicalOnuDistanceZero_Handler,
		},
		{
			MethodName: "GetLogicalOnuDistance",
			Handler:    _Openolt_GetLogicalOnuDistance_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "EnableIndication",
			Handler:       _Openolt_EnableIndication_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "voltha_protos/openolt.proto",
}
