// Copyright 2018 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v3.17.1
// source: backend/backend.proto

package backend

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type LocalBackend struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// address of exec server. default "exec-server:5050"
	ExecAddr string `protobuf:"bytes,1,opt,name=exec_addr,json=execAddr,proto3" json:"exec_addr,omitempty"`
	// address of file server. default "file-server:5050"
	FileAddr string `protobuf:"bytes,2,opt,name=file_addr,json=fileAddr,proto3" json:"file_addr,omitempty"`
	// address of execlog server. default "execlog-server:5050"
	ExeclogAddr      string                    `protobuf:"bytes,3,opt,name=execlog_addr,json=execlogAddr,proto3" json:"execlog_addr,omitempty"`
	EnableBytestream bool                      `protobuf:"varint,4,opt,name=enable_bytestream,json=enableBytestream,proto3" json:"enable_bytestream,omitempty"`
	TraceOption      *LocalBackend_TraceOption `protobuf:"bytes,5,opt,name=trace_option,json=traceOption,proto3" json:"trace_option,omitempty"`
}

func (x *LocalBackend) Reset() {
	*x = LocalBackend{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *LocalBackend) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LocalBackend) ProtoMessage() {}

func (x *LocalBackend) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LocalBackend.ProtoReflect.Descriptor instead.
func (*LocalBackend) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{0}
}

func (x *LocalBackend) GetExecAddr() string {
	if x != nil {
		return x.ExecAddr
	}
	return ""
}

func (x *LocalBackend) GetFileAddr() string {
	if x != nil {
		return x.FileAddr
	}
	return ""
}

func (x *LocalBackend) GetExeclogAddr() string {
	if x != nil {
		return x.ExeclogAddr
	}
	return ""
}

func (x *LocalBackend) GetEnableBytestream() bool {
	if x != nil {
		return x.EnableBytestream
	}
	return false
}

func (x *LocalBackend) GetTraceOption() *LocalBackend_TraceOption {
	if x != nil {
		return x.TraceOption
	}
	return nil
}

type HttpRpcBackend struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// target URL (scheme + host).
	// request query will be preserved.
	// e.g. "https://clients5.google.com/cxx-compiler-service"
	Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
}

func (x *HttpRpcBackend) Reset() {
	*x = HttpRpcBackend{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *HttpRpcBackend) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HttpRpcBackend) ProtoMessage() {}

func (x *HttpRpcBackend) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HttpRpcBackend.ProtoReflect.Descriptor instead.
func (*HttpRpcBackend) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{1}
}

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

type RemoteBackend struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// target address.
	// e.g. "goma.endpoints.goma-dev.cloud.goog:443"
	Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	// api_key to access the backend.
	// it is used to read api_key value in api-keys volume.
	ApiKeyName string `protobuf:"bytes,2,opt,name=api_key_name,json=apiKeyName,proto3" json:"api_key_name,omitempty"`
}

func (x *RemoteBackend) Reset() {
	*x = RemoteBackend{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RemoteBackend) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RemoteBackend) ProtoMessage() {}

func (x *RemoteBackend) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RemoteBackend.ProtoReflect.Descriptor instead.
func (*RemoteBackend) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{2}
}

func (x *RemoteBackend) GetAddress() string {
	if x != nil {
		return x.Address
	}
	return ""
}

func (x *RemoteBackend) GetApiKeyName() string {
	if x != nil {
		return x.ApiKeyName
	}
	return ""
}

type BackendMapping struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// id of group that uses the backend.
	// group id matches with group id in ACL if not empty.
	// empty group id will be used as default backend.
	GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	// backend selection by query parameters, encoded form sorted by key
	// as same as https://golang.org/pkg/net/url/#Values.Encode
	// if specified, this backend will be used if all query parameters
	// matches with query_params.
	// if query_params is empty, any requests will match.
	//
	// it is not used for default backend (empty group id). i.e.
	// if group_id is empty, query_params must be empty.
	QueryParams string `protobuf:"bytes,4,opt,name=query_params,json=queryParams,proto3" json:"query_params,omitempty"`
	// backend for the group.
	//
	// Types that are assignable to Backend:
	//	*BackendMapping_HttpRpc
	//	*BackendMapping_Remote
	Backend isBackendMapping_Backend `protobuf_oneof:"backend"`
}

