// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/toolchain.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// TODO(crbug.com/1020615): Drop this once this is live in production and all of
// the users have migrated to using BuilderConfig.Artifacts.ArtifactType
// Meanwhile, keep this in sync with chromiumos/builder_config.proto.
type AFDOArtifactType int32

const (
	// No AFDO artifact type specified.
	AFDOArtifactType_NONE_TYPE AFDOArtifactType = 0
	// The type is orderfile.
	AFDOArtifactType_ORDERFILE AFDOArtifactType = 1
	// The type is Chrome AFDO files generated by benchmarks.
	AFDOArtifactType_BENCHMARK_AFDO AFDOArtifactType = 2
	// The type is kernel AFDO files.
	AFDOArtifactType_KERNEL_AFDO AFDOArtifactType = 3
	// The type is Chrome AFDO used in release builders.
	AFDOArtifactType_CHROME_AFDO AFDOArtifactType = 4
)

var AFDOArtifactType_name = map[int32]string{
	0: "NONE_TYPE",
	1: "ORDERFILE",
	2: "BENCHMARK_AFDO",
	3: "KERNEL_AFDO",
	4: "CHROME_AFDO",
}

var AFDOArtifactType_value = map[string]int32{
	"NONE_TYPE":      0,
	"ORDERFILE":      1,
	"BENCHMARK_AFDO": 2,
	"KERNEL_AFDO":    3,
	"CHROME_AFDO":    4,
}

func (x AFDOArtifactType) String() string {
	return proto.EnumName(AFDOArtifactType_name, int32(x))
}

func (AFDOArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{0}
}

// Does this artifact require a build?
type PrepareForToolchainBuildResponse_BuildRelevance int32

const (
	PrepareForToolchainBuildResponse_UNSPECIFIED PrepareForToolchainBuildResponse_BuildRelevance = 0
	// Build is necessary to generate artifacts.
	PrepareForToolchainBuildResponse_NEEDED PrepareForToolchainBuildResponse_BuildRelevance = 1
	// Defer to other artifacts.  Used primarily for aggregation of artifact
	// results.
	PrepareForToolchainBuildResponse_UNKNOWN PrepareForToolchainBuildResponse_BuildRelevance = 2
	// Artifacts are already generated.  The build is pointless.
	PrepareForToolchainBuildResponse_POINTLESS PrepareForToolchainBuildResponse_BuildRelevance = 3
)

var PrepareForToolchainBuildResponse_BuildRelevance_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NEEDED",
	2: "UNKNOWN",
	3: "POINTLESS",
}

var PrepareForToolchainBuildResponse_BuildRelevance_value = map[string]int32{
	"UNSPECIFIED": 0,
	"NEEDED":      1,
	"UNKNOWN":     2,
	"POINTLESS":   3,
}

func (x PrepareForToolchainBuildResponse_BuildRelevance) String() string {
	return proto.EnumName(PrepareForToolchainBuildResponse_BuildRelevance_name, int32(x))
}

func (PrepareForToolchainBuildResponse_BuildRelevance) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{2, 0}
}

// Information about a collection of artifacts.
type ArtifactInfo struct {
	// The ArtifactType.
	ArtifactType chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_type,omitempty"`
	// Artifacts for this ArtifactType.
	Artifacts            []*Artifact `protobuf:"bytes,2,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *ArtifactInfo) Reset()         { *m = ArtifactInfo{} }
func (m *ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactInfo) ProtoMessage()    {}
func (*ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{0}
}

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

var xxx_messageInfo_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactInfo) GetArtifactType() chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

func (m *ArtifactInfo) GetArtifacts() []*Artifact {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

// Prepare the build for artifact building.
type PrepareForToolchainBuildRequest struct {
	// The artifact types that this build should make.
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Note: both chroot and sysroot may be unspecified, when the endpoint is
	// called prior to their creation.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,3,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Information about artifacts available when preparing.
	InputArtifacts []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,4,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Additional arguments used in PrepareForBuild.
	AdditionalArgs       *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *PrepareForToolchainBuildRequest) Reset()         { *m = PrepareForToolchainBuildRequest{} }
func (m *PrepareForToolchainBuildRequest) String() string { return proto.CompactTextString(m) }
func (*PrepareForToolchainBuildRequest) ProtoMessage()    {}
func (*PrepareForToolchainBuildRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{1}
}

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

var xxx_messageInfo_PrepareForToolchainBuildRequest proto.InternalMessageInfo

func (m *PrepareForToolchainBuildRequest) GetArtifactTypes() []chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetInputArtifacts() []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetAdditionalArgs() *chromiumos.PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

// TODO(crbug/1019868): Migrate to using chromiumos.PrepareForBuildResponse.
type PrepareForToolchainBuildResponse struct {
	BuildRelevance       PrepareForToolchainBuildResponse_BuildRelevance `protobuf:"varint,1,opt,name=build_relevance,json=buildRelevance,proto3,enum=chromite.api.PrepareForToolchainBuildResponse_BuildRelevance" json:"build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
	XXX_unrecognized     []byte                                          `json:"-"`
	XXX_sizecache        int32                                           `json:"-"`
}

