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

package inter_container // import "github.com/opencord/voltha-protos/go/inter_container"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import any "github.com/golang/protobuf/ptypes/any"
import openflow_13 "github.com/opencord/voltha-protos/go/openflow_13"
import voltha "github.com/opencord/voltha-protos/go/voltha"

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

// LogicalPortId from public import voltha_protos/logical_device.proto
type LogicalPortId = voltha.LogicalPortId

// LogicalPort from public import voltha_protos/logical_device.proto
type LogicalPort = voltha.LogicalPort

// LogicalPorts from public import voltha_protos/logical_device.proto
type LogicalPorts = voltha.LogicalPorts

// LogicalDevice from public import voltha_protos/logical_device.proto
type LogicalDevice = voltha.LogicalDevice

// LogicalDevices from public import voltha_protos/logical_device.proto
type LogicalDevices = voltha.LogicalDevices

type MessageType int32

const (
	MessageType_REQUEST           MessageType = 0
	MessageType_RESPONSE          MessageType = 1
	MessageType_DEVICE_DISCOVERED MessageType = 2
)

var MessageType_name = map[int32]string{
	0: "REQUEST",
	1: "RESPONSE",
	2: "DEVICE_DISCOVERED",
}
var MessageType_value = map[string]int32{
	"REQUEST":           0,
	"RESPONSE":          1,
	"DEVICE_DISCOVERED": 2,
}

func (x MessageType) String() string {
	return proto.EnumName(MessageType_name, int32(x))
}
func (MessageType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{0}
}

type ErrorCodeCodes int32

const (
	ErrorCode_UNSUPPORTED_REQUEST ErrorCodeCodes = 0
	ErrorCode_INVALID_PARAMETERS  ErrorCodeCodes = 1
)

var ErrorCodeCodes_name = map[int32]string{
	0: "UNSUPPORTED_REQUEST",
	1: "INVALID_PARAMETERS",
}
var ErrorCodeCodes_value = map[string]int32{
	"UNSUPPORTED_REQUEST": 0,
	"INVALID_PARAMETERS":  1,
}

func (x ErrorCodeCodes) String() string {
	return proto.EnumName(ErrorCodeCodes_name, int32(x))
}
func (ErrorCodeCodes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{4, 0}
}

type InterAdapterMessageType_Types int32

const (
	InterAdapterMessageType_FLOW_REQUEST     InterAdapterMessageType_Types = 0
	InterAdapterMessageType_FLOW_RESPONSE    InterAdapterMessageType_Types = 1
	InterAdapterMessageType_OMCI_REQUEST     InterAdapterMessageType_Types = 2
	InterAdapterMessageType_OMCI_RESPONSE    InterAdapterMessageType_Types = 3
	InterAdapterMessageType_METRICS_REQUEST  InterAdapterMessageType_Types = 4
	InterAdapterMessageType_METRICS_RESPONSE InterAdapterMessageType_Types = 5
	InterAdapterMessageType_ONU_IND_REQUEST  InterAdapterMessageType_Types = 6
	InterAdapterMessageType_ONU_IND_RESPONSE InterAdapterMessageType_Types = 7
)

var InterAdapterMessageType_Types_name = map[int32]string{
	0: "FLOW_REQUEST",
	1: "FLOW_RESPONSE",
	2: "OMCI_REQUEST",
	3: "OMCI_RESPONSE",
	4: "METRICS_REQUEST",
	5: "METRICS_RESPONSE",
	6: "ONU_IND_REQUEST",
	7: "ONU_IND_RESPONSE",
}
var InterAdapterMessageType_Types_value = map[string]int32{
	"FLOW_REQUEST":     0,
	"FLOW_RESPONSE":    1,
	"OMCI_REQUEST":     2,
	"OMCI_RESPONSE":    3,
	"METRICS_REQUEST":  4,
	"METRICS_RESPONSE": 5,
	"ONU_IND_REQUEST":  6,
	"ONU_IND_RESPONSE": 7,
}

