// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/firmware.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

// TODO(b/177907747): Drop this once the migration is complete.
// List of known location that firmware can be built from.
type FwLocation int32

const (
	FwLocation_FW_LOCATION_UNKNOWN FwLocation = 0
	FwLocation_PLATFORM_EC         FwLocation = 1 // platform/ec/firmware_builder.py
	FwLocation_PLATFORM_ZEPHYR     FwLocation = 2 // platform/zephyr-chrome/firmware_builder.py
	FwLocation_PLATFORM_TI50       FwLocation = 3 // platform/ti50/common/firmware_builder.py.  Added in R90.
)

// Enum value maps for FwLocation.
var (
	FwLocation_name = map[int32]string{
		0: "FW_LOCATION_UNKNOWN",
		1: "PLATFORM_EC",
		2: "PLATFORM_ZEPHYR",
		3: "PLATFORM_TI50",
	}
	FwLocation_value = map[string]int32{
		"FW_LOCATION_UNKNOWN": 0,
		"PLATFORM_EC":         1,
		"PLATFORM_ZEPHYR":     2,
		"PLATFORM_TI50":       3,
	}
)

func (x FwLocation) Enum() *FwLocation {
	p := new(FwLocation)
	*p = x
	return p
}

func (x FwLocation) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FwLocation) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[0].Descriptor()
}

func (FwLocation) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[0]
}

func (x FwLocation) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FwLocation.Descriptor instead.
func (FwLocation) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0}
}

type FwBuildMetric_FwSection_FwRegion int32

const (
	FwBuildMetric_FwSection_FW_REGION_UNKNOWN FwBuildMetric_FwSection_FwRegion = 0
	FwBuildMetric_FwSection_EC_RO             FwBuildMetric_FwSection_FwRegion = 1 // The entire section protected by write protect.
	FwBuildMetric_FwSection_EC_RW             FwBuildMetric_FwSection_FwRegion = 2 // Also RW_A for EFS1 systems.
	FwBuildMetric_FwSection_EC_RO_BSS         FwBuildMetric_FwSection_FwRegion = 3
	FwBuildMetric_FwSection_EC_RW_BSS         FwBuildMetric_FwSection_FwRegion = 4
	FwBuildMetric_FwSection_EC_SHARED_MEM     FwBuildMetric_FwSection_FwRegion = 5
)

// Enum value maps for FwBuildMetric_FwSection_FwRegion.
var (
	FwBuildMetric_FwSection_FwRegion_name = map[int32]string{
		0: "FW_REGION_UNKNOWN",
		1: "EC_RO",
		2: "EC_RW",
		3: "EC_RO_BSS",
		4: "EC_RW_BSS",
		5: "EC_SHARED_MEM",
	}
	FwBuildMetric_FwSection_FwRegion_value = map[string]int32{
		"FW_REGION_UNKNOWN": 0,
		"EC_RO":             1,
		"EC_RW":             2,
		"EC_RO_BSS":         3,
		"EC_RW_BSS":         4,
		"EC_SHARED_MEM":     5,
	}
)

func (x FwBuildMetric_FwSection_FwRegion) Enum() *FwBuildMetric_FwSection_FwRegion {
	p := new(FwBuildMetric_FwSection_FwRegion)
	*p = x
	return p
}

func (x FwBuildMetric_FwSection_FwRegion) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FwBuildMetric_FwSection_FwRegion) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[1].Descriptor()
}

func (FwBuildMetric_FwSection_FwRegion) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[1]
}

func (x FwBuildMetric_FwSection_FwRegion) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FwBuildMetric_FwSection_FwRegion.Descriptor instead.
func (FwBuildMetric_FwSection_FwRegion) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0, 0, 0}
}

type FirmwareArtifactInfo_TarballInfo_FirmwareType_Type int32

const (
	FirmwareArtifactInfo_TarballInfo_FirmwareType_UNKNOWN FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 0
	FirmwareArtifactInfo_TarballInfo_FirmwareType_MAIN    FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 1
	FirmwareArtifactInfo_TarballInfo_FirmwareType_EC      FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 2
	FirmwareArtifactInfo_TarballInfo_FirmwareType_PD      FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 3
)

