// Code generated by protoc-gen-go. DO NOT EDIT.
// source: grpc/channelz/v1/channelz.proto

package grpc_channelz_v1 // import "google.golang.org/grpc/channelz/grpc_channelz_v1"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import any "github.com/golang/protobuf/ptypes/any"
import duration "github.com/golang/protobuf/ptypes/duration"
import timestamp "github.com/golang/protobuf/ptypes/timestamp"
import wrappers "github.com/golang/protobuf/ptypes/wrappers"

import (
	context "golang.org/x/net/context"
	grpc "google.golang.org/grpc"
)

// 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

type ChannelConnectivityState_State int32

const (
	ChannelConnectivityState_UNKNOWN           ChannelConnectivityState_State = 0
	ChannelConnectivityState_IDLE              ChannelConnectivityState_State = 1
	ChannelConnectivityState_CONNECTING        ChannelConnectivityState_State = 2
	ChannelConnectivityState_READY             ChannelConnectivityState_State = 3
	ChannelConnectivityState_TRANSIENT_FAILURE ChannelConnectivityState_State = 4
	ChannelConnectivityState_SHUTDOWN          ChannelConnectivityState_State = 5
)

var ChannelConnectivityState_State_name = map[int32]string{
	0: "UNKNOWN",
	1: "IDLE",
	2: "CONNECTING",
	3: "READY",
	4: "TRANSIENT_FAILURE",
	5: "SHUTDOWN",
}
var ChannelConnectivityState_State_value = map[string]int32{
	"UNKNOWN":           0,
	"IDLE":              1,
	"CONNECTING":        2,
	"READY":             3,
	"TRANSIENT_FAILURE": 4,
	"SHUTDOWN":          5,
}

func (x ChannelConnectivityState_State) String() string {
	return proto.EnumName(ChannelConnectivityState_State_name, int32(x))
}
func (ChannelConnectivityState_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_channelz_449295370a82a4c0, []int{2, 0}
}

// The supported severity levels of trace events.
type ChannelTraceEvent_Severity int32

const (
	ChannelTraceEvent_CT_UNKNOWN ChannelTraceEvent_Severity = 0
	ChannelTraceEvent_CT_INFO    ChannelTraceEvent_Severity = 1
	ChannelTraceEvent_CT_WARNING ChannelTraceEvent_Severity = 2
	ChannelTraceEvent_CT_ERROR   ChannelTraceEvent_Severity = 3
)

var ChannelTraceEvent_Severity_name = map[int32]string{
	0: "CT_UNKNOWN",
	1: "CT_INFO",
	2: "CT_WARNING",
	3: "CT_ERROR",
}
var ChannelTraceEvent_Severity_value = map[string]int32{
	"CT_UNKNOWN": 0,
	"CT_INFO":    1,
	"CT_WARNING": 2,
	"CT_ERROR":   3,
}

func (x ChannelTraceEvent_Severity) String() string {
	return proto.EnumName(ChannelTraceEvent_Severity_name, int32(x))
}
func (ChannelTraceEvent_Severity) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_channelz_449295370a82a4c0, []int{4, 0}
}

// Channel is a logical grouping of channels, subchannels, and sockets.
type Channel struct {
	// The identifier for this channel. This should bet set.
	Ref *ChannelRef `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"`
	// Data specific to this channel.
	Data *ChannelData `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	// There are no ordering guarantees on the order of channel refs.
	// There may not be cycles in the ref graph.
	// A channel ref may be present in more than one channel or subchannel.
	ChannelRef []*ChannelRef `protobuf:"bytes,3,rep,name=channel_ref,json=channelRef,proto3" json:"channel_ref,omitempty"`
	// At most one of 'channel_ref+subchannel_ref' and 'socket' is set.
	// There are no ordering guarantees on the order of subchannel refs.
	// There may not be cycles in the ref graph.
	// A sub channel ref may be present in more than one channel or subchannel.
	SubchannelRef []*SubchannelRef `protobuf:"bytes,4,rep,name=subchannel_ref,json=subchannelRef,proto3" json:"subchannel_ref,omitempty"`
	// There are no ordering guarantees on the order of sockets.
	SocketRef            []*SocketRef `protobuf:"bytes,5,rep,name=socket_ref,json=socketRef,proto3" json:"socket_ref,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

var xxx_messageInfo_Channel proto.InternalMessageInfo

func (m *Channel) GetRef() *ChannelRef {
	if m != nil {
		return m.Ref
	}
	return nil
}

func (m *Channel) GetData() *ChannelData {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Channel) GetChannelRef() []*ChannelRef {
	if m != nil {
		return m.ChannelRef
	}
	return nil
}

func (m *Channel) GetSubchannelRef() []*SubchannelRef {
	if m != nil {
		return m.SubchannelRef
	}
	return nil
}

func (m *Channel) GetSocketRef() []*SocketRef {
	if m != nil {
		return m.SocketRef
	}
	return nil
}

// Subchannel is a logical grouping of channels, subchannels, and sockets.
// A subchannel is load balanced over by it's ancestor
type Subchannel struct {
	// The identifier for this channel.
	Ref *SubchannelRef `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"`
	// Data specific to this channel.
	Data *ChannelData `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	// There are no ordering guarantees on the order of channel refs.
	// There may not be cycles in the ref graph.
	// A channel ref may be present in more than one channel or subchannel.
	ChannelRef []*ChannelRef `protobuf:"bytes,3,rep,name=channel_ref,json=channelRef,proto3" json:"channel_ref,omitempty"`
	// At most one of 'channel_ref+subchannel_ref' and 'socket' is set.
	// There are no ordering guarantees on the order of subchannel refs.
	// There may not be cycles in the ref graph.
	// A sub channel ref may be present in more than one channel or subchannel.
	SubchannelRef []*SubchannelRef `protobuf:"bytes,4,rep,name=subchannel_ref,json=subchannelRef,proto3" json:"subchannel_ref,omitempty"`
	// There are no ordering guarantees on the order of sockets.
	SocketRef            []*SocketRef `protobuf:"bytes,5,rep,name=socket_ref,json=socketRef,proto3" json:"socket_ref,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

var xxx_messageInfo_Subchannel proto.InternalMessageInfo

func (m *Subchannel) GetRef() *SubchannelRef {
	if m != nil {
		return m.Ref
	}
	return nil
}

func (m *Subchannel) GetData() *ChannelData {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Subchannel) GetChannelRef() []*ChannelRef {
	if m != nil {
		return m.ChannelRef
	}
	return nil
}

func (m *Subchannel) GetSubchannelRef() []*SubchannelRef {
	if m != nil {
		return m.SubchannelRef
	}
	return nil
}

func (m *Subchannel) GetSocketRef() []*SocketRef {
	if m != nil {
		return m.SocketRef
	}
	return nil
}

// These come from the specified states in this document:
// https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md
type ChannelConnectivityState struct {
	State                ChannelConnectivityState_State `protobuf:"varint,1,opt,name=state,proto3,enum=grpc.channelz.v1.ChannelConnectivityState_State" json:"state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

var xxx_messageInfo_ChannelConnectivityState proto.InternalMessageInfo

func (m *ChannelConnectivityState) GetState() ChannelConnectivityState_State {
	if m != nil {
		return m.State
	}
	return ChannelConnectivityState_UNKNOWN
}

// Channel data is data related to a specific Channel or Subchannel.
type ChannelData struct {
	// The connectivity state of the channel or subchannel.  Implementations
	// should always set this.
	State *ChannelConnectivityState `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
	// The target this channel originally tried to connect to.  May be absent
	Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
	// A trace of recent events on the channel.  May be absent.
	Trace *ChannelTrace `protobuf:"bytes,3,opt,name=trace,proto3" json:"trace,omitempty"`
	// The number of calls started on the channel
	CallsStarted int64 `protobuf:"varint,4,opt,name=calls_started,json=callsStarted,proto3" json:"calls_started,omitempty"`
	// The number of calls that have completed with an OK status
	CallsSucceeded int64 `protobuf:"varint,5,opt,name=calls_succeeded,json=callsSucceeded,proto3" json:"calls_succeeded,omitempty"`
	// The number of calls that have completed with a non-OK status
	CallsFailed int64 `protobuf:"varint,6,opt,name=calls_failed,json=callsFailed,proto3" json:"calls_failed,omitempty"`
	// The last time a call was started on the channel.
	LastCallStartedTimestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=last_call_started_timestamp,json=lastCallStartedTimestamp,proto3" json:"last_call_started_timestamp,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}             `json:"-"`
	XXX_unrecognized         []byte               `json:"-"`
	XXX_sizecache            int32                `json:"-"`
}

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

var xxx_messageInfo_ChannelData proto.InternalMessageInfo

func (m *ChannelData) GetState() *ChannelConnectivityState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *ChannelData) GetTarget() string {
	if m != nil {
		return m.Target
	}
	return ""
}