func (x InterAdapterMessageType_Types) String() string {
	return proto.EnumName(InterAdapterMessageType_Types_name, int32(x))
}
func (InterAdapterMessageType_Types) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{14, 0}
}

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

func (m *StrType) Reset()         { *m = StrType{} }
func (m *StrType) String() string { return proto.CompactTextString(m) }
func (*StrType) ProtoMessage()    {}
func (*StrType) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{0}
}
func (m *StrType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_StrType.Unmarshal(m, b)
}
func (m *StrType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_StrType.Marshal(b, m, deterministic)
}
func (dst *StrType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_StrType.Merge(dst, src)
}
func (m *StrType) XXX_Size() int {
	return xxx_messageInfo_StrType.Size(m)
}
func (m *StrType) XXX_DiscardUnknown() {
	xxx_messageInfo_StrType.DiscardUnknown(m)
}

var xxx_messageInfo_StrType proto.InternalMessageInfo

func (m *StrType) GetVal() string {
	if m != nil {
		return m.Val
	}
	return ""
}

type IntType struct {
	Val                  int64    `protobuf:"varint,1,opt,name=val,proto3" json:"val,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *IntType) Reset()         { *m = IntType{} }
func (m *IntType) String() string { return proto.CompactTextString(m) }
func (*IntType) ProtoMessage()    {}
func (*IntType) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{1}
}
func (m *IntType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntType.Unmarshal(m, b)
}
func (m *IntType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntType.Marshal(b, m, deterministic)
}
func (dst *IntType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntType.Merge(dst, src)
}
func (m *IntType) XXX_Size() int {
	return xxx_messageInfo_IntType.Size(m)
}
func (m *IntType) XXX_DiscardUnknown() {
	xxx_messageInfo_IntType.DiscardUnknown(m)
}

var xxx_messageInfo_IntType proto.InternalMessageInfo

func (m *IntType) GetVal() int64 {
	if m != nil {
		return m.Val
	}
	return 0
}

type BoolType struct {
	Val                  bool     `protobuf:"varint,1,opt,name=val,proto3" json:"val,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BoolType) Reset()         { *m = BoolType{} }
func (m *BoolType) String() string { return proto.CompactTextString(m) }
func (*BoolType) ProtoMessage()    {}
func (*BoolType) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{2}
}
func (m *BoolType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BoolType.Unmarshal(m, b)
}
func (m *BoolType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BoolType.Marshal(b, m, deterministic)
}
func (dst *BoolType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BoolType.Merge(dst, src)
}
func (m *BoolType) XXX_Size() int {
	return xxx_messageInfo_BoolType.Size(m)
}
func (m *BoolType) XXX_DiscardUnknown() {
	xxx_messageInfo_BoolType.DiscardUnknown(m)
}

var xxx_messageInfo_BoolType proto.InternalMessageInfo

func (m *BoolType) GetVal() bool {
	if m != nil {
		return m.Val
	}
	return false
}

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

func (m *Packet) Reset()         { *m = Packet{} }
func (m *Packet) String() string { return proto.CompactTextString(m) }
func (*Packet) ProtoMessage()    {}
func (*Packet) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{3}
}
func (m *Packet) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Packet.Unmarshal(m, b)
}
func (m *Packet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Packet.Marshal(b, m, deterministic)
}
func (dst *Packet) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Packet.Merge(dst, src)
}
func (m *Packet) XXX_Size() int {
	return xxx_messageInfo_Packet.Size(m)
}
func (m *Packet) XXX_DiscardUnknown() {
	xxx_messageInfo_Packet.DiscardUnknown(m)
}

var xxx_messageInfo_Packet proto.InternalMessageInfo

func (m *Packet) GetPayload() []byte {
	if m != nil {
		return m.Payload
	}
	return nil
}

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

