// 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/v5/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 GetOmciEthernetFrameExtendedPmResponse_Format int32

const (
	GetOmciEthernetFrameExtendedPmResponse_THIRTY_TWO_BIT GetOmciEthernetFrameExtendedPmResponse_Format = 0
	GetOmciEthernetFrameExtendedPmResponse_SIXTY_FOUR_BIT GetOmciEthernetFrameExtendedPmResponse_Format = 1
)

var GetOmciEthernetFrameExtendedPmResponse_Format_name = map[int32]string{
	0: "THIRTY_TWO_BIT",
	1: "SIXTY_FOUR_BIT",
}

var GetOmciEthernetFrameExtendedPmResponse_Format_value = map[string]int32{
	"THIRTY_TWO_BIT": 0,
	"SIXTY_FOUR_BIT": 1,
}

func (x GetOmciEthernetFrameExtendedPmResponse_Format) String() string {
	return proto.EnumName(GetOmciEthernetFrameExtendedPmResponse_Format_name, int32(x))
}

func (GetOmciEthernetFrameExtendedPmResponse_Format) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ecf6e9799a9202d, []int{17, 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{20, 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{20, 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{22, 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{22, 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 GetOmciEthernetFrameExtendedPmRequest struct {
	OnuDeviceId string `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
	// Types that are valid to be assigned to IsUniIndex:
	//	*GetOmciEthernetFrameExtendedPmRequest_UniIndex
	IsUniIndex           isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex `protobuf_oneof:"is_uni_index"`
	Reset_               bool                                               `protobuf:"varint,3,opt,name=reset,proto3" json:"reset,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
	XXX_unrecognized     []byte                                             `json:"-"`
	XXX_sizecache        int32                                              `json:"-"`
}

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

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

var xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest proto.InternalMessageInfo

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

type isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex interface {
	isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex()
}

type GetOmciEthernetFrameExtendedPmRequest_UniIndex struct {
	UniIndex uint32 `protobuf:"varint,2,opt,name=uniIndex,proto3,oneof"`
}

func (*GetOmciEthernetFrameExtendedPmRequest_UniIndex) isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex() {
}

func (m *GetOmciEthernetFrameExtendedPmRequest) GetIsUniIndex() isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex {
	if m != nil {
		return m.IsUniIndex
	}
	return nil
}

func (m *GetOmciEthernetFrameExtendedPmRequest) GetUniIndex() uint32 {
	if x, ok := m.GetIsUniIndex().(*GetOmciEthernetFrameExtendedPmRequest_UniIndex); ok {
		return x.UniIndex
	}
	return 0
}

func (m *GetOmciEthernetFrameExtendedPmRequest) GetReset_() bool {
	if m != nil {
		return m.Reset_
	}
	return false
}

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

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 OmciEthernetFrameExtendedPm struct {
	DropEvents               uint64   `protobuf:"fixed64,1,opt,name=drop_events,json=dropEvents,proto3" json:"drop_events,omitempty"`
	Octets                   uint64   `protobuf:"fixed64,2,opt,name=octets,proto3" json:"octets,omitempty"`
	Frames                   uint64   `protobuf:"fixed64,3,opt,name=frames,proto3" json:"frames,omitempty"`
	BroadcastFrames          uint64   `protobuf:"fixed64,4,opt,name=broadcast_frames,json=broadcastFrames,proto3" json:"broadcast_frames,omitempty"`
	MulticastFrames          uint64   `protobuf:"fixed64,5,opt,name=multicast_frames,json=multicastFrames,proto3" json:"multicast_frames,omitempty"`
	CrcErroredFrames         uint64   `protobuf:"fixed64,6,opt,name=crc_errored_frames,json=crcErroredFrames,proto3" json:"crc_errored_frames,omitempty"`
	UndersizeFrames          uint64   `protobuf:"fixed64,7,opt,name=undersize_frames,json=undersizeFrames,proto3" json:"undersize_frames,omitempty"`
	OversizeFrames           uint64   `protobuf:"fixed64,8,opt,name=oversize_frames,json=oversizeFrames,proto3" json:"oversize_frames,omitempty"`
	Frames_64Octets          uint64   `protobuf:"fixed64,9,opt,name=frames_64_octets,json=frames64Octets,proto3" json:"frames_64_octets,omitempty"`
	Frames_65To_127Octets    uint64   `protobuf:"fixed64,10,opt,name=frames_65_to_127_octets,json=frames65To127Octets,proto3" json:"frames_65_to_127_octets,omitempty"`
	Frames_128To_255Octets   uint64   `protobuf:"fixed64,11,opt,name=frames_128_to_255_octets,json=frames128To255Octets,proto3" json:"frames_128_to_255_octets,omitempty"`
	Frames_256To_511Octets   uint64   `protobuf:"fixed64,12,opt,name=frames_256_to_511_octets,json=frames256To511Octets,proto3" json:"frames_256_to_511_octets,omitempty"`
	Frames_512To_1023Octets  uint64   `protobuf:"fixed64,13,opt,name=frames_512_to_1023_octets,json=frames512To1023Octets,proto3" json:"frames_512_to_1023_octets,omitempty"`
	Frames_1024To_1518Octets uint64   `protobuf:"fixed64,14,opt,name=frames_1024_to_1518_octets,json=frames1024To1518Octets,proto3" json:"frames_1024_to_1518_octets,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_OmciEthernetFrameExtendedPm proto.InternalMessageInfo

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

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

func (m *OmciEthernetFrameExtendedPm) GetFrames() uint64 {
	if m != nil {
		return m.Frames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetBroadcastFrames() uint64 {
	if m != nil {
		return m.BroadcastFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetMulticastFrames() uint64 {
	if m != nil {
		return m.MulticastFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetCrcErroredFrames() uint64 {
	if m != nil {
		return m.CrcErroredFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetUndersizeFrames() uint64 {
	if m != nil {
		return m.UndersizeFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetOversizeFrames() uint64 {
	if m != nil {
		return m.OversizeFrames
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_64Octets() uint64 {
	if m != nil {
		return m.Frames_64Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_65To_127Octets() uint64 {
	if m != nil {
		return m.Frames_65To_127Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_128To_255Octets() uint64 {
	if m != nil {
		return m.Frames_128To_255Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_256To_511Octets() uint64 {
	if m != nil {
		return m.Frames_256To_511Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_512To_1023Octets() uint64 {
	if m != nil {
		return m.Frames_512To_1023Octets
	}
	return 0
}

func (m *OmciEthernetFrameExtendedPm) GetFrames_1024To_1518Octets() uint64 {
	if m != nil {
		return m.Frames_1024To_1518Octets
	}
	return 0
}

type GetOmciEthernetFrameExtendedPmResponse struct {
	Upstream                          *OmciEthernetFrameExtendedPm                  `protobuf:"bytes,1,opt,name=upstream,proto3" json:"upstream,omitempty"`
	Downstream                        *OmciEthernetFrameExtendedPm                  `protobuf:"bytes,2,opt,name=downstream,proto3" json:"downstream,omitempty"`
	OmciEthernetFrameExtendedPmFormat GetOmciEthernetFrameExtendedPmResponse_Format `protobuf:"varint,3,opt,name=omci_ethernet_frame_extended_pm_format,json=omciEthernetFrameExtendedPmFormat,proto3,enum=extension.GetOmciEthernetFrameExtendedPmResponse_Format" json:"omci_ethernet_frame_extended_pm_format,omitempty"`
	XXX_NoUnkeyedLiteral              struct{}                                      `json:"-"`
	XXX_unrecognized                  []byte                                        `json:"-"`
	XXX_sizecache                     int32                                         `json:"-"`
}

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

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

var xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse proto.InternalMessageInfo

func (m *GetOmciEthernetFrameExtendedPmResponse) GetUpstream() *OmciEthernetFrameExtendedPm {
	if m != nil {
		return m.Upstream
	}
	return nil
}

func (m *GetOmciEthernetFrameExtendedPmResponse) GetDownstream() *OmciEthernetFrameExtendedPm {
	if m != nil {
		return m.Downstream
	}
	return nil
}

func (m *GetOmciEthernetFrameExtendedPmResponse) GetOmciEthernetFrameExtendedPmFormat() GetOmciEthernetFrameExtendedPmResponse_Format {
	if m != nil {
		return m.OmciEthernetFrameExtendedPmFormat
	}
	return GetOmciEthernetFrameExtendedPmResponse_THIRTY_TWO_BIT
}

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

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

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 *GetOmciEthernetFrameExtendedPmRequest `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() *GetOmciEthernetFrameExtendedPmRequest {
	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_OnuCounters
	//	*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{20}
}

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_OnuCounters struct {
	OnuCounters *GetOmciEthernetFrameExtendedPmResponse `protobuf:"bytes,10,opt,name=onuCounters,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_OnuCounters) 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) GetOnuCounters() *GetOmciEthernetFrameExtendedPmResponse {
	if x, ok := m.GetResponse().(*GetValueResponse_OnuCounters); ok {
		return x.OnuCounters
	}
	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_OnuCounters)(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{21}
}

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

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

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

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

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

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