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

package extension

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	empty "github.com/golang/protobuf/ptypes/empty"
	config "github.com/opencord/voltha-protos/v4/go/ext/config"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

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

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

// AlarmConfig from public import voltha_protos/ext_config.proto
type AlarmConfig = config.AlarmConfig
type AlarmConfig_OnuItuPonAlarmConfig = config.AlarmConfig_OnuItuPonAlarmConfig

// OnuItuPonAlarm from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm = config.OnuItuPonAlarm
type OnuItuPonAlarm_RateThresholdConfig_ = config.OnuItuPonAlarm_RateThresholdConfig_
type OnuItuPonAlarm_RateRangeConfig_ = config.OnuItuPonAlarm_RateRangeConfig_
type OnuItuPonAlarm_ValueThresholdConfig_ = config.OnuItuPonAlarm_ValueThresholdConfig_

// OnuItuPonAlarm_SoakTime from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_SoakTime = config.OnuItuPonAlarm_SoakTime

// OnuItuPonAlarm_RateThresholdConfig from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_RateThresholdConfig = config.OnuItuPonAlarm_RateThresholdConfig

// OnuItuPonAlarm_RateRangeConfig from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_RateRangeConfig = config.OnuItuPonAlarm_RateRangeConfig

// OnuItuPonAlarm_ValueThresholdConfig from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_ValueThresholdConfig = config.OnuItuPonAlarm_ValueThresholdConfig

// OnuItuPonAlarm_AlarmID from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_AlarmID = config.OnuItuPonAlarm_AlarmID

var OnuItuPonAlarm_AlarmID_name = config.OnuItuPonAlarm_AlarmID_name
var OnuItuPonAlarm_AlarmID_value = config.OnuItuPonAlarm_AlarmID_value

const OnuItuPonAlarm_RDI_ERRORS = OnuItuPonAlarm_AlarmID(config.OnuItuPonAlarm_RDI_ERRORS)

// OnuItuPonAlarm_AlarmReportingCondition from public import voltha_protos/ext_config.proto
type OnuItuPonAlarm_AlarmReportingCondition = config.OnuItuPonAlarm_AlarmReportingCondition

var OnuItuPonAlarm_AlarmReportingCondition_name = config.OnuItuPonAlarm_AlarmReportingCondition_name
var OnuItuPonAlarm_AlarmReportingCondition_value = config.OnuItuPonAlarm_AlarmReportingCondition_value

const OnuItuPonAlarm_RATE_THRESHOLD = OnuItuPonAlarm_AlarmReportingCondition(config.OnuItuPonAlarm_RATE_THRESHOLD)
const OnuItuPonAlarm_RATE_RANGE = OnuItuPonAlarm_AlarmReportingCondition(config.OnuItuPonAlarm_RATE_RANGE)
const OnuItuPonAlarm_VALUE_THRESHOLD = OnuItuPonAlarm_AlarmReportingCondition(config.OnuItuPonAlarm_VALUE_THRESHOLD)

type GetOnuUniInfoResponse_ConfigurationInd int32

const (
	GetOnuUniInfoResponse_UNKOWN               GetOnuUniInfoResponse_ConfigurationInd = 0
	GetOnuUniInfoResponse_TEN_BASE_T_FDX       GetOnuUniInfoResponse_ConfigurationInd = 1
	GetOnuUniInfoResponse_HUNDRED_BASE_T_FDX   GetOnuUniInfoResponse_ConfigurationInd = 2
	GetOnuUniInfoResponse_GIGABIT_ETHERNET_FDX GetOnuUniInfoResponse_ConfigurationInd = 3
	GetOnuUniInfoResponse_TEN_G_ETHERNET_FDX   GetOnuUniInfoResponse_ConfigurationInd = 4
	GetOnuUniInfoResponse_TEN_BASE_T_HDX       GetOnuUniInfoResponse_ConfigurationInd = 5
	GetOnuUniInfoResponse_HUNDRED_BASE_T_HDX   GetOnuUniInfoResponse_ConfigurationInd = 6
	GetOnuUniInfoResponse_GIGABIT_ETHERNET_HDX GetOnuUniInfoResponse_ConfigurationInd = 7
)

var GetOnuUniInfoResponse_ConfigurationInd_name = map[int32]string{
	0: "UNKOWN",
	1: "TEN_BASE_T_FDX",
	2: "HUNDRED_BASE_T_FDX",
	3: "GIGABIT_ETHERNET_FDX",
	4: "TEN_G_ETHERNET_FDX",
	5: "TEN_BASE_T_HDX",
	6: "HUNDRED_BASE_T_HDX",
	7: "GIGABIT_ETHERNET_HDX",
}

var GetOnuUniInfoResponse_ConfigurationInd_value = map[string]int32{
	"UNKOWN":               0,
	"TEN_BASE_T_FDX":       1,
	"HUNDRED_BASE_T_FDX":   2,
	"GIGABIT_ETHERNET_FDX": 3,
	"TEN_G_ETHERNET_FDX":   4,
	"TEN_BASE_T_HDX":       5,
	"HUNDRED_BASE_T_HDX":   6,
	"GIGABIT_ETHERNET_HDX": 7,
}

func (x GetOnuUniInfoResponse_ConfigurationInd) String() string {
	return proto.EnumName(GetOnuUniInfoResponse_ConfigurationInd_name, int32(x))
}

func (GetOnuUniInfoResponse_ConfigurationInd) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{3, 0}
}

type GetOnuUniInfoResponse_AdministrativeState int32

const (
	GetOnuUniInfoResponse_ADMSTATE_UNDEFINED GetOnuUniInfoResponse_AdministrativeState = 0
	GetOnuUniInfoResponse_LOCKED             GetOnuUniInfoResponse_AdministrativeState = 1
	GetOnuUniInfoResponse_UNLOCKED           GetOnuUniInfoResponse_AdministrativeState = 2
)

var GetOnuUniInfoResponse_AdministrativeState_name = map[int32]string{
	0: "ADMSTATE_UNDEFINED",
	1: "LOCKED",
	2: "UNLOCKED",
}

var GetOnuUniInfoResponse_AdministrativeState_value = map[string]int32{
	"ADMSTATE_UNDEFINED": 0,
	"LOCKED":             1,
	"UNLOCKED":           2,
}

func (x GetOnuUniInfoResponse_AdministrativeState) String() string {
	return proto.EnumName(GetOnuUniInfoResponse_AdministrativeState_name, int32(x))
}

func (GetOnuUniInfoResponse_AdministrativeState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{3, 1}
}

type GetOnuUniInfoResponse_OperationalState int32

const (
	GetOnuUniInfoResponse_OPERSTATE_UNDEFINED GetOnuUniInfoResponse_OperationalState = 0
	GetOnuUniInfoResponse_ENABLED             GetOnuUniInfoResponse_OperationalState = 1
	GetOnuUniInfoResponse_DISABLED            GetOnuUniInfoResponse_OperationalState = 2
)

var GetOnuUniInfoResponse_OperationalState_name = map[int32]string{
	0: "OPERSTATE_UNDEFINED",
	1: "ENABLED",
	2: "DISABLED",
}

var GetOnuUniInfoResponse_OperationalState_value = map[string]int32{
	"OPERSTATE_UNDEFINED": 0,
	"ENABLED":             1,
	"DISABLED":            2,
}

func (x GetOnuUniInfoResponse_OperationalState) String() string {
	return proto.EnumName(GetOnuUniInfoResponse_OperationalState_name, int32(x))
}

func (GetOnuUniInfoResponse_OperationalState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{3, 2}
}

type GetOltPortCounters_PortType int32

const (
	GetOltPortCounters_Port_UNKNOWN      GetOltPortCounters_PortType = 0
	GetOltPortCounters_Port_ETHERNET_NNI GetOltPortCounters_PortType = 1
	GetOltPortCounters_Port_PON_OLT      GetOltPortCounters_PortType = 2
)

var GetOltPortCounters_PortType_name = map[int32]string{
	0: "Port_UNKNOWN",
	1: "Port_ETHERNET_NNI",
	2: "Port_PON_OLT",
}

var GetOltPortCounters_PortType_value = map[string]int32{
	"Port_UNKNOWN":      0,
	"Port_ETHERNET_NNI": 1,
	"Port_PON_OLT":      2,
}

func (x GetOltPortCounters_PortType) String() string {
	return proto.EnumName(GetOltPortCounters_PortType_name, int32(x))
}

func (GetOltPortCounters_PortType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{4, 0}
}

type GetOnuEthernetBridgePortHistory_Direction int32

const (
	GetOnuEthernetBridgePortHistory_UNDEFINED  GetOnuEthernetBridgePortHistory_Direction = 0
	GetOnuEthernetBridgePortHistory_UPSTREAM   GetOnuEthernetBridgePortHistory_Direction = 1
	GetOnuEthernetBridgePortHistory_DOWNSTREAM GetOnuEthernetBridgePortHistory_Direction = 2
)

var GetOnuEthernetBridgePortHistory_Direction_name = map[int32]string{
	0: "UNDEFINED",
	1: "UPSTREAM",
	2: "DOWNSTREAM",
}

var GetOnuEthernetBridgePortHistory_Direction_value = map[string]int32{
	"UNDEFINED":  0,
	"UPSTREAM":   1,
	"DOWNSTREAM": 2,
}

func (x GetOnuEthernetBridgePortHistory_Direction) String() string {
	return proto.EnumName(GetOnuEthernetBridgePortHistory_Direction_name, int32(x))
}

func (GetOnuEthernetBridgePortHistory_Direction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{8, 0}
}

type GetValueResponse_Status int32

const (
	GetValueResponse_STATUS_UNDEFINED GetValueResponse_Status = 0
	GetValueResponse_OK               GetValueResponse_Status = 1
	GetValueResponse_ERROR            GetValueResponse_Status = 2
)

var GetValueResponse_Status_name = map[int32]string{
	0: "STATUS_UNDEFINED",
	1: "OK",
	2: "ERROR",
}

var GetValueResponse_Status_value = map[string]int32{
	"STATUS_UNDEFINED": 0,
	"OK":               1,
	"ERROR":            2,
}

func (x GetValueResponse_Status) String() string {
	return proto.EnumName(GetValueResponse_Status_name, int32(x))
}

func (GetValueResponse_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{17, 0}
}

type GetValueResponse_ErrorReason int32

const (
	GetValueResponse_REASON_UNDEFINED  GetValueResponse_ErrorReason = 0
	GetValueResponse_UNSUPPORTED       GetValueResponse_ErrorReason = 1
	GetValueResponse_INVALID_DEVICE_ID GetValueResponse_ErrorReason = 2
	GetValueResponse_INVALID_PORT_TYPE GetValueResponse_ErrorReason = 3
	GetValueResponse_TIMEOUT           GetValueResponse_ErrorReason = 4
	GetValueResponse_INVALID_REQ_TYPE  GetValueResponse_ErrorReason = 5
	GetValueResponse_INTERNAL_ERROR    GetValueResponse_ErrorReason = 6
	GetValueResponse_INVALID_DEVICE    GetValueResponse_ErrorReason = 7
)

var GetValueResponse_ErrorReason_name = map[int32]string{
	0: "REASON_UNDEFINED",
	1: "UNSUPPORTED",
	2: "INVALID_DEVICE_ID",
	3: "INVALID_PORT_TYPE",
	4: "TIMEOUT",
	5: "INVALID_REQ_TYPE",
	6: "INTERNAL_ERROR",
	7: "INVALID_DEVICE",
}

var GetValueResponse_ErrorReason_value = map[string]int32{
	"REASON_UNDEFINED":  0,
	"UNSUPPORTED":       1,
	"INVALID_DEVICE_ID": 2,
	"INVALID_PORT_TYPE": 3,
	"TIMEOUT":           4,
	"INVALID_REQ_TYPE":  5,
	"INTERNAL_ERROR":    6,
	"INVALID_DEVICE":    7,
}

