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

// This can easily be generalized to a Builds method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type BuildsChromeRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target we are checking for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// List of packages to be installed by the builder. If none are specified the
	// standard list of packages is used.
	Packages             []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeRequest proto.InternalMessageInfo

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

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

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

type BuildsChromeResponse struct {
	// Whether or not it builds chrome.
	BuildsChrome         bool     `protobuf:"varint,1,opt,name=builds_chrome,json=buildsChrome,proto3" json:"builds_chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeResponse proto.InternalMessageInfo

func (m *BuildsChromeResponse) GetBuildsChrome() bool {
	if m != nil {
		return m.BuildsChrome
	}
	return false
}

type GetBestVisibleRequest struct {
	// An atom to pass to portageq, e.g. 'chromeos-chrome'.
	Atom string `protobuf:"bytes,1,opt,name=atom,proto3" json:"atom,omitempty"`
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine. Checks the chroot when not provided.
	// Required when examining a build target.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,3,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 *GetBestVisibleRequest) Reset()         { *m = GetBestVisibleRequest{} }
func (m *GetBestVisibleRequest) String() string { return proto.CompactTextString(m) }
func (*GetBestVisibleRequest) ProtoMessage()    {}
func (*GetBestVisibleRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{2}
}

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

var xxx_messageInfo_GetBestVisibleRequest proto.InternalMessageInfo

func (m *GetBestVisibleRequest) GetAtom() string {
	if m != nil {
		return m.Atom
	}
	return ""
}

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

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

type GetBestVisibleResponse struct {
	// TODO: is this sufficient? Needs tag too?
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,1,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleResponse proto.InternalMessageInfo

func (m *GetBestVisibleResponse) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type GetChromeVersionRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	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 *GetChromeVersionRequest) Reset()         { *m = GetChromeVersionRequest{} }
func (m *GetChromeVersionRequest) String() string { return proto.CompactTextString(m) }
func (*GetChromeVersionRequest) ProtoMessage()    {}
func (*GetChromeVersionRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{4}
}

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

var xxx_messageInfo_GetChromeVersionRequest proto.InternalMessageInfo

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

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

type GetChromeVersionResponse struct {
	// The chrome version.
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetChromeVersionResponse proto.InternalMessageInfo

func (m *GetChromeVersionResponse) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

type GetTargetVersionsRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	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 *GetTargetVersionsRequest) Reset()         { *m = GetTargetVersionsRequest{} }
func (m *GetTargetVersionsRequest) String() string { return proto.CompactTextString(m) }
func (*GetTargetVersionsRequest) ProtoMessage()    {}
func (*GetTargetVersionsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{6}
}

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

var xxx_messageInfo_GetTargetVersionsRequest proto.InternalMessageInfo

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

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

type GetTargetVersionsResponse struct {
	// Android version, e.g. 5812377
	AndroidVersion string `protobuf:"bytes,1,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"`
	// Android-branch version, e.g. git_nyc
	AndroidBranchVersion string `protobuf:"bytes,2,opt,name=android_branch_version,json=androidBranchVersion,proto3" json:"android_branch_version,omitempty"`
	// Android-target version, e.g. cheets
	AndroidTargetVersion string `protobuf:"bytes,3,opt,name=android_target_version,json=androidTargetVersion,proto3" json:"android_target_version,omitempty"`
	// Chrome version, e.g. 78.0.3877.0.
	ChromeVersion string `protobuf:"bytes,4,opt,name=chrome_version,json=chromeVersion,proto3" json:"chrome_version,omitempty"`
	// Full version, e.g. R78-12438.0.0.
	FullVersion string `protobuf:"bytes,5,opt,name=full_version,json=fullVersion,proto3" json:"full_version,omitempty"`
	// Milestone version, e.g. 78.
	MilestoneVersion string `protobuf:"bytes,6,opt,name=milestone_version,json=milestoneVersion,proto3" json:"milestone_version,omitempty"`
	// Platform version, e.g. 12438.0.0.
	PlatformVersion      string   `protobuf:"bytes,7,opt,name=platform_version,json=platformVersion,proto3" json:"platform_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetTargetVersionsResponse proto.InternalMessageInfo

func (m *GetTargetVersionsResponse) GetAndroidVersion() string {
	if m != nil {
		return m.AndroidVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidBranchVersion() string {
	if m != nil {
		return m.AndroidBranchVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidTargetVersion() string {
	if m != nil {
		return m.AndroidTargetVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetChromeVersion() string {
	if m != nil {
		return m.ChromeVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetFullVersion() string {
	if m != nil {
		return m.FullVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetMilestoneVersion() string {
	if m != nil {
		return m.MilestoneVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetPlatformVersion() string {
	if m != nil {
		return m.PlatformVersion
	}
	return ""
}

// This can easily be generalized to a HasPrebuilt method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type HasChromePrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome               bool     `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasChromePrebuiltRequest proto.InternalMessageInfo

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

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

func (m *HasChromePrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

type HasChromePrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasChromePrebuiltResponse proto.InternalMessageInfo

func (m *HasChromePrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

// The generic version of HasChromePrebuilt.
type HasPrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	// Required.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome bool `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,omitempty"`
	// The package whose prebuilt is being queried.
	// The category and package name are required.
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,4,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_HasPrebuiltRequest proto.InternalMessageInfo

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

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

func (m *HasPrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

func (m *HasPrebuiltRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type HasPrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasPrebuiltResponse proto.InternalMessageInfo

func (m *HasPrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

type UprevPackagesRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target(s) whose packages should be uprevved.
	// Defaults to all build targets when none are given.
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,2,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// Required.
	// The overlay type to search against.
	OverlayType OverlayType `protobuf:"varint,3,opt,name=overlay_type,json=overlayType,proto3,enum=chromite.api.OverlayType" json:"overlay_type,omitempty"`
	// Optional.
	// A directory where results should be dumped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UprevPackagesRequest) Reset()         { *m = UprevPackagesRequest{} }
func (m *UprevPackagesRequest) String() string { return proto.CompactTextString(m) }
func (*UprevPackagesRequest) ProtoMessage()    {}
func (*UprevPackagesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{12}
}

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

var xxx_messageInfo_UprevPackagesRequest proto.InternalMessageInfo

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

func (m *UprevPackagesRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *UprevPackagesRequest) GetOverlayType() OverlayType {
	if m != nil {
		return m.OverlayType
	}
	return OverlayType_OVERLAYTYPE_UNSPECIFIED
}

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

// TODO(evanhernandez): Support build-target specific uprevs once needed.
type UprevVersionedPackageRequest struct {
	// The chroot path. Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The package to uprev.
	PackageInfo *chromiumos.PackageInfo `protobuf:"bytes,2,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	// The versions to consider for an update.
	Versions []*UprevVersionedPackageRequest_GitRef `protobuf:"bytes,3,rep,name=versions,proto3" json:"versions,omitempty"`
	// The build targets whose sysroot should be cleaned of old versions.
	BuildTargets         []*chromiumos.BuildTarget `protobuf:"bytes,4,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *UprevVersionedPackageRequest) Reset()         { *m = UprevVersionedPackageRequest{} }
func (m *UprevVersionedPackageRequest) String() string { return proto.CompactTextString(m) }
func (*UprevVersionedPackageRequest) ProtoMessage()    {}
func (*UprevVersionedPackageRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{13}
}

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

var xxx_messageInfo_UprevVersionedPackageRequest proto.InternalMessageInfo

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

func (m *UprevVersionedPackageRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetVersions() []*UprevVersionedPackageRequest_GitRef {
	if m != nil {
		return m.Versions
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

type UprevVersionedPackageRequest_GitRef struct {
	// Relative path to the git repository.
	Repository string `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"`
	// The name of the git ref.
	Ref string `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	// The exact sha1 of the git ref.
	Revision             string   `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevVersionedPackageRequest_GitRef proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest_GitRef) GetRepository() string {
	if m != nil {
		return m.Repository
	}
	return ""
}

func (m *UprevVersionedPackageRequest_GitRef) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *UprevVersionedPackageRequest_GitRef) GetRevision() string {
	if m != nil {
		return m.Revision
	}
	return ""
}

type UprevPackagesResponse struct {
	// The list of ebuilds that were modified. Contains added and deleted files.
	ModifiedEbuilds []*UprevPackagesResponse_Ebuild `protobuf:"bytes,1,rep,name=modified_ebuilds,json=modifiedEbuilds,proto3" json:"modified_ebuilds,omitempty"`
	// The new version that was uprevved to when an uprev was completed.
	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UprevPackagesResponse) Reset()         { *m = UprevPackagesResponse{} }
func (m *UprevPackagesResponse) String() string { return proto.CompactTextString(m) }
func (*UprevPackagesResponse) ProtoMessage()    {}
func (*UprevPackagesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{14}
}

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

var xxx_messageInfo_UprevPackagesResponse proto.InternalMessageInfo

func (m *UprevPackagesResponse) GetModifiedEbuilds() []*UprevPackagesResponse_Ebuild {
	if m != nil {
		return m.ModifiedEbuilds
	}
	return nil
}

func (m *UprevPackagesResponse) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

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

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

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

var xxx_messageInfo_UprevPackagesResponse_Ebuild proto.InternalMessageInfo

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

type UprevVersionedPackageResponse struct {
	// list of uprev responses.
	Responses            []*UprevPackagesResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *UprevVersionedPackageResponse) Reset()         { *m = UprevVersionedPackageResponse{} }
func (m *UprevVersionedPackageResponse) String() string { return proto.CompactTextString(m) }
func (*UprevVersionedPackageResponse) ProtoMessage()    {}
func (*UprevVersionedPackageResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{15}
}

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

var xxx_messageInfo_UprevVersionedPackageResponse proto.InternalMessageInfo

func (m *UprevVersionedPackageResponse) GetResponses() []*UprevPackagesResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func init() {
	proto.RegisterType((*BuildsChromeRequest)(nil), "chromite.api.BuildsChromeRequest")
	proto.RegisterType((*BuildsChromeResponse)(nil), "chromite.api.BuildsChromeResponse")
	proto.RegisterType((*GetBestVisibleRequest)(nil), "chromite.api.GetBestVisibleRequest")
	proto.RegisterType((*GetBestVisibleResponse)(nil), "chromite.api.GetBestVisibleResponse")
	proto.RegisterType((*GetChromeVersionRequest)(nil), "chromite.api.GetChromeVersionRequest")
	proto.RegisterType((*GetChromeVersionResponse)(nil), "chromite.api.GetChromeVersionResponse")
	proto.RegisterType((*GetTargetVersionsRequest)(nil), "chromite.api.GetTargetVersionsRequest")
	proto.RegisterType((*GetTargetVersionsResponse)(nil), "chromite.api.GetTargetVersionsResponse")
	proto.RegisterType((*HasChromePrebuiltRequest)(nil), "chromite.api.HasChromePrebuiltRequest")
	proto.RegisterType((*HasChromePrebuiltResponse)(nil), "chromite.api.HasChromePrebuiltResponse")
	proto.RegisterType((*HasPrebuiltRequest)(nil), "chromite.api.HasPrebuiltRequest")
	proto.RegisterType((*HasPrebuiltResponse)(nil), "chromite.api.HasPrebuiltResponse")
	proto.RegisterType((*UprevPackagesRequest)(nil), "chromite.api.UprevPackagesRequest")
	proto.RegisterType((*UprevVersionedPackageRequest)(nil), "chromite.api.UprevVersionedPackageRequest")
	proto.RegisterType((*UprevVersionedPackageRequest_GitRef)(nil), "chromite.api.UprevVersionedPackageRequest.GitRef")
	proto.RegisterType((*UprevPackagesResponse)(nil), "chromite.api.UprevPackagesResponse")
	proto.RegisterType((*UprevPackagesResponse_Ebuild)(nil), "chromite.api.UprevPackagesResponse.Ebuild")
	proto.RegisterType((*UprevVersionedPackageResponse)(nil), "chromite.api.UprevVersionedPackageResponse")
}

func init() { proto.RegisterFile("chromite/api/packages.proto", fileDescriptor_40286986e1d9a416) }

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

// PackageServiceClient is the client API for PackageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PackageServiceClient interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error)
	// Check if there is an available prebuilt for the most recent version of the
	// package.
	HasPrebuilt(ctx context.Context, in *HasPrebuiltRequest, opts ...grpc.CallOption) (*HasPrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error)
}

type packageServiceClient struct {
	cc *grpc.ClientConn
}

func NewPackageServiceClient(cc *grpc.ClientConn) PackageServiceClient {
	return &packageServiceClient{cc}
}

func (c *packageServiceClient) BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error) {
	out := new(BuildsChromeResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/BuildsChrome", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error) {
	out := new(GetBestVisibleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetBestVisible", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error) {
	out := new(GetChromeVersionResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetChromeVersion", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error) {
	out := new(GetTargetVersionsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetTargetVersions", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error) {
	out := new(HasChromePrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasChromePrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasPrebuilt(ctx context.Context, in *HasPrebuiltRequest, opts ...grpc.CallOption) (*HasPrebuiltResponse, error) {
	out := new(HasPrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasPrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error) {
	out := new(UprevPackagesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/Uprev", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error) {
	out := new(UprevVersionedPackageResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/UprevVersionedPackage", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PackageServiceServer is the server API for PackageService service.
type PackageServiceServer interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(context.Context, *BuildsChromeRequest) (*BuildsChromeResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(context.Context, *GetBestVisibleRequest) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(context.Context, *GetChromeVersionRequest) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(context.Context, *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(context.Context, *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error)
	// Check if there is an available prebuilt for the most recent version of the
	// package.
	HasPrebuilt(context.Context, *HasPrebuiltRequest) (*HasPrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(context.Context, *UprevPackagesRequest) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(context.Context, *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error)
}

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

func (*UnimplementedPackageServiceServer) BuildsChrome(ctx context.Context, req *BuildsChromeRequest) (*BuildsChromeResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildsChrome not implemented")
}
func (*UnimplementedPackageServiceServer) GetBestVisible(ctx context.Context, req *GetBestVisibleRequest) (*GetBestVisibleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetBestVisible not implemented")
}
func (*UnimplementedPackageServiceServer) GetChromeVersion(ctx context.Context, req *GetChromeVersionRequest) (*GetChromeVersionResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetChromeVersion not implemented")
}
func (*UnimplementedPackageServiceServer) GetTargetVersions(ctx context.Context, req *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetTargetVersions not implemented")
}
func (*UnimplementedPackageServiceServer) HasChromePrebuilt(ctx context.Context, req *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasChromePrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) HasPrebuilt(ctx context.Context, req *HasPrebuiltRequest) (*HasPrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasPrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) Uprev(ctx context.Context, req *UprevPackagesRequest) (*UprevPackagesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Uprev not implemented")
}
func (*UnimplementedPackageServiceServer) UprevVersionedPackage(ctx context.Context, req *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UprevVersionedPackage not implemented")
}

func RegisterPackageServiceServer(s *grpc.Server, srv PackageServiceServer) {
	s.RegisterService(&_PackageService_serviceDesc, srv)
}

func _PackageService_BuildsChrome_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildsChromeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).BuildsChrome(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/BuildsChrome",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).BuildsChrome(ctx, req.(*BuildsChromeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetBestVisible_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBestVisibleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetBestVisible(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetBestVisible",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetBestVisible(ctx, req.(*GetBestVisibleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetChromeVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetChromeVersionRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetChromeVersion",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, req.(*GetChromeVersionRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetTargetVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTargetVersionsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetTargetVersions",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, req.(*GetTargetVersionsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasChromePrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasChromePrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasChromePrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, req.(*HasChromePrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasPrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasPrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasPrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasPrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasPrebuilt(ctx, req.(*HasPrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_Uprev_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevPackagesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).Uprev(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/Uprev",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).Uprev(ctx, req.(*UprevPackagesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_UprevVersionedPackage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevVersionedPackageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/UprevVersionedPackage",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, req.(*UprevVersionedPackageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _PackageService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.PackageService",
	HandlerType: (*PackageServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildsChrome",
			Handler:    _PackageService_BuildsChrome_Handler,
		},
		{
			MethodName: "GetBestVisible",
			Handler:    _PackageService_GetBestVisible_Handler,
		},
		{
			MethodName: "GetChromeVersion",
			Handler:    _PackageService_GetChromeVersion_Handler,
		},
		{
			MethodName: "GetTargetVersions",
			Handler:    _PackageService_GetTargetVersions_Handler,
		},
		{
			MethodName: "HasChromePrebuilt",
			Handler:    _PackageService_HasChromePrebuilt_Handler,
		},
		{
			MethodName: "HasPrebuilt",
			Handler:    _PackageService_HasPrebuilt_Handler,
		},
		{
			MethodName: "Uprev",
			Handler:    _PackageService_Uprev_Handler,
		},
		{
			MethodName: "UprevVersionedPackage",
			Handler:    _PackageService_UprevVersionedPackage_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/packages.proto",
}