func (m *ErrorCode) Reset()         { *m = ErrorCode{} }
func (m *ErrorCode) String() string { return proto.CompactTextString(m) }
func (*ErrorCode) ProtoMessage()    {}
func (*ErrorCode) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{4}
}
func (m *ErrorCode) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ErrorCode.Unmarshal(m, b)
}
func (m *ErrorCode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ErrorCode.Marshal(b, m, deterministic)
}
func (dst *ErrorCode) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ErrorCode.Merge(dst, src)
}
func (m *ErrorCode) XXX_Size() int {
	return xxx_messageInfo_ErrorCode.Size(m)
}
func (m *ErrorCode) XXX_DiscardUnknown() {
	xxx_messageInfo_ErrorCode.DiscardUnknown(m)
}

var xxx_messageInfo_ErrorCode proto.InternalMessageInfo

type Error struct {
	Code                 *ErrorCode `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
	Reason               string     `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Error) Reset()         { *m = Error{} }
func (m *Error) String() string { return proto.CompactTextString(m) }
func (*Error) ProtoMessage()    {}
func (*Error) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{5}
}
func (m *Error) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Error.Unmarshal(m, b)
}
func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Error.Marshal(b, m, deterministic)
}
func (dst *Error) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Error.Merge(dst, src)
}
func (m *Error) XXX_Size() int {
	return xxx_messageInfo_Error.Size(m)
}
func (m *Error) XXX_DiscardUnknown() {
	xxx_messageInfo_Error.DiscardUnknown(m)
}

var xxx_messageInfo_Error proto.InternalMessageInfo

func (m *Error) GetCode() *ErrorCode {
	if m != nil {
		return m.Code
	}
	return nil
}

func (m *Error) GetReason() string {
	if m != nil {
		return m.Reason
	}
	return ""
}

type Header struct {
	Id                   string      `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Type                 MessageType `protobuf:"varint,2,opt,name=type,proto3,enum=voltha.MessageType" json:"type,omitempty"`
	FromTopic            string      `protobuf:"bytes,3,opt,name=from_topic,json=fromTopic,proto3" json:"from_topic,omitempty"`
	ToTopic              string      `protobuf:"bytes,4,opt,name=to_topic,json=toTopic,proto3" json:"to_topic,omitempty"`
	KeyTopic             string      `protobuf:"bytes,5,opt,name=key_topic,json=keyTopic,proto3" json:"key_topic,omitempty"`
	Timestamp            int64       `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Header) Reset()         { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage()    {}
func (*Header) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{6}
}
func (m *Header) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Header.Unmarshal(m, b)
}
func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Header.Marshal(b, m, deterministic)
}
func (dst *Header) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Header.Merge(dst, src)
}
func (m *Header) XXX_Size() int {
	return xxx_messageInfo_Header.Size(m)
}
func (m *Header) XXX_DiscardUnknown() {
	xxx_messageInfo_Header.DiscardUnknown(m)
}

var xxx_messageInfo_Header proto.InternalMessageInfo

func (m *Header) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *Header) GetType() MessageType {
	if m != nil {
		return m.Type
	}
	return MessageType_REQUEST
}

func (m *Header) GetFromTopic() string {
	if m != nil {
		return m.FromTopic
	}
	return ""
}

func (m *Header) GetToTopic() string {
	if m != nil {
		return m.ToTopic
	}
	return ""
}

func (m *Header) GetKeyTopic() string {
	if m != nil {
		return m.KeyTopic
	}
	return ""
}

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

type Argument struct {
	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value                *any.Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Argument) Reset()         { *m = Argument{} }
func (m *Argument) String() string { return proto.CompactTextString(m) }
func (*Argument) ProtoMessage()    {}
func (*Argument) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{7}
}
func (m *Argument) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Argument.Unmarshal(m, b)
}
func (m *Argument) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Argument.Marshal(b, m, deterministic)
}
func (dst *Argument) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Argument.Merge(dst, src)
}
func (m *Argument) XXX_Size() int {
	return xxx_messageInfo_Argument.Size(m)
}
func (m *Argument) XXX_DiscardUnknown() {
	xxx_messageInfo_Argument.DiscardUnknown(m)
}

var xxx_messageInfo_Argument proto.InternalMessageInfo

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

func (m *Argument) GetValue() *any.Any {
	if m != nil {
		return m.Value
	}
	return nil
}