func (x GetValueResponse_ErrorReason) String() string {
	return proto.EnumName(GetValueResponse_ErrorReason_name, int32(x))
}

func (GetValueResponse_ErrorReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{17, 1}
}

type SetValueResponse_Status int32

const (
	SetValueResponse_STATUS_UNDEFINED SetValueResponse_Status = 0
	SetValueResponse_OK               SetValueResponse_Status = 1
	SetValueResponse_ERROR            SetValueResponse_Status = 2
)

var SetValueResponse_Status_name = map[int32]string{
	0: "STATUS_UNDEFINED",
	1: "OK",
	2: "ERROR",
}

var SetValueResponse_Status_value = map[string]int32{
	"STATUS_UNDEFINED": 0,
	"OK":               1,
	"ERROR":            2,
}

func (x SetValueResponse_Status) String() string {
	return proto.EnumName(SetValueResponse_Status_name, int32(x))
}

func (SetValueResponse_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{19, 0}
}

type SetValueResponse_ErrorReason int32

const (
	SetValueResponse_REASON_UNDEFINED SetValueResponse_ErrorReason = 0
	SetValueResponse_UNSUPPORTED      SetValueResponse_ErrorReason = 1
)

var SetValueResponse_ErrorReason_name = map[int32]string{
	0: "REASON_UNDEFINED",
	1: "UNSUPPORTED",
}

var SetValueResponse_ErrorReason_value = map[string]int32{
	"REASON_UNDEFINED": 0,
	"UNSUPPORTED":      1,
}

func (x SetValueResponse_ErrorReason) String() string {
	return proto.EnumName(SetValueResponse_ErrorReason_name, int32(x))
}

func (SetValueResponse_ErrorReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{19, 1}
}

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

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

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

var xxx_messageInfo_GetDistanceRequest proto.InternalMessageInfo

func (m *GetDistanceRequest) GetOnuDeviceId() string {
	if m != nil {
		return m.OnuDeviceId
	}
	return ""
}

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

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

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

var xxx_messageInfo_GetDistanceResponse proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_GetOnuUniInfoRequest proto.InternalMessageInfo

func (m *GetOnuUniInfoRequest) GetUniIndex() uint32 {
	if m != nil {
		return m.UniIndex
	}
	return 0
}

