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

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

package prototype

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

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

// Defines the metadata for a project, which ultimately controls how this
// project is managed throughout the infrastructure.
type DesignProject struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Defines the human-readable name for the project.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Defines the git-repo path for the project.
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// Defines the path that stores all of the project configuration.
	// Relative to the git-repo
	ConfigPath string `protobuf:"bytes,3,opt,name=config_path,json=configPath,proto3" json:"config_path,omitempty"`
	// Define the project's local_manifest.
	RepoManifestPath string `protobuf:"bytes,4,opt,name=repo_manifest_path,json=repoManifestPath,proto3" json:"repo_manifest_path,omitempty"`
	// The Google Storage bucket for artifacts from the project's builds.
	GsBucket string `protobuf:"bytes,5,opt,name=gs_bucket,json=gsBucket,proto3" json:"gs_bucket,omitempty"`
	// Defines config needed to maintain firmware builders for the project.
	FirmwareConfig *DesignProject_FirmwareConfig `protobuf:"bytes,6,opt,name=firmware_config,json=firmwareConfig,proto3" json:"firmware_config,omitempty"`
	// Define factory build config needed for manufacturing verification.
	FactoryConfig *DesignProject_FactoryConfig `protobuf:"bytes,7,opt,name=factory_config,json=factoryConfig,proto3" json:"factory_config,omitempty"`
	// Defines signing config unique to the given design project.
	SigningConfig *DesignProject_SigningConfig `protobuf:"bytes,8,opt,name=signing_config,json=signingConfig,proto3" json:"signing_config,omitempty"`
}

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

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

func (*DesignProject) ProtoMessage() {}

func (x *DesignProject) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_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 DesignProject.ProtoReflect.Descriptor instead.
func (*DesignProject) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0}
}

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

func (x *DesignProject) GetRepo() string {
	if x != nil {
		return x.Repo
	}
	return ""
}

func (x *DesignProject) GetConfigPath() string {
	if x != nil {
		return x.ConfigPath
	}
	return ""
}

func (x *DesignProject) GetRepoManifestPath() string {
	if x != nil {
		return x.RepoManifestPath
	}
	return ""
}

func (x *DesignProject) GetGsBucket() string {
	if x != nil {
		return x.GsBucket
	}
	return ""
}

func (x *DesignProject) GetFirmwareConfig() *DesignProject_FirmwareConfig {
	if x != nil {
		return x.FirmwareConfig
	}
	return nil
}

func (x *DesignProject) GetFactoryConfig() *DesignProject_FactoryConfig {
	if x != nil {
		return x.FactoryConfig
	}
	return nil
}

func (x *DesignProject) GetSigningConfig() *DesignProject_SigningConfig {
	if x != nil {
		return x.SigningConfig
	}
	return nil
}

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

	// Defines the firmware branch that will be maintained for the project.
	FirmwareBranch string `protobuf:"bytes,1,opt,name=firmware_branch,json=firmwareBranch,proto3" json:"firmware_branch,omitempty"`
}

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

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

func (*DesignProject_FirmwareConfig) ProtoMessage() {}

func (x *DesignProject_FirmwareConfig) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_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 DesignProject_FirmwareConfig.ProtoReflect.Descriptor instead.
func (*DesignProject_FirmwareConfig) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0, 0}
}

func (x *DesignProject_FirmwareConfig) GetFirmwareBranch() string {
	if x != nil {
		return x.FirmwareBranch
	}
	return ""
}

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

	// Defines the factory branch that will be maintained for the project.
	FactoryBranch string `protobuf:"bytes,1,opt,name=factory_branch,json=factoryBranch,proto3" json:"factory_branch,omitempty"`
	// A key in the project.yaml metadata file, to look up the branch, path,
	// etc. For example, to match the entry in the project.yaml file:
	//
	// MILKYWAY:
	//   board: GALAXY
	//   branch: master
	//   version: 3
	//   path: v3/MILKYWAY
	//
	// project_key should be 'MILKYWAY'. The matching is case-insensitive.
	HwidProjectKey string `protobuf:"bytes,2,opt,name=hwid_project_key,json=hwidProjectKey,proto3" json:"hwid_project_key,omitempty"`
}

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

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

func (*DesignProject_FactoryConfig) ProtoMessage() {}

func (x *DesignProject_FactoryConfig) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_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 DesignProject_FactoryConfig.ProtoReflect.Descriptor instead.
func (*DesignProject_FactoryConfig) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0, 1}
}

func (x *DesignProject_FactoryConfig) GetFactoryBranch() string {
	if x != nil {
		return x.FactoryBranch
	}
	return ""
}

