// 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{19, 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{19, 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{21, 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{21, 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 GetRxPowerRequest 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 *GetRxPowerRequest) Reset()         { *m = GetRxPowerRequest{} }
func (m *GetRxPowerRequest) String() string { return proto.CompactTextString(m) }
func (*GetRxPowerRequest) ProtoMessage()    {}
func (*GetRxPowerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{14}
}

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

var xxx_messageInfo_GetRxPowerRequest proto.InternalMessageInfo

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

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

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{15}
}

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{16}
}

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 GetRxPowerResponse struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	FailReason           string   `protobuf:"bytes,4,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
	RxPower              float64  `protobuf:"fixed64,5,opt,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetRxPowerResponse proto.InternalMessageInfo

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

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

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

func (m *GetRxPowerResponse) GetFailReason() string {
	if m != nil {
		return m.FailReason
	}
	return ""
}

func (m *GetRxPowerResponse) GetRxPower() float64 {
	if m != nil {
		return m.RxPower
	}
	return 0
}

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
	//	*GetValueRequest_RxPower
	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{18}
}

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"`
}

type GetValueRequest_RxPower struct {
	RxPower *GetRxPowerRequest `protobuf:"bytes,9,opt,name=rxPower,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 (*GetValueRequest_RxPower) 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
}

func (m *GetValueRequest) GetRxPower() *GetRxPowerRequest {
	if x, ok := m.GetRequest().(*GetValueRequest_RxPower); ok {
		return x.RxPower
	}
	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),
		(*GetValueRequest_RxPower)(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
	//	*GetValueResponse_RxPower
	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{19}
}

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"`
}

type GetValueResponse_RxPower struct {
	RxPower *GetRxPowerResponse `protobuf:"bytes,11,opt,name=rxPower,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 (*GetValueResponse_RxPower) 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
}

func (m *GetValueResponse) GetRxPower() *GetRxPowerResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_RxPower); ok {
		return x.RxPower
	}
	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),
		(*GetValueResponse_RxPower)(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{20}
}

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{21}
}

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{22}
}

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{23}
}

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{24}
}

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{25}
}

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