func (x *BackendMapping) Reset() {
	*x = BackendMapping{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BackendMapping) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BackendMapping) ProtoMessage() {}

func (x *BackendMapping) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BackendMapping.ProtoReflect.Descriptor instead.
func (*BackendMapping) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{3}
}

func (x *BackendMapping) GetGroupId() string {
	if x != nil {
		return x.GroupId
	}
	return ""
}

func (x *BackendMapping) GetQueryParams() string {
	if x != nil {
		return x.QueryParams
	}
	return ""
}

func (m *BackendMapping) GetBackend() isBackendMapping_Backend {
	if m != nil {
		return m.Backend
	}
	return nil
}

func (x *BackendMapping) GetHttpRpc() *HttpRpcBackend {
	if x, ok := x.GetBackend().(*BackendMapping_HttpRpc); ok {
		return x.HttpRpc
	}
	return nil
}

func (x *BackendMapping) GetRemote() *RemoteBackend {
	if x, ok := x.GetBackend().(*BackendMapping_Remote); ok {
		return x.Remote
	}
	return nil
}

type isBackendMapping_Backend interface {
	isBackendMapping_Backend()
}

type BackendMapping_HttpRpc struct {
	HttpRpc *HttpRpcBackend `protobuf:"bytes,2,opt,name=http_rpc,json=httpRpc,proto3,oneof"`
}

type BackendMapping_Remote struct {
	Remote *RemoteBackend `protobuf:"bytes,3,opt,name=remote,proto3,oneof"`
}

func (*BackendMapping_HttpRpc) isBackendMapping_Backend() {}

func (*BackendMapping_Remote) isBackendMapping_Backend() {}

type BackendRule struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Backends []*BackendMapping `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"`
}

func (x *BackendRule) Reset() {
	*x = BackendRule{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BackendRule) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BackendRule) ProtoMessage() {}

func (x *BackendRule) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BackendRule.ProtoReflect.Descriptor instead.
func (*BackendRule) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{4}
}

func (x *BackendRule) GetBackends() []*BackendMapping {
	if x != nil {
		return x.Backends
	}
	return nil
}

type BackendConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Backend:
	//	*BackendConfig_Local
	//	*BackendConfig_HttpRpc
	//	*BackendConfig_Remote
	//	*BackendConfig_Rule
	Backend isBackendConfig_Backend `protobuf_oneof:"backend"`
}

func (x *BackendConfig) Reset() {
	*x = BackendConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BackendConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BackendConfig) ProtoMessage() {}

func (x *BackendConfig) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BackendConfig.ProtoReflect.Descriptor instead.
func (*BackendConfig) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{5}
}

func (m *BackendConfig) GetBackend() isBackendConfig_Backend {
	if m != nil {
		return m.Backend
	}
	return nil
}

func (x *BackendConfig) GetLocal() *LocalBackend {
	if x, ok := x.GetBackend().(*BackendConfig_Local); ok {
		return x.Local
	}
	return nil
}

func (x *BackendConfig) GetHttpRpc() *HttpRpcBackend {
	if x, ok := x.GetBackend().(*BackendConfig_HttpRpc); ok {
		return x.HttpRpc
	}
	return nil
}

func (x *BackendConfig) GetRemote() *RemoteBackend {
	if x, ok := x.GetBackend().(*BackendConfig_Remote); ok {
		return x.Remote
	}
	return nil
}