func (m *ChannelData) GetTrace() *ChannelTrace {
	if m != nil {
		return m.Trace
	}
	return nil
}

func (m *ChannelData) GetCallsStarted() int64 {
	if m != nil {
		return m.CallsStarted
	}
	return 0
}

func (m *ChannelData) GetCallsSucceeded() int64 {
	if m != nil {
		return m.CallsSucceeded
	}
	return 0
}

func (m *ChannelData) GetCallsFailed() int64 {
	if m != nil {
		return m.CallsFailed
	}
	return 0
}

func (m *ChannelData) GetLastCallStartedTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.LastCallStartedTimestamp
	}
	return nil
}

// A trace event is an interesting thing that happened to a channel or
// subchannel, such as creation, address resolution, subchannel creation, etc.
type ChannelTraceEvent struct {
	// High level description of the event.
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
	// the severity of the trace event
	Severity ChannelTraceEvent_Severity `protobuf:"varint,2,opt,name=severity,proto3,enum=grpc.channelz.v1.ChannelTraceEvent_Severity" json:"severity,omitempty"`
	// When this event occurred.
	Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	// ref of referenced channel or subchannel.
	// Optional, only present if this event refers to a child object. For example,
	// this field would be filled if this trace event was for a subchannel being
	// created.
	//
	// Types that are valid to be assigned to ChildRef:
	//	*ChannelTraceEvent_ChannelRef
	//	*ChannelTraceEvent_SubchannelRef
	ChildRef             isChannelTraceEvent_ChildRef `protobuf_oneof:"child_ref"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

var xxx_messageInfo_ChannelTraceEvent proto.InternalMessageInfo

func (m *ChannelTraceEvent) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *ChannelTraceEvent) GetSeverity() ChannelTraceEvent_Severity {
	if m != nil {
		return m.Severity
	}
	return ChannelTraceEvent_CT_UNKNOWN
}

func (m *ChannelTraceEvent) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

type isChannelTraceEvent_ChildRef interface {
	isChannelTraceEvent_ChildRef()
}

type ChannelTraceEvent_ChannelRef struct {
	ChannelRef *ChannelRef `protobuf:"bytes,4,opt,name=channel_ref,json=channelRef,proto3,oneof"`
}

type ChannelTraceEvent_SubchannelRef struct {
	SubchannelRef *SubchannelRef `protobuf:"bytes,5,opt,name=subchannel_ref,json=subchannelRef,proto3,oneof"`
}

func (*ChannelTraceEvent_ChannelRef) isChannelTraceEvent_ChildRef() {}

func (*ChannelTraceEvent_SubchannelRef) isChannelTraceEvent_ChildRef() {}

func (m *ChannelTraceEvent) GetChildRef() isChannelTraceEvent_ChildRef {
	if m != nil {
		return m.ChildRef
	}
	return nil
}

func (m *ChannelTraceEvent) GetChannelRef() *ChannelRef {
	if x, ok := m.GetChildRef().(*ChannelTraceEvent_ChannelRef); ok {
		return x.ChannelRef
	}
	return nil
}

func (m *ChannelTraceEvent) GetSubchannelRef() *SubchannelRef {
	if x, ok := m.GetChildRef().(*ChannelTraceEvent_SubchannelRef); ok {
		return x.SubchannelRef
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ChannelTraceEvent) 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 _ChannelTraceEvent_OneofMarshaler, _ChannelTraceEvent_OneofUnmarshaler, _ChannelTraceEvent_OneofSizer, []interface{}{
		(*ChannelTraceEvent_ChannelRef)(nil),
		(*ChannelTraceEvent_SubchannelRef)(nil),
	}
}

func _ChannelTraceEvent_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*ChannelTraceEvent)
	// child_ref
	switch x := m.ChildRef.(type) {
	case *ChannelTraceEvent_ChannelRef:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ChannelRef); err != nil {
			return err
		}
	case *ChannelTraceEvent_SubchannelRef:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.SubchannelRef); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("ChannelTraceEvent.ChildRef has unexpected type %T", x)
	}
	return nil
}

func _ChannelTraceEvent_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*ChannelTraceEvent)
	switch tag {
	case 4: // child_ref.channel_ref
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(ChannelRef)
		err := b.DecodeMessage(msg)
		m.ChildRef = &ChannelTraceEvent_ChannelRef{msg}
		return true, err
	case 5: // child_ref.subchannel_ref
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(SubchannelRef)
		err := b.DecodeMessage(msg)
		m.ChildRef = &ChannelTraceEvent_SubchannelRef{msg}
		return true, err
	default:
		return false, nil
	}
}

func _ChannelTraceEvent_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*ChannelTraceEvent)
	// child_ref
	switch x := m.ChildRef.(type) {
	case *ChannelTraceEvent_ChannelRef:
		s := proto.Size(x.ChannelRef)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *ChannelTraceEvent_SubchannelRef:
		s := proto.Size(x.SubchannelRef)
		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
}

// ChannelTrace represents the recent events that have occurred on the channel.
type ChannelTrace struct {
	// Number of events ever logged in this tracing object. This can differ from
	// events.size() because events can be overwritten or garbage collected by
	// implementations.
	NumEventsLogged int64 `protobuf:"varint,1,opt,name=num_events_logged,json=numEventsLogged,proto3" json:"num_events_logged,omitempty"`
	// Time that this channel was created.
	CreationTimestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=creation_timestamp,json=creationTimestamp,proto3" json:"creation_timestamp,omitempty"`
	// List of events that have occurred on this channel.
	Events               []*ChannelTraceEvent `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

var xxx_messageInfo_ChannelTrace proto.InternalMessageInfo

func (m *ChannelTrace) GetNumEventsLogged() int64 {
	if m != nil {
		return m.NumEventsLogged
	}
	return 0
}

func (m *ChannelTrace) GetCreationTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.CreationTimestamp
	}
	return nil
}

func (m *ChannelTrace) GetEvents() []*ChannelTraceEvent {
	if m != nil {
		return m.Events
	}
	return nil
}

// ChannelRef is a reference to a Channel.
type ChannelRef struct {
	// The globally unique id for this channel.  Must be a positive number.
	ChannelId int64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
	// An optional name associated with the channel.
	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_ChannelRef proto.InternalMessageInfo

func (m *ChannelRef) GetChannelId() int64 {
	if m != nil {
		return m.ChannelId
	}
	return 0
}

func (m *ChannelRef) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// ChannelRef is a reference to a Subchannel.
type SubchannelRef struct {
	// The globally unique id for this subchannel.  Must be a positive number.
	SubchannelId int64 `protobuf:"varint,7,opt,name=subchannel_id,json=subchannelId,proto3" json:"subchannel_id,omitempty"`
	// An optional name associated with the subchannel.
	Name                 string   `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_SubchannelRef proto.InternalMessageInfo

func (m *SubchannelRef) GetSubchannelId() int64 {
	if m != nil {
		return m.SubchannelId
	}
	return 0
}

func (m *SubchannelRef) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// SocketRef is a reference to a Socket.
type SocketRef struct {
	// The globally unique id for this socket.  Must be a positive number.
	SocketId int64 `protobuf:"varint,3,opt,name=socket_id,json=socketId,proto3" json:"socket_id,omitempty"`
	// An optional name associated with the socket.
	Name                 string   `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_SocketRef proto.InternalMessageInfo

func (m *SocketRef) GetSocketId() int64 {
	if m != nil {
		return m.SocketId
	}
	return 0
}

func (m *SocketRef) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// ServerRef is a reference to a Server.
type ServerRef struct {
	// A globally unique identifier for this server.  Must be a positive number.
	ServerId int64 `protobuf:"varint,5,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
	// An optional name associated with the server.
	Name                 string   `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_ServerRef proto.InternalMessageInfo

func (m *ServerRef) GetServerId() int64 {
	if m != nil {
		return m.ServerId
	}
	return 0
}

func (m *ServerRef) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Server represents a single server.  There may be multiple servers in a single
// program.
type Server struct {
	// The identifier for a Server.  This should be set.
	Ref *ServerRef `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"`
	// The associated data of the Server.
	Data *ServerData `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	// The sockets that the server is listening on.  There are no ordering
	// guarantees.  This may be absent.
	ListenSocket         []*SocketRef `protobuf:"bytes,3,rep,name=listen_socket,json=listenSocket,proto3" json:"listen_socket,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

var xxx_messageInfo_Server proto.InternalMessageInfo

func (m *Server) GetRef() *ServerRef {
	if m != nil {
		return m.Ref
	}
	return nil
}

func (m *Server) GetData() *ServerData {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Server) GetListenSocket() []*SocketRef {
	if m != nil {
		return m.ListenSocket
	}
	return nil
}

// ServerData is data for a specific Server.
type ServerData struct {
	// A trace of recent events on the server.  May be absent.
	Trace *ChannelTrace `protobuf:"bytes,1,opt,name=trace,proto3" json:"trace,omitempty"`
	// The number of incoming calls started on the server
	CallsStarted int64 `protobuf:"varint,2,opt,name=calls_started,json=callsStarted,proto3" json:"calls_started,omitempty"`
	// The number of incoming calls that have completed with an OK status
	CallsSucceeded int64 `protobuf:"varint,3,opt,name=calls_succeeded,json=callsSucceeded,proto3" json:"calls_succeeded,omitempty"`
	// The number of incoming calls that have a completed with a non-OK status
	CallsFailed int64 `protobuf:"varint,4,opt,name=calls_failed,json=callsFailed,proto3" json:"calls_failed,omitempty"`
	// The last time a call was started on the server.
	LastCallStartedTimestamp *timestamp.Timestamp `protobuf:"bytes,5,opt,name=last_call_started_timestamp,json=lastCallStartedTimestamp,proto3" json:"last_call_started_timestamp,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}             `json:"-"`
	XXX_unrecognized         []byte               `json:"-"`
	XXX_sizecache            int32                `json:"-"`
}

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

var xxx_messageInfo_ServerData proto.InternalMessageInfo

func (m *ServerData) GetTrace() *ChannelTrace {
	if m != nil {
		return m.Trace
	}
	return nil
}

func (m *ServerData) GetCallsStarted() int64 {
	if m != nil {
		return m.CallsStarted
	}
	return 0
}

func (m *ServerData) GetCallsSucceeded() int64 {
	if m != nil {
		return m.CallsSucceeded
	}
	return 0
}

func (m *ServerData) GetCallsFailed() int64 {
	if m != nil {
		return m.CallsFailed
	}
	return 0
}

func (m *ServerData) GetLastCallStartedTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.LastCallStartedTimestamp
	}
	return nil
}

// Information about an actual connection.  Pronounced "sock-ay".
type Socket struct {
	// The identifier for the Socket.
	Ref *SocketRef `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"`
	// Data specific to this Socket.
	Data *SocketData `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	// The locally bound address.
	Local *Address `protobuf:"bytes,3,opt,name=local,proto3" json:"local,omitempty"`
	// The remote bound address.  May be absent.
	Remote *Address `protobuf:"bytes,4,opt,name=remote,proto3" json:"remote,omitempty"`
	// Security details for this socket.  May be absent if not available, or
	// there is no security on the socket.
	Security *Security `protobuf:"bytes,5,opt,name=security,proto3" json:"security,omitempty"`
	// Optional, represents the name of the remote endpoint, if different than
	// the original target name.
	RemoteName           string   `protobuf:"bytes,6,opt,name=remote_name,json=remoteName,proto3" json:"remote_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Socket proto.InternalMessageInfo

func (m *Socket) GetRef() *SocketRef {
	if m != nil {
		return m.Ref
	}
	return nil
}

func (m *Socket) GetData() *SocketData {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Socket) GetLocal() *Address {
	if m != nil {
		return m.Local
	}
	return nil
}

func (m *Socket) GetRemote() *Address {
	if m != nil {
		return m.Remote
	}
	return nil
}

func (m *Socket) GetSecurity() *Security {
	if m != nil {
		return m.Security
	}
	return nil
}

func (m *Socket) GetRemoteName() string {
	if m != nil {
		return m.RemoteName
	}
	return ""
}

// SocketData is data associated for a specific Socket.  The fields present
// are specific to the implementation, so there may be minor differences in
// the semantics.  (e.g. flow control windows)
type SocketData struct {
	// The number of streams that have been started.
	StreamsStarted int64 `protobuf:"varint,1,opt,name=streams_started,json=streamsStarted,proto3" json:"streams_started,omitempty"`
	// The number of streams that have ended successfully:
	// On client side, received frame with eos bit set;
	// On server side, sent frame with eos bit set.
	StreamsSucceeded int64 `protobuf:"varint,2,opt,name=streams_succeeded,json=streamsSucceeded,proto3" json:"streams_succeeded,omitempty"`
	// The number of streams that have ended unsuccessfully:
	// On client side, ended without receiving frame with eos bit set;
	// On server side, ended without sending frame with eos bit set.
	StreamsFailed int64 `protobuf:"varint,3,opt,name=streams_failed,json=streamsFailed,proto3" json:"streams_failed,omitempty"`
	// The number of grpc messages successfully sent on this socket.
	MessagesSent int64 `protobuf:"varint,4,opt,name=messages_sent,json=messagesSent,proto3" json:"messages_sent,omitempty"`
	// The number of grpc messages received on this socket.
	MessagesReceived int64 `protobuf:"varint,5,opt,name=messages_received,json=messagesReceived,proto3" json:"messages_received,omitempty"`
	// The number of keep alives sent.  This is typically implemented with HTTP/2
	// ping messages.
	KeepAlivesSent int64 `protobuf:"varint,6,opt,name=keep_alives_sent,json=keepAlivesSent,proto3" json:"keep_alives_sent,omitempty"`
	// The last time a stream was created by this endpoint.  Usually unset for
	// servers.
	LastLocalStreamCreatedTimestamp *timestamp.Timestamp `protobuf:"bytes,7,opt,name=last_local_stream_created_timestamp,json=lastLocalStreamCreatedTimestamp,proto3" json:"last_local_stream_created_timestamp,omitempty"`
	// The last time a stream was created by the remote endpoint.  Usually unset
	// for clients.
	LastRemoteStreamCreatedTimestamp *timestamp.Timestamp `protobuf:"bytes,8,opt,name=last_remote_stream_created_timestamp,json=lastRemoteStreamCreatedTimestamp,proto3" json:"last_remote_stream_created_timestamp,omitempty"`
	// The last time a message was sent by this endpoint.
	LastMessageSentTimestamp *timestamp.Timestamp `protobuf:"bytes,9,opt,name=last_message_sent_timestamp,json=lastMessageSentTimestamp,proto3" json:"last_message_sent_timestamp,omitempty"`
	// The last time a message was received by this endpoint.
	LastMessageReceivedTimestamp *timestamp.Timestamp `protobuf:"bytes,10,opt,name=last_message_received_timestamp,json=lastMessageReceivedTimestamp,proto3" json:"last_message_received_timestamp,omitempty"`
	// The amount of window, granted to the local endpoint by the remote endpoint.
	// This may be slightly out of date due to network latency.  This does NOT
	// include stream level or TCP level flow control info.
	LocalFlowControlWindow *wrappers.Int64Value `protobuf:"bytes,11,opt,name=local_flow_control_window,json=localFlowControlWindow,proto3" json:"local_flow_control_window,omitempty"`
	// The amount of window, granted to the remote endpoint by the local endpoint.
	// This may be slightly out of date due to network latency.  This does NOT
	// include stream level or TCP level flow control info.
	RemoteFlowControlWindow *wrappers.Int64Value `protobuf:"bytes,12,opt,name=remote_flow_control_window,json=remoteFlowControlWindow,proto3" json:"remote_flow_control_window,omitempty"`
	// Socket options set on this socket.  May be absent if 'summary' is set
	// on GetSocketRequest.
	Option               []*SocketOption `protobuf:"bytes,13,rep,name=option,proto3" json:"option,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

var xxx_messageInfo_SocketData proto.InternalMessageInfo

func (m *SocketData) GetStreamsStarted() int64 {
	if m != nil {
		return m.StreamsStarted
	}
	return 0
}

func (m *SocketData) GetStreamsSucceeded() int64 {
	if m != nil {
		return m.StreamsSucceeded
	}
	return 0
}

func (m *SocketData) GetStreamsFailed() int64 {
	if m != nil {
		return m.StreamsFailed
	}
	return 0
}

func (m *SocketData) GetMessagesSent() int64 {
	if m != nil {
		return m.MessagesSent
	}
	return 0
}

func (m *SocketData) GetMessagesReceived() int64 {
	if m != nil {
		return m.MessagesReceived
	}
	return 0
}

func (m *SocketData) GetKeepAlivesSent() int64 {
	if m != nil {
		return m.KeepAlivesSent
	}
	return 0
}

func (m *SocketData) GetLastLocalStreamCreatedTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.LastLocalStreamCreatedTimestamp
	}
	return nil
}

func (m *SocketData) GetLastRemoteStreamCreatedTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.LastRemoteStreamCreatedTimestamp
	}
	return nil
}

func (m *SocketData) GetLastMessageSentTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.LastMessageSentTimestamp
	}
	return nil
}

func (m *SocketData) GetLastMessageReceivedTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.LastMessageReceivedTimestamp
	}
	return nil
}

func (m *SocketData) GetLocalFlowControlWindow() *wrappers.Int64Value {
	if m != nil {
		return m.LocalFlowControlWindow
	}
	return nil
}

func (m *SocketData) GetRemoteFlowControlWindow() *wrappers.Int64Value {
	if m != nil {
		return m.RemoteFlowControlWindow
	}
	return nil
}

func (m *SocketData) GetOption() []*SocketOption {
	if m != nil {
		return m.Option
	}
	return nil
}

// Address represents the address used to create the socket.
type Address struct {
	// Types that are valid to be assigned to Address:
	//	*Address_TcpipAddress
	//	*Address_UdsAddress_
	//	*Address_OtherAddress_
	Address              isAddress_Address `protobuf_oneof:"address"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

var xxx_messageInfo_Address proto.InternalMessageInfo

type isAddress_Address interface {
	isAddress_Address()
}

type Address_TcpipAddress struct {
	TcpipAddress *Address_TcpIpAddress `protobuf:"bytes,1,opt,name=tcpip_address,json=tcpipAddress,proto3,oneof"`
}

type Address_UdsAddress_ struct {
	UdsAddress *Address_UdsAddress `protobuf:"bytes,2,opt,name=uds_address,json=udsAddress,proto3,oneof"`
}

type Address_OtherAddress_ struct {
	OtherAddress *Address_OtherAddress `protobuf:"bytes,3,opt,name=other_address,json=otherAddress,proto3,oneof"`
}

func (*Address_TcpipAddress) isAddress_Address() {}

func (*Address_UdsAddress_) isAddress_Address() {}

func (*Address_OtherAddress_) isAddress_Address() {}

func (m *Address) GetAddress() isAddress_Address {
	if m != nil {
		return m.Address
	}
	return nil
}

func (m *Address) GetTcpipAddress() *Address_TcpIpAddress {
	if x, ok := m.GetAddress().(*Address_TcpipAddress); ok {
		return x.TcpipAddress
	}
	return nil
}

func (m *Address) GetUdsAddress() *Address_UdsAddress {
	if x, ok := m.GetAddress().(*Address_UdsAddress_); ok {
		return x.UdsAddress
	}
	return nil
}

func (m *Address) GetOtherAddress() *Address_OtherAddress {
	if x, ok := m.GetAddress().(*Address_OtherAddress_); ok {
		return x.OtherAddress
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Address) 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 _Address_OneofMarshaler, _Address_OneofUnmarshaler, _Address_OneofSizer, []interface{}{
		(*Address_TcpipAddress)(nil),
		(*Address_UdsAddress_)(nil),
		(*Address_OtherAddress_)(nil),
	}
}

func _Address_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Address)
	// address
	switch x := m.Address.(type) {
	case *Address_TcpipAddress:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.TcpipAddress); err != nil {
			return err
		}
	case *Address_UdsAddress_:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.UdsAddress); err != nil {
			return err
		}
	case *Address_OtherAddress_:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OtherAddress); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("Address.Address has unexpected type %T", x)
	}
	return nil
}