// Enum value maps for FirmwareArtifactInfo_TarballInfo_FirmwareType_Type.
var (
	FirmwareArtifactInfo_TarballInfo_FirmwareType_Type_name = map[int32]string{
		0: "UNKNOWN",
		1: "MAIN",
		2: "EC",
		3: "PD",
	}
	FirmwareArtifactInfo_TarballInfo_FirmwareType_Type_value = map[string]int32{
		"UNKNOWN": 0,
		"MAIN":    1,
		"EC":      2,
		"PD":      3,
	}
)

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Enum() *FirmwareArtifactInfo_TarballInfo_FirmwareType_Type {
	p := new(FirmwareArtifactInfo_TarballInfo_FirmwareType_Type)
	*p = x
	return p
}

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[2].Descriptor()
}

func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[2]
}

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FirmwareArtifactInfo_TarballInfo_FirmwareType_Type.Descriptor instead.
func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 0, 0, 0}
}

// Metrics collected on every successful firmware build.
type FwBuildMetric struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Lowercase name of the firmware target built. E.g. phaser.
	TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"`
	// Lowercase name of the platform the firmware target belongs to. May be
	// blank. E.g. octopus.
	PlatformName string `protobuf:"bytes,2,opt,name=platform_name,json=platformName,proto3" json:"platform_name,omitempty"`
	// List of firmware sections and their free and total sizes in bytes.
	FwSection []*FwBuildMetric_FwSection `protobuf:"bytes,3,rep,name=fw_section,json=fwSection,proto3" json:"fw_section,omitempty"`
	// Optional information related to a specific target type.
	//
	// Types that are assignable to ImageType:
	//	*FwBuildMetric_Zephyr
	ImageType isFwBuildMetric_ImageType `protobuf_oneof:"image_type"`
}

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

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

func (*FwBuildMetric) ProtoMessage() {}

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

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

func (x *FwBuildMetric) GetTargetName() string {
	if x != nil {
		return x.TargetName
	}
	return ""
}

func (x *FwBuildMetric) GetPlatformName() string {
	if x != nil {
		return x.PlatformName
	}
	return ""
}

func (x *FwBuildMetric) GetFwSection() []*FwBuildMetric_FwSection {
	if x != nil {
		return x.FwSection
	}
	return nil
}

func (m *FwBuildMetric) GetImageType() isFwBuildMetric_ImageType {
	if m != nil {
		return m.ImageType
	}
	return nil
}

func (x *FwBuildMetric) GetZephyr() *FwBuildMetric_ZephyrTarget {
	if x, ok := x.GetImageType().(*FwBuildMetric_Zephyr); ok {
		return x.Zephyr
	}
	return nil
}

type isFwBuildMetric_ImageType interface {
	isFwBuildMetric_ImageType()
}

type FwBuildMetric_Zephyr struct {
	Zephyr *FwBuildMetric_ZephyrTarget `protobuf:"bytes,4,opt,name=zephyr,proto3,oneof"`
}

func (*FwBuildMetric_Zephyr) isFwBuildMetric_ImageType() {}

// A list of FW metrics collected on every successful firmware build
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py.
type FwBuildMetricList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*FwBuildMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*FwBuildMetricList) ProtoMessage() {}

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

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

func (x *FwBuildMetricList) GetValue() []*FwBuildMetric {
	if x != nil {
		return x.Value
	}
	return nil
}

// Metrics collect on successful firmware unit test runs.
type FwTestMetric struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of firmware test.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*FwTestMetric) ProtoMessage() {}

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

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

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

// A list of FW metrics collected on every successful firmware unit test.
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py.
type FwTestMetricList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*FwTestMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*FwTestMetricList) ProtoMessage() {}

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

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