type InterContainerMessage struct {
	Header               *Header  `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
	Body                 *any.Any `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterContainerMessage) Reset()         { *m = InterContainerMessage{} }
func (m *InterContainerMessage) String() string { return proto.CompactTextString(m) }
func (*InterContainerMessage) ProtoMessage()    {}
func (*InterContainerMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{8}
}
func (m *InterContainerMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterContainerMessage.Unmarshal(m, b)
}
func (m *InterContainerMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterContainerMessage.Marshal(b, m, deterministic)
}
func (dst *InterContainerMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterContainerMessage.Merge(dst, src)
}
func (m *InterContainerMessage) XXX_Size() int {
	return xxx_messageInfo_InterContainerMessage.Size(m)
}
func (m *InterContainerMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterContainerMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterContainerMessage proto.InternalMessageInfo

func (m *InterContainerMessage) GetHeader() *Header {
	if m != nil {
		return m.Header
	}
	return nil
}

func (m *InterContainerMessage) GetBody() *any.Any {
	if m != nil {
		return m.Body
	}
	return nil
}

type InterContainerRequestBody struct {
	Rpc                  string      `protobuf:"bytes,2,opt,name=rpc,proto3" json:"rpc,omitempty"`
	Args                 []*Argument `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"`
	ResponseRequired     bool        `protobuf:"varint,4,opt,name=response_required,json=responseRequired,proto3" json:"response_required,omitempty"`
	ReplyToTopic         string      `protobuf:"bytes,5,opt,name=reply_to_topic,json=replyToTopic,proto3" json:"reply_to_topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *InterContainerRequestBody) Reset()         { *m = InterContainerRequestBody{} }
func (m *InterContainerRequestBody) String() string { return proto.CompactTextString(m) }
func (*InterContainerRequestBody) ProtoMessage()    {}
func (*InterContainerRequestBody) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{9}
}
func (m *InterContainerRequestBody) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterContainerRequestBody.Unmarshal(m, b)
}
func (m *InterContainerRequestBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterContainerRequestBody.Marshal(b, m, deterministic)
}
func (dst *InterContainerRequestBody) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterContainerRequestBody.Merge(dst, src)
}
func (m *InterContainerRequestBody) XXX_Size() int {
	return xxx_messageInfo_InterContainerRequestBody.Size(m)
}
func (m *InterContainerRequestBody) XXX_DiscardUnknown() {
	xxx_messageInfo_InterContainerRequestBody.DiscardUnknown(m)
}

var xxx_messageInfo_InterContainerRequestBody proto.InternalMessageInfo

func (m *InterContainerRequestBody) GetRpc() string {
	if m != nil {
		return m.Rpc
	}
	return ""
}

func (m *InterContainerRequestBody) GetArgs() []*Argument {
	if m != nil {
		return m.Args
	}
	return nil
}

func (m *InterContainerRequestBody) GetResponseRequired() bool {
	if m != nil {
		return m.ResponseRequired
	}
	return false
}

func (m *InterContainerRequestBody) GetReplyToTopic() string {
	if m != nil {
		return m.ReplyToTopic
	}
	return ""
}

type InterContainerResponseBody struct {
	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	Result               *any.Any `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InterContainerResponseBody) Reset()         { *m = InterContainerResponseBody{} }
func (m *InterContainerResponseBody) String() string { return proto.CompactTextString(m) }
func (*InterContainerResponseBody) ProtoMessage()    {}
func (*InterContainerResponseBody) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{10}
}
func (m *InterContainerResponseBody) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterContainerResponseBody.Unmarshal(m, b)
}
func (m *InterContainerResponseBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterContainerResponseBody.Marshal(b, m, deterministic)
}
func (dst *InterContainerResponseBody) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterContainerResponseBody.Merge(dst, src)
}
func (m *InterContainerResponseBody) XXX_Size() int {
	return xxx_messageInfo_InterContainerResponseBody.Size(m)
}
func (m *InterContainerResponseBody) XXX_DiscardUnknown() {
	xxx_messageInfo_InterContainerResponseBody.DiscardUnknown(m)
}