func (x *BackendConfig) GetRule() *BackendRule {
	if x, ok := x.GetBackend().(*BackendConfig_Rule); ok {
		return x.Rule
	}
	return nil
}

type isBackendConfig_Backend interface {
	isBackendConfig_Backend()
}

type BackendConfig_Local struct {
	// for frontend in backend cluster.
	Local *LocalBackend `protobuf:"bytes,1,opt,name=local,proto3,oneof"`
}

type BackendConfig_HttpRpc struct {
	// debug only.
	HttpRpc *HttpRpcBackend `protobuf:"bytes,2,opt,name=http_rpc,json=httpRpc,proto3,oneof"`
}

type BackendConfig_Remote struct {
	Remote *RemoteBackend `protobuf:"bytes,3,opt,name=remote,proto3,oneof"`
}

type BackendConfig_Rule struct {
	// for frontend-mixer
	Rule *BackendRule `protobuf:"bytes,4,opt,name=rule,proto3,oneof"`
}

func (*BackendConfig_Local) isBackendConfig_Backend() {}

func (*BackendConfig_HttpRpc) isBackendConfig_Backend() {}

func (*BackendConfig_Remote) isBackendConfig_Backend() {}

func (*BackendConfig_Rule) isBackendConfig_Backend() {}

// attributes for cloud tracing when handling this backend request.
type LocalBackend_TraceOption struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"`
	Cluster   string `protobuf:"bytes,2,opt,name=cluster,proto3" json:"cluster,omitempty"`
}

func (x *LocalBackend_TraceOption) Reset() {
	*x = LocalBackend_TraceOption{}
	if protoimpl.UnsafeEnabled {
		mi := &file_backend_backend_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *LocalBackend_TraceOption) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LocalBackend_TraceOption) ProtoMessage() {}