func (x *FwTestMetricList) GetValue() []*FwTestMetric {
	if x != nil {
		return x.Value
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called.
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

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

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

func (*BuildAllTotFirmwareRequest) ProtoMessage() {}

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

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

func (x *BuildAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (x *BuildAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildAllTotFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collected on every successful firmware build
	Metrics *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

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

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

func (*BuildAllTotFirmwareResponse) ProtoMessage() {}

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

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

func (x *BuildAllTotFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

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

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

func (*TestAllTotFirmwareRequest) ProtoMessage() {}

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

// Deprecated: Use TestAllTotFirmwareRequest.ProtoReflect.Descriptor instead.
func (*TestAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{6}
}

func (x *TestAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (x *TestAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestAllTotFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collect on successfuly firmware unit test runs
	Metrics *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *TestAllTotFirmwareResponse) Reset() {
	*x = TestAllTotFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*TestAllTotFirmwareResponse) ProtoMessage() {}

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

// Deprecated: Use TestAllTotFirmwareResponse.ProtoReflect.Descriptor instead.
func (*TestAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{7}
}

func (x *TestAllTotFirmwareResponse) GetMetrics() *FwTestMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

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

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *BuildAllFirmwareRequest) Reset() {
	*x = BuildAllFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BuildAllFirmwareRequest) ProtoMessage() {}

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

// Deprecated: Use BuildAllFirmwareRequest.ProtoReflect.Descriptor instead.
func (*BuildAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{8}
}

func (x *BuildAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (x *BuildAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildAllFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

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

	// Metrics collected on every successful firmware build
	Metrics *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *BuildAllFirmwareResponse) Reset() {
	*x = BuildAllFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BuildAllFirmwareResponse) ProtoMessage() {}

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

// Deprecated: Use BuildAllFirmwareResponse.ProtoReflect.Descriptor instead.
func (*BuildAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{9}
}

func (x *BuildAllFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

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

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *TestAllFirmwareRequest) Reset() {
	*x = TestAllFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*TestAllFirmwareRequest) ProtoMessage() {}

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

// Deprecated: Use TestAllFirmwareRequest.ProtoReflect.Descriptor instead.
func (*TestAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{10}
}

func (x *TestAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (x *TestAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestAllFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

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

	// Metrics collect on successfuly firmware unit test runs
	Metrics *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *TestAllFirmwareResponse) Reset() {
	*x = TestAllFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*TestAllFirmwareResponse) ProtoMessage() {}

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

// Deprecated: Use TestAllFirmwareResponse.ProtoReflect.Descriptor instead.
func (*TestAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{11}
}

func (x *TestAllFirmwareResponse) GetMetrics() *FwTestMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

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

	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The output directory in which to place the bundled artifacts.
	ResultPath *chromiumos.ResultPath `protobuf:"bytes,3,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	// The artifact types requested.  The firmware_location is found in
	// artifacts.output_artifacts[].location.
	Artifacts *chromiumos.ArtifactsByService_Firmware `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	// The Chrome OS style version to use in FirmwareArtifactInfo.
	BcsVersion string `protobuf:"bytes,5,opt,name=bcs_version,json=bcsVersion,proto3" json:"bcs_version,omitempty"`
}

func (x *BundleFirmwareArtifactsRequest) Reset() {
	*x = BundleFirmwareArtifactsRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BundleFirmwareArtifactsRequest) ProtoMessage() {}

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

// Deprecated: Use BundleFirmwareArtifactsRequest.ProtoReflect.Descriptor instead.
func (*BundleFirmwareArtifactsRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{12}
}

func (x *BundleFirmwareArtifactsRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetResultPath() *chromiumos.ResultPath {
	if x != nil {
		return x.ResultPath
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetArtifacts() *chromiumos.ArtifactsByService_Firmware {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetBcsVersion() string {
	if x != nil {
		return x.BcsVersion
	}
	return ""
}

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

	// The artifacts that were bundled.
	Artifacts *chromiumos.UploadedArtifactsByService_Firmware `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
}

func (x *BundleFirmwareArtifactsResponse) Reset() {
	*x = BundleFirmwareArtifactsResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BundleFirmwareArtifactsResponse) ProtoMessage() {}

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

// Deprecated: Use BundleFirmwareArtifactsResponse.ProtoReflect.Descriptor instead.
func (*BundleFirmwareArtifactsResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{13}
}

func (x *BundleFirmwareArtifactsResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService_Firmware {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

// Contents of a Firmware.FIRMWARE_TARBALL_INFO artifact.
type FirmwareArtifactInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Objects []*FirmwareArtifactInfo_ObjectInfo `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"`
}

func (x *FirmwareArtifactInfo) Reset() {
	*x = FirmwareArtifactInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo) ProtoMessage() {}

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

// Deprecated: Use FirmwareArtifactInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14}
}

func (x *FirmwareArtifactInfo) GetObjects() []*FirmwareArtifactInfo_ObjectInfo {
	if x != nil {
		return x.Objects
	}
	return nil
}

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

	// Region as described in FMAP or linker script.
	// E.g. EC_RO, EC_RW, EC_NVRAM, RO_BSS, RW_BSS, SHARED_MEM.
	Region FwBuildMetric_FwSection_FwRegion `protobuf:"varint,1,opt,name=region,proto3,enum=chromite.api.FwBuildMetric_FwSection_FwRegion" json:"region,omitempty"`
	// The number of bytes used in this section.
	Used uint32 `protobuf:"varint,2,opt,name=used,proto3" json:"used,omitempty"`
	// The total number of bytes available in this section.
	Total uint32 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"`
}

func (x *FwBuildMetric_FwSection) Reset() {
	*x = FwBuildMetric_FwSection{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FwBuildMetric_FwSection) ProtoMessage() {}

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

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

func (x *FwBuildMetric_FwSection) GetRegion() FwBuildMetric_FwSection_FwRegion {
	if x != nil {
		return x.Region
	}
	return FwBuildMetric_FwSection_FW_REGION_UNKNOWN
}

func (x *FwBuildMetric_FwSection) GetUsed() uint32 {
	if x != nil {
		return x.Used
	}
	return 0
}

func (x *FwBuildMetric_FwSection) GetTotal() uint32 {
	if x != nil {
		return x.Total
	}
	return 0
}

// Version number components: "major.minor.tiny".
type FwBuildMetric_Version struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
	Tiny  uint32 `protobuf:"varint,3,opt,name=tiny,proto3" json:"tiny,omitempty"`
}

func (x *FwBuildMetric_Version) Reset() {
	*x = FwBuildMetric_Version{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FwBuildMetric_Version) ProtoMessage() {}

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

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

func (x *FwBuildMetric_Version) GetMajor() uint32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *FwBuildMetric_Version) GetMinor() uint32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

func (x *FwBuildMetric_Version) GetTiny() uint32 {
	if x != nil {
		return x.Tiny
	}
	return 0
}

// Zephyr-base firmware target related build metrics.
type FwBuildMetric_ZephyrTarget struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The version of the Zephyr kernel used during build.
	KernelVersion *FwBuildMetric_Version `protobuf:"bytes,1,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
}

func (x *FwBuildMetric_ZephyrTarget) Reset() {
	*x = FwBuildMetric_ZephyrTarget{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FwBuildMetric_ZephyrTarget) ProtoMessage() {}

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

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

func (x *FwBuildMetric_ZephyrTarget) GetKernelVersion() *FwBuildMetric_Version {
	if x != nil {
		return x.KernelVersion
	}
	return nil
}

// TODO(crbug/1176305): Use types from
// chromiumos/config/api/software/firmware_config.proto
type FirmwareArtifactInfo_TarballInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The Chrome OS style version.
	BcsVersion string `protobuf:"bytes,1,opt,name=bcs_version,json=bcsVersion,proto3" json:"bcs_version,omitempty"`
	// The name of the firmware image used by the firmware updater. Typically
	// the device name, but can differ when a device may have two or more
	// different firmware images.
	FirmwareImageName string                                             `protobuf:"bytes,2,opt,name=firmware_image_name,json=firmwareImageName,proto3" json:"firmware_image_name,omitempty"`
	Type              FirmwareArtifactInfo_TarballInfo_FirmwareType_Type `protobuf:"varint,3,opt,name=type,proto3,enum=chromite.api.FirmwareArtifactInfo_TarballInfo_FirmwareType_Type" json:"type,omitempty"`
	Version           *FirmwareArtifactInfo_TarballInfo_Version          `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
}

func (x *FirmwareArtifactInfo_TarballInfo) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_TarballInfo) ProtoMessage() {}

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

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

func (x *FirmwareArtifactInfo_TarballInfo) GetBcsVersion() string {
	if x != nil {
		return x.BcsVersion
	}
	return ""
}

func (x *FirmwareArtifactInfo_TarballInfo) GetFirmwareImageName() string {
	if x != nil {
		return x.FirmwareImageName
	}
	return ""
}

func (x *FirmwareArtifactInfo_TarballInfo) GetType() FirmwareArtifactInfo_TarballInfo_FirmwareType_Type {
	if x != nil {
		return x.Type
	}
	return FirmwareArtifactInfo_TarballInfo_FirmwareType_UNKNOWN
}

func (x *FirmwareArtifactInfo_TarballInfo) GetVersion() *FirmwareArtifactInfo_TarballInfo_Version {
	if x != nil {
		return x.Version
	}
	return nil
}

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

	// The name of the file.
	FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
	// Types that are assignable to FirmwareObjectInfo:
	//	*FirmwareArtifactInfo_ObjectInfo_TarballInfo
	FirmwareObjectInfo isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo `protobuf_oneof:"firmware_object_info"`
}

func (x *FirmwareArtifactInfo_ObjectInfo) Reset() {
	*x = FirmwareArtifactInfo_ObjectInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_ObjectInfo) ProtoMessage() {}

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

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

func (x *FirmwareArtifactInfo_ObjectInfo) GetFileName() string {
	if x != nil {
		return x.FileName
	}
	return ""
}

func (m *FirmwareArtifactInfo_ObjectInfo) GetFirmwareObjectInfo() isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo {
	if m != nil {
		return m.FirmwareObjectInfo
	}
	return nil
}

func (x *FirmwareArtifactInfo_ObjectInfo) GetTarballInfo() *FirmwareArtifactInfo_TarballInfo {
	if x, ok := x.GetFirmwareObjectInfo().(*FirmwareArtifactInfo_ObjectInfo_TarballInfo); ok {
		return x.TarballInfo
	}
	return nil
}

type isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo interface {
	isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo()
}

type FirmwareArtifactInfo_ObjectInfo_TarballInfo struct {
	// Info about Firmware.FIRMWARE_TARBALL.
	TarballInfo *FirmwareArtifactInfo_TarballInfo `protobuf:"bytes,2,opt,name=tarball_info,json=tarballInfo,proto3,oneof"`
}

func (*FirmwareArtifactInfo_ObjectInfo_TarballInfo) isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo() {
}

// The type of a firmware binary.
type FirmwareArtifactInfo_TarballInfo_FirmwareType struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *FirmwareArtifactInfo_TarballInfo_FirmwareType) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo_FirmwareType{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[20]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_TarballInfo_FirmwareType) ProtoMessage() {}

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

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

// The firmware version from updater.sh --manifest.
type FirmwareArtifactInfo_TarballInfo_Version struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo_Version{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[21]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_TarballInfo_Version) ProtoMessage() {}

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

// Deprecated: Use FirmwareArtifactInfo_TarballInfo_Version.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo_Version) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 0, 1}
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) GetMajor() int32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) GetMinor() int32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

var File_chromite_api_firmware_proto protoreflect.FileDescriptor

var file_chromite_api_firmware_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
	0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xfe, 0x04, 0x0a, 0x0d, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x66, 0x77,
	0x5f, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x46, 0x77, 0x53, 0x65,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x42, 0x0a, 0x06, 0x7a, 0x65, 0x70, 0x68, 0x79, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x5a, 0x65,
	0x70, 0x68, 0x79, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x06, 0x7a, 0x65,
	0x70, 0x68, 0x79, 0x72, 0x1a, 0xe7, 0x01, 0x0a, 0x09, 0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e,
	0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x77, 0x52, 0x65, 0x67, 0x69,
	0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73,
	0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x14,
	0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74,
	0x6f, 0x74, 0x61, 0x6c, 0x22, 0x68, 0x0a, 0x08, 0x46, 0x77, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e,
	0x12, 0x15, 0x0a, 0x11, 0x46, 0x57, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e,
	0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x43, 0x5f, 0x52, 0x4f,
	0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x43, 0x5f, 0x52, 0x57, 0x10, 0x02, 0x12, 0x0d, 0x0a,
	0x09, 0x45, 0x43, 0x5f, 0x52, 0x4f, 0x5f, 0x42, 0x53, 0x53, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09,
	0x45, 0x43, 0x5f, 0x52, 0x57, 0x5f, 0x42, 0x53, 0x53, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x45,
	0x43, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4d, 0x45, 0x4d, 0x10, 0x05, 0x1a, 0x49,
	0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a,
	0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12,
	0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
	0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6e, 0x79, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x69, 0x6e, 0x79, 0x1a, 0x5a, 0x0a, 0x0c, 0x5a, 0x65, 0x70,
	0x68, 0x79, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x4a, 0x0a, 0x0e, 0x6b, 0x65, 0x72,
	0x6e, 0x65, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x56, 0x65,
	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74,
	0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x0c, 0x46,
	0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
	0x44, 0x0a, 0x10, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c,
	0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x1a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41,
	0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46,
	0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63,
	0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f,
	0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c,
	0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x58, 0x0a, 0x1b,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6d,
	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d,
	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x54, 0x65, 0x73, 0x74, 0x41,
	0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46,
	0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63,
	0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f,
	0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c,
	0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x56, 0x0a, 0x1a,
	0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73,
	0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c,
	0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x43, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61,
	0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f,
	0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x55, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41,
	0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
	0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xae, 0x01,
	0x0a, 0x16, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64,
	0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x53,
	0x0a, 0x17, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74,
	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72,
	0x69, 0x63, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x1e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x61, 0x74,
	0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52,
	0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x09, 0x61,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69,
	0x66, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
	0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x63, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x1f, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61,
	0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x41,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
	0x65, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69,
	0x66, 0x61, 0x63, 0x74, 0x73, 0x22, 0xf7, 0x04, 0x0a, 0x14, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x47,
	0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49,
	0x6e, 0x66, 0x6f, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07,
	0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x1a, 0xfc, 0x02, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x62,
	0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x63, 0x73, 0x5f, 0x76,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x63,
	0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x49,
	0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x40, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61,
	0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x54,
	0x79, 0x70, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x50,
	0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x36, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49,
	0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x2e,
	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x1a, 0x3d, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65,
	0x22, 0x2d, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e,
	0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12,
	0x06, 0x0a, 0x02, 0x45, 0x43, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x50, 0x44, 0x10, 0x03, 0x1a,
	0x35, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61,
	0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72,
	0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
	0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x1a, 0x96, 0x01, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63,
	0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61,
	0x6d, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e,
	0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72,
	0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x62,
	0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x16, 0x0a, 0x14, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2a,
	0x5e, 0x0a, 0x0a, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a,
	0x13, 0x46, 0x57, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b,
	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f,
	0x52, 0x4d, 0x5f, 0x45, 0x43, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4c, 0x41, 0x54, 0x46,
	0x4f, 0x52, 0x4d, 0x5f, 0x5a, 0x45, 0x50, 0x48, 0x59, 0x52, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d,
	0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x54, 0x49, 0x35, 0x30, 0x10, 0x03, 0x32,
	0xb3, 0x04, 0x0a, 0x0f, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76,
	0x69, 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54,
	0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x28, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41,
	0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x67, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65,
	0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x25, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x54,
	0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x24,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65,
	0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x42,
	0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x1a, 0x10, 0xc2, 0xed, 0x1a, 0x0c, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x10, 0x01, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62,
	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_firmware_proto_rawDescOnce sync.Once
	file_chromite_api_firmware_proto_rawDescData = file_chromite_api_firmware_proto_rawDesc
)