func (x *DesignProject_FactoryConfig) GetHwidProjectKey() string {
	if x != nil {
		return x.HwidProjectKey
	}
	return ""
}

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

	// Key names have taken historically followed many different patterns.
	// To support all of the cases, this defines an explicit mapping between the
	// supported brands and corresponding keys present in the respective
	// keysets.
	// Going forward, this could be standardized, removing the need for the
	// explict mapping, but this will be required for the foreseeable future.
	BrandIdToKey map[string]string `protobuf:"bytes,1,rep,name=brand_id_to_key,json=brandIdToKey,proto3" json:"brand_id_to_key,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*DesignProject_SigningConfig) ProtoMessage() {}

func (x *DesignProject_SigningConfig) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_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 DesignProject_SigningConfig.ProtoReflect.Descriptor instead.
func (*DesignProject_SigningConfig) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0, 2}
}

func (x *DesignProject_SigningConfig) GetBrandIdToKey() map[string]string {
	if x != nil {
		return x.BrandIdToKey
	}
	return nil
}

var File_prototype_design_project_proto protoreflect.FileDescriptor

var file_prototype_design_project_proto_rawDesc = []byte{
	0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x64, 0x65, 0x73, 0x69,
	0x67, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe4, 0x05, 0x0a, 0x0d,
	0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f,
	0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6d,
	0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74,
	0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65,
	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65,
	0x74, 0x12, 0x50, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x0e, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x0d, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x12, 0x4d, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x1a, 0x39, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f,
	0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x1a, 0x60, 0x0a, 0x0d,
	0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a,
	0x0e, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72,
	0x61, 0x6e, 0x63, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x77, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
	0x68, 0x77, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x65, 0x79, 0x1a, 0xb1,
	0x01, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x12, 0x5f, 0x0a, 0x0f, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f,
	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x54, 0x6f, 0x4b, 0x65, 0x79, 0x45, 0x6e,
	0x74, 0x72, 0x79, 0x52, 0x0c, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x54, 0x6f, 0x4b, 0x65,
	0x79, 0x1a, 0x3f, 0x0a, 0x11, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x54, 0x6f, 0x4b, 0x65,
	0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
	0x38, 0x01, 0x42, 0x35, 0x5a, 0x33, 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,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_prototype_design_project_proto_rawDescOnce sync.Once
	file_prototype_design_project_proto_rawDescData = file_prototype_design_project_proto_rawDesc
)

func file_prototype_design_project_proto_rawDescGZIP() []byte {
	file_prototype_design_project_proto_rawDescOnce.Do(func() {
		file_prototype_design_project_proto_rawDescData = protoimpl.X.CompressGZIP(file_prototype_design_project_proto_rawDescData)
	})
	return file_prototype_design_project_proto_rawDescData
}

var file_prototype_design_project_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_prototype_design_project_proto_goTypes = []interface{}{
	(*DesignProject)(nil),                // 0: prototype.DesignProject
	(*DesignProject_FirmwareConfig)(nil), // 1: prototype.DesignProject.FirmwareConfig
	(*DesignProject_FactoryConfig)(nil),  // 2: prototype.DesignProject.FactoryConfig
	(*DesignProject_SigningConfig)(nil),  // 3: prototype.DesignProject.SigningConfig
	nil,                                  // 4: prototype.DesignProject.SigningConfig.BrandIdToKeyEntry
}
var file_prototype_design_project_proto_depIdxs = []int32{
	1, // 0: prototype.DesignProject.firmware_config:type_name -> prototype.DesignProject.FirmwareConfig
	2, // 1: prototype.DesignProject.factory_config:type_name -> prototype.DesignProject.FactoryConfig
	3, // 2: prototype.DesignProject.signing_config:type_name -> prototype.DesignProject.SigningConfig
	4, // 3: prototype.DesignProject.SigningConfig.brand_id_to_key:type_name -> prototype.DesignProject.SigningConfig.BrandIdToKeyEntry
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_prototype_design_project_proto_init() }
func file_prototype_design_project_proto_init() {
	if File_prototype_design_project_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_prototype_design_project_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_design_project_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject_FirmwareConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_design_project_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject_FactoryConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_design_project_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject_SigningConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_prototype_design_project_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_prototype_design_project_proto_goTypes,
		DependencyIndexes: file_prototype_design_project_proto_depIdxs,
		MessageInfos:      file_prototype_design_project_proto_msgTypes,
	}.Build()
	File_prototype_design_project_proto = out.File
	file_prototype_design_project_proto_rawDesc = nil
	file_prototype_design_project_proto_goTypes = nil
	file_prototype_design_project_proto_depIdxs = nil
}