var xxx_messageInfo_InterContainerResponseBody proto.InternalMessageInfo

func (m *InterContainerResponseBody) GetSuccess() bool {
	if m != nil {
		return m.Success
	}
	return false
}

func (m *InterContainerResponseBody) GetResult() *any.Any {
	if m != nil {
		return m.Result
	}
	return nil
}

type SwitchCapability struct {
	Desc                 *openflow_13.OfpDesc           `protobuf:"bytes,1,opt,name=desc,proto3" json:"desc,omitempty"`
	SwitchFeatures       *openflow_13.OfpSwitchFeatures `protobuf:"bytes,2,opt,name=switch_features,json=switchFeatures,proto3" json:"switch_features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

func (m *SwitchCapability) Reset()         { *m = SwitchCapability{} }
func (m *SwitchCapability) String() string { return proto.CompactTextString(m) }
func (*SwitchCapability) ProtoMessage()    {}
func (*SwitchCapability) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{11}
}
func (m *SwitchCapability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SwitchCapability.Unmarshal(m, b)
}
func (m *SwitchCapability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SwitchCapability.Marshal(b, m, deterministic)
}
func (dst *SwitchCapability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SwitchCapability.Merge(dst, src)
}
func (m *SwitchCapability) XXX_Size() int {
	return xxx_messageInfo_SwitchCapability.Size(m)
}
func (m *SwitchCapability) XXX_DiscardUnknown() {
	xxx_messageInfo_SwitchCapability.DiscardUnknown(m)
}

var xxx_messageInfo_SwitchCapability proto.InternalMessageInfo

func (m *SwitchCapability) GetDesc() *openflow_13.OfpDesc {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *SwitchCapability) GetSwitchFeatures() *openflow_13.OfpSwitchFeatures {
	if m != nil {
		return m.SwitchFeatures
	}
	return nil
}

type PortCapability struct {
	Port                 *voltha.LogicalPort `protobuf:"bytes,1,opt,name=port,proto3" json:"port,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *PortCapability) Reset()         { *m = PortCapability{} }
func (m *PortCapability) String() string { return proto.CompactTextString(m) }
func (*PortCapability) ProtoMessage()    {}
func (*PortCapability) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{12}
}
func (m *PortCapability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PortCapability.Unmarshal(m, b)
}
func (m *PortCapability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PortCapability.Marshal(b, m, deterministic)
}
func (dst *PortCapability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PortCapability.Merge(dst, src)
}
func (m *PortCapability) XXX_Size() int {
	return xxx_messageInfo_PortCapability.Size(m)
}
func (m *PortCapability) XXX_DiscardUnknown() {
	xxx_messageInfo_PortCapability.DiscardUnknown(m)
}

var xxx_messageInfo_PortCapability proto.InternalMessageInfo

func (m *PortCapability) GetPort() *voltha.LogicalPort {
	if m != nil {
		return m.Port
	}
	return nil
}