type GetOnuUniInfoResponse struct {
	AdmState             GetOnuUniInfoResponse_AdministrativeState `protobuf:"varint,1,opt,name=admState,proto3,enum=extension.GetOnuUniInfoResponse_AdministrativeState" json:"admState,omitempty"`
	OperState            GetOnuUniInfoResponse_OperationalState    `protobuf:"varint,2,opt,name=operState,proto3,enum=extension.GetOnuUniInfoResponse_OperationalState" json:"operState,omitempty"`
	ConfigInd            GetOnuUniInfoResponse_ConfigurationInd    `protobuf:"varint,3,opt,name=configInd,proto3,enum=extension.GetOnuUniInfoResponse_ConfigurationInd" json:"configInd,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuUniInfoResponse proto.InternalMessageInfo

func (m *GetOnuUniInfoResponse) GetAdmState() GetOnuUniInfoResponse_AdministrativeState {
	if m != nil {
		return m.AdmState
	}
	return GetOnuUniInfoResponse_ADMSTATE_UNDEFINED
}

func (m *GetOnuUniInfoResponse) GetOperState() GetOnuUniInfoResponse_OperationalState {
	if m != nil {
		return m.OperState
	}
	return GetOnuUniInfoResponse_OPERSTATE_UNDEFINED
}

func (m *GetOnuUniInfoResponse) GetConfigInd() GetOnuUniInfoResponse_ConfigurationInd {
	if m != nil {
		return m.ConfigInd
	}
	return GetOnuUniInfoResponse_UNKOWN
}

type GetOltPortCounters struct {
	PortNo               uint32                      `protobuf:"varint,1,opt,name=portNo,proto3" json:"portNo,omitempty"`
	PortType             GetOltPortCounters_PortType `protobuf:"varint,2,opt,name=portType,proto3,enum=extension.GetOltPortCounters_PortType" json:"portType,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_GetOltPortCounters proto.InternalMessageInfo

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

func (m *GetOltPortCounters) GetPortType() GetOltPortCounters_PortType {
	if m != nil {
		return m.PortType
	}
	return GetOltPortCounters_Port_UNKNOWN
}

type GetOltPortCountersResponse struct {
	TxBytes              uint64   `protobuf:"varint,1,opt,name=txBytes,proto3" json:"txBytes,omitempty"`
	RxBytes              uint64   `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
	TxPackets            uint64   `protobuf:"varint,3,opt,name=txPackets,proto3" json:"txPackets,omitempty"`
	RxPackets            uint64   `protobuf:"varint,4,opt,name=rxPackets,proto3" json:"rxPackets,omitempty"`
	TxErrorPackets       uint64   `protobuf:"varint,5,opt,name=txErrorPackets,proto3" json:"txErrorPackets,omitempty"`
	RxErrorPackets       uint64   `protobuf:"varint,6,opt,name=rxErrorPackets,proto3" json:"rxErrorPackets,omitempty"`
	TxBcastPackets       uint64   `protobuf:"varint,7,opt,name=txBcastPackets,proto3" json:"txBcastPackets,omitempty"`
	RxBcastPackets       uint64   `protobuf:"varint,8,opt,name=rxBcastPackets,proto3" json:"rxBcastPackets,omitempty"`
	TxUcastPackets       uint64   `protobuf:"varint,9,opt,name=txUcastPackets,proto3" json:"txUcastPackets,omitempty"`
	RxUcastPackets       uint64   `protobuf:"varint,10,opt,name=rxUcastPackets,proto3" json:"rxUcastPackets,omitempty"`
	TxMcastPackets       uint64   `protobuf:"varint,11,opt,name=txMcastPackets,proto3" json:"txMcastPackets,omitempty"`
	RxMcastPackets       uint64   `protobuf:"varint,12,opt,name=rxMcastPackets,proto3" json:"rxMcastPackets,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOltPortCountersResponse proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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

type GetOnuPonOpticalInfo struct {
	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuPonOpticalInfo proto.InternalMessageInfo

func (m *GetOnuPonOpticalInfo) GetEmpty() *empty.Empty {
	if m != nil {
		return m.Empty
	}
	return nil
}

// These values correspond to the Optical Line Supervision Test results
// described in section A3.39.5 of ITU-T G.988 (11/2017) specification.
type GetOnuPonOpticalInfoResponse struct {
	PowerFeedVoltage       float32  `protobuf:"fixed32,1,opt,name=powerFeedVoltage,proto3" json:"powerFeedVoltage,omitempty"`
	ReceivedOpticalPower   float32  `protobuf:"fixed32,2,opt,name=receivedOpticalPower,proto3" json:"receivedOpticalPower,omitempty"`
	MeanOpticalLaunchPower float32  `protobuf:"fixed32,3,opt,name=meanOpticalLaunchPower,proto3" json:"meanOpticalLaunchPower,omitempty"`
	LaserBiasCurrent       float32  `protobuf:"fixed32,4,opt,name=laserBiasCurrent,proto3" json:"laserBiasCurrent,omitempty"`
	Temperature            float32  `protobuf:"fixed32,5,opt,name=temperature,proto3" json:"temperature,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuPonOpticalInfoResponse proto.InternalMessageInfo

func (m *GetOnuPonOpticalInfoResponse) GetPowerFeedVoltage() float32 {
	if m != nil {
		return m.PowerFeedVoltage
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetReceivedOpticalPower() float32 {
	if m != nil {
		return m.ReceivedOpticalPower
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetMeanOpticalLaunchPower() float32 {
	if m != nil {
		return m.MeanOpticalLaunchPower
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetLaserBiasCurrent() float32 {
	if m != nil {
		return m.LaserBiasCurrent
	}
	return 0
}

func (m *GetOnuPonOpticalInfoResponse) GetTemperature() float32 {
	if m != nil {
		return m.Temperature
	}
	return 0
}

type GetOnuEthernetBridgePortHistory struct {
	Direction            GetOnuEthernetBridgePortHistory_Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=extension.GetOnuEthernetBridgePortHistory_Direction" json:"direction,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuEthernetBridgePortHistory proto.InternalMessageInfo

func (m *GetOnuEthernetBridgePortHistory) GetDirection() GetOnuEthernetBridgePortHistory_Direction {
	if m != nil {
		return m.Direction
	}
	return GetOnuEthernetBridgePortHistory_UNDEFINED
}

type GetOnuEthernetBridgePortHistoryResponse struct {
	DropEvents              uint32   `protobuf:"varint,1,opt,name=dropEvents,proto3" json:"dropEvents,omitempty"`
	Octets                  uint32   `protobuf:"varint,2,opt,name=octets,proto3" json:"octets,omitempty"`
	Packets                 uint32   `protobuf:"varint,3,opt,name=packets,proto3" json:"packets,omitempty"`
	BroadcastPackets        uint32   `protobuf:"varint,4,opt,name=broadcastPackets,proto3" json:"broadcastPackets,omitempty"`
	MulticastPackets        uint32   `protobuf:"varint,5,opt,name=multicastPackets,proto3" json:"multicastPackets,omitempty"`
	CrcErroredPackets       uint32   `protobuf:"varint,6,opt,name=crcErroredPackets,proto3" json:"crcErroredPackets,omitempty"`
	UndersizePackets        uint32   `protobuf:"varint,7,opt,name=undersizePackets,proto3" json:"undersizePackets,omitempty"`
	OversizePackets         uint32   `protobuf:"varint,8,opt,name=oversizePackets,proto3" json:"oversizePackets,omitempty"`
	Packets64Octets         uint32   `protobuf:"varint,9,opt,name=packets64octets,proto3" json:"packets64octets,omitempty"`
	Packets65To127Octets    uint32   `protobuf:"varint,10,opt,name=packets65To127octets,proto3" json:"packets65To127octets,omitempty"`
	Packets128To255Octets   uint32   `protobuf:"varint,11,opt,name=packets128To255Octets,proto3" json:"packets128To255Octets,omitempty"`
	Packets256To511Octets   uint32   `protobuf:"varint,12,opt,name=packets256To511octets,proto3" json:"packets256To511octets,omitempty"`
	Packets512To1023Octets  uint32   `protobuf:"varint,13,opt,name=packets512To1023octets,proto3" json:"packets512To1023octets,omitempty"`
	Packets1024To1518Octets uint32   `protobuf:"varint,14,opt,name=packets1024To1518octets,proto3" json:"packets1024To1518octets,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse proto.InternalMessageInfo

func (m *GetOnuEthernetBridgePortHistoryResponse) GetDropEvents() uint32 {
	if m != nil {
		return m.DropEvents
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetOctets() uint32 {
	if m != nil {
		return m.Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets() uint32 {
	if m != nil {
		return m.Packets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetBroadcastPackets() uint32 {
	if m != nil {
		return m.BroadcastPackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetMulticastPackets() uint32 {
	if m != nil {
		return m.MulticastPackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetCrcErroredPackets() uint32 {
	if m != nil {
		return m.CrcErroredPackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetUndersizePackets() uint32 {
	if m != nil {
		return m.UndersizePackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetOversizePackets() uint32 {
	if m != nil {
		return m.OversizePackets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets64Octets() uint32 {
	if m != nil {
		return m.Packets64Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets65To127Octets() uint32 {
	if m != nil {
		return m.Packets65To127Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets128To255Octets() uint32 {
	if m != nil {
		return m.Packets128To255Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets256To511Octets() uint32 {
	if m != nil {
		return m.Packets256To511Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets512To1023Octets() uint32 {
	if m != nil {
		return m.Packets512To1023Octets
	}
	return 0
}

func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets1024To1518Octets() uint32 {
	if m != nil {
		return m.Packets1024To1518Octets
	}
	return 0
}

type GetOnuFecHistory struct {
	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuFecHistory proto.InternalMessageInfo

func (m *GetOnuFecHistory) GetEmpty() *empty.Empty {
	if m != nil {
		return m.Empty
	}
	return nil
}

type GetOnuFecHistoryResponse struct {
	CorrectedBytes         uint32   `protobuf:"varint,1,opt,name=correctedBytes,proto3" json:"correctedBytes,omitempty"`
	CorrectedCodeWords     uint32   `protobuf:"varint,2,opt,name=correctedCodeWords,proto3" json:"correctedCodeWords,omitempty"`
	FecSeconds             uint32   `protobuf:"varint,3,opt,name=fecSeconds,proto3" json:"fecSeconds,omitempty"`
	TotalCodeWords         uint32   `protobuf:"varint,4,opt,name=totalCodeWords,proto3" json:"totalCodeWords,omitempty"`
	UncorrectableCodeWords uint32   `protobuf:"varint,5,opt,name=uncorrectableCodeWords,proto3" json:"uncorrectableCodeWords,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuFecHistoryResponse proto.InternalMessageInfo

func (m *GetOnuFecHistoryResponse) GetCorrectedBytes() uint32 {
	if m != nil {
		return m.CorrectedBytes
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetCorrectedCodeWords() uint32 {
	if m != nil {
		return m.CorrectedCodeWords
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetFecSeconds() uint32 {
	if m != nil {
		return m.FecSeconds
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetTotalCodeWords() uint32 {
	if m != nil {
		return m.TotalCodeWords
	}
	return 0
}

func (m *GetOnuFecHistoryResponse) GetUncorrectableCodeWords() uint32 {
	if m != nil {
		return m.UncorrectableCodeWords
	}
	return 0
}

type GetOnuCountersRequest 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 *GetOnuCountersRequest) Reset()         { *m = GetOnuCountersRequest{} }
func (m *GetOnuCountersRequest) String() string { return proto.CompactTextString(m) }
func (*GetOnuCountersRequest) ProtoMessage()    {}
func (*GetOnuCountersRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{12}
}

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

var xxx_messageInfo_GetOnuCountersRequest proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_GetOnuOMCICountersRequest proto.InternalMessageInfo

func (m *GetOnuOMCICountersRequest) GetOnuDeviceId() string {
	if m != nil {
		return m.OnuDeviceId
	}
	return ""
}

type GetOnuCountersResponse struct {
	// Types that are valid to be assigned to IsIntfId:
	//	*GetOnuCountersResponse_IntfId
	IsIntfId isGetOnuCountersResponse_IsIntfId `protobuf_oneof:"is_intf_id"`
	// Types that are valid to be assigned to IsOnuId:
	//	*GetOnuCountersResponse_OnuId
	IsOnuId isGetOnuCountersResponse_IsOnuId `protobuf_oneof:"is_onu_id"`
	// Types that are valid to be assigned to IsPositiveDrift:
	//	*GetOnuCountersResponse_PositiveDrift
	IsPositiveDrift isGetOnuCountersResponse_IsPositiveDrift `protobuf_oneof:"is_positive_drift"`
	// Types that are valid to be assigned to IsNegativeDrift:
	//	*GetOnuCountersResponse_NegativeDrift
	IsNegativeDrift isGetOnuCountersResponse_IsNegativeDrift `protobuf_oneof:"is_negative_drift"`
	// Types that are valid to be assigned to IsDelimiterMissDetection:
	//	*GetOnuCountersResponse_DelimiterMissDetection
	IsDelimiterMissDetection isGetOnuCountersResponse_IsDelimiterMissDetection `protobuf_oneof:"is_delimiter_miss_detection"`
	// Types that are valid to be assigned to IsBipErrors:
	//	*GetOnuCountersResponse_BipErrors
	IsBipErrors isGetOnuCountersResponse_IsBipErrors `protobuf_oneof:"is_bip_errors"`
	// Types that are valid to be assigned to IsBipUnits:
	//	*GetOnuCountersResponse_BipUnits
	IsBipUnits isGetOnuCountersResponse_IsBipUnits `protobuf_oneof:"is_bip_units"`
	// Types that are valid to be assigned to IsFecCorrectedSymbols:
	//	*GetOnuCountersResponse_FecCorrectedSymbols
	IsFecCorrectedSymbols isGetOnuCountersResponse_IsFecCorrectedSymbols `protobuf_oneof:"is_fec_corrected_symbols"`
	// Types that are valid to be assigned to IsFecCodewordsCorrected:
	//	*GetOnuCountersResponse_FecCodewordsCorrected
	IsFecCodewordsCorrected isGetOnuCountersResponse_IsFecCodewordsCorrected `protobuf_oneof:"is_fec_codewords_corrected"`
	// Types that are valid to be assigned to IsFecCodewordsUncorrectable:
	//	*GetOnuCountersResponse_FecCodewordsUncorrectable
	IsFecCodewordsUncorrectable isGetOnuCountersResponse_IsFecCodewordsUncorrectable `protobuf_oneof:"is_fec_codewords_uncorrectable"`
	// Types that are valid to be assigned to IsFecCodewords:
	//	*GetOnuCountersResponse_FecCodewords
	IsFecCodewords isGetOnuCountersResponse_IsFecCodewords `protobuf_oneof:"is_fec_codewords"`
	// Types that are valid to be assigned to IsFecCorrectedUnits:
	//	*GetOnuCountersResponse_FecCorrectedUnits
	IsFecCorrectedUnits isGetOnuCountersResponse_IsFecCorrectedUnits `protobuf_oneof:"is_fec_corrected_units"`
	// Types that are valid to be assigned to IsXgemKeyErrors:
	//	*GetOnuCountersResponse_XgemKeyErrors
	IsXgemKeyErrors isGetOnuCountersResponse_IsXgemKeyErrors `protobuf_oneof:"is_xgem_key_errors"`
	// Types that are valid to be assigned to IsXgemLoss:
	//	*GetOnuCountersResponse_XgemLoss
	IsXgemLoss isGetOnuCountersResponse_IsXgemLoss `protobuf_oneof:"is_xgem_loss"`
	// Types that are valid to be assigned to IsRxPloamsError:
	//	*GetOnuCountersResponse_RxPloamsError
	IsRxPloamsError isGetOnuCountersResponse_IsRxPloamsError `protobuf_oneof:"is_rx_ploams_error"`
	// Types that are valid to be assigned to IsRxPloamsNonIdle:
	//	*GetOnuCountersResponse_RxPloamsNonIdle
	IsRxPloamsNonIdle isGetOnuCountersResponse_IsRxPloamsNonIdle `protobuf_oneof:"is_rx_ploams_non_idle"`
	// Types that are valid to be assigned to IsRxOmci:
	//	*GetOnuCountersResponse_RxOmci
	IsRxOmci isGetOnuCountersResponse_IsRxOmci `protobuf_oneof:"is_rx_omci"`
	// Types that are valid to be assigned to IsTxOmci:
	//	*GetOnuCountersResponse_TxOmci
	IsTxOmci isGetOnuCountersResponse_IsTxOmci `protobuf_oneof:"is_tx_omci"`
	// Types that are valid to be assigned to IsRxOmciPacketsCrcError:
	//	*GetOnuCountersResponse_RxOmciPacketsCrcError
	IsRxOmciPacketsCrcError isGetOnuCountersResponse_IsRxOmciPacketsCrcError `protobuf_oneof:"is_rx_omci_packets_crc_error"`
	// Types that are valid to be assigned to IsRxBytes:
	//	*GetOnuCountersResponse_RxBytes
	IsRxBytes isGetOnuCountersResponse_IsRxBytes `protobuf_oneof:"is_rx_bytes"`
	// Types that are valid to be assigned to IsRxPackets:
	//	*GetOnuCountersResponse_RxPackets
	IsRxPackets isGetOnuCountersResponse_IsRxPackets `protobuf_oneof:"is_rx_packets"`
	// Types that are valid to be assigned to IsTxBytes:
	//	*GetOnuCountersResponse_TxBytes
	IsTxBytes isGetOnuCountersResponse_IsTxBytes `protobuf_oneof:"is_tx_bytes"`
	// Types that are valid to be assigned to IsTxPackets:
	//	*GetOnuCountersResponse_TxPackets
	IsTxPackets isGetOnuCountersResponse_IsTxPackets `protobuf_oneof:"is_tx_packets"`
	// Types that are valid to be assigned to IsBerReported:
	//	*GetOnuCountersResponse_BerReported
	IsBerReported isGetOnuCountersResponse_IsBerReported `protobuf_oneof:"is_ber_reported"`
	// Types that are valid to be assigned to IsLcdgErrors:
	//	*GetOnuCountersResponse_LcdgErrors
	IsLcdgErrors isGetOnuCountersResponse_IsLcdgErrors `protobuf_oneof:"is_lcdg_errors"`
	// Types that are valid to be assigned to IsRdiErrors:
	//	*GetOnuCountersResponse_RdiErrors
	IsRdiErrors isGetOnuCountersResponse_IsRdiErrors `protobuf_oneof:"is_rdi_errors"`
	// Types that are valid to be assigned to IsTimestamp:
	//	*GetOnuCountersResponse_Timestamp
	IsTimestamp          isGetOnuCountersResponse_IsTimestamp `protobuf_oneof:"is_timestamp"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuCountersResponse proto.InternalMessageInfo

type isGetOnuCountersResponse_IsIntfId interface {
	isGetOnuCountersResponse_IsIntfId()
}

type GetOnuCountersResponse_IntfId struct {
	IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3,oneof"`
}

func (*GetOnuCountersResponse_IntfId) isGetOnuCountersResponse_IsIntfId() {}

func (m *GetOnuCountersResponse) GetIsIntfId() isGetOnuCountersResponse_IsIntfId {
	if m != nil {
		return m.IsIntfId
	}
	return nil
}

func (m *GetOnuCountersResponse) GetIntfId() uint32 {
	if x, ok := m.GetIsIntfId().(*GetOnuCountersResponse_IntfId); ok {
		return x.IntfId
	}
	return 0
}

type isGetOnuCountersResponse_IsOnuId interface {
	isGetOnuCountersResponse_IsOnuId()
}

type GetOnuCountersResponse_OnuId struct {
	OnuId uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3,oneof"`
}

func (*GetOnuCountersResponse_OnuId) isGetOnuCountersResponse_IsOnuId() {}

func (m *GetOnuCountersResponse) GetIsOnuId() isGetOnuCountersResponse_IsOnuId {
	if m != nil {
		return m.IsOnuId
	}
	return nil
}

func (m *GetOnuCountersResponse) GetOnuId() uint32 {
	if x, ok := m.GetIsOnuId().(*GetOnuCountersResponse_OnuId); ok {
		return x.OnuId
	}
	return 0
}

type isGetOnuCountersResponse_IsPositiveDrift interface {
	isGetOnuCountersResponse_IsPositiveDrift()
}

type GetOnuCountersResponse_PositiveDrift struct {
	PositiveDrift uint64 `protobuf:"fixed64,3,opt,name=positive_drift,json=positiveDrift,proto3,oneof"`
}

func (*GetOnuCountersResponse_PositiveDrift) isGetOnuCountersResponse_IsPositiveDrift() {}

func (m *GetOnuCountersResponse) GetIsPositiveDrift() isGetOnuCountersResponse_IsPositiveDrift {
	if m != nil {
		return m.IsPositiveDrift
	}
	return nil
}

func (m *GetOnuCountersResponse) GetPositiveDrift() uint64 {
	if x, ok := m.GetIsPositiveDrift().(*GetOnuCountersResponse_PositiveDrift); ok {
		return x.PositiveDrift
	}
	return 0
}

type isGetOnuCountersResponse_IsNegativeDrift interface {
	isGetOnuCountersResponse_IsNegativeDrift()
}

type GetOnuCountersResponse_NegativeDrift struct {
	NegativeDrift uint64 `protobuf:"fixed64,4,opt,name=negative_drift,json=negativeDrift,proto3,oneof"`
}

func (*GetOnuCountersResponse_NegativeDrift) isGetOnuCountersResponse_IsNegativeDrift() {}

func (m *GetOnuCountersResponse) GetIsNegativeDrift() isGetOnuCountersResponse_IsNegativeDrift {
	if m != nil {
		return m.IsNegativeDrift
	}
	return nil
}

func (m *GetOnuCountersResponse) GetNegativeDrift() uint64 {
	if x, ok := m.GetIsNegativeDrift().(*GetOnuCountersResponse_NegativeDrift); ok {
		return x.NegativeDrift
	}
	return 0
}

type isGetOnuCountersResponse_IsDelimiterMissDetection interface {
	isGetOnuCountersResponse_IsDelimiterMissDetection()
}

type GetOnuCountersResponse_DelimiterMissDetection struct {
	DelimiterMissDetection uint64 `protobuf:"fixed64,5,opt,name=delimiter_miss_detection,json=delimiterMissDetection,proto3,oneof"`
}

func (*GetOnuCountersResponse_DelimiterMissDetection) isGetOnuCountersResponse_IsDelimiterMissDetection() {
}

func (m *GetOnuCountersResponse) GetIsDelimiterMissDetection() isGetOnuCountersResponse_IsDelimiterMissDetection {
	if m != nil {
		return m.IsDelimiterMissDetection
	}
	return nil
}

func (m *GetOnuCountersResponse) GetDelimiterMissDetection() uint64 {
	if x, ok := m.GetIsDelimiterMissDetection().(*GetOnuCountersResponse_DelimiterMissDetection); ok {
		return x.DelimiterMissDetection
	}
	return 0
}

type isGetOnuCountersResponse_IsBipErrors interface {
	isGetOnuCountersResponse_IsBipErrors()
}

type GetOnuCountersResponse_BipErrors struct {
	BipErrors uint64 `protobuf:"fixed64,6,opt,name=bip_errors,json=bipErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_BipErrors) isGetOnuCountersResponse_IsBipErrors() {}

func (m *GetOnuCountersResponse) GetIsBipErrors() isGetOnuCountersResponse_IsBipErrors {
	if m != nil {
		return m.IsBipErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetBipErrors() uint64 {
	if x, ok := m.GetIsBipErrors().(*GetOnuCountersResponse_BipErrors); ok {
		return x.BipErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsBipUnits interface {
	isGetOnuCountersResponse_IsBipUnits()
}

type GetOnuCountersResponse_BipUnits struct {
	BipUnits uint64 `protobuf:"fixed64,7,opt,name=bip_units,json=bipUnits,proto3,oneof"`
}

func (*GetOnuCountersResponse_BipUnits) isGetOnuCountersResponse_IsBipUnits() {}

func (m *GetOnuCountersResponse) GetIsBipUnits() isGetOnuCountersResponse_IsBipUnits {
	if m != nil {
		return m.IsBipUnits
	}
	return nil
}

func (m *GetOnuCountersResponse) GetBipUnits() uint64 {
	if x, ok := m.GetIsBipUnits().(*GetOnuCountersResponse_BipUnits); ok {
		return x.BipUnits
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCorrectedSymbols interface {
	isGetOnuCountersResponse_IsFecCorrectedSymbols()
}

type GetOnuCountersResponse_FecCorrectedSymbols struct {
	FecCorrectedSymbols uint64 `protobuf:"fixed64,8,opt,name=fec_corrected_symbols,json=fecCorrectedSymbols,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCorrectedSymbols) isGetOnuCountersResponse_IsFecCorrectedSymbols() {}

func (m *GetOnuCountersResponse) GetIsFecCorrectedSymbols() isGetOnuCountersResponse_IsFecCorrectedSymbols {
	if m != nil {
		return m.IsFecCorrectedSymbols
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCorrectedSymbols() uint64 {
	if x, ok := m.GetIsFecCorrectedSymbols().(*GetOnuCountersResponse_FecCorrectedSymbols); ok {
		return x.FecCorrectedSymbols
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCodewordsCorrected interface {
	isGetOnuCountersResponse_IsFecCodewordsCorrected()
}

type GetOnuCountersResponse_FecCodewordsCorrected struct {
	FecCodewordsCorrected uint64 `protobuf:"fixed64,9,opt,name=fec_codewords_corrected,json=fecCodewordsCorrected,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCodewordsCorrected) isGetOnuCountersResponse_IsFecCodewordsCorrected() {
}

func (m *GetOnuCountersResponse) GetIsFecCodewordsCorrected() isGetOnuCountersResponse_IsFecCodewordsCorrected {
	if m != nil {
		return m.IsFecCodewordsCorrected
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCodewordsCorrected() uint64 {
	if x, ok := m.GetIsFecCodewordsCorrected().(*GetOnuCountersResponse_FecCodewordsCorrected); ok {
		return x.FecCodewordsCorrected
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCodewordsUncorrectable interface {
	isGetOnuCountersResponse_IsFecCodewordsUncorrectable()
}

type GetOnuCountersResponse_FecCodewordsUncorrectable struct {
	FecCodewordsUncorrectable uint64 `protobuf:"fixed64,10,opt,name=fec_codewords_uncorrectable,json=fecCodewordsUncorrectable,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCodewordsUncorrectable) isGetOnuCountersResponse_IsFecCodewordsUncorrectable() {
}

func (m *GetOnuCountersResponse) GetIsFecCodewordsUncorrectable() isGetOnuCountersResponse_IsFecCodewordsUncorrectable {
	if m != nil {
		return m.IsFecCodewordsUncorrectable
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCodewordsUncorrectable() uint64 {
	if x, ok := m.GetIsFecCodewordsUncorrectable().(*GetOnuCountersResponse_FecCodewordsUncorrectable); ok {
		return x.FecCodewordsUncorrectable
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCodewords interface {
	isGetOnuCountersResponse_IsFecCodewords()
}

type GetOnuCountersResponse_FecCodewords struct {
	FecCodewords uint64 `protobuf:"fixed64,11,opt,name=fec_codewords,json=fecCodewords,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCodewords) isGetOnuCountersResponse_IsFecCodewords() {}

func (m *GetOnuCountersResponse) GetIsFecCodewords() isGetOnuCountersResponse_IsFecCodewords {
	if m != nil {
		return m.IsFecCodewords
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCodewords() uint64 {
	if x, ok := m.GetIsFecCodewords().(*GetOnuCountersResponse_FecCodewords); ok {
		return x.FecCodewords
	}
	return 0
}

type isGetOnuCountersResponse_IsFecCorrectedUnits interface {
	isGetOnuCountersResponse_IsFecCorrectedUnits()
}

type GetOnuCountersResponse_FecCorrectedUnits struct {
	FecCorrectedUnits uint64 `protobuf:"fixed64,12,opt,name=fec_corrected_units,json=fecCorrectedUnits,proto3,oneof"`
}

func (*GetOnuCountersResponse_FecCorrectedUnits) isGetOnuCountersResponse_IsFecCorrectedUnits() {}

func (m *GetOnuCountersResponse) GetIsFecCorrectedUnits() isGetOnuCountersResponse_IsFecCorrectedUnits {
	if m != nil {
		return m.IsFecCorrectedUnits
	}
	return nil
}

func (m *GetOnuCountersResponse) GetFecCorrectedUnits() uint64 {
	if x, ok := m.GetIsFecCorrectedUnits().(*GetOnuCountersResponse_FecCorrectedUnits); ok {
		return x.FecCorrectedUnits
	}
	return 0
}

type isGetOnuCountersResponse_IsXgemKeyErrors interface {
	isGetOnuCountersResponse_IsXgemKeyErrors()
}

type GetOnuCountersResponse_XgemKeyErrors struct {
	XgemKeyErrors uint64 `protobuf:"fixed64,13,opt,name=xgem_key_errors,json=xgemKeyErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_XgemKeyErrors) isGetOnuCountersResponse_IsXgemKeyErrors() {}

func (m *GetOnuCountersResponse) GetIsXgemKeyErrors() isGetOnuCountersResponse_IsXgemKeyErrors {
	if m != nil {
		return m.IsXgemKeyErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetXgemKeyErrors() uint64 {
	if x, ok := m.GetIsXgemKeyErrors().(*GetOnuCountersResponse_XgemKeyErrors); ok {
		return x.XgemKeyErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsXgemLoss interface {
	isGetOnuCountersResponse_IsXgemLoss()
}

type GetOnuCountersResponse_XgemLoss struct {
	XgemLoss uint64 `protobuf:"fixed64,14,opt,name=xgem_loss,json=xgemLoss,proto3,oneof"`
}

func (*GetOnuCountersResponse_XgemLoss) isGetOnuCountersResponse_IsXgemLoss() {}

func (m *GetOnuCountersResponse) GetIsXgemLoss() isGetOnuCountersResponse_IsXgemLoss {
	if m != nil {
		return m.IsXgemLoss
	}
	return nil
}

func (m *GetOnuCountersResponse) GetXgemLoss() uint64 {
	if x, ok := m.GetIsXgemLoss().(*GetOnuCountersResponse_XgemLoss); ok {
		return x.XgemLoss
	}
	return 0
}

type isGetOnuCountersResponse_IsRxPloamsError interface {
	isGetOnuCountersResponse_IsRxPloamsError()
}

type GetOnuCountersResponse_RxPloamsError struct {
	RxPloamsError uint64 `protobuf:"fixed64,15,opt,name=rx_ploams_error,json=rxPloamsError,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxPloamsError) isGetOnuCountersResponse_IsRxPloamsError() {}

func (m *GetOnuCountersResponse) GetIsRxPloamsError() isGetOnuCountersResponse_IsRxPloamsError {
	if m != nil {
		return m.IsRxPloamsError
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxPloamsError() uint64 {
	if x, ok := m.GetIsRxPloamsError().(*GetOnuCountersResponse_RxPloamsError); ok {
		return x.RxPloamsError
	}
	return 0
}

type isGetOnuCountersResponse_IsRxPloamsNonIdle interface {
	isGetOnuCountersResponse_IsRxPloamsNonIdle()
}

type GetOnuCountersResponse_RxPloamsNonIdle struct {
	RxPloamsNonIdle uint64 `protobuf:"fixed64,16,opt,name=rx_ploams_non_idle,json=rxPloamsNonIdle,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxPloamsNonIdle) isGetOnuCountersResponse_IsRxPloamsNonIdle() {}

func (m *GetOnuCountersResponse) GetIsRxPloamsNonIdle() isGetOnuCountersResponse_IsRxPloamsNonIdle {
	if m != nil {
		return m.IsRxPloamsNonIdle
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxPloamsNonIdle() uint64 {
	if x, ok := m.GetIsRxPloamsNonIdle().(*GetOnuCountersResponse_RxPloamsNonIdle); ok {
		return x.RxPloamsNonIdle
	}
	return 0
}

type isGetOnuCountersResponse_IsRxOmci interface {
	isGetOnuCountersResponse_IsRxOmci()
}

type GetOnuCountersResponse_RxOmci struct {
	RxOmci uint64 `protobuf:"fixed64,17,opt,name=rx_omci,json=rxOmci,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxOmci) isGetOnuCountersResponse_IsRxOmci() {}

func (m *GetOnuCountersResponse) GetIsRxOmci() isGetOnuCountersResponse_IsRxOmci {
	if m != nil {
		return m.IsRxOmci
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxOmci() uint64 {
	if x, ok := m.GetIsRxOmci().(*GetOnuCountersResponse_RxOmci); ok {
		return x.RxOmci
	}
	return 0
}

type isGetOnuCountersResponse_IsTxOmci interface {
	isGetOnuCountersResponse_IsTxOmci()
}

type GetOnuCountersResponse_TxOmci struct {
	TxOmci uint64 `protobuf:"fixed64,18,opt,name=tx_omci,json=txOmci,proto3,oneof"`
}

func (*GetOnuCountersResponse_TxOmci) isGetOnuCountersResponse_IsTxOmci() {}

func (m *GetOnuCountersResponse) GetIsTxOmci() isGetOnuCountersResponse_IsTxOmci {
	if m != nil {
		return m.IsTxOmci
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTxOmci() uint64 {
	if x, ok := m.GetIsTxOmci().(*GetOnuCountersResponse_TxOmci); ok {
		return x.TxOmci
	}
	return 0
}

type isGetOnuCountersResponse_IsRxOmciPacketsCrcError interface {
	isGetOnuCountersResponse_IsRxOmciPacketsCrcError()
}

type GetOnuCountersResponse_RxOmciPacketsCrcError struct {
	RxOmciPacketsCrcError uint64 `protobuf:"fixed64,19,opt,name=rx_omci_packets_crc_error,json=rxOmciPacketsCrcError,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxOmciPacketsCrcError) isGetOnuCountersResponse_IsRxOmciPacketsCrcError() {
}

func (m *GetOnuCountersResponse) GetIsRxOmciPacketsCrcError() isGetOnuCountersResponse_IsRxOmciPacketsCrcError {
	if m != nil {
		return m.IsRxOmciPacketsCrcError
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxOmciPacketsCrcError() uint64 {
	if x, ok := m.GetIsRxOmciPacketsCrcError().(*GetOnuCountersResponse_RxOmciPacketsCrcError); ok {
		return x.RxOmciPacketsCrcError
	}
	return 0
}

type isGetOnuCountersResponse_IsRxBytes interface {
	isGetOnuCountersResponse_IsRxBytes()
}

type GetOnuCountersResponse_RxBytes struct {
	RxBytes uint64 `protobuf:"fixed64,20,opt,name=rx_bytes,json=rxBytes,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxBytes) isGetOnuCountersResponse_IsRxBytes() {}

func (m *GetOnuCountersResponse) GetIsRxBytes() isGetOnuCountersResponse_IsRxBytes {
	if m != nil {
		return m.IsRxBytes
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxBytes() uint64 {
	if x, ok := m.GetIsRxBytes().(*GetOnuCountersResponse_RxBytes); ok {
		return x.RxBytes
	}
	return 0
}

type isGetOnuCountersResponse_IsRxPackets interface {
	isGetOnuCountersResponse_IsRxPackets()
}

type GetOnuCountersResponse_RxPackets struct {
	RxPackets uint64 `protobuf:"fixed64,21,opt,name=rx_packets,json=rxPackets,proto3,oneof"`
}

func (*GetOnuCountersResponse_RxPackets) isGetOnuCountersResponse_IsRxPackets() {}

func (m *GetOnuCountersResponse) GetIsRxPackets() isGetOnuCountersResponse_IsRxPackets {
	if m != nil {
		return m.IsRxPackets
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRxPackets() uint64 {
	if x, ok := m.GetIsRxPackets().(*GetOnuCountersResponse_RxPackets); ok {
		return x.RxPackets
	}
	return 0
}

type isGetOnuCountersResponse_IsTxBytes interface {
	isGetOnuCountersResponse_IsTxBytes()
}

type GetOnuCountersResponse_TxBytes struct {
	TxBytes uint64 `protobuf:"fixed64,22,opt,name=tx_bytes,json=txBytes,proto3,oneof"`
}

func (*GetOnuCountersResponse_TxBytes) isGetOnuCountersResponse_IsTxBytes() {}

func (m *GetOnuCountersResponse) GetIsTxBytes() isGetOnuCountersResponse_IsTxBytes {
	if m != nil {
		return m.IsTxBytes
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTxBytes() uint64 {
	if x, ok := m.GetIsTxBytes().(*GetOnuCountersResponse_TxBytes); ok {
		return x.TxBytes
	}
	return 0
}

type isGetOnuCountersResponse_IsTxPackets interface {
	isGetOnuCountersResponse_IsTxPackets()
}

type GetOnuCountersResponse_TxPackets struct {
	TxPackets uint64 `protobuf:"fixed64,23,opt,name=tx_packets,json=txPackets,proto3,oneof"`
}

func (*GetOnuCountersResponse_TxPackets) isGetOnuCountersResponse_IsTxPackets() {}

func (m *GetOnuCountersResponse) GetIsTxPackets() isGetOnuCountersResponse_IsTxPackets {
	if m != nil {
		return m.IsTxPackets
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTxPackets() uint64 {
	if x, ok := m.GetIsTxPackets().(*GetOnuCountersResponse_TxPackets); ok {
		return x.TxPackets
	}
	return 0
}

type isGetOnuCountersResponse_IsBerReported interface {
	isGetOnuCountersResponse_IsBerReported()
}

type GetOnuCountersResponse_BerReported struct {
	BerReported uint64 `protobuf:"fixed64,24,opt,name=ber_reported,json=berReported,proto3,oneof"`
}

func (*GetOnuCountersResponse_BerReported) isGetOnuCountersResponse_IsBerReported() {}

func (m *GetOnuCountersResponse) GetIsBerReported() isGetOnuCountersResponse_IsBerReported {
	if m != nil {
		return m.IsBerReported
	}
	return nil
}

func (m *GetOnuCountersResponse) GetBerReported() uint64 {
	if x, ok := m.GetIsBerReported().(*GetOnuCountersResponse_BerReported); ok {
		return x.BerReported
	}
	return 0
}

type isGetOnuCountersResponse_IsLcdgErrors interface {
	isGetOnuCountersResponse_IsLcdgErrors()
}

type GetOnuCountersResponse_LcdgErrors struct {
	LcdgErrors uint64 `protobuf:"fixed64,25,opt,name=lcdg_errors,json=lcdgErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_LcdgErrors) isGetOnuCountersResponse_IsLcdgErrors() {}

func (m *GetOnuCountersResponse) GetIsLcdgErrors() isGetOnuCountersResponse_IsLcdgErrors {
	if m != nil {
		return m.IsLcdgErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetLcdgErrors() uint64 {
	if x, ok := m.GetIsLcdgErrors().(*GetOnuCountersResponse_LcdgErrors); ok {
		return x.LcdgErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsRdiErrors interface {
	isGetOnuCountersResponse_IsRdiErrors()
}

type GetOnuCountersResponse_RdiErrors struct {
	RdiErrors uint64 `protobuf:"fixed64,26,opt,name=rdi_errors,json=rdiErrors,proto3,oneof"`
}

func (*GetOnuCountersResponse_RdiErrors) isGetOnuCountersResponse_IsRdiErrors() {}

func (m *GetOnuCountersResponse) GetIsRdiErrors() isGetOnuCountersResponse_IsRdiErrors {
	if m != nil {
		return m.IsRdiErrors
	}
	return nil
}

func (m *GetOnuCountersResponse) GetRdiErrors() uint64 {
	if x, ok := m.GetIsRdiErrors().(*GetOnuCountersResponse_RdiErrors); ok {
		return x.RdiErrors
	}
	return 0
}

type isGetOnuCountersResponse_IsTimestamp interface {
	isGetOnuCountersResponse_IsTimestamp()
}

type GetOnuCountersResponse_Timestamp struct {
	Timestamp uint32 `protobuf:"fixed32,27,opt,name=timestamp,proto3,oneof"`
}

func (*GetOnuCountersResponse_Timestamp) isGetOnuCountersResponse_IsTimestamp() {}

func (m *GetOnuCountersResponse) GetIsTimestamp() isGetOnuCountersResponse_IsTimestamp {
	if m != nil {
		return m.IsTimestamp
	}
	return nil
}

func (m *GetOnuCountersResponse) GetTimestamp() uint32 {
	if x, ok := m.GetIsTimestamp().(*GetOnuCountersResponse_Timestamp); ok {
		return x.Timestamp
	}
	return 0
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetOnuCountersResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetOnuCountersResponse_IntfId)(nil),
		(*GetOnuCountersResponse_OnuId)(nil),
		(*GetOnuCountersResponse_PositiveDrift)(nil),
		(*GetOnuCountersResponse_NegativeDrift)(nil),
		(*GetOnuCountersResponse_DelimiterMissDetection)(nil),
		(*GetOnuCountersResponse_BipErrors)(nil),
		(*GetOnuCountersResponse_BipUnits)(nil),
		(*GetOnuCountersResponse_FecCorrectedSymbols)(nil),
		(*GetOnuCountersResponse_FecCodewordsCorrected)(nil),
		(*GetOnuCountersResponse_FecCodewordsUncorrectable)(nil),
		(*GetOnuCountersResponse_FecCodewords)(nil),
		(*GetOnuCountersResponse_FecCorrectedUnits)(nil),
		(*GetOnuCountersResponse_XgemKeyErrors)(nil),
		(*GetOnuCountersResponse_XgemLoss)(nil),
		(*GetOnuCountersResponse_RxPloamsError)(nil),
		(*GetOnuCountersResponse_RxPloamsNonIdle)(nil),
		(*GetOnuCountersResponse_RxOmci)(nil),
		(*GetOnuCountersResponse_TxOmci)(nil),
		(*GetOnuCountersResponse_RxOmciPacketsCrcError)(nil),
		(*GetOnuCountersResponse_RxBytes)(nil),
		(*GetOnuCountersResponse_RxPackets)(nil),
		(*GetOnuCountersResponse_TxBytes)(nil),
		(*GetOnuCountersResponse_TxPackets)(nil),
		(*GetOnuCountersResponse_BerReported)(nil),
		(*GetOnuCountersResponse_LcdgErrors)(nil),
		(*GetOnuCountersResponse_RdiErrors)(nil),
		(*GetOnuCountersResponse_Timestamp)(nil),
	}
}

type GetOnuOMCICountersResponse struct {
	// Types that are valid to be assigned to IsDropEvents:
	//	*GetOnuOMCICountersResponse_DropEvents
	IsDropEvents isGetOnuOMCICountersResponse_IsDropEvents `protobuf_oneof:"is_drop_events"`
	// Types that are valid to be assigned to IsOctets:
	//	*GetOnuOMCICountersResponse_Octets
	IsOctets isGetOnuOMCICountersResponse_IsOctets `protobuf_oneof:"is_octets"`
	// Types that are valid to be assigned to IsFrames:
	//	*GetOnuOMCICountersResponse_Frames
	IsFrames isGetOnuOMCICountersResponse_IsFrames `protobuf_oneof:"is_frames"`
	// Types that are valid to be assigned to IsBroadcastFrames:
	//	*GetOnuOMCICountersResponse_BroadcastFrames
	IsBroadcastFrames isGetOnuOMCICountersResponse_IsBroadcastFrames `protobuf_oneof:"is_broadcast_frames"`
	// Types that are valid to be assigned to IsMulticastFrames:
	//	*GetOnuOMCICountersResponse_MulticastFrames
	IsMulticastFrames isGetOnuOMCICountersResponse_IsMulticastFrames `protobuf_oneof:"is_multicast_frames"`
	// Types that are valid to be assigned to IsCrcErroredFrames:
	//	*GetOnuOMCICountersResponse_CrcErroredFrames
	IsCrcErroredFrames isGetOnuOMCICountersResponse_IsCrcErroredFrames `protobuf_oneof:"is_crc_errored_frames"`
	// Types that are valid to be assigned to IsUndersizeFrames:
	//	*GetOnuOMCICountersResponse_UndersizeFrames
	IsUndersizeFrames isGetOnuOMCICountersResponse_IsUndersizeFrames `protobuf_oneof:"is_undersize_frames"`
	// Types that are valid to be assigned to IsOversizeFrames:
	//	*GetOnuOMCICountersResponse_OversizeFrames
	IsOversizeFrames isGetOnuOMCICountersResponse_IsOversizeFrames `protobuf_oneof:"is_oversize_frames"`
	// Types that are valid to be assigned to IsFrames_64Octets:
	//	*GetOnuOMCICountersResponse_Frames_64Octets
	IsFrames_64Octets isGetOnuOMCICountersResponse_IsFrames_64Octets `protobuf_oneof:"is_frames_64_octets"`
	// Types that are valid to be assigned to IsFrames_65To_127Octets:
	//	*GetOnuOMCICountersResponse_Frames_65To_127Octets
	IsFrames_65To_127Octets isGetOnuOMCICountersResponse_IsFrames_65To_127Octets `protobuf_oneof:"is_frames_65_to_127_octets"`
	// Types that are valid to be assigned to IsFrames_128To_255Octets:
	//	*GetOnuOMCICountersResponse_Frames_128To_255Octets
	IsFrames_128To_255Octets isGetOnuOMCICountersResponse_IsFrames_128To_255Octets `protobuf_oneof:"is_frames_128_to_255_octets"`
	// Types that are valid to be assigned to IsFrames_256To_511Octets:
	//	*GetOnuOMCICountersResponse_Frames_256To_511Octets
	IsFrames_256To_511Octets isGetOnuOMCICountersResponse_IsFrames_256To_511Octets `protobuf_oneof:"is_frames_256_to_511_octets"`
	// Types that are valid to be assigned to IsFrames_512To_1023Octets:
	//	*GetOnuOMCICountersResponse_Frames_512To_1023Octets
	IsFrames_512To_1023Octets isGetOnuOMCICountersResponse_IsFrames_512To_1023Octets `protobuf_oneof:"is_frames_512_to_1023_octets"`
	// Types that are valid to be assigned to IsFrames_1024To_1518Octets:
	//	*GetOnuOMCICountersResponse_Frames_1024To_1518Octets
	IsFrames_1024To_1518Octets isGetOnuOMCICountersResponse_IsFrames_1024To_1518Octets `protobuf_oneof:"is_frames_1024_to_1518_octets"`
	XXX_NoUnkeyedLiteral       struct{}                                                `json:"-"`
	XXX_unrecognized           []byte                                                  `json:"-"`
	XXX_sizecache              int32                                                   `json:"-"`
}

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

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

var xxx_messageInfo_GetOnuOMCICountersResponse proto.InternalMessageInfo

type isGetOnuOMCICountersResponse_IsDropEvents interface {
	isGetOnuOMCICountersResponse_IsDropEvents()
}

type GetOnuOMCICountersResponse_DropEvents struct {
	DropEvents uint64 `protobuf:"fixed64,1,opt,name=drop_events,json=dropEvents,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_DropEvents) isGetOnuOMCICountersResponse_IsDropEvents() {}

func (m *GetOnuOMCICountersResponse) GetIsDropEvents() isGetOnuOMCICountersResponse_IsDropEvents {
	if m != nil {
		return m.IsDropEvents
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetDropEvents() uint64 {
	if x, ok := m.GetIsDropEvents().(*GetOnuOMCICountersResponse_DropEvents); ok {
		return x.DropEvents
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsOctets interface {
	isGetOnuOMCICountersResponse_IsOctets()
}

type GetOnuOMCICountersResponse_Octets struct {
	Octets uint64 `protobuf:"fixed64,2,opt,name=octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Octets) isGetOnuOMCICountersResponse_IsOctets() {}

func (m *GetOnuOMCICountersResponse) GetIsOctets() isGetOnuOMCICountersResponse_IsOctets {
	if m != nil {
		return m.IsOctets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetOctets() uint64 {
	if x, ok := m.GetIsOctets().(*GetOnuOMCICountersResponse_Octets); ok {
		return x.Octets
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames interface {
	isGetOnuOMCICountersResponse_IsFrames()
}

type GetOnuOMCICountersResponse_Frames struct {
	Frames uint64 `protobuf:"fixed64,3,opt,name=frames,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames) isGetOnuOMCICountersResponse_IsFrames() {}

func (m *GetOnuOMCICountersResponse) GetIsFrames() isGetOnuOMCICountersResponse_IsFrames {
	if m != nil {
		return m.IsFrames
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames() uint64 {
	if x, ok := m.GetIsFrames().(*GetOnuOMCICountersResponse_Frames); ok {
		return x.Frames
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsBroadcastFrames interface {
	isGetOnuOMCICountersResponse_IsBroadcastFrames()
}

type GetOnuOMCICountersResponse_BroadcastFrames struct {
	BroadcastFrames uint64 `protobuf:"fixed64,4,opt,name=broadcast_frames,json=broadcastFrames,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_BroadcastFrames) isGetOnuOMCICountersResponse_IsBroadcastFrames() {}

func (m *GetOnuOMCICountersResponse) GetIsBroadcastFrames() isGetOnuOMCICountersResponse_IsBroadcastFrames {
	if m != nil {
		return m.IsBroadcastFrames
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetBroadcastFrames() uint64 {
	if x, ok := m.GetIsBroadcastFrames().(*GetOnuOMCICountersResponse_BroadcastFrames); ok {
		return x.BroadcastFrames
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsMulticastFrames interface {
	isGetOnuOMCICountersResponse_IsMulticastFrames()
}

type GetOnuOMCICountersResponse_MulticastFrames struct {
	MulticastFrames uint64 `protobuf:"fixed64,5,opt,name=multicast_frames,json=multicastFrames,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_MulticastFrames) isGetOnuOMCICountersResponse_IsMulticastFrames() {}

func (m *GetOnuOMCICountersResponse) GetIsMulticastFrames() isGetOnuOMCICountersResponse_IsMulticastFrames {
	if m != nil {
		return m.IsMulticastFrames
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetMulticastFrames() uint64 {
	if x, ok := m.GetIsMulticastFrames().(*GetOnuOMCICountersResponse_MulticastFrames); ok {
		return x.MulticastFrames
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsCrcErroredFrames interface {
	isGetOnuOMCICountersResponse_IsCrcErroredFrames()
}

type GetOnuOMCICountersResponse_CrcErroredFrames struct {
	CrcErroredFrames uint64 `protobuf:"fixed64,6,opt,name=crc_errored_frames,json=crcErroredFrames,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_CrcErroredFrames) isGetOnuOMCICountersResponse_IsCrcErroredFrames() {
}

func (m *GetOnuOMCICountersResponse) GetIsCrcErroredFrames() isGetOnuOMCICountersResponse_IsCrcErroredFrames {
	if m != nil {
		return m.IsCrcErroredFrames
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetCrcErroredFrames() uint64 {
	if x, ok := m.GetIsCrcErroredFrames().(*GetOnuOMCICountersResponse_CrcErroredFrames); ok {
		return x.CrcErroredFrames
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsUndersizeFrames interface {
	isGetOnuOMCICountersResponse_IsUndersizeFrames()
}

type GetOnuOMCICountersResponse_UndersizeFrames struct {
	UndersizeFrames uint64 `protobuf:"fixed64,7,opt,name=undersize_frames,json=undersizeFrames,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_UndersizeFrames) isGetOnuOMCICountersResponse_IsUndersizeFrames() {}

func (m *GetOnuOMCICountersResponse) GetIsUndersizeFrames() isGetOnuOMCICountersResponse_IsUndersizeFrames {
	if m != nil {
		return m.IsUndersizeFrames
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetUndersizeFrames() uint64 {
	if x, ok := m.GetIsUndersizeFrames().(*GetOnuOMCICountersResponse_UndersizeFrames); ok {
		return x.UndersizeFrames
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsOversizeFrames interface {
	isGetOnuOMCICountersResponse_IsOversizeFrames()
}

type GetOnuOMCICountersResponse_OversizeFrames struct {
	OversizeFrames uint64 `protobuf:"fixed64,8,opt,name=oversize_frames,json=oversizeFrames,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_OversizeFrames) isGetOnuOMCICountersResponse_IsOversizeFrames() {}

func (m *GetOnuOMCICountersResponse) GetIsOversizeFrames() isGetOnuOMCICountersResponse_IsOversizeFrames {
	if m != nil {
		return m.IsOversizeFrames
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetOversizeFrames() uint64 {
	if x, ok := m.GetIsOversizeFrames().(*GetOnuOMCICountersResponse_OversizeFrames); ok {
		return x.OversizeFrames
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames_64Octets interface {
	isGetOnuOMCICountersResponse_IsFrames_64Octets()
}

type GetOnuOMCICountersResponse_Frames_64Octets struct {
	Frames_64Octets uint64 `protobuf:"fixed64,9,opt,name=frames_64_octets,json=frames64Octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames_64Octets) isGetOnuOMCICountersResponse_IsFrames_64Octets() {}

func (m *GetOnuOMCICountersResponse) GetIsFrames_64Octets() isGetOnuOMCICountersResponse_IsFrames_64Octets {
	if m != nil {
		return m.IsFrames_64Octets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames_64Octets() uint64 {
	if x, ok := m.GetIsFrames_64Octets().(*GetOnuOMCICountersResponse_Frames_64Octets); ok {
		return x.Frames_64Octets
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames_65To_127Octets interface {
	isGetOnuOMCICountersResponse_IsFrames_65To_127Octets()
}

type GetOnuOMCICountersResponse_Frames_65To_127Octets struct {
	Frames_65To_127Octets uint64 `protobuf:"fixed64,10,opt,name=frames_65_to_127_octets,json=frames65To127Octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames_65To_127Octets) isGetOnuOMCICountersResponse_IsFrames_65To_127Octets() {
}

func (m *GetOnuOMCICountersResponse) GetIsFrames_65To_127Octets() isGetOnuOMCICountersResponse_IsFrames_65To_127Octets {
	if m != nil {
		return m.IsFrames_65To_127Octets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames_65To_127Octets() uint64 {
	if x, ok := m.GetIsFrames_65To_127Octets().(*GetOnuOMCICountersResponse_Frames_65To_127Octets); ok {
		return x.Frames_65To_127Octets
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames_128To_255Octets interface {
	isGetOnuOMCICountersResponse_IsFrames_128To_255Octets()
}

type GetOnuOMCICountersResponse_Frames_128To_255Octets struct {
	Frames_128To_255Octets uint64 `protobuf:"fixed64,11,opt,name=frames_128_to_255_octets,json=frames128To255Octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames_128To_255Octets) isGetOnuOMCICountersResponse_IsFrames_128To_255Octets() {
}

func (m *GetOnuOMCICountersResponse) GetIsFrames_128To_255Octets() isGetOnuOMCICountersResponse_IsFrames_128To_255Octets {
	if m != nil {
		return m.IsFrames_128To_255Octets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames_128To_255Octets() uint64 {
	if x, ok := m.GetIsFrames_128To_255Octets().(*GetOnuOMCICountersResponse_Frames_128To_255Octets); ok {
		return x.Frames_128To_255Octets
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames_256To_511Octets interface {
	isGetOnuOMCICountersResponse_IsFrames_256To_511Octets()
}

type GetOnuOMCICountersResponse_Frames_256To_511Octets struct {
	Frames_256To_511Octets uint64 `protobuf:"fixed64,12,opt,name=frames_256_to_511_octets,json=frames256To511Octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames_256To_511Octets) isGetOnuOMCICountersResponse_IsFrames_256To_511Octets() {
}

func (m *GetOnuOMCICountersResponse) GetIsFrames_256To_511Octets() isGetOnuOMCICountersResponse_IsFrames_256To_511Octets {
	if m != nil {
		return m.IsFrames_256To_511Octets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames_256To_511Octets() uint64 {
	if x, ok := m.GetIsFrames_256To_511Octets().(*GetOnuOMCICountersResponse_Frames_256To_511Octets); ok {
		return x.Frames_256To_511Octets
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames_512To_1023Octets interface {
	isGetOnuOMCICountersResponse_IsFrames_512To_1023Octets()
}

type GetOnuOMCICountersResponse_Frames_512To_1023Octets struct {
	Frames_512To_1023Octets uint64 `protobuf:"fixed64,13,opt,name=frames_512_to_1023_octets,json=frames512To1023Octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames_512To_1023Octets) isGetOnuOMCICountersResponse_IsFrames_512To_1023Octets() {
}

func (m *GetOnuOMCICountersResponse) GetIsFrames_512To_1023Octets() isGetOnuOMCICountersResponse_IsFrames_512To_1023Octets {
	if m != nil {
		return m.IsFrames_512To_1023Octets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames_512To_1023Octets() uint64 {
	if x, ok := m.GetIsFrames_512To_1023Octets().(*GetOnuOMCICountersResponse_Frames_512To_1023Octets); ok {
		return x.Frames_512To_1023Octets
	}
	return 0
}

type isGetOnuOMCICountersResponse_IsFrames_1024To_1518Octets interface {
	isGetOnuOMCICountersResponse_IsFrames_1024To_1518Octets()
}

type GetOnuOMCICountersResponse_Frames_1024To_1518Octets struct {
	Frames_1024To_1518Octets uint64 `protobuf:"fixed64,14,opt,name=frames_1024_to_1518_octets,json=frames1024To1518Octets,proto3,oneof"`
}

func (*GetOnuOMCICountersResponse_Frames_1024To_1518Octets) isGetOnuOMCICountersResponse_IsFrames_1024To_1518Octets() {
}

func (m *GetOnuOMCICountersResponse) GetIsFrames_1024To_1518Octets() isGetOnuOMCICountersResponse_IsFrames_1024To_1518Octets {
	if m != nil {
		return m.IsFrames_1024To_1518Octets
	}
	return nil
}

func (m *GetOnuOMCICountersResponse) GetFrames_1024To_1518Octets() uint64 {
	if x, ok := m.GetIsFrames_1024To_1518Octets().(*GetOnuOMCICountersResponse_Frames_1024To_1518Octets); ok {
		return x.Frames_1024To_1518Octets
	}
	return 0
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetOnuOMCICountersResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetOnuOMCICountersResponse_DropEvents)(nil),
		(*GetOnuOMCICountersResponse_Octets)(nil),
		(*GetOnuOMCICountersResponse_Frames)(nil),
		(*GetOnuOMCICountersResponse_BroadcastFrames)(nil),
		(*GetOnuOMCICountersResponse_MulticastFrames)(nil),
		(*GetOnuOMCICountersResponse_CrcErroredFrames)(nil),
		(*GetOnuOMCICountersResponse_UndersizeFrames)(nil),
		(*GetOnuOMCICountersResponse_OversizeFrames)(nil),
		(*GetOnuOMCICountersResponse_Frames_64Octets)(nil),
		(*GetOnuOMCICountersResponse_Frames_65To_127Octets)(nil),
		(*GetOnuOMCICountersResponse_Frames_128To_255Octets)(nil),
		(*GetOnuOMCICountersResponse_Frames_256To_511Octets)(nil),
		(*GetOnuOMCICountersResponse_Frames_512To_1023Octets)(nil),
		(*GetOnuOMCICountersResponse_Frames_1024To_1518Octets)(nil),
	}
}

type GetValueRequest struct {
	// Types that are valid to be assigned to Request:
	//	*GetValueRequest_Distance
	//	*GetValueRequest_UniInfo
	//	*GetValueRequest_OltPortInfo
	//	*GetValueRequest_OnuOpticalInfo
	//	*GetValueRequest_EthBridgePort
	//	*GetValueRequest_FecHistory
	//	*GetValueRequest_OnuPonInfo
	//	*GetValueRequest_OnuInfo
	Request              isGetValueRequest_Request `protobuf_oneof:"request"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_GetValueRequest proto.InternalMessageInfo

type isGetValueRequest_Request interface {
	isGetValueRequest_Request()
}

type GetValueRequest_Distance struct {
	Distance *GetDistanceRequest `protobuf:"bytes,1,opt,name=distance,proto3,oneof"`
}

type GetValueRequest_UniInfo struct {
	UniInfo *GetOnuUniInfoRequest `protobuf:"bytes,2,opt,name=uniInfo,proto3,oneof"`
}

type GetValueRequest_OltPortInfo struct {
	OltPortInfo *GetOltPortCounters `protobuf:"bytes,3,opt,name=oltPortInfo,proto3,oneof"`
}

type GetValueRequest_OnuOpticalInfo struct {
	OnuOpticalInfo *GetOnuPonOpticalInfo `protobuf:"bytes,4,opt,name=onuOpticalInfo,proto3,oneof"`
}

type GetValueRequest_EthBridgePort struct {
	EthBridgePort *GetOnuEthernetBridgePortHistory `protobuf:"bytes,5,opt,name=ethBridgePort,proto3,oneof"`
}

type GetValueRequest_FecHistory struct {
	FecHistory *GetOnuFecHistory `protobuf:"bytes,6,opt,name=fecHistory,proto3,oneof"`
}

type GetValueRequest_OnuPonInfo struct {
	OnuPonInfo *GetOnuCountersRequest `protobuf:"bytes,7,opt,name=onuPonInfo,proto3,oneof"`
}

type GetValueRequest_OnuInfo struct {
	OnuInfo *GetOnuOMCICountersRequest `protobuf:"bytes,8,opt,name=onuInfo,proto3,oneof"`
}

func (*GetValueRequest_Distance) isGetValueRequest_Request() {}

func (*GetValueRequest_UniInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_OltPortInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_OnuOpticalInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_EthBridgePort) isGetValueRequest_Request() {}

func (*GetValueRequest_FecHistory) isGetValueRequest_Request() {}

func (*GetValueRequest_OnuPonInfo) isGetValueRequest_Request() {}

func (*GetValueRequest_OnuInfo) isGetValueRequest_Request() {}

func (m *GetValueRequest) GetRequest() isGetValueRequest_Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *GetValueRequest) GetDistance() *GetDistanceRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_Distance); ok {
		return x.Distance
	}
	return nil
}

func (m *GetValueRequest) GetUniInfo() *GetOnuUniInfoRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_UniInfo); ok {
		return x.UniInfo
	}
	return nil
}

func (m *GetValueRequest) GetOltPortInfo() *GetOltPortCounters {
	if x, ok := m.GetRequest().(*GetValueRequest_OltPortInfo); ok {
		return x.OltPortInfo
	}
	return nil
}

func (m *GetValueRequest) GetOnuOpticalInfo() *GetOnuPonOpticalInfo {
	if x, ok := m.GetRequest().(*GetValueRequest_OnuOpticalInfo); ok {
		return x.OnuOpticalInfo
	}
	return nil
}

func (m *GetValueRequest) GetEthBridgePort() *GetOnuEthernetBridgePortHistory {
	if x, ok := m.GetRequest().(*GetValueRequest_EthBridgePort); ok {
		return x.EthBridgePort
	}
	return nil
}

func (m *GetValueRequest) GetFecHistory() *GetOnuFecHistory {
	if x, ok := m.GetRequest().(*GetValueRequest_FecHistory); ok {
		return x.FecHistory
	}
	return nil
}

func (m *GetValueRequest) GetOnuPonInfo() *GetOnuCountersRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_OnuPonInfo); ok {
		return x.OnuPonInfo
	}
	return nil
}

func (m *GetValueRequest) GetOnuInfo() *GetOnuOMCICountersRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_OnuInfo); ok {
		return x.OnuInfo
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetValueRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetValueRequest_Distance)(nil),
		(*GetValueRequest_UniInfo)(nil),
		(*GetValueRequest_OltPortInfo)(nil),
		(*GetValueRequest_OnuOpticalInfo)(nil),
		(*GetValueRequest_EthBridgePort)(nil),
		(*GetValueRequest_FecHistory)(nil),
		(*GetValueRequest_OnuPonInfo)(nil),
		(*GetValueRequest_OnuInfo)(nil),
	}
}

type GetValueResponse struct {
	Status    GetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.GetValueResponse_Status" json:"status,omitempty"`
	ErrReason GetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.GetValueResponse_ErrorReason" json:"errReason,omitempty"`
	// Types that are valid to be assigned to Response:
	//	*GetValueResponse_Distance
	//	*GetValueResponse_UniInfo
	//	*GetValueResponse_PortCoutners
	//	*GetValueResponse_OnuOpticalInfo
	//	*GetValueResponse_EthBridgePortInfo
	//	*GetValueResponse_FecHistory
	//	*GetValueResponse_OnuPonCounters
	//	*GetValueResponse_OnuOMCICounters
	Response             isGetValueResponse_Response `protobuf_oneof:"response"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_GetValueResponse proto.InternalMessageInfo

func (m *GetValueResponse) GetStatus() GetValueResponse_Status {
	if m != nil {
		return m.Status
	}
	return GetValueResponse_STATUS_UNDEFINED
}

func (m *GetValueResponse) GetErrReason() GetValueResponse_ErrorReason {
	if m != nil {
		return m.ErrReason
	}
	return GetValueResponse_REASON_UNDEFINED
}

type isGetValueResponse_Response interface {
	isGetValueResponse_Response()
}

type GetValueResponse_Distance struct {
	Distance *GetDistanceResponse `protobuf:"bytes,3,opt,name=distance,proto3,oneof"`
}

type GetValueResponse_UniInfo struct {
	UniInfo *GetOnuUniInfoResponse `protobuf:"bytes,4,opt,name=uniInfo,proto3,oneof"`
}

type GetValueResponse_PortCoutners struct {
	PortCoutners *GetOltPortCountersResponse `protobuf:"bytes,5,opt,name=portCoutners,proto3,oneof"`
}

type GetValueResponse_OnuOpticalInfo struct {
	OnuOpticalInfo *GetOnuPonOpticalInfoResponse `protobuf:"bytes,6,opt,name=onuOpticalInfo,proto3,oneof"`
}

type GetValueResponse_EthBridgePortInfo struct {
	EthBridgePortInfo *GetOnuEthernetBridgePortHistoryResponse `protobuf:"bytes,7,opt,name=ethBridgePortInfo,proto3,oneof"`
}

type GetValueResponse_FecHistory struct {
	FecHistory *GetOnuFecHistoryResponse `protobuf:"bytes,8,opt,name=fecHistory,proto3,oneof"`
}

type GetValueResponse_OnuPonCounters struct {
	OnuPonCounters *GetOnuCountersResponse `protobuf:"bytes,9,opt,name=onuPonCounters,proto3,oneof"`
}

type GetValueResponse_OnuOMCICounters struct {
	OnuOMCICounters *GetOnuOMCICountersResponse `protobuf:"bytes,10,opt,name=onuOMCICounters,proto3,oneof"`
}

func (*GetValueResponse_Distance) isGetValueResponse_Response() {}

func (*GetValueResponse_UniInfo) isGetValueResponse_Response() {}

func (*GetValueResponse_PortCoutners) isGetValueResponse_Response() {}

func (*GetValueResponse_OnuOpticalInfo) isGetValueResponse_Response() {}

func (*GetValueResponse_EthBridgePortInfo) isGetValueResponse_Response() {}

func (*GetValueResponse_FecHistory) isGetValueResponse_Response() {}

func (*GetValueResponse_OnuPonCounters) isGetValueResponse_Response() {}

func (*GetValueResponse_OnuOMCICounters) isGetValueResponse_Response() {}

func (m *GetValueResponse) GetResponse() isGetValueResponse_Response {
	if m != nil {
		return m.Response
	}
	return nil
}

func (m *GetValueResponse) GetDistance() *GetDistanceResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_Distance); ok {
		return x.Distance
	}
	return nil
}

func (m *GetValueResponse) GetUniInfo() *GetOnuUniInfoResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_UniInfo); ok {
		return x.UniInfo
	}
	return nil
}

func (m *GetValueResponse) GetPortCoutners() *GetOltPortCountersResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_PortCoutners); ok {
		return x.PortCoutners
	}
	return nil
}

func (m *GetValueResponse) GetOnuOpticalInfo() *GetOnuPonOpticalInfoResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuOpticalInfo); ok {
		return x.OnuOpticalInfo
	}
	return nil
}

func (m *GetValueResponse) GetEthBridgePortInfo() *GetOnuEthernetBridgePortHistoryResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_EthBridgePortInfo); ok {
		return x.EthBridgePortInfo
	}
	return nil
}

func (m *GetValueResponse) GetFecHistory() *GetOnuFecHistoryResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_FecHistory); ok {
		return x.FecHistory
	}
	return nil
}

func (m *GetValueResponse) GetOnuPonCounters() *GetOnuCountersResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuPonCounters); ok {
		return x.OnuPonCounters
	}
	return nil
}

func (m *GetValueResponse) GetOnuOMCICounters() *GetOnuOMCICountersResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuOMCICounters); ok {
		return x.OnuOMCICounters
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetValueResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetValueResponse_Distance)(nil),
		(*GetValueResponse_UniInfo)(nil),
		(*GetValueResponse_PortCoutners)(nil),
		(*GetValueResponse_OnuOpticalInfo)(nil),
		(*GetValueResponse_EthBridgePortInfo)(nil),
		(*GetValueResponse_FecHistory)(nil),
		(*GetValueResponse_OnuPonCounters)(nil),
		(*GetValueResponse_OnuOMCICounters)(nil),
	}
}

type SetValueRequest struct {
	// Types that are valid to be assigned to Request:
	//	*SetValueRequest_AlarmConfig
	Request              isSetValueRequest_Request `protobuf_oneof:"request"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_SetValueRequest proto.InternalMessageInfo

type isSetValueRequest_Request interface {
	isSetValueRequest_Request()
}

type SetValueRequest_AlarmConfig struct {
	AlarmConfig *config.AlarmConfig `protobuf:"bytes,1,opt,name=alarm_config,json=alarmConfig,proto3,oneof"`
}

func (*SetValueRequest_AlarmConfig) isSetValueRequest_Request() {}

func (m *SetValueRequest) GetRequest() isSetValueRequest_Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *SetValueRequest) GetAlarmConfig() *config.AlarmConfig {
	if x, ok := m.GetRequest().(*SetValueRequest_AlarmConfig); ok {
		return x.AlarmConfig
	}
	return nil
}

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

type SetValueResponse struct {
	Status               SetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.SetValueResponse_Status" json:"status,omitempty"`
	ErrReason            SetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.SetValueResponse_ErrorReason" json:"errReason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_SetValueResponse proto.InternalMessageInfo

func (m *SetValueResponse) GetStatus() SetValueResponse_Status {
	if m != nil {
		return m.Status
	}
	return SetValueResponse_STATUS_UNDEFINED
}

func (m *SetValueResponse) GetErrReason() SetValueResponse_ErrorReason {
	if m != nil {
		return m.ErrReason
	}
	return SetValueResponse_REASON_UNDEFINED
}

type SingleGetValueRequest struct {
	TargetId             string           `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
	Request              *GetValueRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_SingleGetValueRequest proto.InternalMessageInfo

func (m *SingleGetValueRequest) GetTargetId() string {
	if m != nil {
		return m.TargetId
	}
	return ""
}

func (m *SingleGetValueRequest) GetRequest() *GetValueRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

type SingleGetValueResponse struct {
	Response             *GetValueResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_SingleGetValueResponse proto.InternalMessageInfo

func (m *SingleGetValueResponse) GetResponse() *GetValueResponse {
	if m != nil {
		return m.Response
	}
	return nil
}

type SingleSetValueRequest struct {
	TargetId             string           `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
	Request              *SetValueRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_SingleSetValueRequest proto.InternalMessageInfo

func (m *SingleSetValueRequest) GetTargetId() string {
	if m != nil {
		return m.TargetId
	}
	return ""
}

func (m *SingleSetValueRequest) GetRequest() *SetValueRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

type SingleSetValueResponse struct {
	Response             *SetValueResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_SingleSetValueResponse proto.InternalMessageInfo

func (m *SingleSetValueResponse) GetResponse() *SetValueResponse {
	if m != nil {
		return m.Response
	}
	return nil
}

func init() {
	proto.RegisterEnum("extension.GetOnuUniInfoResponse_ConfigurationInd", GetOnuUniInfoResponse_ConfigurationInd_name, GetOnuUniInfoResponse_ConfigurationInd_value)
	proto.RegisterEnum("extension.GetOnuUniInfoResponse_AdministrativeState", GetOnuUniInfoResponse_AdministrativeState_name, GetOnuUniInfoResponse_AdministrativeState_value)
	proto.RegisterEnum("extension.GetOnuUniInfoResponse_OperationalState", GetOnuUniInfoResponse_OperationalState_name, GetOnuUniInfoResponse_OperationalState_value)
	proto.RegisterEnum("extension.GetOltPortCounters_PortType", GetOltPortCounters_PortType_name, GetOltPortCounters_PortType_value)
	proto.RegisterEnum("extension.GetOnuEthernetBridgePortHistory_Direction", GetOnuEthernetBridgePortHistory_Direction_name, GetOnuEthernetBridgePortHistory_Direction_value)
	proto.RegisterEnum("extension.GetValueResponse_Status", GetValueResponse_Status_name, GetValueResponse_Status_value)
	proto.RegisterEnum("extension.GetValueResponse_ErrorReason", GetValueResponse_ErrorReason_name, GetValueResponse_ErrorReason_value)
	proto.RegisterEnum("extension.SetValueResponse_Status", SetValueResponse_Status_name, SetValueResponse_Status_value)
	proto.RegisterEnum("extension.SetValueResponse_ErrorReason", SetValueResponse_ErrorReason_name, SetValueResponse_ErrorReason_value)
	proto.RegisterType((*GetDistanceRequest)(nil), "extension.GetDistanceRequest")
	proto.RegisterType((*GetDistanceResponse)(nil), "extension.GetDistanceResponse")
	proto.RegisterType((*GetOnuUniInfoRequest)(nil), "extension.GetOnuUniInfoRequest")
	proto.RegisterType((*GetOnuUniInfoResponse)(nil), "extension.GetOnuUniInfoResponse")
	proto.RegisterType((*GetOltPortCounters)(nil), "extension.GetOltPortCounters")
	proto.RegisterType((*GetOltPortCountersResponse)(nil), "extension.GetOltPortCountersResponse")
	proto.RegisterType((*GetOnuPonOpticalInfo)(nil), "extension.GetOnuPonOpticalInfo")
	proto.RegisterType((*GetOnuPonOpticalInfoResponse)(nil), "extension.GetOnuPonOpticalInfoResponse")
	proto.RegisterType((*GetOnuEthernetBridgePortHistory)(nil), "extension.GetOnuEthernetBridgePortHistory")
	proto.RegisterType((*GetOnuEthernetBridgePortHistoryResponse)(nil), "extension.GetOnuEthernetBridgePortHistoryResponse")
	proto.RegisterType((*GetOnuFecHistory)(nil), "extension.GetOnuFecHistory")
	proto.RegisterType((*GetOnuFecHistoryResponse)(nil), "extension.GetOnuFecHistoryResponse")
	proto.RegisterType((*GetOnuCountersRequest)(nil), "extension.GetOnuCountersRequest")
	proto.RegisterType((*GetOnuOMCICountersRequest)(nil), "extension.GetOnuOMCICountersRequest")
	proto.RegisterType((*GetOnuCountersResponse)(nil), "extension.GetOnuCountersResponse")
	proto.RegisterType((*GetOnuOMCICountersResponse)(nil), "extension.GetOnuOMCICountersResponse")
	proto.RegisterType((*GetValueRequest)(nil), "extension.GetValueRequest")
	proto.RegisterType((*GetValueResponse)(nil), "extension.GetValueResponse")
	proto.RegisterType((*SetValueRequest)(nil), "extension.SetValueRequest")
	proto.RegisterType((*SetValueResponse)(nil), "extension.SetValueResponse")
	proto.RegisterType((*SingleGetValueRequest)(nil), "extension.SingleGetValueRequest")
	proto.RegisterType((*SingleGetValueResponse)(nil), "extension.SingleGetValueResponse")
	proto.RegisterType((*SingleSetValueRequest)(nil), "extension.SingleSetValueRequest")
	proto.RegisterType((*SingleSetValueResponse)(nil), "extension.SingleSetValueResponse")
}

func init() { proto.RegisterFile("voltha_protos/extensions.proto", fileDescriptor_7ecf6e9799a9202d) }

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

// ExtensionClient is the client API for Extension service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ExtensionClient interface {
	// Get a single attribute
	GetExtValue(ctx context.Context, in *SingleGetValueRequest, opts ...grpc.CallOption) (*SingleGetValueResponse, error)
	// Set a single attribute
	SetExtValue(ctx context.Context, in *SingleSetValueRequest, opts ...grpc.CallOption) (*SingleSetValueResponse, error)
}

type extensionClient struct {
	cc *grpc.ClientConn
}

func NewExtensionClient(cc *grpc.ClientConn) ExtensionClient {
	return &extensionClient{cc}
}

func (c *extensionClient) GetExtValue(ctx context.Context, in *SingleGetValueRequest, opts ...grpc.CallOption) (*SingleGetValueResponse, error) {
	out := new(SingleGetValueResponse)
	err := c.cc.Invoke(ctx, "/extension.Extension/GetExtValue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *extensionClient) SetExtValue(ctx context.Context, in *SingleSetValueRequest, opts ...grpc.CallOption) (*SingleSetValueResponse, error) {
	out := new(SingleSetValueResponse)
	err := c.cc.Invoke(ctx, "/extension.Extension/SetExtValue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ExtensionServer is the server API for Extension service.
type ExtensionServer interface {
	// Get a single attribute
	GetExtValue(context.Context, *SingleGetValueRequest) (*SingleGetValueResponse, error)
	// Set a single attribute
	SetExtValue(context.Context, *SingleSetValueRequest) (*SingleSetValueResponse, error)
}

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

func (*UnimplementedExtensionServer) GetExtValue(ctx context.Context, req *SingleGetValueRequest) (*SingleGetValueResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetExtValue not implemented")
}
func (*UnimplementedExtensionServer) SetExtValue(ctx context.Context, req *SingleSetValueRequest) (*SingleSetValueResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetExtValue not implemented")
}

func RegisterExtensionServer(s *grpc.Server, srv ExtensionServer) {
	s.RegisterService(&_Extension_serviceDesc, srv)
}

func _Extension_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SingleGetValueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ExtensionServer).GetExtValue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/extension.Extension/GetExtValue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ExtensionServer).GetExtValue(ctx, req.(*SingleGetValueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Extension_SetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SingleSetValueRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ExtensionServer).SetExtValue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/extension.Extension/SetExtValue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ExtensionServer).SetExtValue(ctx, req.(*SingleSetValueRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Extension_serviceDesc = grpc.ServiceDesc{
	ServiceName: "extension.Extension",
	HandlerType: (*ExtensionServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetExtValue",
			Handler:    _Extension_GetExtValue_Handler,
		},
		{
			MethodName: "SetExtValue",
			Handler:    _Extension_SetExtValue_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "voltha_protos/extensions.proto",
}