func (x *LocalBackend_TraceOption) ProtoReflect() protoreflect.Message {
	mi := &file_backend_backend_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LocalBackend_TraceOption.ProtoReflect.Descriptor instead.
func (*LocalBackend_TraceOption) Descriptor() ([]byte, []int) {
	return file_backend_backend_proto_rawDescGZIP(), []int{0, 0}
}

func (x *LocalBackend_TraceOption) GetNamespace() string {
	if x != nil {
		return x.Namespace
	}
	return ""
}

func (x *LocalBackend_TraceOption) GetCluster() string {
	if x != nil {
		return x.Cluster
	}
	return ""
}

var File_backend_backend_proto protoreflect.FileDescriptor

var file_backend_backend_proto_rawDesc = []byte{
	0x0a, 0x15, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e,
	0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
	0x22, 0xa5, 0x02, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e,
	0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1b,
	0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x65,
	0x78, 0x65, 0x63, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x6c, 0x6f, 0x67, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b,
	0x0a, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x74, 0x72,
	0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x44, 0x0a, 0x0c, 0x74,
	0x72, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x21, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4c, 0x6f, 0x63, 0x61,
	0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x4f, 0x70,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x1a, 0x45, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18,
	0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x28, 0x0a, 0x0e, 0x48, 0x74, 0x74, 0x70,
	0x52, 0x70, 0x63, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x22, 0x4b, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b,
	0x65, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a,
	0x0c, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22,
	0xc1, 0x01, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69,
	0x6e, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a,
	0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
	0x12, 0x34, 0x0a, 0x08, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74,
	0x70, 0x52, 0x70, 0x63, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x07, 0x68,
	0x74, 0x74, 0x70, 0x52, 0x70, 0x63, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x48, 0x00,
	0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b,
	0x65, 0x6e, 0x64, 0x22, 0x42, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x75,
	0x6c, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x42,
	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x62,
	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x22, 0xdd, 0x01, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b,
	0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x05, 0x6c, 0x6f, 0x63,
	0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65,
	0x6e, 0x64, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x48,
	0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x08, 0x68, 0x74, 0x74, 0x70,
	0x5f, 0x72, 0x70, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x61, 0x63,
	0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x70, 0x63, 0x42, 0x61, 0x63, 0x6b,
	0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x07, 0x68, 0x74, 0x74, 0x70, 0x52, 0x70, 0x63, 0x12, 0x30,
	0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42,
	0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
	0x12, 0x2a, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14,
	0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
	0x52, 0x75, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07,
	0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x6f, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x6f, 0x6d, 0x61, 0x2f,
	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x61, 0x63,
	0x6b, 0x65, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_backend_backend_proto_rawDescOnce sync.Once
	file_backend_backend_proto_rawDescData = file_backend_backend_proto_rawDesc
)

func file_backend_backend_proto_rawDescGZIP() []byte {
	file_backend_backend_proto_rawDescOnce.Do(func() {
		file_backend_backend_proto_rawDescData = protoimpl.X.CompressGZIP(file_backend_backend_proto_rawDescData)
	})
	return file_backend_backend_proto_rawDescData
}

var file_backend_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_backend_backend_proto_goTypes = []interface{}{
	(*LocalBackend)(nil),             // 0: backend.LocalBackend
	(*HttpRpcBackend)(nil),           // 1: backend.HttpRpcBackend
	(*RemoteBackend)(nil),            // 2: backend.RemoteBackend
	(*BackendMapping)(nil),           // 3: backend.BackendMapping
	(*BackendRule)(nil),              // 4: backend.BackendRule
	(*BackendConfig)(nil),            // 5: backend.BackendConfig
	(*LocalBackend_TraceOption)(nil), // 6: backend.LocalBackend.TraceOption
}
var file_backend_backend_proto_depIdxs = []int32{
	6, // 0: backend.LocalBackend.trace_option:type_name -> backend.LocalBackend.TraceOption
	1, // 1: backend.BackendMapping.http_rpc:type_name -> backend.HttpRpcBackend
	2, // 2: backend.BackendMapping.remote:type_name -> backend.RemoteBackend
	3, // 3: backend.BackendRule.backends:type_name -> backend.BackendMapping
	0, // 4: backend.BackendConfig.local:type_name -> backend.LocalBackend
	1, // 5: backend.BackendConfig.http_rpc:type_name -> backend.HttpRpcBackend
	2, // 6: backend.BackendConfig.remote:type_name -> backend.RemoteBackend
	4, // 7: backend.BackendConfig.rule:type_name -> backend.BackendRule
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	8, // [8:8] is the sub-list for extension type_name
	8, // [8:8] is the sub-list for extension extendee
	0, // [0:8] is the sub-list for field type_name
}

func init() { file_backend_backend_proto_init() }
func file_backend_backend_proto_init() {
	if File_backend_backend_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_backend_backend_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocalBackend); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_backend_backend_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HttpRpcBackend); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_backend_backend_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RemoteBackend); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_backend_backend_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BackendMapping); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_backend_backend_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BackendRule); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_backend_backend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BackendConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_backend_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocalBackend_TraceOption); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_backend_backend_proto_msgTypes[3].OneofWrappers = []interface{}{
		(*BackendMapping_HttpRpc)(nil),
		(*BackendMapping_Remote)(nil),
	}
	file_backend_backend_proto_msgTypes[5].OneofWrappers = []interface{}{
		(*BackendConfig_Local)(nil),
		(*BackendConfig_HttpRpc)(nil),
		(*BackendConfig_Remote)(nil),
		(*BackendConfig_Rule)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_backend_backend_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   7,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_backend_backend_proto_goTypes,
		DependencyIndexes: file_backend_backend_proto_depIdxs,
		MessageInfos:      file_backend_backend_proto_msgTypes,
	}.Build()
	File_backend_backend_proto = out.File
	file_backend_backend_proto_rawDesc = nil
	file_backend_backend_proto_goTypes = nil
	file_backend_backend_proto_depIdxs = nil
}