func _Address_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Address)
	switch tag {
	case 1: // address.tcpip_address
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Address_TcpIpAddress)
		err := b.DecodeMessage(msg)
		m.Address = &Address_TcpipAddress{msg}
		return true, err
	case 2: // address.uds_address
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Address_UdsAddress)
		err := b.DecodeMessage(msg)
		m.Address = &Address_UdsAddress_{msg}
		return true, err
	case 3: // address.other_address
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Address_OtherAddress)
		err := b.DecodeMessage(msg)
		m.Address = &Address_OtherAddress_{msg}
		return true, err
	default:
		return false, nil
	}
}

func _Address_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Address)
	// address
	switch x := m.Address.(type) {
	case *Address_TcpipAddress:
		s := proto.Size(x.TcpipAddress)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Address_UdsAddress_:
		s := proto.Size(x.UdsAddress)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Address_OtherAddress_:
		s := proto.Size(x.OtherAddress)
		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 Address_TcpIpAddress struct {
	// Either the IPv4 or IPv6 address in bytes.  Will be either 4 bytes or 16
	// bytes in length.
	IpAddress []byte `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
	// 0-64k, or -1 if not appropriate.
	Port                 int32    `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Address_TcpIpAddress proto.InternalMessageInfo

func (m *Address_TcpIpAddress) GetIpAddress() []byte {
	if m != nil {
		return m.IpAddress
	}
	return nil
}

func (m *Address_TcpIpAddress) GetPort() int32 {
	if m != nil {
		return m.Port
	}
	return 0
}

// A Unix Domain Socket address.
type Address_UdsAddress struct {
	Filename             string   `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Address_UdsAddress proto.InternalMessageInfo

func (m *Address_UdsAddress) GetFilename() string {
	if m != nil {
		return m.Filename
	}
	return ""
}

// An address type not included above.
type Address_OtherAddress struct {
	// The human readable version of the value.  This value should be set.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The actual address message.
	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 *Address_OtherAddress) Reset()         { *m = Address_OtherAddress{} }
func (m *Address_OtherAddress) String() string { return proto.CompactTextString(m) }
func (*Address_OtherAddress) ProtoMessage()    {}
func (*Address_OtherAddress) Descriptor() ([]byte, []int) {
	return fileDescriptor_channelz_449295370a82a4c0, []int{14, 2}
}
func (m *Address_OtherAddress) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Address_OtherAddress.Unmarshal(m, b)
}
func (m *Address_OtherAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Address_OtherAddress.Marshal(b, m, deterministic)
}
func (dst *Address_OtherAddress) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Address_OtherAddress.Merge(dst, src)
}
func (m *Address_OtherAddress) XXX_Size() int {
	return xxx_messageInfo_Address_OtherAddress.Size(m)
}
func (m *Address_OtherAddress) XXX_DiscardUnknown() {
	xxx_messageInfo_Address_OtherAddress.DiscardUnknown(m)
}

var xxx_messageInfo_Address_OtherAddress proto.InternalMessageInfo

func (m *Address_OtherAddress) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

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

// Security represents details about how secure the socket is.
type Security struct {
	// Types that are valid to be assigned to Model:
	//	*Security_Tls_
	//	*Security_Other
	Model                isSecurity_Model `protobuf_oneof:"model"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

var xxx_messageInfo_Security proto.InternalMessageInfo

type isSecurity_Model interface {
	isSecurity_Model()
}

type Security_Tls_ struct {
	Tls *Security_Tls `protobuf:"bytes,1,opt,name=tls,proto3,oneof"`
}

type Security_Other struct {
	Other *Security_OtherSecurity `protobuf:"bytes,2,opt,name=other,proto3,oneof"`
}

func (*Security_Tls_) isSecurity_Model() {}

func (*Security_Other) isSecurity_Model() {}

func (m *Security) GetModel() isSecurity_Model {
	if m != nil {
		return m.Model
	}
	return nil
}

func (m *Security) GetTls() *Security_Tls {
	if x, ok := m.GetModel().(*Security_Tls_); ok {
		return x.Tls
	}
	return nil
}

func (m *Security) GetOther() *Security_OtherSecurity {
	if x, ok := m.GetModel().(*Security_Other); ok {
		return x.Other
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Security) 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 _Security_OneofMarshaler, _Security_OneofUnmarshaler, _Security_OneofSizer, []interface{}{
		(*Security_Tls_)(nil),
		(*Security_Other)(nil),
	}
}

func _Security_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Security)
	// model
	switch x := m.Model.(type) {
	case *Security_Tls_:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Tls); err != nil {
			return err
		}
	case *Security_Other:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Other); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("Security.Model has unexpected type %T", x)
	}
	return nil
}