func file_chromite_api_firmware_proto_rawDescGZIP() []byte {
	file_chromite_api_firmware_proto_rawDescOnce.Do(func() {
		file_chromite_api_firmware_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_firmware_proto_rawDescData)
	})
	return file_chromite_api_firmware_proto_rawDescData
}

var file_chromite_api_firmware_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_chromite_api_firmware_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
var file_chromite_api_firmware_proto_goTypes = []interface{}{
	(FwLocation)(0),                                         // 0: chromite.api.FwLocation
	(FwBuildMetric_FwSection_FwRegion)(0),                   // 1: chromite.api.FwBuildMetric.FwSection.FwRegion
	(FirmwareArtifactInfo_TarballInfo_FirmwareType_Type)(0), // 2: chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type
	(*FwBuildMetric)(nil),                                   // 3: chromite.api.FwBuildMetric
	(*FwBuildMetricList)(nil),                               // 4: chromite.api.FwBuildMetricList
	(*FwTestMetric)(nil),                                    // 5: chromite.api.FwTestMetric
	(*FwTestMetricList)(nil),                                // 6: chromite.api.FwTestMetricList
	(*BuildAllTotFirmwareRequest)(nil),                      // 7: chromite.api.BuildAllTotFirmwareRequest
	(*BuildAllTotFirmwareResponse)(nil),                     // 8: chromite.api.BuildAllTotFirmwareResponse
	(*TestAllTotFirmwareRequest)(nil),                       // 9: chromite.api.TestAllTotFirmwareRequest
	(*TestAllTotFirmwareResponse)(nil),                      // 10: chromite.api.TestAllTotFirmwareResponse
	(*BuildAllFirmwareRequest)(nil),                         // 11: chromite.api.BuildAllFirmwareRequest
	(*BuildAllFirmwareResponse)(nil),                        // 12: chromite.api.BuildAllFirmwareResponse
	(*TestAllFirmwareRequest)(nil),                          // 13: chromite.api.TestAllFirmwareRequest
	(*TestAllFirmwareResponse)(nil),                         // 14: chromite.api.TestAllFirmwareResponse
	(*BundleFirmwareArtifactsRequest)(nil),                  // 15: chromite.api.BundleFirmwareArtifactsRequest
	(*BundleFirmwareArtifactsResponse)(nil),                 // 16: chromite.api.BundleFirmwareArtifactsResponse
	(*FirmwareArtifactInfo)(nil),                            // 17: chromite.api.FirmwareArtifactInfo
	(*FwBuildMetric_FwSection)(nil),                         // 18: chromite.api.FwBuildMetric.FwSection
	(*FwBuildMetric_Version)(nil),                           // 19: chromite.api.FwBuildMetric.Version
	(*FwBuildMetric_ZephyrTarget)(nil),                      // 20: chromite.api.FwBuildMetric.ZephyrTarget
	(*FirmwareArtifactInfo_TarballInfo)(nil),                // 21: chromite.api.FirmwareArtifactInfo.TarballInfo
	(*FirmwareArtifactInfo_ObjectInfo)(nil),                 // 22: chromite.api.FirmwareArtifactInfo.ObjectInfo
	(*FirmwareArtifactInfo_TarballInfo_FirmwareType)(nil),   // 23: chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType
	(*FirmwareArtifactInfo_TarballInfo_Version)(nil),        // 24: chromite.api.FirmwareArtifactInfo.TarballInfo.Version
	(*chromiumos.Chroot)(nil),                               // 25: chromiumos.Chroot
	(chromiumos.FwLocation)(0),                              // 26: chromiumos.FwLocation
	(*chromiumos.ResultPath)(nil),                           // 27: chromiumos.ResultPath
	(*chromiumos.ArtifactsByService_Firmware)(nil),          // 28: chromiumos.ArtifactsByService.Firmware
	(*chromiumos.UploadedArtifactsByService_Firmware)(nil),  // 29: chromiumos.UploadedArtifactsByService.Firmware
}
var file_chromite_api_firmware_proto_depIdxs = []int32{
	18, // 0: chromite.api.FwBuildMetric.fw_section:type_name -> chromite.api.FwBuildMetric.FwSection
	20, // 1: chromite.api.FwBuildMetric.zephyr:type_name -> chromite.api.FwBuildMetric.ZephyrTarget
	3,  // 2: chromite.api.FwBuildMetricList.value:type_name -> chromite.api.FwBuildMetric
	5,  // 3: chromite.api.FwTestMetricList.value:type_name -> chromite.api.FwTestMetric
	0,  // 4: chromite.api.BuildAllTotFirmwareRequest.firmware_location:type_name -> chromite.api.FwLocation
	25, // 5: chromite.api.BuildAllTotFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	4,  // 6: chromite.api.BuildAllTotFirmwareResponse.metrics:type_name -> chromite.api.FwBuildMetricList
	0,  // 7: chromite.api.TestAllTotFirmwareRequest.firmware_location:type_name -> chromite.api.FwLocation
	25, // 8: chromite.api.TestAllTotFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	6,  // 9: chromite.api.TestAllTotFirmwareResponse.metrics:type_name -> chromite.api.FwTestMetricList
	26, // 10: chromite.api.BuildAllFirmwareRequest.firmware_location:type_name -> chromiumos.FwLocation
	25, // 11: chromite.api.BuildAllFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	4,  // 12: chromite.api.BuildAllFirmwareResponse.metrics:type_name -> chromite.api.FwBuildMetricList
	26, // 13: chromite.api.TestAllFirmwareRequest.firmware_location:type_name -> chromiumos.FwLocation
	25, // 14: chromite.api.TestAllFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	6,  // 15: chromite.api.TestAllFirmwareResponse.metrics:type_name -> chromite.api.FwTestMetricList
	25, // 16: chromite.api.BundleFirmwareArtifactsRequest.chroot:type_name -> chromiumos.Chroot
	27, // 17: chromite.api.BundleFirmwareArtifactsRequest.result_path:type_name -> chromiumos.ResultPath
	28, // 18: chromite.api.BundleFirmwareArtifactsRequest.artifacts:type_name -> chromiumos.ArtifactsByService.Firmware
	29, // 19: chromite.api.BundleFirmwareArtifactsResponse.artifacts:type_name -> chromiumos.UploadedArtifactsByService.Firmware
	22, // 20: chromite.api.FirmwareArtifactInfo.objects:type_name -> chromite.api.FirmwareArtifactInfo.ObjectInfo
	1,  // 21: chromite.api.FwBuildMetric.FwSection.region:type_name -> chromite.api.FwBuildMetric.FwSection.FwRegion
	19, // 22: chromite.api.FwBuildMetric.ZephyrTarget.kernel_version:type_name -> chromite.api.FwBuildMetric.Version
	2,  // 23: chromite.api.FirmwareArtifactInfo.TarballInfo.type:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type
	24, // 24: chromite.api.FirmwareArtifactInfo.TarballInfo.version:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo.Version
	21, // 25: chromite.api.FirmwareArtifactInfo.ObjectInfo.tarball_info:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo
	7,  // 26: chromite.api.FirmwareService.BuildAllTotFirmware:input_type -> chromite.api.BuildAllTotFirmwareRequest
	9,  // 27: chromite.api.FirmwareService.TestAllTotFirmware:input_type -> chromite.api.TestAllTotFirmwareRequest
	11, // 28: chromite.api.FirmwareService.BuildAllFirmware:input_type -> chromite.api.BuildAllFirmwareRequest
	13, // 29: chromite.api.FirmwareService.TestAllFirmware:input_type -> chromite.api.TestAllFirmwareRequest
	15, // 30: chromite.api.FirmwareService.BundleFirmwareArtifacts:input_type -> chromite.api.BundleFirmwareArtifactsRequest
	8,  // 31: chromite.api.FirmwareService.BuildAllTotFirmware:output_type -> chromite.api.BuildAllTotFirmwareResponse
	10, // 32: chromite.api.FirmwareService.TestAllTotFirmware:output_type -> chromite.api.TestAllTotFirmwareResponse
	12, // 33: chromite.api.FirmwareService.BuildAllFirmware:output_type -> chromite.api.BuildAllFirmwareResponse
	14, // 34: chromite.api.FirmwareService.TestAllFirmware:output_type -> chromite.api.TestAllFirmwareResponse
	16, // 35: chromite.api.FirmwareService.BundleFirmwareArtifacts:output_type -> chromite.api.BundleFirmwareArtifactsResponse
	31, // [31:36] is the sub-list for method output_type
	26, // [26:31] is the sub-list for method input_type
	26, // [26:26] is the sub-list for extension type_name
	26, // [26:26] is the sub-list for extension extendee
	0,  // [0:26] is the sub-list for field type_name
}

func init() { file_chromite_api_firmware_proto_init() }
func file_chromite_api_firmware_proto_init() {
	if File_chromite_api_firmware_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_firmware_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetricList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwTestMetric); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwTestMetricList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllTotFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllTotFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllTotFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllTotFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BundleFirmwareArtifactsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BundleFirmwareArtifactsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_FwSection); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_Version); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_ZephyrTarget); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_ObjectInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo_FirmwareType); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo_Version); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_chromite_api_firmware_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*FwBuildMetric_Zephyr)(nil),
	}
	file_chromite_api_firmware_proto_msgTypes[19].OneofWrappers = []interface{}{
		(*FirmwareArtifactInfo_ObjectInfo_TarballInfo)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_firmware_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   22,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_firmware_proto_goTypes,
		DependencyIndexes: file_chromite_api_firmware_proto_depIdxs,
		EnumInfos:         file_chromite_api_firmware_proto_enumTypes,
		MessageInfos:      file_chromite_api_firmware_proto_msgTypes,
	}.Build()
	File_chromite_api_firmware_proto = out.File
	file_chromite_api_firmware_proto_rawDesc = nil
	file_chromite_api_firmware_proto_goTypes = nil
	file_chromite_api_firmware_proto_depIdxs = nil
}
