// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/sysroot.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

// Sysroot information.
type Sysroot struct {
	// Sysroot location.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The build target used to create the sysroot.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_Sysroot proto.InternalMessageInfo

func (m *Sysroot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

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

// Information about the sysroot's profile.
type Profile struct {
	// The name of the profile.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Profile proto.InternalMessageInfo

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

// Sysroot create request.
type SysrootCreateRequest struct {
	// The target whose sysroot is being created.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The sysroot create flags.
	Flags *SysrootCreateRequest_Flags `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
	// The profile to select for the sysroot.
	Profile *Profile `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,4,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_SysrootCreateRequest proto.InternalMessageInfo

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

func (m *SysrootCreateRequest) GetFlags() *SysrootCreateRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

func (m *SysrootCreateRequest) GetProfile() *Profile {
	if m != nil {
		return m.Profile
	}
	return nil
}

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

// The Create flags.
type SysrootCreateRequest_Flags struct {
	// Triggers an update of the chroot unless the it is declared as current.
	ChrootCurrent bool `protobuf:"varint,1,opt,name=chroot_current,json=chrootCurrent,proto3" json:"chroot_current,omitempty"`
	// Replace the existing sysroot when one already exists when set to true,
	// otherwise keep the existing sysroot. No effect when the sysroot does not
	// exist.
	Replace bool `protobuf:"varint,2,opt,name=replace,proto3" json:"replace,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,3,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SysrootCreateRequest_Flags proto.InternalMessageInfo

func (m *SysrootCreateRequest_Flags) GetChrootCurrent() bool {
	if m != nil {
		return m.ChrootCurrent
	}
	return false
}

func (m *SysrootCreateRequest_Flags) GetReplace() bool {
	if m != nil {
		return m.Replace
	}
	return false
}

func (m *SysrootCreateRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

// Create response.
type SysrootCreateResponse struct {
	// Information about the created sysroot. This sysroot can be passed directly
	// to the InstallToolchainRequest.
	Sysroot              *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SysrootCreateResponse proto.InternalMessageInfo

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

// Sysroot generate archive request.
type SysrootGenerateArchiveRequest struct {
	// The target whose sysroot is being created.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Packages to generate the sysroot for, such as 'virtual/target-fuzzers'.
	// This is passed in based on the informaitonal builder type, see
	// chromite/config/chromeos_config.py for examples.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// Target directory for the sysroot tarball.
	TargetDir            *chromiumos.ResultPath `protobuf:"bytes,4,opt,name=target_dir,json=targetDir,proto3" json:"target_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_SysrootGenerateArchiveRequest proto.InternalMessageInfo

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

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

func (m *SysrootGenerateArchiveRequest) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *SysrootGenerateArchiveRequest) GetTargetDir() *chromiumos.ResultPath {
	if m != nil {
		return m.TargetDir
	}
	return nil
}

// Generate archive response.
type SysrootGenerateArchiveResponse struct {
	// Path where the sysroot tarball is written.
	SysrootArchive       *chromiumos.Path `protobuf:"bytes,1,opt,name=sysroot_archive,json=sysrootArchive,proto3" json:"sysroot_archive,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_SysrootGenerateArchiveResponse proto.InternalMessageInfo

func (m *SysrootGenerateArchiveResponse) GetSysrootArchive() *chromiumos.Path {
	if m != nil {
		return m.SysrootArchive
	}
	return nil
}

// Request to install the toolchain into the sysroot.
type InstallToolchainRequest struct {
	// The sysroot where the toolchain is being installed.
	// The path and build_target are required.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The flags for the install.
	Flags *InstallToolchainRequest_Flags `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_InstallToolchainRequest proto.InternalMessageInfo

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

func (m *InstallToolchainRequest) GetFlags() *InstallToolchainRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

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

// The install toolchain flags.
type InstallToolchainRequest_Flags struct {
	// Compile from source (true), or use bin packages (false).
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,2,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_InstallToolchainRequest_Flags proto.InternalMessageInfo

func (m *InstallToolchainRequest_Flags) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *InstallToolchainRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

type InstallToolchainResponse struct {
	// The packages that failed to install. Will populate at least the category
	// and package fields for any failed packages.
	FailedPackages       []*chromiumos.PackageInfo `protobuf:"bytes,1,rep,name=failed_packages,json=failedPackages,proto3" json:"failed_packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *InstallToolchainResponse) Reset()         { *m = InstallToolchainResponse{} }
func (m *InstallToolchainResponse) String() string { return proto.CompactTextString(m) }
func (*InstallToolchainResponse) ProtoMessage()    {}
func (*InstallToolchainResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{7}
}

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

var xxx_messageInfo_InstallToolchainResponse proto.InternalMessageInfo

func (m *InstallToolchainResponse) GetFailedPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.FailedPackages
	}
	return nil
}

type InstallPackagesRequest struct {
	// The sysroot into which the packages are being installed.
	// The path and build target are required.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The install packages flags.
	Flags *InstallPackagesRequest_Flags `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"`
	// A list of specific packages to install. Will generate the list of packages
	// for the build target if none are specified.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,4,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// USE flags to set before building the packages.
	UseFlags []*chromiumos.UseFlag `protobuf:"bytes,5,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// Goma Config.
	GomaConfig           *chromiumos.GomaConfig `protobuf:"bytes,6,opt,name=goma_config,json=gomaConfig,proto3" json:"goma_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *InstallPackagesRequest) Reset()         { *m = InstallPackagesRequest{} }
func (m *InstallPackagesRequest) String() string { return proto.CompactTextString(m) }
func (*InstallPackagesRequest) ProtoMessage()    {}
func (*InstallPackagesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{8}
}

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

var xxx_messageInfo_InstallPackagesRequest proto.InternalMessageInfo

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

func (m *InstallPackagesRequest) GetFlags() *InstallPackagesRequest_Flags {
	if m != nil {
		return m.Flags
	}
	return nil
}

func (m *InstallPackagesRequest) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

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

func (m *InstallPackagesRequest) GetUseFlags() []*chromiumos.UseFlag {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *InstallPackagesRequest) GetGomaConfig() *chromiumos.GomaConfig {
	if m != nil {
		return m.GomaConfig
	}
	return nil
}

type InstallPackagesRequest_Flags struct {
	// Compile from source (true), or use bin packages (false).
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Whether to start goma.
	UseGoma bool `protobuf:"varint,3,opt,name=use_goma,json=useGoma,proto3" json:"use_goma,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged     bool     `protobuf:"varint,4,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_InstallPackagesRequest_Flags proto.InternalMessageInfo

func (m *InstallPackagesRequest_Flags) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *InstallPackagesRequest_Flags) GetUseGoma() bool {
	if m != nil {
		return m.UseGoma
	}
	return false
}

func (m *InstallPackagesRequest_Flags) GetToolchainChanged() bool {
	if m != nil {
		return m.ToolchainChanged
	}
	return false
}

type InstallPackagesResponse struct {
	// The packages that failed to install. Will populate at least the category
	// and package fields for any failed packages.
	FailedPackages []*chromiumos.PackageInfo `protobuf:"bytes,1,rep,name=failed_packages,json=failedPackages,proto3" json:"failed_packages,omitempty"`
	// The metric events that occurred during the running of InstallPackages.
	Events []*chromiumos.MetricEvent `protobuf:"bytes,2,rep,name=events,proto3" json:"events,omitempty"`
	// Goma artifacts will only be populated if
	// InstallPackagesRequest.goma_config.log_dir was not empty.
	GomaArtifacts        *chromiumos.GomaArtifacts `protobuf:"bytes,3,opt,name=goma_artifacts,json=gomaArtifacts,proto3" json:"goma_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *InstallPackagesResponse) Reset()         { *m = InstallPackagesResponse{} }
func (m *InstallPackagesResponse) String() string { return proto.CompactTextString(m) }
func (*InstallPackagesResponse) ProtoMessage()    {}
func (*InstallPackagesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{9}
}

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

var xxx_messageInfo_InstallPackagesResponse proto.InternalMessageInfo

func (m *InstallPackagesResponse) GetFailedPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.FailedPackages
	}
	return nil
}

func (m *InstallPackagesResponse) GetEvents() []*chromiumos.MetricEvent {
	if m != nil {
		return m.Events
	}
	return nil
}

func (m *InstallPackagesResponse) GetGomaArtifacts() *chromiumos.GomaArtifacts {
	if m != nil {
		return m.GomaArtifacts
	}
	return nil
}

type CreateSimpleChromeSysrootRequest struct {
	// The board that is the build_target for the created sysroot.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Additional environment flags which are set via the ENV VAR 'USE'.
	UseFlags []string `protobuf:"bytes,2,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// Target directory for the sysroot tarball.
	TargetDir            *chromiumos.ResultPath `protobuf:"bytes,3,opt,name=target_dir,json=targetDir,proto3" json:"target_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *CreateSimpleChromeSysrootRequest) Reset()         { *m = CreateSimpleChromeSysrootRequest{} }
func (m *CreateSimpleChromeSysrootRequest) String() string { return proto.CompactTextString(m) }
func (*CreateSimpleChromeSysrootRequest) ProtoMessage()    {}
func (*CreateSimpleChromeSysrootRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{10}
}

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

var xxx_messageInfo_CreateSimpleChromeSysrootRequest proto.InternalMessageInfo

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

func (m *CreateSimpleChromeSysrootRequest) GetUseFlags() []string {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *CreateSimpleChromeSysrootRequest) GetTargetDir() *chromiumos.ResultPath {
	if m != nil {
		return m.TargetDir
	}
	return nil
}

type CreateSimpleChromeSysrootResponse struct {
	// Path where the sysroot tarball is written.
	SysrootArchive       *chromiumos.Path `protobuf:"bytes,1,opt,name=sysroot_archive,json=sysrootArchive,proto3" json:"sysroot_archive,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *CreateSimpleChromeSysrootResponse) Reset()         { *m = CreateSimpleChromeSysrootResponse{} }
func (m *CreateSimpleChromeSysrootResponse) String() string { return proto.CompactTextString(m) }
func (*CreateSimpleChromeSysrootResponse) ProtoMessage()    {}
func (*CreateSimpleChromeSysrootResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f8efa85b3e33e938, []int{11}
}

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

var xxx_messageInfo_CreateSimpleChromeSysrootResponse proto.InternalMessageInfo

func (m *CreateSimpleChromeSysrootResponse) GetSysrootArchive() *chromiumos.Path {
	if m != nil {
		return m.SysrootArchive
	}
	return nil
}

func init() {
	proto.RegisterType((*Sysroot)(nil), "chromite.api.Sysroot")
	proto.RegisterType((*Profile)(nil), "chromite.api.Profile")
	proto.RegisterType((*SysrootCreateRequest)(nil), "chromite.api.SysrootCreateRequest")
	proto.RegisterType((*SysrootCreateRequest_Flags)(nil), "chromite.api.SysrootCreateRequest.Flags")
	proto.RegisterType((*SysrootCreateResponse)(nil), "chromite.api.SysrootCreateResponse")
	proto.RegisterType((*SysrootGenerateArchiveRequest)(nil), "chromite.api.SysrootGenerateArchiveRequest")
	proto.RegisterType((*SysrootGenerateArchiveResponse)(nil), "chromite.api.SysrootGenerateArchiveResponse")
	proto.RegisterType((*InstallToolchainRequest)(nil), "chromite.api.InstallToolchainRequest")
	proto.RegisterType((*InstallToolchainRequest_Flags)(nil), "chromite.api.InstallToolchainRequest.Flags")
	proto.RegisterType((*InstallToolchainResponse)(nil), "chromite.api.InstallToolchainResponse")
	proto.RegisterType((*InstallPackagesRequest)(nil), "chromite.api.InstallPackagesRequest")
	proto.RegisterType((*InstallPackagesRequest_Flags)(nil), "chromite.api.InstallPackagesRequest.Flags")
	proto.RegisterType((*InstallPackagesResponse)(nil), "chromite.api.InstallPackagesResponse")
	proto.RegisterType((*CreateSimpleChromeSysrootRequest)(nil), "chromite.api.CreateSimpleChromeSysrootRequest")
	proto.RegisterType((*CreateSimpleChromeSysrootResponse)(nil), "chromite.api.CreateSimpleChromeSysrootResponse")
}

func init() { proto.RegisterFile("chromite/api/sysroot.proto", fileDescriptor_f8efa85b3e33e938) }

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

// SysrootServiceClient is the client API for SysrootService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type SysrootServiceClient interface {
	// Create the base sysroot structure.
	Create(ctx context.Context, in *SysrootCreateRequest, opts ...grpc.CallOption) (*SysrootCreateResponse, error)
	// Generate sysroot archive.
	GenerateArchive(ctx context.Context, in *SysrootGenerateArchiveRequest, opts ...grpc.CallOption) (*SysrootGenerateArchiveResponse, error)
	// Install the toolchain into the sysroot.
	InstallToolchain(ctx context.Context, in *InstallToolchainRequest, opts ...grpc.CallOption) (*InstallToolchainResponse, error)
	// Install packages into the sysroot. By default will install all packages.
	InstallPackages(ctx context.Context, in *InstallPackagesRequest, opts ...grpc.CallOption) (*InstallPackagesResponse, error)
	// Install SimpleChrome sysroot.
	CreateSimpleChromeSysroot(ctx context.Context, in *CreateSimpleChromeSysrootRequest, opts ...grpc.CallOption) (*CreateSimpleChromeSysrootResponse, error)
}

type sysrootServiceClient struct {
	cc *grpc.ClientConn
}

func NewSysrootServiceClient(cc *grpc.ClientConn) SysrootServiceClient {
	return &sysrootServiceClient{cc}
}

func (c *sysrootServiceClient) Create(ctx context.Context, in *SysrootCreateRequest, opts ...grpc.CallOption) (*SysrootCreateResponse, error) {
	out := new(SysrootCreateResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/Create", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) GenerateArchive(ctx context.Context, in *SysrootGenerateArchiveRequest, opts ...grpc.CallOption) (*SysrootGenerateArchiveResponse, error) {
	out := new(SysrootGenerateArchiveResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/GenerateArchive", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) InstallToolchain(ctx context.Context, in *InstallToolchainRequest, opts ...grpc.CallOption) (*InstallToolchainResponse, error) {
	out := new(InstallToolchainResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/InstallToolchain", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) InstallPackages(ctx context.Context, in *InstallPackagesRequest, opts ...grpc.CallOption) (*InstallPackagesResponse, error) {
	out := new(InstallPackagesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/InstallPackages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *sysrootServiceClient) CreateSimpleChromeSysroot(ctx context.Context, in *CreateSimpleChromeSysrootRequest, opts ...grpc.CallOption) (*CreateSimpleChromeSysrootResponse, error) {
	out := new(CreateSimpleChromeSysrootResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.SysrootService/CreateSimpleChromeSysroot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// SysrootServiceServer is the server API for SysrootService service.
type SysrootServiceServer interface {
	// Create the base sysroot structure.
	Create(context.Context, *SysrootCreateRequest) (*SysrootCreateResponse, error)
	// Generate sysroot archive.
	GenerateArchive(context.Context, *SysrootGenerateArchiveRequest) (*SysrootGenerateArchiveResponse, error)
	// Install the toolchain into the sysroot.
	InstallToolchain(context.Context, *InstallToolchainRequest) (*InstallToolchainResponse, error)
	// Install packages into the sysroot. By default will install all packages.
	InstallPackages(context.Context, *InstallPackagesRequest) (*InstallPackagesResponse, error)
	// Install SimpleChrome sysroot.
	CreateSimpleChromeSysroot(context.Context, *CreateSimpleChromeSysrootRequest) (*CreateSimpleChromeSysrootResponse, error)
}

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

func (*UnimplementedSysrootServiceServer) Create(ctx context.Context, req *SysrootCreateRequest) (*SysrootCreateResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
}
func (*UnimplementedSysrootServiceServer) GenerateArchive(ctx context.Context, req *SysrootGenerateArchiveRequest) (*SysrootGenerateArchiveResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateArchive not implemented")
}
func (*UnimplementedSysrootServiceServer) InstallToolchain(ctx context.Context, req *InstallToolchainRequest) (*InstallToolchainResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InstallToolchain not implemented")
}
func (*UnimplementedSysrootServiceServer) InstallPackages(ctx context.Context, req *InstallPackagesRequest) (*InstallPackagesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InstallPackages not implemented")
}
func (*UnimplementedSysrootServiceServer) CreateSimpleChromeSysroot(ctx context.Context, req *CreateSimpleChromeSysrootRequest) (*CreateSimpleChromeSysrootResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateSimpleChromeSysroot not implemented")
}

func RegisterSysrootServiceServer(s *grpc.Server, srv SysrootServiceServer) {
	s.RegisterService(&_SysrootService_serviceDesc, srv)
}

func _SysrootService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SysrootCreateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).Create(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/Create",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).Create(ctx, req.(*SysrootCreateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_GenerateArchive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SysrootGenerateArchiveRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).GenerateArchive(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/GenerateArchive",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).GenerateArchive(ctx, req.(*SysrootGenerateArchiveRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_InstallToolchain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(InstallToolchainRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).InstallToolchain(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/InstallToolchain",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).InstallToolchain(ctx, req.(*InstallToolchainRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_InstallPackages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(InstallPackagesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).InstallPackages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/InstallPackages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).InstallPackages(ctx, req.(*InstallPackagesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _SysrootService_CreateSimpleChromeSysroot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateSimpleChromeSysrootRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(SysrootServiceServer).CreateSimpleChromeSysroot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.SysrootService/CreateSimpleChromeSysroot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(SysrootServiceServer).CreateSimpleChromeSysroot(ctx, req.(*CreateSimpleChromeSysrootRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _SysrootService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.SysrootService",
	HandlerType: (*SysrootServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Create",
			Handler:    _SysrootService_Create_Handler,
		},
		{
			MethodName: "GenerateArchive",
			Handler:    _SysrootService_GenerateArchive_Handler,
		},
		{
			MethodName: "InstallToolchain",
			Handler:    _SysrootService_InstallToolchain_Handler,
		},
		{
			MethodName: "InstallPackages",
			Handler:    _SysrootService_InstallPackages_Handler,
		},
		{
			MethodName: "CreateSimpleChromeSysroot",
			Handler:    _SysrootService_CreateSimpleChromeSysroot_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/sysroot.proto",
}