func _Security_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Security)
	switch tag {
	case 1: // model.tls
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Security_Tls)
		err := b.DecodeMessage(msg)
		m.Model = &Security_Tls_{msg}
		return true, err
	case 2: // model.other
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Security_OtherSecurity)
		err := b.DecodeMessage(msg)
		m.Model = &Security_Other{msg}
		return true, err
	default:
		return false, nil
	}
}

func _Security_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Security)
	// model
	switch x := m.Model.(type) {
	case *Security_Tls_:
		s := proto.Size(x.Tls)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Security_Other:
		s := proto.Size(x.Other)
		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 Security_Tls struct {
	// Types that are valid to be assigned to CipherSuite:
	//	*Security_Tls_StandardName
	//	*Security_Tls_OtherName
	CipherSuite isSecurity_Tls_CipherSuite `protobuf_oneof:"cipher_suite"`
	// the certificate used by this endpoint.
	LocalCertificate []byte `protobuf:"bytes,3,opt,name=local_certificate,json=localCertificate,proto3" json:"local_certificate,omitempty"`
	// the certificate used by the remote endpoint.
	RemoteCertificate    []byte   `protobuf:"bytes,4,opt,name=remote_certificate,json=remoteCertificate,proto3" json:"remote_certificate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_Security_Tls proto.InternalMessageInfo

type isSecurity_Tls_CipherSuite interface {
	isSecurity_Tls_CipherSuite()
}

type Security_Tls_StandardName struct {
	StandardName string `protobuf:"bytes,1,opt,name=standard_name,json=standardName,proto3,oneof"`
}

type Security_Tls_OtherName struct {
	OtherName string `protobuf:"bytes,2,opt,name=other_name,json=otherName,proto3,oneof"`
}

func (*Security_Tls_StandardName) isSecurity_Tls_CipherSuite() {}

func (*Security_Tls_OtherName) isSecurity_Tls_CipherSuite() {}

func (m *Security_Tls) GetCipherSuite() isSecurity_Tls_CipherSuite {
	if m != nil {
		return m.CipherSuite
	}
	return nil
}

func (m *Security_Tls) GetStandardName() string {
	if x, ok := m.GetCipherSuite().(*Security_Tls_StandardName); ok {
		return x.StandardName
	}
	return ""
}

func (m *Security_Tls) GetOtherName() string {
	if x, ok := m.GetCipherSuite().(*Security_Tls_OtherName); ok {
		return x.OtherName
	}
	return ""
}

func (m *Security_Tls) GetLocalCertificate() []byte {
	if m != nil {
		return m.LocalCertificate
	}
	return nil
}

func (m *Security_Tls) GetRemoteCertificate() []byte {
	if m != nil {
		return m.RemoteCertificate
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Security_Tls) 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 _Security_Tls_OneofMarshaler, _Security_Tls_OneofUnmarshaler, _Security_Tls_OneofSizer, []interface{}{
		(*Security_Tls_StandardName)(nil),
		(*Security_Tls_OtherName)(nil),
	}
}

func _Security_Tls_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Security_Tls)
	// cipher_suite
	switch x := m.CipherSuite.(type) {
	case *Security_Tls_StandardName:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.StandardName)
	case *Security_Tls_OtherName:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.OtherName)
	case nil:
	default:
		return fmt.Errorf("Security_Tls.CipherSuite has unexpected type %T", x)
	}
	return nil
}

func _Security_Tls_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Security_Tls)
	switch tag {
	case 1: // cipher_suite.standard_name
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.CipherSuite = &Security_Tls_StandardName{x}
		return true, err
	case 2: // cipher_suite.other_name
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.CipherSuite = &Security_Tls_OtherName{x}
		return true, err
	default:
		return false, nil
	}
}

func _Security_Tls_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Security_Tls)
	// cipher_suite
	switch x := m.CipherSuite.(type) {
	case *Security_Tls_StandardName:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.StandardName)))
		n += len(x.StandardName)
	case *Security_Tls_OtherName:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.OtherName)))
		n += len(x.OtherName)
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type Security_OtherSecurity struct {
	// The human readable version of the value.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The actual security details message.
	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 *Security_OtherSecurity) Reset()         { *m = Security_OtherSecurity{} }
func (m *Security_OtherSecurity) String() string { return proto.CompactTextString(m) }
func (*Security_OtherSecurity) ProtoMessage()    {}
func (*Security_OtherSecurity) Descriptor() ([]byte, []int) {
	return fileDescriptor_channelz_449295370a82a4c0, []int{15, 1}
}
func (m *Security_OtherSecurity) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Security_OtherSecurity.Unmarshal(m, b)
}
func (m *Security_OtherSecurity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Security_OtherSecurity.Marshal(b, m, deterministic)
}
func (dst *Security_OtherSecurity) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Security_OtherSecurity.Merge(dst, src)
}
func (m *Security_OtherSecurity) XXX_Size() int {
	return xxx_messageInfo_Security_OtherSecurity.Size(m)
}
func (m *Security_OtherSecurity) XXX_DiscardUnknown() {
	xxx_messageInfo_Security_OtherSecurity.DiscardUnknown(m)
}

var xxx_messageInfo_Security_OtherSecurity proto.InternalMessageInfo

func (m *Security_OtherSecurity) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

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

// SocketOption represents socket options for a socket.  Specifically, these
// are the options returned by getsockopt().
type SocketOption struct {
	// The full name of the socket option.  Typically this will be the upper case
	// name, such as "SO_REUSEPORT".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The human readable value of this socket option.  At least one of value or
	// additional will be set.
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	// Additional data associated with the socket option.  At least one of value
	// or additional will be set.
	Additional           *any.Any `protobuf:"bytes,3,opt,name=additional,proto3" json:"additional,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_SocketOption proto.InternalMessageInfo

func (m *SocketOption) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *SocketOption) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *SocketOption) GetAdditional() *any.Any {
	if m != nil {
		return m.Additional
	}
	return nil
}