func (m *PrepareForToolchainBuildResponse) Reset()         { *m = PrepareForToolchainBuildResponse{} }
func (m *PrepareForToolchainBuildResponse) String() string { return proto.CompactTextString(m) }
func (*PrepareForToolchainBuildResponse) ProtoMessage()    {}
func (*PrepareForToolchainBuildResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{2}
}

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

var xxx_messageInfo_PrepareForToolchainBuildResponse proto.InternalMessageInfo

func (m *PrepareForToolchainBuildResponse) GetBuildRelevance() PrepareForToolchainBuildResponse_BuildRelevance {
	if m != nil {
		return m.BuildRelevance
	}
	return PrepareForToolchainBuildResponse_UNSPECIFIED
}

type BundleToolchainRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir string `protobuf:"bytes,3,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// Which artifacts are wanted?
	ArtifactTypes        []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,4,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
	XXX_unrecognized     []byte                                             `json:"-"`
	XXX_sizecache        int32                                              `json:"-"`
}

func (m *BundleToolchainRequest) Reset()         { *m = BundleToolchainRequest{} }
func (m *BundleToolchainRequest) String() string { return proto.CompactTextString(m) }
func (*BundleToolchainRequest) ProtoMessage()    {}
func (*BundleToolchainRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{3}
}

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

var xxx_messageInfo_BundleToolchainRequest proto.InternalMessageInfo

func (m *BundleToolchainRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *BundleToolchainRequest) GetSysroot() *Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *BundleToolchainRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

func (m *BundleToolchainRequest) GetArtifactTypes() []chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

// Response describing which bundles were dumped to the given output directory.
type BundleToolchainResponse struct {
	// The artifacts that added to the output directory.
	ArtifactsInfo        []*ArtifactInfo `protobuf:"bytes,2,rep,name=artifacts_info,json=artifactsInfo,proto3" json:"artifacts_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *BundleToolchainResponse) Reset()         { *m = BundleToolchainResponse{} }
func (m *BundleToolchainResponse) String() string { return proto.CompactTextString(m) }
func (*BundleToolchainResponse) ProtoMessage()    {}
func (*BundleToolchainResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{4}
}

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

var xxx_messageInfo_BundleToolchainResponse proto.InternalMessageInfo

func (m *BundleToolchainResponse) GetArtifactsInfo() []*ArtifactInfo {
	if m != nil {
		return m.ArtifactsInfo
	}
	return nil
}

type VerifyAFDOArtifactsRequest struct {
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The type of AFDO artifact to test.
	ArtifactType         chromiumos.AFDOArtifactType `protobuf:"varint,2,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.AFDOArtifactType" json:"artifact_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *VerifyAFDOArtifactsRequest) Reset()         { *m = VerifyAFDOArtifactsRequest{} }
func (m *VerifyAFDOArtifactsRequest) String() string { return proto.CompactTextString(m) }
func (*VerifyAFDOArtifactsRequest) ProtoMessage()    {}
func (*VerifyAFDOArtifactsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{5}
}

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

var xxx_messageInfo_VerifyAFDOArtifactsRequest proto.InternalMessageInfo

func (m *VerifyAFDOArtifactsRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *VerifyAFDOArtifactsRequest) GetArtifactType() chromiumos.AFDOArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.AFDOArtifactType_NONE_TYPE
}

type VerifyAFDOArtifactsResponse struct {
	// Status of the service
	Status               bool     `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *VerifyAFDOArtifactsResponse) Reset()         { *m = VerifyAFDOArtifactsResponse{} }