type DeviceDiscovered struct {
	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	ParentId             string   `protobuf:"bytes,2,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"`
	DeviceType           string   `protobuf:"bytes,3,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"`
	Publisher            string   `protobuf:"bytes,4,opt,name=publisher,proto3" json:"publisher,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeviceDiscovered) Reset()         { *m = DeviceDiscovered{} }
func (m *DeviceDiscovered) String() string { return proto.CompactTextString(m) }
func (*DeviceDiscovered) ProtoMessage()    {}
func (*DeviceDiscovered) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{13}
}
func (m *DeviceDiscovered) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeviceDiscovered.Unmarshal(m, b)
}
func (m *DeviceDiscovered) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeviceDiscovered.Marshal(b, m, deterministic)
}
func (dst *DeviceDiscovered) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeviceDiscovered.Merge(dst, src)
}
func (m *DeviceDiscovered) XXX_Size() int {
	return xxx_messageInfo_DeviceDiscovered.Size(m)
}
func (m *DeviceDiscovered) XXX_DiscardUnknown() {
	xxx_messageInfo_DeviceDiscovered.DiscardUnknown(m)
}

var xxx_messageInfo_DeviceDiscovered proto.InternalMessageInfo

func (m *DeviceDiscovered) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *DeviceDiscovered) GetParentId() string {
	if m != nil {
		return m.ParentId
	}
	return ""
}

func (m *DeviceDiscovered) GetDeviceType() string {
	if m != nil {
		return m.DeviceType
	}
	return ""
}

func (m *DeviceDiscovered) GetPublisher() string {
	if m != nil {
		return m.Publisher
	}
	return ""
}

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

func (m *InterAdapterMessageType) Reset()         { *m = InterAdapterMessageType{} }
func (m *InterAdapterMessageType) String() string { return proto.CompactTextString(m) }
func (*InterAdapterMessageType) ProtoMessage()    {}
func (*InterAdapterMessageType) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{14}
}
func (m *InterAdapterMessageType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterMessageType.Unmarshal(m, b)
}
func (m *InterAdapterMessageType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterMessageType.Marshal(b, m, deterministic)
}
func (dst *InterAdapterMessageType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterMessageType.Merge(dst, src)
}
func (m *InterAdapterMessageType) XXX_Size() int {
	return xxx_messageInfo_InterAdapterMessageType.Size(m)
}
func (m *InterAdapterMessageType) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterMessageType.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterMessageType proto.InternalMessageInfo

type InterAdapterHeader struct {
	Id                   string                        `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Type                 InterAdapterMessageType_Types `protobuf:"varint,2,opt,name=type,proto3,enum=voltha.InterAdapterMessageType_Types" json:"type,omitempty"`
	FromTopic            string                        `protobuf:"bytes,3,opt,name=from_topic,json=fromTopic,proto3" json:"from_topic,omitempty"`
	ToTopic              string                        `protobuf:"bytes,4,opt,name=to_topic,json=toTopic,proto3" json:"to_topic,omitempty"`
	ToDeviceId           string                        `protobuf:"bytes,5,opt,name=to_device_id,json=toDeviceId,proto3" json:"to_device_id,omitempty"`
	ProxyDeviceId        string                        `protobuf:"bytes,6,opt,name=proxy_device_id,json=proxyDeviceId,proto3" json:"proxy_device_id,omitempty"`
	Timestamp            int64                         `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *InterAdapterHeader) Reset()         { *m = InterAdapterHeader{} }
func (m *InterAdapterHeader) String() string { return proto.CompactTextString(m) }
func (*InterAdapterHeader) ProtoMessage()    {}
func (*InterAdapterHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{15}
}
func (m *InterAdapterHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterHeader.Unmarshal(m, b)
}
func (m *InterAdapterHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterHeader.Marshal(b, m, deterministic)
}
func (dst *InterAdapterHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterHeader.Merge(dst, src)
}
func (m *InterAdapterHeader) XXX_Size() int {
	return xxx_messageInfo_InterAdapterHeader.Size(m)
}
func (m *InterAdapterHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterHeader.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterHeader proto.InternalMessageInfo

func (m *InterAdapterHeader) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *InterAdapterHeader) GetType() InterAdapterMessageType_Types {
	if m != nil {
		return m.Type
	}
	return InterAdapterMessageType_FLOW_REQUEST
}

func (m *InterAdapterHeader) GetFromTopic() string {
	if m != nil {
		return m.FromTopic
	}
	return ""
}

func (m *InterAdapterHeader) GetToTopic() string {
	if m != nil {
		return m.ToTopic
	}
	return ""
}

func (m *InterAdapterHeader) GetToDeviceId() string {
	if m != nil {
		return m.ToDeviceId
	}
	return ""
}

func (m *InterAdapterHeader) GetProxyDeviceId() string {
	if m != nil {
		return m.ProxyDeviceId
	}
	return ""
}

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

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

func (m *InterAdapterOmciMessage) Reset()         { *m = InterAdapterOmciMessage{} }
func (m *InterAdapterOmciMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterOmciMessage) ProtoMessage()    {}
func (*InterAdapterOmciMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{16}
}
func (m *InterAdapterOmciMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterOmciMessage.Unmarshal(m, b)
}
func (m *InterAdapterOmciMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterOmciMessage.Marshal(b, m, deterministic)
}
func (dst *InterAdapterOmciMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterOmciMessage.Merge(dst, src)
}
func (m *InterAdapterOmciMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterOmciMessage.Size(m)
}
func (m *InterAdapterOmciMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterOmciMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterOmciMessage proto.InternalMessageInfo

func (m *InterAdapterOmciMessage) GetMessage() []byte {
	if m != nil {
		return m.Message
	}
	return nil
}

type InterAdapterResponseBody struct {
	Status bool `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
	// Types that are valid to be assigned to Payload:
	//	*InterAdapterResponseBody_Body
	//	*InterAdapterResponseBody_Omci
	Payload              isInterAdapterResponseBody_Payload `protobuf_oneof:"payload"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

func (m *InterAdapterResponseBody) Reset()         { *m = InterAdapterResponseBody{} }
func (m *InterAdapterResponseBody) String() string { return proto.CompactTextString(m) }
func (*InterAdapterResponseBody) ProtoMessage()    {}
func (*InterAdapterResponseBody) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{17}
}
func (m *InterAdapterResponseBody) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterResponseBody.Unmarshal(m, b)
}
func (m *InterAdapterResponseBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterResponseBody.Marshal(b, m, deterministic)
}
func (dst *InterAdapterResponseBody) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterResponseBody.Merge(dst, src)
}
func (m *InterAdapterResponseBody) XXX_Size() int {
	return xxx_messageInfo_InterAdapterResponseBody.Size(m)
}
func (m *InterAdapterResponseBody) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterResponseBody.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterResponseBody proto.InternalMessageInfo

func (m *InterAdapterResponseBody) GetStatus() bool {
	if m != nil {
		return m.Status
	}
	return false
}

type isInterAdapterResponseBody_Payload interface {
	isInterAdapterResponseBody_Payload()
}

type InterAdapterResponseBody_Body struct {
	Body *any.Any `protobuf:"bytes,2,opt,name=body,proto3,oneof"`
}

type InterAdapterResponseBody_Omci struct {
	Omci *InterAdapterOmciMessage `protobuf:"bytes,3,opt,name=omci,proto3,oneof"`
}

func (*InterAdapterResponseBody_Body) isInterAdapterResponseBody_Payload() {}

func (*InterAdapterResponseBody_Omci) isInterAdapterResponseBody_Payload() {}

func (m *InterAdapterResponseBody) GetPayload() isInterAdapterResponseBody_Payload {
	if m != nil {
		return m.Payload
	}
	return nil
}

func (m *InterAdapterResponseBody) GetBody() *any.Any {
	if x, ok := m.GetPayload().(*InterAdapterResponseBody_Body); ok {
		return x.Body
	}
	return nil
}

func (m *InterAdapterResponseBody) GetOmci() *InterAdapterOmciMessage {
	if x, ok := m.GetPayload().(*InterAdapterResponseBody_Omci); ok {
		return x.Omci
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*InterAdapterResponseBody) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _InterAdapterResponseBody_OneofMarshaler, _InterAdapterResponseBody_OneofUnmarshaler, _InterAdapterResponseBody_OneofSizer, []interface{}{
		(*InterAdapterResponseBody_Body)(nil),
		(*InterAdapterResponseBody_Omci)(nil),
	}
}

func _InterAdapterResponseBody_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*InterAdapterResponseBody)
	// payload
	switch x := m.Payload.(type) {
	case *InterAdapterResponseBody_Body:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Body); err != nil {
			return err
		}
	case *InterAdapterResponseBody_Omci:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Omci); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("InterAdapterResponseBody.Payload has unexpected type %T", x)
	}
	return nil
}

func _InterAdapterResponseBody_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*InterAdapterResponseBody)
	switch tag {
	case 2: // payload.body
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(any.Any)
		err := b.DecodeMessage(msg)
		m.Payload = &InterAdapterResponseBody_Body{msg}
		return true, err
	case 3: // payload.omci
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(InterAdapterOmciMessage)
		err := b.DecodeMessage(msg)
		m.Payload = &InterAdapterResponseBody_Omci{msg}
		return true, err
	default:
		return false, nil
	}
}

func _InterAdapterResponseBody_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*InterAdapterResponseBody)
	// payload
	switch x := m.Payload.(type) {
	case *InterAdapterResponseBody_Body:
		s := proto.Size(x.Body)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *InterAdapterResponseBody_Omci:
		s := proto.Size(x.Omci)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type InterAdapterMessage struct {
	Header               *InterAdapterHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
	Body                 *any.Any            `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *InterAdapterMessage) Reset()         { *m = InterAdapterMessage{} }