// For use with SocketOption's additional field.  This is primarily used for
// SO_RCVTIMEO and SO_SNDTIMEO
type SocketOptionTimeout struct {
	Duration             *duration.Duration `protobuf:"bytes,1,opt,name=duration,proto3" json:"duration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

var xxx_messageInfo_SocketOptionTimeout proto.InternalMessageInfo

func (m *SocketOptionTimeout) GetDuration() *duration.Duration {
	if m != nil {
		return m.Duration
	}
	return nil
}

// For use with SocketOption's additional field.  This is primarily used for
// SO_LINGER.
type SocketOptionLinger struct {
	// active maps to `struct linger.l_onoff`
	Active bool `protobuf:"varint,1,opt,name=active,proto3" json:"active,omitempty"`
	// duration maps to `struct linger.l_linger`
	Duration             *duration.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

var xxx_messageInfo_SocketOptionLinger proto.InternalMessageInfo

func (m *SocketOptionLinger) GetActive() bool {
	if m != nil {
		return m.Active
	}
	return false
}

func (m *SocketOptionLinger) GetDuration() *duration.Duration {
	if m != nil {
		return m.Duration
	}
	return nil
}

// For use with SocketOption's additional field.  Tcp info for
// SOL_TCP and TCP_INFO.
type SocketOptionTcpInfo struct {
	TcpiState            uint32   `protobuf:"varint,1,opt,name=tcpi_state,json=tcpiState,proto3" json:"tcpi_state,omitempty"`
	TcpiCaState          uint32   `protobuf:"varint,2,opt,name=tcpi_ca_state,json=tcpiCaState,proto3" json:"tcpi_ca_state,omitempty"`
	TcpiRetransmits      uint32   `protobuf:"varint,3,opt,name=tcpi_retransmits,json=tcpiRetransmits,proto3" json:"tcpi_retransmits,omitempty"`
	TcpiProbes           uint32   `protobuf:"varint,4,opt,name=tcpi_probes,json=tcpiProbes,proto3" json:"tcpi_probes,omitempty"`
	TcpiBackoff          uint32   `protobuf:"varint,5,opt,name=tcpi_backoff,json=tcpiBackoff,proto3" json:"tcpi_backoff,omitempty"`
	TcpiOptions          uint32   `protobuf:"varint,6,opt,name=tcpi_options,json=tcpiOptions,proto3" json:"tcpi_options,omitempty"`
	TcpiSndWscale        uint32   `protobuf:"varint,7,opt,name=tcpi_snd_wscale,json=tcpiSndWscale,proto3" json:"tcpi_snd_wscale,omitempty"`
	TcpiRcvWscale        uint32   `protobuf:"varint,8,opt,name=tcpi_rcv_wscale,json=tcpiRcvWscale,proto3" json:"tcpi_rcv_wscale,omitempty"`
	TcpiRto              uint32   `protobuf:"varint,9,opt,name=tcpi_rto,json=tcpiRto,proto3" json:"tcpi_rto,omitempty"`
	TcpiAto              uint32   `protobuf:"varint,10,opt,name=tcpi_ato,json=tcpiAto,proto3" json:"tcpi_ato,omitempty"`
	TcpiSndMss           uint32   `protobuf:"varint,11,opt,name=tcpi_snd_mss,json=tcpiSndMss,proto3" json:"tcpi_snd_mss,omitempty"`
	TcpiRcvMss           uint32   `protobuf:"varint,12,opt,name=tcpi_rcv_mss,json=tcpiRcvMss,proto3" json:"tcpi_rcv_mss,omitempty"`
	TcpiUnacked          uint32   `protobuf:"varint,13,opt,name=tcpi_unacked,json=tcpiUnacked,proto3" json:"tcpi_unacked,omitempty"`
	TcpiSacked           uint32   `protobuf:"varint,14,opt,name=tcpi_sacked,json=tcpiSacked,proto3" json:"tcpi_sacked,omitempty"`
	TcpiLost             uint32   `protobuf:"varint,15,opt,name=tcpi_lost,json=tcpiLost,proto3" json:"tcpi_lost,omitempty"`
	TcpiRetrans          uint32   `protobuf:"varint,16,opt,name=tcpi_retrans,json=tcpiRetrans,proto3" json:"tcpi_retrans,omitempty"`
	TcpiFackets          uint32   `protobuf:"varint,17,opt,name=tcpi_fackets,json=tcpiFackets,proto3" json:"tcpi_fackets,omitempty"`
	TcpiLastDataSent     uint32   `protobuf:"varint,18,opt,name=tcpi_last_data_sent,json=tcpiLastDataSent,proto3" json:"tcpi_last_data_sent,omitempty"`
	TcpiLastAckSent      uint32   `protobuf:"varint,19,opt,name=tcpi_last_ack_sent,json=tcpiLastAckSent,proto3" json:"tcpi_last_ack_sent,omitempty"`
	TcpiLastDataRecv     uint32   `protobuf:"varint,20,opt,name=tcpi_last_data_recv,json=tcpiLastDataRecv,proto3" json:"tcpi_last_data_recv,omitempty"`
	TcpiLastAckRecv      uint32   `protobuf:"varint,21,opt,name=tcpi_last_ack_recv,json=tcpiLastAckRecv,proto3" json:"tcpi_last_ack_recv,omitempty"`
	TcpiPmtu             uint32   `protobuf:"varint,22,opt,name=tcpi_pmtu,json=tcpiPmtu,proto3" json:"tcpi_pmtu,omitempty"`
	TcpiRcvSsthresh      uint32   `protobuf:"varint,23,opt,name=tcpi_rcv_ssthresh,json=tcpiRcvSsthresh,proto3" json:"tcpi_rcv_ssthresh,omitempty"`
	TcpiRtt              uint32   `protobuf:"varint,24,opt,name=tcpi_rtt,json=tcpiRtt,proto3" json:"tcpi_rtt,omitempty"`
	TcpiRttvar           uint32   `protobuf:"varint,25,opt,name=tcpi_rttvar,json=tcpiRttvar,proto3" json:"tcpi_rttvar,omitempty"`
	TcpiSndSsthresh      uint32   `protobuf:"varint,26,opt,name=tcpi_snd_ssthresh,json=tcpiSndSsthresh,proto3" json:"tcpi_snd_ssthresh,omitempty"`
	TcpiSndCwnd          uint32   `protobuf:"varint,27,opt,name=tcpi_snd_cwnd,json=tcpiSndCwnd,proto3" json:"tcpi_snd_cwnd,omitempty"`
	TcpiAdvmss           uint32   `protobuf:"varint,28,opt,name=tcpi_advmss,json=tcpiAdvmss,proto3" json:"tcpi_advmss,omitempty"`
	TcpiReordering       uint32   `protobuf:"varint,29,opt,name=tcpi_reordering,json=tcpiReordering,proto3" json:"tcpi_reordering,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_SocketOptionTcpInfo proto.InternalMessageInfo

func (m *SocketOptionTcpInfo) GetTcpiState() uint32 {
	if m != nil {
		return m.TcpiState
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiCaState() uint32 {
	if m != nil {
		return m.TcpiCaState
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRetransmits() uint32 {
	if m != nil {
		return m.TcpiRetransmits
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiProbes() uint32 {
	if m != nil {
		return m.TcpiProbes
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiBackoff() uint32 {
	if m != nil {
		return m.TcpiBackoff
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiOptions() uint32 {
	if m != nil {
		return m.TcpiOptions
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiSndWscale() uint32 {
	if m != nil {
		return m.TcpiSndWscale
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRcvWscale() uint32 {
	if m != nil {
		return m.TcpiRcvWscale
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRto() uint32 {
	if m != nil {
		return m.TcpiRto
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiAto() uint32 {
	if m != nil {
		return m.TcpiAto
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiSndMss() uint32 {
	if m != nil {
		return m.TcpiSndMss
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRcvMss() uint32 {
	if m != nil {
		return m.TcpiRcvMss
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiUnacked() uint32 {
	if m != nil {
		return m.TcpiUnacked
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiSacked() uint32 {
	if m != nil {
		return m.TcpiSacked
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiLost() uint32 {
	if m != nil {
		return m.TcpiLost
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRetrans() uint32 {
	if m != nil {
		return m.TcpiRetrans
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiFackets() uint32 {
	if m != nil {
		return m.TcpiFackets
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiLastDataSent() uint32 {
	if m != nil {
		return m.TcpiLastDataSent
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiLastAckSent() uint32 {
	if m != nil {
		return m.TcpiLastAckSent
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiLastDataRecv() uint32 {
	if m != nil {
		return m.TcpiLastDataRecv
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiLastAckRecv() uint32 {
	if m != nil {
		return m.TcpiLastAckRecv
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiPmtu() uint32 {
	if m != nil {
		return m.TcpiPmtu
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRcvSsthresh() uint32 {
	if m != nil {
		return m.TcpiRcvSsthresh
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRtt() uint32 {
	if m != nil {
		return m.TcpiRtt
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiRttvar() uint32 {
	if m != nil {
		return m.TcpiRttvar
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiSndSsthresh() uint32 {
	if m != nil {
		return m.TcpiSndSsthresh
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiSndCwnd() uint32 {
	if m != nil {
		return m.TcpiSndCwnd
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiAdvmss() uint32 {
	if m != nil {
		return m.TcpiAdvmss
	}
	return 0
}

func (m *SocketOptionTcpInfo) GetTcpiReordering() uint32 {
	if m != nil {
		return m.TcpiReordering
	}
	return 0
}

type GetTopChannelsRequest struct {
	// start_channel_id indicates that only channels at or above this id should be
	// included in the results.
	// To request the first page, this should be set to 0. To request
	// subsequent pages, the client generates this value by adding 1 to
	// the highest seen result ID.
	StartChannelId int64 `protobuf:"varint,1,opt,name=start_channel_id,json=startChannelId,proto3" json:"start_channel_id,omitempty"`
	// If non-zero, the server will return a page of results containing
	// at most this many items. If zero, the server will choose a
	// reasonable page size.  Must never be negative.
	MaxResults           int64    `protobuf:"varint,2,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetTopChannelsRequest proto.InternalMessageInfo

func (m *GetTopChannelsRequest) GetStartChannelId() int64 {
	if m != nil {
		return m.StartChannelId
	}
	return 0
}

func (m *GetTopChannelsRequest) GetMaxResults() int64 {
	if m != nil {
		return m.MaxResults
	}
	return 0
}

type GetTopChannelsResponse struct {
	// list of channels that the connection detail service knows about.  Sorted in
	// ascending channel_id order.
	// Must contain at least 1 result, otherwise 'end' must be true.
	Channel []*Channel `protobuf:"bytes,1,rep,name=channel,proto3" json:"channel,omitempty"`
	// If set, indicates that the list of channels is the final list.  Requesting
	// more channels can only return more if they are created after this RPC
	// completes.
	End                  bool     `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetTopChannelsResponse proto.InternalMessageInfo

func (m *GetTopChannelsResponse) GetChannel() []*Channel {
	if m != nil {
		return m.Channel
	}
	return nil
}

func (m *GetTopChannelsResponse) GetEnd() bool {
	if m != nil {
		return m.End
	}
	return false
}

type GetServersRequest struct {
	// start_server_id indicates that only servers at or above this id should be
	// included in the results.
	// To request the first page, this must be set to 0. To request
	// subsequent pages, the client generates this value by adding 1 to
	// the highest seen result ID.
	StartServerId int64 `protobuf:"varint,1,opt,name=start_server_id,json=startServerId,proto3" json:"start_server_id,omitempty"`
	// If non-zero, the server will return a page of results containing
	// at most this many items. If zero, the server will choose a
	// reasonable page size.  Must never be negative.
	MaxResults           int64    `protobuf:"varint,2,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetServersRequest proto.InternalMessageInfo

func (m *GetServersRequest) GetStartServerId() int64 {
	if m != nil {
		return m.StartServerId
	}
	return 0
}

func (m *GetServersRequest) GetMaxResults() int64 {
	if m != nil {
		return m.MaxResults
	}
	return 0
}

type GetServersResponse struct {
	// list of servers that the connection detail service knows about.  Sorted in
	// ascending server_id order.
	// Must contain at least 1 result, otherwise 'end' must be true.
	Server []*Server `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"`
	// If set, indicates that the list of servers is the final list.  Requesting
	// more servers will only return more if they are created after this RPC
	// completes.
	End                  bool     `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetServersResponse proto.InternalMessageInfo

func (m *GetServersResponse) GetServer() []*Server {
	if m != nil {
		return m.Server
	}
	return nil
}

func (m *GetServersResponse) GetEnd() bool {
	if m != nil {
		return m.End
	}
	return false
}

type GetServerRequest struct {
	// server_id is the identifier of the specific server to get.
	ServerId             int64    `protobuf:"varint,1,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetServerRequest proto.InternalMessageInfo

func (m *GetServerRequest) GetServerId() int64 {
	if m != nil {
		return m.ServerId
	}
	return 0
}

type GetServerResponse struct {
	// The Server that corresponds to the requested server_id.  This field
	// should be set.
	Server               *Server  `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetServerResponse proto.InternalMessageInfo

func (m *GetServerResponse) GetServer() *Server {
	if m != nil {
		return m.Server
	}
	return nil
}

type GetServerSocketsRequest struct {
	ServerId int64 `protobuf:"varint,1,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
	// start_socket_id indicates that only sockets at or above this id should be
	// included in the results.
	// To request the first page, this must be set to 0. To request
	// subsequent pages, the client generates this value by adding 1 to
	// the highest seen result ID.
	StartSocketId int64 `protobuf:"varint,2,opt,name=start_socket_id,json=startSocketId,proto3" json:"start_socket_id,omitempty"`
	// If non-zero, the server will return a page of results containing
	// at most this many items. If zero, the server will choose a
	// reasonable page size.  Must never be negative.
	MaxResults           int64    `protobuf:"varint,3,opt,name=max_results,json=maxResults,proto3" json:"max_results,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetServerSocketsRequest proto.InternalMessageInfo

func (m *GetServerSocketsRequest) GetServerId() int64 {
	if m != nil {
		return m.ServerId
	}
	return 0
}

func (m *GetServerSocketsRequest) GetStartSocketId() int64 {
	if m != nil {
		return m.StartSocketId
	}
	return 0
}

func (m *GetServerSocketsRequest) GetMaxResults() int64 {
	if m != nil {
		return m.MaxResults
	}
	return 0
}

type GetServerSocketsResponse struct {
	// list of socket refs that the connection detail service knows about.  Sorted in
	// ascending socket_id order.
	// Must contain at least 1 result, otherwise 'end' must be true.
	SocketRef []*SocketRef `protobuf:"bytes,1,rep,name=socket_ref,json=socketRef,proto3" json:"socket_ref,omitempty"`
	// If set, indicates that the list of sockets is the final list.  Requesting
	// more sockets will only return more if they are created after this RPC
	// completes.
	End                  bool     `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetServerSocketsResponse proto.InternalMessageInfo

func (m *GetServerSocketsResponse) GetSocketRef() []*SocketRef {
	if m != nil {
		return m.SocketRef
	}
	return nil
}

func (m *GetServerSocketsResponse) GetEnd() bool {
	if m != nil {
		return m.End
	}
	return false
}

type GetChannelRequest struct {
	// channel_id is the identifier of the specific channel to get.
	ChannelId            int64    `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetChannelRequest proto.InternalMessageInfo

func (m *GetChannelRequest) GetChannelId() int64 {
	if m != nil {
		return m.ChannelId
	}
	return 0
}

type GetChannelResponse struct {
	// The Channel that corresponds to the requested channel_id.  This field
	// should be set.
	Channel              *Channel `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetChannelResponse proto.InternalMessageInfo

func (m *GetChannelResponse) GetChannel() *Channel {
	if m != nil {
		return m.Channel
	}
	return nil
}

type GetSubchannelRequest struct {
	// subchannel_id is the identifier of the specific subchannel to get.
	SubchannelId         int64    `protobuf:"varint,1,opt,name=subchannel_id,json=subchannelId,proto3" json:"subchannel_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetSubchannelRequest proto.InternalMessageInfo

func (m *GetSubchannelRequest) GetSubchannelId() int64 {
	if m != nil {
		return m.SubchannelId
	}
	return 0
}

type GetSubchannelResponse struct {
	// The Subchannel that corresponds to the requested subchannel_id.  This
	// field should be set.
	Subchannel           *Subchannel `protobuf:"bytes,1,opt,name=subchannel,proto3" json:"subchannel,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

var xxx_messageInfo_GetSubchannelResponse proto.InternalMessageInfo

func (m *GetSubchannelResponse) GetSubchannel() *Subchannel {
	if m != nil {
		return m.Subchannel
	}
	return nil
}

type GetSocketRequest struct {
	// socket_id is the identifier of the specific socket to get.
	SocketId int64 `protobuf:"varint,1,opt,name=socket_id,json=socketId,proto3" json:"socket_id,omitempty"`
	// If true, the response will contain only high level information
	// that is inexpensive to obtain. Fields thay may be omitted are
	// documented.
	Summary              bool     `protobuf:"varint,2,opt,name=summary,proto3" json:"summary,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetSocketRequest proto.InternalMessageInfo

func (m *GetSocketRequest) GetSocketId() int64 {
	if m != nil {
		return m.SocketId
	}
	return 0
}

func (m *GetSocketRequest) GetSummary() bool {
	if m != nil {
		return m.Summary
	}
	return false
}

type GetSocketResponse struct {
	// The Socket that corresponds to the requested socket_id.  This field
	// should be set.
	Socket               *Socket  `protobuf:"bytes,1,opt,name=socket,proto3" json:"socket,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

var xxx_messageInfo_GetSocketResponse proto.InternalMessageInfo

func (m *GetSocketResponse) GetSocket() *Socket {
	if m != nil {
		return m.Socket
	}
	return nil
}

func init() {
	proto.RegisterType((*Channel)(nil), "grpc.channelz.v1.Channel")
	proto.RegisterType((*Subchannel)(nil), "grpc.channelz.v1.Subchannel")
	proto.RegisterType((*ChannelConnectivityState)(nil), "grpc.channelz.v1.ChannelConnectivityState")
	proto.RegisterType((*ChannelData)(nil), "grpc.channelz.v1.ChannelData")
	proto.RegisterType((*ChannelTraceEvent)(nil), "grpc.channelz.v1.ChannelTraceEvent")
	proto.RegisterType((*ChannelTrace)(nil), "grpc.channelz.v1.ChannelTrace")
	proto.RegisterType((*ChannelRef)(nil), "grpc.channelz.v1.ChannelRef")
	proto.RegisterType((*SubchannelRef)(nil), "grpc.channelz.v1.SubchannelRef")
	proto.RegisterType((*SocketRef)(nil), "grpc.channelz.v1.SocketRef")
	proto.RegisterType((*ServerRef)(nil), "grpc.channelz.v1.ServerRef")
	proto.RegisterType((*Server)(nil), "grpc.channelz.v1.Server")
	proto.RegisterType((*ServerData)(nil), "grpc.channelz.v1.ServerData")
	proto.RegisterType((*Socket)(nil), "grpc.channelz.v1.Socket")
	proto.RegisterType((*SocketData)(nil), "grpc.channelz.v1.SocketData")
	proto.RegisterType((*Address)(nil), "grpc.channelz.v1.Address")
	proto.RegisterType((*Address_TcpIpAddress)(nil), "grpc.channelz.v1.Address.TcpIpAddress")
	proto.RegisterType((*Address_UdsAddress)(nil), "grpc.channelz.v1.Address.UdsAddress")
	proto.RegisterType((*Address_OtherAddress)(nil), "grpc.channelz.v1.Address.OtherAddress")
	proto.RegisterType((*Security)(nil), "grpc.channelz.v1.Security")
	proto.RegisterType((*Security_Tls)(nil), "grpc.channelz.v1.Security.Tls")
	proto.RegisterType((*Security_OtherSecurity)(nil), "grpc.channelz.v1.Security.OtherSecurity")
	proto.RegisterType((*SocketOption)(nil), "grpc.channelz.v1.SocketOption")
	proto.RegisterType((*SocketOptionTimeout)(nil), "grpc.channelz.v1.SocketOptionTimeout")
	proto.RegisterType((*SocketOptionLinger)(nil), "grpc.channelz.v1.SocketOptionLinger")
	proto.RegisterType((*SocketOptionTcpInfo)(nil), "grpc.channelz.v1.SocketOptionTcpInfo")
	proto.RegisterType((*GetTopChannelsRequest)(nil), "grpc.channelz.v1.GetTopChannelsRequest")
	proto.RegisterType((*GetTopChannelsResponse)(nil), "grpc.channelz.v1.GetTopChannelsResponse")
	proto.RegisterType((*GetServersRequest)(nil), "grpc.channelz.v1.GetServersRequest")
	proto.RegisterType((*GetServersResponse)(nil), "grpc.channelz.v1.GetServersResponse")
	proto.RegisterType((*GetServerRequest)(nil), "grpc.channelz.v1.GetServerRequest")
	proto.RegisterType((*GetServerResponse)(nil), "grpc.channelz.v1.GetServerResponse")
	proto.RegisterType((*GetServerSocketsRequest)(nil), "grpc.channelz.v1.GetServerSocketsRequest")
	proto.RegisterType((*GetServerSocketsResponse)(nil), "grpc.channelz.v1.GetServerSocketsResponse")
	proto.RegisterType((*GetChannelRequest)(nil), "grpc.channelz.v1.GetChannelRequest")
	proto.RegisterType((*GetChannelResponse)(nil), "grpc.channelz.v1.GetChannelResponse")
	proto.RegisterType((*GetSubchannelRequest)(nil), "grpc.channelz.v1.GetSubchannelRequest")
	proto.RegisterType((*GetSubchannelResponse)(nil), "grpc.channelz.v1.GetSubchannelResponse")
	proto.RegisterType((*GetSocketRequest)(nil), "grpc.channelz.v1.GetSocketRequest")
	proto.RegisterType((*GetSocketResponse)(nil), "grpc.channelz.v1.GetSocketResponse")
	proto.RegisterEnum("grpc.channelz.v1.ChannelConnectivityState_State", ChannelConnectivityState_State_name, ChannelConnectivityState_State_value)
	proto.RegisterEnum("grpc.channelz.v1.ChannelTraceEvent_Severity", ChannelTraceEvent_Severity_name, ChannelTraceEvent_Severity_value)
}

// 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

// ChannelzClient is the client API for Channelz service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ChannelzClient interface {
	// Gets all root channels (i.e. channels the application has directly
	// created). This does not include subchannels nor non-top level channels.
	GetTopChannels(ctx context.Context, in *GetTopChannelsRequest, opts ...grpc.CallOption) (*GetTopChannelsResponse, error)
	// Gets all servers that exist in the process.
	GetServers(ctx context.Context, in *GetServersRequest, opts ...grpc.CallOption) (*GetServersResponse, error)
	// Returns a single Server, or else a NOT_FOUND code.
	GetServer(ctx context.Context, in *GetServerRequest, opts ...grpc.CallOption) (*GetServerResponse, error)
	// Gets all server sockets that exist in the process.
	GetServerSockets(ctx context.Context, in *GetServerSocketsRequest, opts ...grpc.CallOption) (*GetServerSocketsResponse, error)
	// Returns a single Channel, or else a NOT_FOUND code.
	GetChannel(ctx context.Context, in *GetChannelRequest, opts ...grpc.CallOption) (*GetChannelResponse, error)
	// Returns a single Subchannel, or else a NOT_FOUND code.
	GetSubchannel(ctx context.Context, in *GetSubchannelRequest, opts ...grpc.CallOption) (*GetSubchannelResponse, error)
	// Returns a single Socket or else a NOT_FOUND code.
	GetSocket(ctx context.Context, in *GetSocketRequest, opts ...grpc.CallOption) (*GetSocketResponse, error)
}

type channelzClient struct {
	cc *grpc.ClientConn
}

func NewChannelzClient(cc *grpc.ClientConn) ChannelzClient {
	return &channelzClient{cc}
}

func (c *channelzClient) GetTopChannels(ctx context.Context, in *GetTopChannelsRequest, opts ...grpc.CallOption) (*GetTopChannelsResponse, error) {
	out := new(GetTopChannelsResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetTopChannels", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *channelzClient) GetServers(ctx context.Context, in *GetServersRequest, opts ...grpc.CallOption) (*GetServersResponse, error) {
	out := new(GetServersResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetServers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *channelzClient) GetServer(ctx context.Context, in *GetServerRequest, opts ...grpc.CallOption) (*GetServerResponse, error) {
	out := new(GetServerResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *channelzClient) GetServerSockets(ctx context.Context, in *GetServerSocketsRequest, opts ...grpc.CallOption) (*GetServerSocketsResponse, error) {
	out := new(GetServerSocketsResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetServerSockets", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *channelzClient) GetChannel(ctx context.Context, in *GetChannelRequest, opts ...grpc.CallOption) (*GetChannelResponse, error) {
	out := new(GetChannelResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetChannel", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *channelzClient) GetSubchannel(ctx context.Context, in *GetSubchannelRequest, opts ...grpc.CallOption) (*GetSubchannelResponse, error) {
	out := new(GetSubchannelResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetSubchannel", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *channelzClient) GetSocket(ctx context.Context, in *GetSocketRequest, opts ...grpc.CallOption) (*GetSocketResponse, error) {
	out := new(GetSocketResponse)
	err := c.cc.Invoke(ctx, "/grpc.channelz.v1.Channelz/GetSocket", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ChannelzServer is the server API for Channelz service.
type ChannelzServer interface {
	// Gets all root channels (i.e. channels the application has directly
	// created). This does not include subchannels nor non-top level channels.
	GetTopChannels(context.Context, *GetTopChannelsRequest) (*GetTopChannelsResponse, error)
	// Gets all servers that exist in the process.
	GetServers(context.Context, *GetServersRequest) (*GetServersResponse, error)
	// Returns a single Server, or else a NOT_FOUND code.
	GetServer(context.Context, *GetServerRequest) (*GetServerResponse, error)
	// Gets all server sockets that exist in the process.
	GetServerSockets(context.Context, *GetServerSocketsRequest) (*GetServerSocketsResponse, error)
	// Returns a single Channel, or else a NOT_FOUND code.
	GetChannel(context.Context, *GetChannelRequest) (*GetChannelResponse, error)
	// Returns a single Subchannel, or else a NOT_FOUND code.
	GetSubchannel(context.Context, *GetSubchannelRequest) (*GetSubchannelResponse, error)
	// Returns a single Socket or else a NOT_FOUND code.
	GetSocket(context.Context, *GetSocketRequest) (*GetSocketResponse, error)
}

func RegisterChannelzServer(s *grpc.Server, srv ChannelzServer) {
	s.RegisterService(&_Channelz_serviceDesc, srv)
}

func _Channelz_GetTopChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTopChannelsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetTopChannels(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetTopChannels",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetTopChannels(ctx, req.(*GetTopChannelsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Channelz_GetServers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServersRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetServers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetServers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetServers(ctx, req.(*GetServersRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Channelz_GetServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetServer(ctx, req.(*GetServerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Channelz_GetServerSockets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServerSocketsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetServerSockets(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetServerSockets",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetServerSockets(ctx, req.(*GetServerSocketsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Channelz_GetChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetChannelRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetChannel(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetChannel",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetChannel(ctx, req.(*GetChannelRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Channelz_GetSubchannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetSubchannelRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetSubchannel(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetSubchannel",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetSubchannel(ctx, req.(*GetSubchannelRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Channelz_GetSocket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetSocketRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ChannelzServer).GetSocket(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/grpc.channelz.v1.Channelz/GetSocket",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ChannelzServer).GetSocket(ctx, req.(*GetSocketRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Channelz_serviceDesc = grpc.ServiceDesc{
	ServiceName: "grpc.channelz.v1.Channelz",
	HandlerType: (*ChannelzServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetTopChannels",
			Handler:    _Channelz_GetTopChannels_Handler,
		},
		{
			MethodName: "GetServers",
			Handler:    _Channelz_GetServers_Handler,
		},
		{
			MethodName: "GetServer",
			Handler:    _Channelz_GetServer_Handler,
		},
		{
			MethodName: "GetServerSockets",
			Handler:    _Channelz_GetServerSockets_Handler,
		},
		{
			MethodName: "GetChannel",
			Handler:    _Channelz_GetChannel_Handler,
		},
		{
			MethodName: "GetSubchannel",
			Handler:    _Channelz_GetSubchannel_Handler,
		},
		{
			MethodName: "GetSocket",
			Handler:    _Channelz_GetSocket_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "grpc/channelz/v1/channelz.proto",
}

func init() {
	proto.RegisterFile("grpc/channelz/v1/channelz.proto", fileDescriptor_channelz_449295370a82a4c0)
}

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