func (m *VerifyAFDOArtifactsResponse) String() string { return proto.CompactTextString(m) }
func (*VerifyAFDOArtifactsResponse) ProtoMessage()    {}
func (*VerifyAFDOArtifactsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{6}
}

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

var xxx_messageInfo_VerifyAFDOArtifactsResponse proto.InternalMessageInfo

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

func init() {
	proto.RegisterEnum("chromite.api.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromite.api.PrepareForToolchainBuildResponse_BuildRelevance", PrepareForToolchainBuildResponse_BuildRelevance_name, PrepareForToolchainBuildResponse_BuildRelevance_value)
	proto.RegisterType((*ArtifactInfo)(nil), "chromite.api.ArtifactInfo")
	proto.RegisterType((*PrepareForToolchainBuildRequest)(nil), "chromite.api.PrepareForToolchainBuildRequest")
	proto.RegisterType((*PrepareForToolchainBuildResponse)(nil), "chromite.api.PrepareForToolchainBuildResponse")
	proto.RegisterType((*BundleToolchainRequest)(nil), "chromite.api.BundleToolchainRequest")
	proto.RegisterType((*BundleToolchainResponse)(nil), "chromite.api.BundleToolchainResponse")
	proto.RegisterType((*VerifyAFDOArtifactsRequest)(nil), "chromite.api.VerifyAFDOArtifactsRequest")
	proto.RegisterType((*VerifyAFDOArtifactsResponse)(nil), "chromite.api.VerifyAFDOArtifactsResponse")
}

func init() { proto.RegisterFile("chromite/api/toolchain.proto", fileDescriptor_7ff43bdb7436d394) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// ToolchainServiceClient is the client API for ToolchainService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ToolchainServiceClient interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error)
}

type toolchainServiceClient struct {
	cc *grpc.ClientConn
}

func NewToolchainServiceClient(cc *grpc.ClientConn) ToolchainServiceClient {
	return &toolchainServiceClient{cc}
}

func (c *toolchainServiceClient) UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error) {
	out := new(PrepareForToolchainBuildResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/PrepareForBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error) {
	out := new(BundleToolchainResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/BundleArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ToolchainServiceServer is the server API for ToolchainService service.
type ToolchainServiceServer interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(context.Context, *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(context.Context, *BundleToolchainRequest) (*BundleToolchainResponse, error)
}

// UnimplementedToolchainServiceServer can be embedded to have forward compatible implementations.
type UnimplementedToolchainServiceServer struct {
}

func (*UnimplementedToolchainServiceServer) UpdateEbuildWithAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdateEbuildWithAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) UploadVettedAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UploadVettedAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) PrepareForBuild(ctx context.Context, req *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareForBuild not implemented")
}
func (*UnimplementedToolchainServiceServer) BundleArtifacts(ctx context.Context, req *BundleToolchainRequest) (*BundleToolchainResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleArtifacts not implemented")
}

func RegisterToolchainServiceServer(s *grpc.Server, srv ToolchainServiceServer) {
	s.RegisterService(&_ToolchainService_serviceDesc, srv)
}

func _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_UploadVettedAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_PrepareForBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PrepareForToolchainBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).PrepareForBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/PrepareForBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).PrepareForBuild(ctx, req.(*PrepareForToolchainBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_BundleArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleToolchainRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).BundleArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/BundleArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).BundleArtifacts(ctx, req.(*BundleToolchainRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ToolchainService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ToolchainService",
	HandlerType: (*ToolchainServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "UpdateEbuildWithAFDOArtifacts",
			Handler:    _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler,
		},
		{
			MethodName: "UploadVettedAFDOArtifacts",
			Handler:    _ToolchainService_UploadVettedAFDOArtifacts_Handler,
		},
		{
			MethodName: "PrepareForBuild",
			Handler:    _ToolchainService_PrepareForBuild_Handler,
		},
		{
			MethodName: "BundleArtifacts",
			Handler:    _ToolchainService_BundleArtifacts_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/toolchain.proto",
}