func (m *InterAdapterMessage) String() string { return proto.CompactTextString(m) }
func (*InterAdapterMessage) ProtoMessage()    {}
func (*InterAdapterMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_inter_container_07f83a25f58b3d1d, []int{18}
}
func (m *InterAdapterMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_InterAdapterMessage.Unmarshal(m, b)
}
func (m *InterAdapterMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_InterAdapterMessage.Marshal(b, m, deterministic)
}
func (dst *InterAdapterMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_InterAdapterMessage.Merge(dst, src)
}
func (m *InterAdapterMessage) XXX_Size() int {
	return xxx_messageInfo_InterAdapterMessage.Size(m)
}
func (m *InterAdapterMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_InterAdapterMessage.DiscardUnknown(m)
}

var xxx_messageInfo_InterAdapterMessage proto.InternalMessageInfo

func (m *InterAdapterMessage) GetHeader() *InterAdapterHeader {
	if m != nil {
		return m.Header
	}
	return nil
}

func (m *InterAdapterMessage) GetBody() *any.Any {
	if m != nil {
		return m.Body
	}
	return nil
}

func init() {
	proto.RegisterType((*StrType)(nil), "voltha.StrType")
	proto.RegisterType((*IntType)(nil), "voltha.IntType")
	proto.RegisterType((*BoolType)(nil), "voltha.BoolType")
	proto.RegisterType((*Packet)(nil), "voltha.Packet")
	proto.RegisterType((*ErrorCode)(nil), "voltha.ErrorCode")
	proto.RegisterType((*Error)(nil), "voltha.Error")
	proto.RegisterType((*Header)(nil), "voltha.Header")
	proto.RegisterType((*Argument)(nil), "voltha.Argument")
	proto.RegisterType((*InterContainerMessage)(nil), "voltha.InterContainerMessage")
	proto.RegisterType((*InterContainerRequestBody)(nil), "voltha.InterContainerRequestBody")
	proto.RegisterType((*InterContainerResponseBody)(nil), "voltha.InterContainerResponseBody")
	proto.RegisterType((*SwitchCapability)(nil), "voltha.SwitchCapability")
	proto.RegisterType((*PortCapability)(nil), "voltha.PortCapability")
	proto.RegisterType((*DeviceDiscovered)(nil), "voltha.DeviceDiscovered")
	proto.RegisterType((*InterAdapterMessageType)(nil), "voltha.InterAdapterMessageType")
	proto.RegisterType((*InterAdapterHeader)(nil), "voltha.InterAdapterHeader")
	proto.RegisterType((*InterAdapterOmciMessage)(nil), "voltha.InterAdapterOmciMessage")
	proto.RegisterType((*InterAdapterResponseBody)(nil), "voltha.InterAdapterResponseBody")
	proto.RegisterType((*InterAdapterMessage)(nil), "voltha.InterAdapterMessage")
	proto.RegisterEnum("voltha.MessageType", MessageType_name, MessageType_value)
	proto.RegisterEnum("voltha.ErrorCodeCodes", ErrorCodeCodes_name, ErrorCodeCodes_value)
	proto.RegisterEnum("voltha.InterAdapterMessageType_Types", InterAdapterMessageType_Types_name, InterAdapterMessageType_Types_value)
}

func init() {
	proto.RegisterFile("voltha_protos/inter_container.proto", fileDescriptor_inter_container_07f83a25f58b3d1d)
}

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