// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/cloud/osconfig/v1beta/guest_policies.proto

package osconfig

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

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)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// The desired state that the OS Config agent maintains on the VM instance.
type DesiredState int32

const (
	// The default is to ensure the package is installed.
	DesiredState_DESIRED_STATE_UNSPECIFIED DesiredState = 0
	// The agent ensures that the package is installed.
	DesiredState_INSTALLED DesiredState = 1
	// The agent ensures that the package is installed and
	// periodically checks for and install any updates.
	DesiredState_UPDATED DesiredState = 2
	// The agent ensures that the package is not installed and uninstall it
	// if detected.
	DesiredState_REMOVED DesiredState = 3
)

// Enum value maps for DesiredState.
var (
	DesiredState_name = map[int32]string{
		0: "DESIRED_STATE_UNSPECIFIED",
		1: "INSTALLED",
		2: "UPDATED",
		3: "REMOVED",
	}
	DesiredState_value = map[string]int32{
		"DESIRED_STATE_UNSPECIFIED": 0,
		"INSTALLED":                 1,
		"UPDATED":                   2,
		"REMOVED":                   3,
	}
)

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

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

func (DesiredState) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[0].Descriptor()
}

func (DesiredState) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[0]
}

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

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

// Types of package managers that may be used to manage this package.
type Package_Manager int32

const (
	// The default behavior is ANY.
	Package_MANAGER_UNSPECIFIED Package_Manager = 0
	// Apply this package config using the default system package manager.
	Package_ANY Package_Manager = 1
	// Apply this package config only if Apt is available on the system.
	Package_APT Package_Manager = 2
	// Apply this package config only if Yum is available on the system.
	Package_YUM Package_Manager = 3
	// Apply this package config only if Zypper is available on the system.
	Package_ZYPPER Package_Manager = 4
	// Apply this package config only if GooGet is available on the system.
	Package_GOO Package_Manager = 5
)

// Enum value maps for Package_Manager.
var (
	Package_Manager_name = map[int32]string{
		0: "MANAGER_UNSPECIFIED",
		1: "ANY",
		2: "APT",
		3: "YUM",
		4: "ZYPPER",
		5: "GOO",
	}
	Package_Manager_value = map[string]int32{
		"MANAGER_UNSPECIFIED": 0,
		"ANY":                 1,
		"APT":                 2,
		"YUM":                 3,
		"ZYPPER":              4,
		"GOO":                 5,
	}
)

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

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

func (Package_Manager) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[1].Descriptor()
}

func (Package_Manager) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[1]
}

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

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

// Type of archive.
type AptRepository_ArchiveType int32

const (
	// Unspecified.
	AptRepository_ARCHIVE_TYPE_UNSPECIFIED AptRepository_ArchiveType = 0
	// DEB indicates that the archive contains binary files.
	AptRepository_DEB AptRepository_ArchiveType = 1
	// DEB_SRC indicates that the archive contains source files.
	AptRepository_DEB_SRC AptRepository_ArchiveType = 2
)

// Enum value maps for AptRepository_ArchiveType.
var (
	AptRepository_ArchiveType_name = map[int32]string{
		0: "ARCHIVE_TYPE_UNSPECIFIED",
		1: "DEB",
		2: "DEB_SRC",
	}
	AptRepository_ArchiveType_value = map[string]int32{
		"ARCHIVE_TYPE_UNSPECIFIED": 0,
		"DEB":                      1,
		"DEB_SRC":                  2,
	}
)

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

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

func (AptRepository_ArchiveType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[2].Descriptor()
}

func (AptRepository_ArchiveType) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[2]
}

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

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

// Specifying the type of archive.
type SoftwareRecipe_Step_ExtractArchive_ArchiveType int32

const (
	// Indicates that the archive type isn't specified.
	SoftwareRecipe_Step_ExtractArchive_ARCHIVE_TYPE_UNSPECIFIED SoftwareRecipe_Step_ExtractArchive_ArchiveType = 0
	// Indicates that the archive is a tar archive with no encryption.
	SoftwareRecipe_Step_ExtractArchive_TAR SoftwareRecipe_Step_ExtractArchive_ArchiveType = 1
	// Indicates that the archive is a tar archive with gzip encryption.
	SoftwareRecipe_Step_ExtractArchive_TAR_GZIP SoftwareRecipe_Step_ExtractArchive_ArchiveType = 2
	// Indicates that the archive is a tar archive with bzip encryption.
	SoftwareRecipe_Step_ExtractArchive_TAR_BZIP SoftwareRecipe_Step_ExtractArchive_ArchiveType = 3
	// Indicates that the archive is a tar archive with lzma encryption.
	SoftwareRecipe_Step_ExtractArchive_TAR_LZMA SoftwareRecipe_Step_ExtractArchive_ArchiveType = 4
	// Indicates that the archive is a tar archive with xz encryption.
	SoftwareRecipe_Step_ExtractArchive_TAR_XZ SoftwareRecipe_Step_ExtractArchive_ArchiveType = 5
	// Indicates that the archive is a zip archive.
	SoftwareRecipe_Step_ExtractArchive_ZIP SoftwareRecipe_Step_ExtractArchive_ArchiveType = 11
)

// Enum value maps for SoftwareRecipe_Step_ExtractArchive_ArchiveType.
var (
	SoftwareRecipe_Step_ExtractArchive_ArchiveType_name = map[int32]string{
		0:  "ARCHIVE_TYPE_UNSPECIFIED",
		1:  "TAR",
		2:  "TAR_GZIP",
		3:  "TAR_BZIP",
		4:  "TAR_LZMA",
		5:  "TAR_XZ",
		11: "ZIP",
	}
	SoftwareRecipe_Step_ExtractArchive_ArchiveType_value = map[string]int32{
		"ARCHIVE_TYPE_UNSPECIFIED": 0,
		"TAR":                      1,
		"TAR_GZIP":                 2,
		"TAR_BZIP":                 3,
		"TAR_LZMA":                 4,
		"TAR_XZ":                   5,
		"ZIP":                      11,
	}
)

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

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

func (SoftwareRecipe_Step_ExtractArchive_ArchiveType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[3].Descriptor()
}

func (SoftwareRecipe_Step_ExtractArchive_ArchiveType) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[3]
}

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

// Deprecated: Use SoftwareRecipe_Step_ExtractArchive_ArchiveType.Descriptor instead.
func (SoftwareRecipe_Step_ExtractArchive_ArchiveType) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 1, 0}
}

// The interpreter used to execute a script.
type SoftwareRecipe_Step_RunScript_Interpreter int32

const (
	// Default value for ScriptType.
	SoftwareRecipe_Step_RunScript_INTERPRETER_UNSPECIFIED SoftwareRecipe_Step_RunScript_Interpreter = 0
	// Indicates that the script is run with `/bin/sh` on Linux and `cmd`
	// on windows.
	SoftwareRecipe_Step_RunScript_SHELL SoftwareRecipe_Step_RunScript_Interpreter = 1
	// Indicates that the script is run with powershell.
	SoftwareRecipe_Step_RunScript_POWERSHELL SoftwareRecipe_Step_RunScript_Interpreter = 3
)

// Enum value maps for SoftwareRecipe_Step_RunScript_Interpreter.
var (
	SoftwareRecipe_Step_RunScript_Interpreter_name = map[int32]string{
		0: "INTERPRETER_UNSPECIFIED",
		1: "SHELL",
		3: "POWERSHELL",
	}
	SoftwareRecipe_Step_RunScript_Interpreter_value = map[string]int32{
		"INTERPRETER_UNSPECIFIED": 0,
		"SHELL":                   1,
		"POWERSHELL":              3,
	}
)

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

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

func (SoftwareRecipe_Step_RunScript_Interpreter) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[4].Descriptor()
}

func (SoftwareRecipe_Step_RunScript_Interpreter) Type() protoreflect.EnumType {
	return &file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes[4]
}

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

// Deprecated: Use SoftwareRecipe_Step_RunScript_Interpreter.Descriptor instead.
func (SoftwareRecipe_Step_RunScript_Interpreter) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 6, 0}
}

// An OS Config resource representing a guest configuration policy. These
// policies represent the desired state for VM instance guest environments
// including packages to install or remove, package repository configurations,
// and software to install.
type GuestPolicy struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. Unique name of the resource in this project using one of the following
	// forms:
	// `projects/{project_number}/guestPolicies/{guest_policy_id}`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Description of the guest policy. Length of the description is limited
	// to 1024 characters.
	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Output only. Time this guest policy was created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Output only. Last time this guest policy was updated.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// Required. Specifies the VM instances that are assigned to this policy. This allows
	// you to target sets or groups of VM instances by different parameters such
	// as labels, names, OS, or zones.
	//
	// If left empty, all VM instances underneath this policy are targeted.
	//
	// At the same level in the resource hierarchy (that is within a project), the
	// service prevents the creation of multiple policies that conflict with
	// each other. For more information, see how the service [handles assignment
	// conflicts](/compute/docs/os-config-management/create-guest-policy#handle-conflicts).
	Assignment *Assignment `protobuf:"bytes,6,opt,name=assignment,proto3" json:"assignment,omitempty"`
	// The software packages to be managed by this policy.
	Packages []*Package `protobuf:"bytes,7,rep,name=packages,proto3" json:"packages,omitempty"`
	// A list of package repositories to configure on the VM instance. This is
	// done before any other configs are applied so they can use these repos.
	// Package repositories are only configured if the corresponding package
	// manager(s) are available.
	PackageRepositories []*PackageRepository `protobuf:"bytes,8,rep,name=package_repositories,json=packageRepositories,proto3" json:"package_repositories,omitempty"`
	// A list of Recipes to install on the VM instance.
	Recipes []*SoftwareRecipe `protobuf:"bytes,9,rep,name=recipes,proto3" json:"recipes,omitempty"`
	// The etag for this guest policy.
	// If this is provided on update, it must match the server's etag.
	Etag string `protobuf:"bytes,10,opt,name=etag,proto3" json:"etag,omitempty"`
}

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

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

func (*GuestPolicy) ProtoMessage() {}

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

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

func (x *GuestPolicy) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *GuestPolicy) GetCreateTime() *timestamp.Timestamp {
	if x != nil {
		return x.CreateTime
	}
	return nil
}

func (x *GuestPolicy) GetUpdateTime() *timestamp.Timestamp {
	if x != nil {
		return x.UpdateTime
	}
	return nil
}

func (x *GuestPolicy) GetAssignment() *Assignment {
	if x != nil {
		return x.Assignment
	}
	return nil
}

func (x *GuestPolicy) GetPackages() []*Package {
	if x != nil {
		return x.Packages
	}
	return nil
}

func (x *GuestPolicy) GetPackageRepositories() []*PackageRepository {
	if x != nil {
		return x.PackageRepositories
	}
	return nil
}

func (x *GuestPolicy) GetRecipes() []*SoftwareRecipe {
	if x != nil {
		return x.Recipes
	}
	return nil
}

func (x *GuestPolicy) GetEtag() string {
	if x != nil {
		return x.Etag
	}
	return ""
}

// An assignment represents the group or groups of VM instances that the policy
// applies to.
//
// If an assignment is empty, it applies to all VM instances. Otherwise, the
// targeted VM instances must meet all the criteria specified. So if both
// labels and zones are specified, the policy applies to VM instances with those
// labels and in those zones.
type Assignment struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Targets instances matching at least one of these label sets. This allows
	// an assignment to target disparate groups, for example "env=prod or
	// env=staging".
	GroupLabels []*Assignment_GroupLabel `protobuf:"bytes,1,rep,name=group_labels,json=groupLabels,proto3" json:"group_labels,omitempty"`
	// Targets instances in any of these zones. Leave empty to target instances
	// in any zone.
	//
	// Zonal targeting is uncommon and is supported to facilitate the management
	// of changes by zone.
	Zones []string `protobuf:"bytes,2,rep,name=zones,proto3" json:"zones,omitempty"`
	// Targets any of the instances specified. Instances are specified by their
	// URI in the form `zones/[ZONE]/instances/[INSTANCE_NAME]`.
	//
	// Instance targeting is uncommon and is supported to facilitate the
	// management of changes by the instance or to target specific VM instances
	// for development and testing.
	//
	// Only supported for project-level policies and must reference instances
	// within this project.
	Instances []string `protobuf:"bytes,3,rep,name=instances,proto3" json:"instances,omitempty"`
	// Targets VM instances whose name starts with one of these prefixes.
	//
	// Like labels, this is another way to group VM instances when targeting
	// configs, for example prefix="prod-".
	//
	// Only supported for project-level policies.
	InstanceNamePrefixes []string `protobuf:"bytes,4,rep,name=instance_name_prefixes,json=instanceNamePrefixes,proto3" json:"instance_name_prefixes,omitempty"`
	// Targets VM instances matching at least one of the following OS types.
	//
	// VM instances must match all supplied criteria for a given OsType to be
	// included.
	OsTypes []*Assignment_OsType `protobuf:"bytes,5,rep,name=os_types,json=osTypes,proto3" json:"os_types,omitempty"`
}

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

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

func (*Assignment) ProtoMessage() {}

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

func (x *Assignment) GetGroupLabels() []*Assignment_GroupLabel {
	if x != nil {
		return x.GroupLabels
	}
	return nil
}

func (x *Assignment) GetZones() []string {
	if x != nil {
		return x.Zones
	}
	return nil
}

func (x *Assignment) GetInstances() []string {
	if x != nil {
		return x.Instances
	}
	return nil
}

func (x *Assignment) GetInstanceNamePrefixes() []string {
	if x != nil {
		return x.InstanceNamePrefixes
	}
	return nil
}

func (x *Assignment) GetOsTypes() []*Assignment_OsType {
	if x != nil {
		return x.OsTypes
	}
	return nil
}

// Package is a reference to the software package to be installed or removed.
// The agent on the VM instance uses the system package manager to apply the
// config.
//
//
// These are the commands that the agent uses to install or remove
// packages.
//
// Apt
// install: `apt-get update && apt-get -y install package1 package2 package3`
// remove: `apt-get -y remove package1 package2 package3`
//
// Yum
// install: `yum -y install package1 package2 package3`
// remove: `yum -y remove package1 package2 package3`
//
// Zypper
// install: `zypper install package1 package2 package3`
// remove: `zypper rm package1 package2`
//
// Googet
// install: `googet -noconfirm install package1 package2 package3`
// remove: `googet -noconfirm remove package1 package2 package3`
type Package struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The name of the package. A package is uniquely identified for conflict
	// validation by checking the package name and the manager(s) that the
	// package targets.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The desired_state the agent should maintain for this package. The
	// default is to ensure the package is installed.
	DesiredState DesiredState `protobuf:"varint,2,opt,name=desired_state,json=desiredState,proto3,enum=google.cloud.osconfig.v1beta.DesiredState" json:"desired_state,omitempty"`
	// Type of package manager that can be used to install this package.
	// If a system does not have the package manager, the package is not
	// installed or removed no error message is returned. By default,
	// or if you specify `ANY`,
	// the agent attempts to install and remove this package using the default
	// package manager. This is useful when creating a policy that applies to
	// different types of systems.
	//
	// The default behavior is ANY.
	Manager Package_Manager `protobuf:"varint,3,opt,name=manager,proto3,enum=google.cloud.osconfig.v1beta.Package_Manager" json:"manager,omitempty"`
}

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

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

func (*Package) ProtoMessage() {}

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

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

func (x *Package) GetDesiredState() DesiredState {
	if x != nil {
		return x.DesiredState
	}
	return DesiredState_DESIRED_STATE_UNSPECIFIED
}

func (x *Package) GetManager() Package_Manager {
	if x != nil {
		return x.Manager
	}
	return Package_MANAGER_UNSPECIFIED
}

// Represents a single Apt package repository. This repository is added to
// a repo file that is stored at
// `/etc/apt/sources.list.d/google_osconfig.list`.
type AptRepository struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Type of archive files in this repository. The default behavior is DEB.
	ArchiveType AptRepository_ArchiveType `protobuf:"varint,1,opt,name=archive_type,json=archiveType,proto3,enum=google.cloud.osconfig.v1beta.AptRepository_ArchiveType" json:"archive_type,omitempty"`
	// Required. URI for this repository.
	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	// Required. Distribution of this repository.
	Distribution string `protobuf:"bytes,3,opt,name=distribution,proto3" json:"distribution,omitempty"`
	// Required. List of components for this repository. Must contain at least one item.
	Components []string `protobuf:"bytes,4,rep,name=components,proto3" json:"components,omitempty"`
	// URI of the key file for this repository. The agent maintains
	// a keyring at `/etc/apt/trusted.gpg.d/osconfig_agent_managed.gpg` containing
	// all the keys in any applied guest policy.
	GpgKey string `protobuf:"bytes,5,opt,name=gpg_key,json=gpgKey,proto3" json:"gpg_key,omitempty"`
}

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

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

func (*AptRepository) ProtoMessage() {}

func (x *AptRepository) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 AptRepository.ProtoReflect.Descriptor instead.
func (*AptRepository) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{3}
}

func (x *AptRepository) GetArchiveType() AptRepository_ArchiveType {
	if x != nil {
		return x.ArchiveType
	}
	return AptRepository_ARCHIVE_TYPE_UNSPECIFIED
}

func (x *AptRepository) GetUri() string {
	if x != nil {
		return x.Uri
	}
	return ""
}

func (x *AptRepository) GetDistribution() string {
	if x != nil {
		return x.Distribution
	}
	return ""
}

func (x *AptRepository) GetComponents() []string {
	if x != nil {
		return x.Components
	}
	return nil
}

func (x *AptRepository) GetGpgKey() string {
	if x != nil {
		return x.GpgKey
	}
	return ""
}

// Represents a single Yum package repository. This repository is added to a
// repo file that is stored at `/etc/yum.repos.d/google_osconfig.repo`.
type YumRepository struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. A one word, unique name for this repository. This is
	// the `repo id` in the Yum config file and also the `display_name` if
	// `display_name` is omitted. This id is also used as the unique identifier
	// when checking for guest policy conflicts.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// The display name of the repository.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Required. The location of the repository directory.
	BaseUrl string `protobuf:"bytes,3,opt,name=base_url,json=baseUrl,proto3" json:"base_url,omitempty"`
	// URIs of GPG keys.
	GpgKeys []string `protobuf:"bytes,4,rep,name=gpg_keys,json=gpgKeys,proto3" json:"gpg_keys,omitempty"`
}

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

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

func (*YumRepository) ProtoMessage() {}

func (x *YumRepository) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 YumRepository.ProtoReflect.Descriptor instead.
func (*YumRepository) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{4}
}

func (x *YumRepository) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *YumRepository) GetDisplayName() string {
	if x != nil {
		return x.DisplayName
	}
	return ""
}

func (x *YumRepository) GetBaseUrl() string {
	if x != nil {
		return x.BaseUrl
	}
	return ""
}

func (x *YumRepository) GetGpgKeys() []string {
	if x != nil {
		return x.GpgKeys
	}
	return nil
}

// Represents a single Zypper package repository. This repository is added to a
// repo file that is stored at `/etc/zypp/repos.d/google_osconfig.repo`.
type ZypperRepository struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. A one word, unique name for this repository. This is
	// the `repo id` in the zypper config file and also the `display_name` if
	// `display_name` is omitted. This id is also used as the unique identifier
	// when checking for guest policy conflicts.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// The display name of the repository.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Required. The location of the repository directory.
	BaseUrl string `protobuf:"bytes,3,opt,name=base_url,json=baseUrl,proto3" json:"base_url,omitempty"`
	// URIs of GPG keys.
	GpgKeys []string `protobuf:"bytes,4,rep,name=gpg_keys,json=gpgKeys,proto3" json:"gpg_keys,omitempty"`
}

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

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

func (*ZypperRepository) ProtoMessage() {}

func (x *ZypperRepository) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 ZypperRepository.ProtoReflect.Descriptor instead.
func (*ZypperRepository) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{5}
}

func (x *ZypperRepository) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *ZypperRepository) GetDisplayName() string {
	if x != nil {
		return x.DisplayName
	}
	return ""
}

func (x *ZypperRepository) GetBaseUrl() string {
	if x != nil {
		return x.BaseUrl
	}
	return ""
}

func (x *ZypperRepository) GetGpgKeys() []string {
	if x != nil {
		return x.GpgKeys
	}
	return nil
}

// Represents a Goo package repository. These is added to a repo file
// that is stored at C:/ProgramData/GooGet/repos/google_osconfig.repo.
type GooRepository struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The name of the repository.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required. The url of the repository.
	Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`
}

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

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

func (*GooRepository) ProtoMessage() {}

func (x *GooRepository) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 GooRepository.ProtoReflect.Descriptor instead.
func (*GooRepository) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{6}
}

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

func (x *GooRepository) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

// A package repository.
type PackageRepository struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A specific type of repository.
	//
	// Types that are assignable to Repository:
	//	*PackageRepository_Apt
	//	*PackageRepository_Yum
	//	*PackageRepository_Zypper
	//	*PackageRepository_Goo
	Repository isPackageRepository_Repository `protobuf_oneof:"repository"`
}

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

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

func (*PackageRepository) ProtoMessage() {}

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

func (m *PackageRepository) GetRepository() isPackageRepository_Repository {
	if m != nil {
		return m.Repository
	}
	return nil
}

func (x *PackageRepository) GetApt() *AptRepository {
	if x, ok := x.GetRepository().(*PackageRepository_Apt); ok {
		return x.Apt
	}
	return nil
}

func (x *PackageRepository) GetYum() *YumRepository {
	if x, ok := x.GetRepository().(*PackageRepository_Yum); ok {
		return x.Yum
	}
	return nil
}

func (x *PackageRepository) GetZypper() *ZypperRepository {
	if x, ok := x.GetRepository().(*PackageRepository_Zypper); ok {
		return x.Zypper
	}
	return nil
}

func (x *PackageRepository) GetGoo() *GooRepository {
	if x, ok := x.GetRepository().(*PackageRepository_Goo); ok {
		return x.Goo
	}
	return nil
}

type isPackageRepository_Repository interface {
	isPackageRepository_Repository()
}

type PackageRepository_Apt struct {
	// An Apt Repository.
	Apt *AptRepository `protobuf:"bytes,1,opt,name=apt,proto3,oneof"`
}

type PackageRepository_Yum struct {
	// A Yum Repository.
	Yum *YumRepository `protobuf:"bytes,2,opt,name=yum,proto3,oneof"`
}

type PackageRepository_Zypper struct {
	// A Zypper Repository.
	Zypper *ZypperRepository `protobuf:"bytes,3,opt,name=zypper,proto3,oneof"`
}

type PackageRepository_Goo struct {
	// A Goo Repository.
	Goo *GooRepository `protobuf:"bytes,4,opt,name=goo,proto3,oneof"`
}

func (*PackageRepository_Apt) isPackageRepository_Repository() {}

func (*PackageRepository_Yum) isPackageRepository_Repository() {}

func (*PackageRepository_Zypper) isPackageRepository_Repository() {}

func (*PackageRepository_Goo) isPackageRepository_Repository() {}

// A software recipe is a set of instructions for installing and configuring a
// piece of software. It consists of a set of artifacts that are
// downloaded, and a set of steps that install, configure, and/or update the
// software.
//
// Recipes support installing and updating software from artifacts in the
// following formats:
// Zip archive, Tar archive, Windows MSI, Debian package, and RPM package.
//
// Additionally, recipes support executing a script (either defined in a file or
// directly in this api) in bash, sh, cmd, and powershell.
//
// Updating a software recipe
//
// If a recipe is assigned to an instance and there is a recipe with the same
// name but a lower version already installed and the assigned state
// of the recipe is `INSTALLED_KEEP_UPDATED`, then the recipe is updated to
// the new version.
//
// Script Working Directories
//
// Each script or execution step is run in its own temporary directory which
// is deleted after completing the step.
type SoftwareRecipe struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. Unique identifier for the recipe. Only one recipe with a given name is
	// installed on an instance.
	//
	// Names are also used to identify resources which helps to determine whether
	// guest policies have conflicts. This means that requests to create multiple
	// recipes with the same name and version are rejected since they
	// could potentially have conflicting assignments.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The version of this software recipe. Version can be up to 4 period
	// separated numbers (e.g. 12.34.56.78).
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// Resources available to be used in the steps in the recipe.
	Artifacts []*SoftwareRecipe_Artifact `protobuf:"bytes,3,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	// Actions to be taken for installing this recipe. On failure it stops
	// executing steps and does not attempt another installation. Any steps taken
	// (including partially completed steps) are not rolled back.
	InstallSteps []*SoftwareRecipe_Step `protobuf:"bytes,4,rep,name=install_steps,json=installSteps,proto3" json:"install_steps,omitempty"`
	// Actions to be taken for updating this recipe. On failure it stops
	// executing steps and  does not attempt another update for this recipe. Any
	// steps taken (including partially completed steps) are not rolled back.
	UpdateSteps []*SoftwareRecipe_Step `protobuf:"bytes,5,rep,name=update_steps,json=updateSteps,proto3" json:"update_steps,omitempty"`
	// Default is INSTALLED. The desired state the agent should maintain for this
	// recipe.
	//
	// INSTALLED: The software recipe is installed on the instance but
	//            won't be updated to new versions.
	// INSTALLED_KEEP_UPDATED: The software recipe is installed on the
	//                         instance. The recipe is updated to a higher
	//                         version, if a higher version of the recipe is
	//                         assigned to this instance.
	// REMOVE: Remove is unsupported for software recipes and attempts to
	//         create or update a recipe to the REMOVE state is rejected.
	DesiredState DesiredState `protobuf:"varint,6,opt,name=desired_state,json=desiredState,proto3,enum=google.cloud.osconfig.v1beta.DesiredState" json:"desired_state,omitempty"`
}

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

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

func (*SoftwareRecipe) ProtoMessage() {}

func (x *SoftwareRecipe) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 SoftwareRecipe.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8}
}

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

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

func (x *SoftwareRecipe) GetArtifacts() []*SoftwareRecipe_Artifact {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

func (x *SoftwareRecipe) GetInstallSteps() []*SoftwareRecipe_Step {
	if x != nil {
		return x.InstallSteps
	}
	return nil
}

func (x *SoftwareRecipe) GetUpdateSteps() []*SoftwareRecipe_Step {
	if x != nil {
		return x.UpdateSteps
	}
	return nil
}

func (x *SoftwareRecipe) GetDesiredState() DesiredState {
	if x != nil {
		return x.DesiredState
	}
	return DesiredState_DESIRED_STATE_UNSPECIFIED
}

// A request message for creating a guest policy.
type CreateGuestPolicyRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The resource name of the parent using one of the following forms:
	// `projects/{project_number}`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The logical name of the guest policy in the project
	// with the following restrictions:
	//
	// * Must contain only lowercase letters, numbers, and hyphens.
	// * Must start with a letter.
	// * Must be between 1-63 characters.
	// * Must end with a number or a letter.
	// * Must be unique within the project.
	GuestPolicyId string `protobuf:"bytes,2,opt,name=guest_policy_id,json=guestPolicyId,proto3" json:"guest_policy_id,omitempty"`
	// Required. The GuestPolicy to create.
	GuestPolicy *GuestPolicy `protobuf:"bytes,3,opt,name=guest_policy,json=guestPolicy,proto3" json:"guest_policy,omitempty"`
}

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

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

func (*CreateGuestPolicyRequest) ProtoMessage() {}

func (x *CreateGuestPolicyRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 CreateGuestPolicyRequest.ProtoReflect.Descriptor instead.
func (*CreateGuestPolicyRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{9}
}

func (x *CreateGuestPolicyRequest) GetParent() string {
	if x != nil {
		return x.Parent
	}
	return ""
}

func (x *CreateGuestPolicyRequest) GetGuestPolicyId() string {
	if x != nil {
		return x.GuestPolicyId
	}
	return ""
}

func (x *CreateGuestPolicyRequest) GetGuestPolicy() *GuestPolicy {
	if x != nil {
		return x.GuestPolicy
	}
	return nil
}

// A request message for retrieving a guest policy.
type GetGuestPolicyRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The resource name of the guest policy using one of the following forms:
	// `projects/{project_number}/guestPolicies/{guest_policy_id}`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*GetGuestPolicyRequest) ProtoMessage() {}

func (x *GetGuestPolicyRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 GetGuestPolicyRequest.ProtoReflect.Descriptor instead.
func (*GetGuestPolicyRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{10}
}

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

// A request message for listing guest policies.
type ListGuestPoliciesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The resource name of the parent using one of the following forms:
	// `projects/{project_number}`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The maximum number of guest policies to return.
	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// A pagination token returned from a previous call to `ListGuestPolicies`
	// that indicates where this listing should continue from.
	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
}

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

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

func (*ListGuestPoliciesRequest) ProtoMessage() {}

func (x *ListGuestPoliciesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 ListGuestPoliciesRequest.ProtoReflect.Descriptor instead.
func (*ListGuestPoliciesRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{11}
}

func (x *ListGuestPoliciesRequest) GetParent() string {
	if x != nil {
		return x.Parent
	}
	return ""
}

func (x *ListGuestPoliciesRequest) GetPageSize() int32 {
	if x != nil {
		return x.PageSize
	}
	return 0
}

func (x *ListGuestPoliciesRequest) GetPageToken() string {
	if x != nil {
		return x.PageToken
	}
	return ""
}

// A response message for listing guest policies.
type ListGuestPoliciesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The list of GuestPolicies.
	GuestPolicies []*GuestPolicy `protobuf:"bytes,1,rep,name=guest_policies,json=guestPolicies,proto3" json:"guest_policies,omitempty"`
	// A pagination token that can be used to get the next page
	// of guest policies.
	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
}

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

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

func (*ListGuestPoliciesResponse) ProtoMessage() {}

func (x *ListGuestPoliciesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 ListGuestPoliciesResponse.ProtoReflect.Descriptor instead.
func (*ListGuestPoliciesResponse) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{12}
}

func (x *ListGuestPoliciesResponse) GetGuestPolicies() []*GuestPolicy {
	if x != nil {
		return x.GuestPolicies
	}
	return nil
}

func (x *ListGuestPoliciesResponse) GetNextPageToken() string {
	if x != nil {
		return x.NextPageToken
	}
	return ""
}

// A request message for updating a guest policy.
type UpdateGuestPolicyRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The updated GuestPolicy.
	GuestPolicy *GuestPolicy `protobuf:"bytes,1,opt,name=guest_policy,json=guestPolicy,proto3" json:"guest_policy,omitempty"`
	// Field mask that controls which fields of the guest policy should be
	// updated.
	UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
}

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

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

func (*UpdateGuestPolicyRequest) ProtoMessage() {}

func (x *UpdateGuestPolicyRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 UpdateGuestPolicyRequest.ProtoReflect.Descriptor instead.
func (*UpdateGuestPolicyRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{13}
}

func (x *UpdateGuestPolicyRequest) GetGuestPolicy() *GuestPolicy {
	if x != nil {
		return x.GuestPolicy
	}
	return nil
}

func (x *UpdateGuestPolicyRequest) GetUpdateMask() *field_mask.FieldMask {
	if x != nil {
		return x.UpdateMask
	}
	return nil
}

// A request message for deleting a guest policy.
type DeleteGuestPolicyRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The resource name of the guest policy  using one of the following forms:
	// `projects/{project_number}/guestPolicies/{guest_policy_id}`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*DeleteGuestPolicyRequest) ProtoMessage() {}

func (x *DeleteGuestPolicyRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 DeleteGuestPolicyRequest.ProtoReflect.Descriptor instead.
func (*DeleteGuestPolicyRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{14}
}

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

// A request message for getting the effective guest policy assigned to the
// instance.
type LookupEffectiveGuestPolicyRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The VM instance whose policies are being looked up.
	Instance string `protobuf:"bytes,1,opt,name=instance,proto3" json:"instance,omitempty"`
	// Short name of the OS running on the instance. The OS Config agent only
	// provides this field for targeting if OS Inventory is enabled for that
	// instance.
	OsShortName string `protobuf:"bytes,2,opt,name=os_short_name,json=osShortName,proto3" json:"os_short_name,omitempty"`
	// Version of the OS running on the instance. The OS Config agent only
	// provides this field for targeting if OS Inventory is enabled for that
	// VM instance.
	OsVersion string `protobuf:"bytes,3,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"`
	// Architecture of OS running on the instance. The OS Config agent only
	// provides this field for targeting if OS Inventory is enabled for that
	// instance.
	OsArchitecture string `protobuf:"bytes,4,opt,name=os_architecture,json=osArchitecture,proto3" json:"os_architecture,omitempty"`
}

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

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

func (*LookupEffectiveGuestPolicyRequest) ProtoMessage() {}

func (x *LookupEffectiveGuestPolicyRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 LookupEffectiveGuestPolicyRequest.ProtoReflect.Descriptor instead.
func (*LookupEffectiveGuestPolicyRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{15}
}

func (x *LookupEffectiveGuestPolicyRequest) GetInstance() string {
	if x != nil {
		return x.Instance
	}
	return ""
}

func (x *LookupEffectiveGuestPolicyRequest) GetOsShortName() string {
	if x != nil {
		return x.OsShortName
	}
	return ""
}

func (x *LookupEffectiveGuestPolicyRequest) GetOsVersion() string {
	if x != nil {
		return x.OsVersion
	}
	return ""
}

func (x *LookupEffectiveGuestPolicyRequest) GetOsArchitecture() string {
	if x != nil {
		return x.OsArchitecture
	}
	return ""
}

// The effective guest policy that applies to a VM instance.
type EffectiveGuestPolicy struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of package configurations assigned to the VM instance.
	Packages []*EffectiveGuestPolicy_SourcedPackage `protobuf:"bytes,1,rep,name=packages,proto3" json:"packages,omitempty"`
	// List of package repository configurations assigned to the VM instance.
	PackageRepositories []*EffectiveGuestPolicy_SourcedPackageRepository `protobuf:"bytes,2,rep,name=package_repositories,json=packageRepositories,proto3" json:"package_repositories,omitempty"`
	// List of recipes assigned to the VM instance.
	SoftwareRecipes []*EffectiveGuestPolicy_SourcedSoftwareRecipe `protobuf:"bytes,3,rep,name=software_recipes,json=softwareRecipes,proto3" json:"software_recipes,omitempty"`
}

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

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

func (*EffectiveGuestPolicy) ProtoMessage() {}

func (x *EffectiveGuestPolicy) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_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 EffectiveGuestPolicy.ProtoReflect.Descriptor instead.
func (*EffectiveGuestPolicy) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{16}
}

func (x *EffectiveGuestPolicy) GetPackages() []*EffectiveGuestPolicy_SourcedPackage {
	if x != nil {
		return x.Packages
	}
	return nil
}

func (x *EffectiveGuestPolicy) GetPackageRepositories() []*EffectiveGuestPolicy_SourcedPackageRepository {
	if x != nil {
		return x.PackageRepositories
	}
	return nil
}

func (x *EffectiveGuestPolicy) GetSoftwareRecipes() []*EffectiveGuestPolicy_SourcedSoftwareRecipe {
	if x != nil {
		return x.SoftwareRecipes
	}
	return nil
}

// Represents a group of VM intances that can be identified as having all
// these labels, for example "env=prod and app=web".
type Assignment_GroupLabel struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Google Compute Engine instance labels that must be present for an
	// instance to be included in this assignment group.
	Labels map[string]string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*Assignment_GroupLabel) ProtoMessage() {}

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

func (x *Assignment_GroupLabel) GetLabels() map[string]string {
	if x != nil {
		return x.Labels
	}
	return nil
}

// Defines the criteria for selecting VM Instances by OS type.
type Assignment_OsType struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Targets VM instances with OS Inventory enabled and having the following
	// OS short name, for example "debian" or "windows".
	OsShortName string `protobuf:"bytes,1,opt,name=os_short_name,json=osShortName,proto3" json:"os_short_name,omitempty"`
	// Targets VM instances with OS Inventory enabled and having the following
	// following OS version.
	OsVersion string `protobuf:"bytes,2,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"`
	// Targets VM instances with OS Inventory enabled and having the following
	// OS architecture.
	OsArchitecture string `protobuf:"bytes,3,opt,name=os_architecture,json=osArchitecture,proto3" json:"os_architecture,omitempty"`
}

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

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

func (*Assignment_OsType) ProtoMessage() {}

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

func (x *Assignment_OsType) GetOsShortName() string {
	if x != nil {
		return x.OsShortName
	}
	return ""
}

func (x *Assignment_OsType) GetOsVersion() string {
	if x != nil {
		return x.OsVersion
	}
	return ""
}

func (x *Assignment_OsType) GetOsArchitecture() string {
	if x != nil {
		return x.OsArchitecture
	}
	return ""
}

// Specifies a resource to be used in the recipe.
type SoftwareRecipe_Artifact struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. Id of the artifact, which the installation and update steps of this
	// recipe can reference. Artifacts in a recipe cannot have the same id.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// A specific type of artifact.
	//
	// Types that are assignable to Artifact:
	//	*SoftwareRecipe_Artifact_Remote_
	//	*SoftwareRecipe_Artifact_Gcs_
	Artifact isSoftwareRecipe_Artifact_Artifact `protobuf_oneof:"artifact"`
	// Defaults to false. When false, recipes are subject to validations
	// based on the artifact type:
	//
	// Remote: A checksum must be specified, and only protocols with
	// transport-layer security are permitted.
	// GCS:    An object generation number must be specified.
	AllowInsecure bool `protobuf:"varint,4,opt,name=allow_insecure,json=allowInsecure,proto3" json:"allow_insecure,omitempty"`
}

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

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

func (*SoftwareRecipe_Artifact) ProtoMessage() {}

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

func (x *SoftwareRecipe_Artifact) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (m *SoftwareRecipe_Artifact) GetArtifact() isSoftwareRecipe_Artifact_Artifact {
	if m != nil {
		return m.Artifact
	}
	return nil
}

func (x *SoftwareRecipe_Artifact) GetRemote() *SoftwareRecipe_Artifact_Remote {
	if x, ok := x.GetArtifact().(*SoftwareRecipe_Artifact_Remote_); ok {
		return x.Remote
	}
	return nil
}

func (x *SoftwareRecipe_Artifact) GetGcs() *SoftwareRecipe_Artifact_Gcs {
	if x, ok := x.GetArtifact().(*SoftwareRecipe_Artifact_Gcs_); ok {
		return x.Gcs
	}
	return nil
}

func (x *SoftwareRecipe_Artifact) GetAllowInsecure() bool {
	if x != nil {
		return x.AllowInsecure
	}
	return false
}

type isSoftwareRecipe_Artifact_Artifact interface {
	isSoftwareRecipe_Artifact_Artifact()
}

type SoftwareRecipe_Artifact_Remote_ struct {
	// A generic remote artifact.
	Remote *SoftwareRecipe_Artifact_Remote `protobuf:"bytes,2,opt,name=remote,proto3,oneof"`
}

type SoftwareRecipe_Artifact_Gcs_ struct {
	// A Google Cloud Storage artifact.
	Gcs *SoftwareRecipe_Artifact_Gcs `protobuf:"bytes,3,opt,name=gcs,proto3,oneof"`
}

func (*SoftwareRecipe_Artifact_Remote_) isSoftwareRecipe_Artifact_Artifact() {}

func (*SoftwareRecipe_Artifact_Gcs_) isSoftwareRecipe_Artifact_Artifact() {}

// An action that can be taken as part of installing or updating a recipe.
type SoftwareRecipe_Step struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A specific type of step.
	//
	// Types that are assignable to Step:
	//	*SoftwareRecipe_Step_FileCopy
	//	*SoftwareRecipe_Step_ArchiveExtraction
	//	*SoftwareRecipe_Step_MsiInstallation
	//	*SoftwareRecipe_Step_DpkgInstallation
	//	*SoftwareRecipe_Step_RpmInstallation
	//	*SoftwareRecipe_Step_FileExec
	//	*SoftwareRecipe_Step_ScriptRun
	Step isSoftwareRecipe_Step_Step `protobuf_oneof:"step"`
}

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

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

func (*SoftwareRecipe_Step) ProtoMessage() {}

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

func (m *SoftwareRecipe_Step) GetStep() isSoftwareRecipe_Step_Step {
	if m != nil {
		return m.Step
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetFileCopy() *SoftwareRecipe_Step_CopyFile {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_FileCopy); ok {
		return x.FileCopy
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetArchiveExtraction() *SoftwareRecipe_Step_ExtractArchive {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_ArchiveExtraction); ok {
		return x.ArchiveExtraction
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetMsiInstallation() *SoftwareRecipe_Step_InstallMsi {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_MsiInstallation); ok {
		return x.MsiInstallation
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetDpkgInstallation() *SoftwareRecipe_Step_InstallDpkg {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_DpkgInstallation); ok {
		return x.DpkgInstallation
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetRpmInstallation() *SoftwareRecipe_Step_InstallRpm {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_RpmInstallation); ok {
		return x.RpmInstallation
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetFileExec() *SoftwareRecipe_Step_ExecFile {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_FileExec); ok {
		return x.FileExec
	}
	return nil
}

func (x *SoftwareRecipe_Step) GetScriptRun() *SoftwareRecipe_Step_RunScript {
	if x, ok := x.GetStep().(*SoftwareRecipe_Step_ScriptRun); ok {
		return x.ScriptRun
	}
	return nil
}

type isSoftwareRecipe_Step_Step interface {
	isSoftwareRecipe_Step_Step()
}

type SoftwareRecipe_Step_FileCopy struct {
	// Copies a file onto the instance.
	FileCopy *SoftwareRecipe_Step_CopyFile `protobuf:"bytes,1,opt,name=file_copy,json=fileCopy,proto3,oneof"`
}

type SoftwareRecipe_Step_ArchiveExtraction struct {
	// Extracts an archive into the specified directory.
	ArchiveExtraction *SoftwareRecipe_Step_ExtractArchive `protobuf:"bytes,2,opt,name=archive_extraction,json=archiveExtraction,proto3,oneof"`
}

type SoftwareRecipe_Step_MsiInstallation struct {
	// Installs an MSI file.
	MsiInstallation *SoftwareRecipe_Step_InstallMsi `protobuf:"bytes,3,opt,name=msi_installation,json=msiInstallation,proto3,oneof"`
}

type SoftwareRecipe_Step_DpkgInstallation struct {
	// Installs a deb file via dpkg.
	DpkgInstallation *SoftwareRecipe_Step_InstallDpkg `protobuf:"bytes,4,opt,name=dpkg_installation,json=dpkgInstallation,proto3,oneof"`
}

type SoftwareRecipe_Step_RpmInstallation struct {
	// Installs an rpm file via the rpm utility.
	RpmInstallation *SoftwareRecipe_Step_InstallRpm `protobuf:"bytes,5,opt,name=rpm_installation,json=rpmInstallation,proto3,oneof"`
}

type SoftwareRecipe_Step_FileExec struct {
	// Executes an artifact or local file.
	FileExec *SoftwareRecipe_Step_ExecFile `protobuf:"bytes,6,opt,name=file_exec,json=fileExec,proto3,oneof"`
}

type SoftwareRecipe_Step_ScriptRun struct {
	// Runs commands in a shell.
	ScriptRun *SoftwareRecipe_Step_RunScript `protobuf:"bytes,7,opt,name=script_run,json=scriptRun,proto3,oneof"`
}

func (*SoftwareRecipe_Step_FileCopy) isSoftwareRecipe_Step_Step() {}

func (*SoftwareRecipe_Step_ArchiveExtraction) isSoftwareRecipe_Step_Step() {}

func (*SoftwareRecipe_Step_MsiInstallation) isSoftwareRecipe_Step_Step() {}

func (*SoftwareRecipe_Step_DpkgInstallation) isSoftwareRecipe_Step_Step() {}

func (*SoftwareRecipe_Step_RpmInstallation) isSoftwareRecipe_Step_Step() {}

func (*SoftwareRecipe_Step_FileExec) isSoftwareRecipe_Step_Step() {}

func (*SoftwareRecipe_Step_ScriptRun) isSoftwareRecipe_Step_Step() {}

// Specifies an artifact available via some URI.
type SoftwareRecipe_Artifact_Remote struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// URI from which to fetch the object. It should contain both the protocol
	// and path following the format {protocol}://{location}.
	Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
	// Must be provided if `allow_insecure` is `false`.
	// SHA256 checksum in hex format, to compare to the checksum of the
	// artifact. If the checksum is not empty and it doesn't match the
	// artifact then the recipe installation fails before running any of the
	// steps.
	Checksum string `protobuf:"bytes,2,opt,name=checksum,proto3" json:"checksum,omitempty"`
}

func (x *SoftwareRecipe_Artifact_Remote) Reset() {
	*x = SoftwareRecipe_Artifact_Remote{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[22]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Artifact_Remote) ProtoMessage() {}

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

func (x *SoftwareRecipe_Artifact_Remote) GetUri() string {
	if x != nil {
		return x.Uri
	}
	return ""
}

func (x *SoftwareRecipe_Artifact_Remote) GetChecksum() string {
	if x != nil {
		return x.Checksum
	}
	return ""
}

// Specifies an artifact available as a Google Cloud Storage object.
type SoftwareRecipe_Artifact_Gcs struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Bucket of the Google Cloud Storage object.
	// Given an example URL:
	// `https://storage.googleapis.com/my-bucket/foo/bar#1234567`
	// this value would be `my-bucket`.
	Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// Name of the Google Cloud Storage object.
	// As specified [here]
	// (https://cloud.google.com/storage/docs/naming#objectnames)
	// Given an example URL:
	// `https://storage.googleapis.com/my-bucket/foo/bar#1234567`
	// this value would be `foo/bar`.
	Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"`
	// Must be provided if allow_insecure is false.
	// Generation number of the Google Cloud Storage object.
	// `https://storage.googleapis.com/my-bucket/foo/bar#1234567`
	// this value would be `1234567`.
	Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"`
}

func (x *SoftwareRecipe_Artifact_Gcs) Reset() {
	*x = SoftwareRecipe_Artifact_Gcs{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[23]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Artifact_Gcs) ProtoMessage() {}

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

func (x *SoftwareRecipe_Artifact_Gcs) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *SoftwareRecipe_Artifact_Gcs) GetObject() string {
	if x != nil {
		return x.Object
	}
	return ""
}

func (x *SoftwareRecipe_Artifact_Gcs) GetGeneration() int64 {
	if x != nil {
		return x.Generation
	}
	return 0
}

// Copies the artifact to the specified path on the instance.
type SoftwareRecipe_Step_CopyFile struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The id of the relevant artifact in the recipe.
	ArtifactId string `protobuf:"bytes,1,opt,name=artifact_id,json=artifactId,proto3" json:"artifact_id,omitempty"`
	// Required. The absolute path on the instance to put the file.
	Destination string `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"`
	// Whether to allow this step to overwrite existing files. If this is
	// false and the file already exists the file is not overwritten
	// and the step is considered a success. Defaults to false.
	Overwrite bool `protobuf:"varint,3,opt,name=overwrite,proto3" json:"overwrite,omitempty"`
	// Consists of three octal digits which represent, in
	// order, the permissions of the owner, group, and other users for the
	// file (similarly to the numeric mode used in the linux chmod utility).
	// Each digit represents a three bit number with the 4 bit
	// corresponding to the read permissions, the 2 bit corresponds to the
	// write bit, and the one bit corresponds to the execute permission.
	// Default behavior is 755.
	//
	// Below are some examples of permissions and their associated values:
	// read, write, and execute: 7
	// read and execute: 5
	// read and write: 6
	// read only: 4
	Permissions string `protobuf:"bytes,4,opt,name=permissions,proto3" json:"permissions,omitempty"`
}

func (x *SoftwareRecipe_Step_CopyFile) Reset() {
	*x = SoftwareRecipe_Step_CopyFile{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[24]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_CopyFile) ProtoMessage() {}

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

func (x *SoftwareRecipe_Step_CopyFile) GetArtifactId() string {
	if x != nil {
		return x.ArtifactId
	}
	return ""
}

func (x *SoftwareRecipe_Step_CopyFile) GetDestination() string {
	if x != nil {
		return x.Destination
	}
	return ""
}

func (x *SoftwareRecipe_Step_CopyFile) GetOverwrite() bool {
	if x != nil {
		return x.Overwrite
	}
	return false
}

func (x *SoftwareRecipe_Step_CopyFile) GetPermissions() string {
	if x != nil {
		return x.Permissions
	}
	return ""
}

// Extracts an archive of the type specified in the specified directory.
type SoftwareRecipe_Step_ExtractArchive struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The id of the relevant artifact in the recipe.
	ArtifactId string `protobuf:"bytes,1,opt,name=artifact_id,json=artifactId,proto3" json:"artifact_id,omitempty"`
	// Directory to extract archive to.
	// Defaults to `/` on Linux or `C:\` on Windows.
	Destination string `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"`
	// Required. The type of the archive to extract.
	Type SoftwareRecipe_Step_ExtractArchive_ArchiveType `protobuf:"varint,3,opt,name=type,proto3,enum=google.cloud.osconfig.v1beta.SoftwareRecipe_Step_ExtractArchive_ArchiveType" json:"type,omitempty"`
}

func (x *SoftwareRecipe_Step_ExtractArchive) Reset() {
	*x = SoftwareRecipe_Step_ExtractArchive{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[25]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_ExtractArchive) ProtoMessage() {}

func (x *SoftwareRecipe_Step_ExtractArchive) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[25]
	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 SoftwareRecipe_Step_ExtractArchive.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe_Step_ExtractArchive) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 1}
}

func (x *SoftwareRecipe_Step_ExtractArchive) GetArtifactId() string {
	if x != nil {
		return x.ArtifactId
	}
	return ""
}

func (x *SoftwareRecipe_Step_ExtractArchive) GetDestination() string {
	if x != nil {
		return x.Destination
	}
	return ""
}

func (x *SoftwareRecipe_Step_ExtractArchive) GetType() SoftwareRecipe_Step_ExtractArchive_ArchiveType {
	if x != nil {
		return x.Type
	}
	return SoftwareRecipe_Step_ExtractArchive_ARCHIVE_TYPE_UNSPECIFIED
}

// Installs an MSI file.
type SoftwareRecipe_Step_InstallMsi struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The id of the relevant artifact in the recipe.
	ArtifactId string `protobuf:"bytes,1,opt,name=artifact_id,json=artifactId,proto3" json:"artifact_id,omitempty"`
	// The flags to use when installing the MSI
	// defaults to ["/i"] (i.e. the install flag).
	Flags []string `protobuf:"bytes,2,rep,name=flags,proto3" json:"flags,omitempty"`
	// Return codes that indicate that the software installed or updated
	// successfully. Behaviour defaults to [0]
	AllowedExitCodes []int32 `protobuf:"varint,3,rep,packed,name=allowed_exit_codes,json=allowedExitCodes,proto3" json:"allowed_exit_codes,omitempty"`
}

func (x *SoftwareRecipe_Step_InstallMsi) Reset() {
	*x = SoftwareRecipe_Step_InstallMsi{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[26]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_InstallMsi) ProtoMessage() {}

func (x *SoftwareRecipe_Step_InstallMsi) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[26]
	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 SoftwareRecipe_Step_InstallMsi.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe_Step_InstallMsi) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 2}
}

func (x *SoftwareRecipe_Step_InstallMsi) GetArtifactId() string {
	if x != nil {
		return x.ArtifactId
	}
	return ""
}

func (x *SoftwareRecipe_Step_InstallMsi) GetFlags() []string {
	if x != nil {
		return x.Flags
	}
	return nil
}

func (x *SoftwareRecipe_Step_InstallMsi) GetAllowedExitCodes() []int32 {
	if x != nil {
		return x.AllowedExitCodes
	}
	return nil
}

// Installs a deb via dpkg.
type SoftwareRecipe_Step_InstallDpkg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The id of the relevant artifact in the recipe.
	ArtifactId string `protobuf:"bytes,1,opt,name=artifact_id,json=artifactId,proto3" json:"artifact_id,omitempty"`
}

func (x *SoftwareRecipe_Step_InstallDpkg) Reset() {
	*x = SoftwareRecipe_Step_InstallDpkg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[27]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_InstallDpkg) ProtoMessage() {}

func (x *SoftwareRecipe_Step_InstallDpkg) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[27]
	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 SoftwareRecipe_Step_InstallDpkg.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe_Step_InstallDpkg) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 3}
}

func (x *SoftwareRecipe_Step_InstallDpkg) GetArtifactId() string {
	if x != nil {
		return x.ArtifactId
	}
	return ""
}

// Installs an rpm file via the rpm utility.
type SoftwareRecipe_Step_InstallRpm struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The id of the relevant artifact in the recipe.
	ArtifactId string `protobuf:"bytes,1,opt,name=artifact_id,json=artifactId,proto3" json:"artifact_id,omitempty"`
}

func (x *SoftwareRecipe_Step_InstallRpm) Reset() {
	*x = SoftwareRecipe_Step_InstallRpm{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[28]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_InstallRpm) ProtoMessage() {}

func (x *SoftwareRecipe_Step_InstallRpm) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[28]
	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 SoftwareRecipe_Step_InstallRpm.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe_Step_InstallRpm) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 4}
}

func (x *SoftwareRecipe_Step_InstallRpm) GetArtifactId() string {
	if x != nil {
		return x.ArtifactId
	}
	return ""
}

// Executes an artifact or local file.
type SoftwareRecipe_Step_ExecFile struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of the file to execute.
	//
	// Types that are assignable to LocationType:
	//	*SoftwareRecipe_Step_ExecFile_ArtifactId
	//	*SoftwareRecipe_Step_ExecFile_LocalPath
	LocationType isSoftwareRecipe_Step_ExecFile_LocationType `protobuf_oneof:"location_type"`
	// Arguments to be passed to the provided executable.
	Args []string `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"`
	// Defaults to [0]. A list of possible return values that the program
	// can return to indicate a success.
	AllowedExitCodes []int32 `protobuf:"varint,4,rep,packed,name=allowed_exit_codes,json=allowedExitCodes,proto3" json:"allowed_exit_codes,omitempty"`
}

func (x *SoftwareRecipe_Step_ExecFile) Reset() {
	*x = SoftwareRecipe_Step_ExecFile{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[29]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_ExecFile) ProtoMessage() {}

func (x *SoftwareRecipe_Step_ExecFile) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[29]
	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 SoftwareRecipe_Step_ExecFile.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe_Step_ExecFile) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 5}
}

func (m *SoftwareRecipe_Step_ExecFile) GetLocationType() isSoftwareRecipe_Step_ExecFile_LocationType {
	if m != nil {
		return m.LocationType
	}
	return nil
}

func (x *SoftwareRecipe_Step_ExecFile) GetArtifactId() string {
	if x, ok := x.GetLocationType().(*SoftwareRecipe_Step_ExecFile_ArtifactId); ok {
		return x.ArtifactId
	}
	return ""
}

func (x *SoftwareRecipe_Step_ExecFile) GetLocalPath() string {
	if x, ok := x.GetLocationType().(*SoftwareRecipe_Step_ExecFile_LocalPath); ok {
		return x.LocalPath
	}
	return ""
}

func (x *SoftwareRecipe_Step_ExecFile) GetArgs() []string {
	if x != nil {
		return x.Args
	}
	return nil
}

func (x *SoftwareRecipe_Step_ExecFile) GetAllowedExitCodes() []int32 {
	if x != nil {
		return x.AllowedExitCodes
	}
	return nil
}

type isSoftwareRecipe_Step_ExecFile_LocationType interface {
	isSoftwareRecipe_Step_ExecFile_LocationType()
}

type SoftwareRecipe_Step_ExecFile_ArtifactId struct {
	// The id of the relevant artifact in the recipe.
	ArtifactId string `protobuf:"bytes,1,opt,name=artifact_id,json=artifactId,proto3,oneof"`
}

type SoftwareRecipe_Step_ExecFile_LocalPath struct {
	// The absolute path of the file on the local filesystem.
	LocalPath string `protobuf:"bytes,2,opt,name=local_path,json=localPath,proto3,oneof"`
}

func (*SoftwareRecipe_Step_ExecFile_ArtifactId) isSoftwareRecipe_Step_ExecFile_LocationType() {}

func (*SoftwareRecipe_Step_ExecFile_LocalPath) isSoftwareRecipe_Step_ExecFile_LocationType() {}

// Runs a script through an interpreter.
type SoftwareRecipe_Step_RunScript struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The shell script to be executed.
	Script string `protobuf:"bytes,1,opt,name=script,proto3" json:"script,omitempty"`
	// Return codes that indicate that the software installed or updated
	// successfully. Behaviour defaults to [0]
	AllowedExitCodes []int32 `protobuf:"varint,2,rep,packed,name=allowed_exit_codes,json=allowedExitCodes,proto3" json:"allowed_exit_codes,omitempty"`
	// The script interpreter to use to run the script. If no interpreter is
	// specified the script is executed directly, which likely
	// only succeed for scripts with
	// [shebang lines](https://en.wikipedia.org/wiki/Shebang_\(Unix\)).
	Interpreter SoftwareRecipe_Step_RunScript_Interpreter `protobuf:"varint,3,opt,name=interpreter,proto3,enum=google.cloud.osconfig.v1beta.SoftwareRecipe_Step_RunScript_Interpreter" json:"interpreter,omitempty"`
}

func (x *SoftwareRecipe_Step_RunScript) Reset() {
	*x = SoftwareRecipe_Step_RunScript{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[30]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*SoftwareRecipe_Step_RunScript) ProtoMessage() {}

func (x *SoftwareRecipe_Step_RunScript) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[30]
	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 SoftwareRecipe_Step_RunScript.ProtoReflect.Descriptor instead.
func (*SoftwareRecipe_Step_RunScript) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{8, 1, 6}
}

func (x *SoftwareRecipe_Step_RunScript) GetScript() string {
	if x != nil {
		return x.Script
	}
	return ""
}

func (x *SoftwareRecipe_Step_RunScript) GetAllowedExitCodes() []int32 {
	if x != nil {
		return x.AllowedExitCodes
	}
	return nil
}

func (x *SoftwareRecipe_Step_RunScript) GetInterpreter() SoftwareRecipe_Step_RunScript_Interpreter {
	if x != nil {
		return x.Interpreter
	}
	return SoftwareRecipe_Step_RunScript_INTERPRETER_UNSPECIFIED
}

// A guest policy package including its source.
type EffectiveGuestPolicy_SourcedPackage struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the guest policy providing this config.
	Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	// A software package to configure on the VM instance.
	Package *Package `protobuf:"bytes,2,opt,name=package,proto3" json:"package,omitempty"`
}

func (x *EffectiveGuestPolicy_SourcedPackage) Reset() {
	*x = EffectiveGuestPolicy_SourcedPackage{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[31]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*EffectiveGuestPolicy_SourcedPackage) ProtoMessage() {}

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

func (x *EffectiveGuestPolicy_SourcedPackage) GetSource() string {
	if x != nil {
		return x.Source
	}
	return ""
}

func (x *EffectiveGuestPolicy_SourcedPackage) GetPackage() *Package {
	if x != nil {
		return x.Package
	}
	return nil
}

// A guest policy package repository including its source.
type EffectiveGuestPolicy_SourcedPackageRepository struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the guest policy providing this config.
	Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	// A software package repository to configure on the VM instance.
	PackageRepository *PackageRepository `protobuf:"bytes,2,opt,name=package_repository,json=packageRepository,proto3" json:"package_repository,omitempty"`
}

func (x *EffectiveGuestPolicy_SourcedPackageRepository) Reset() {
	*x = EffectiveGuestPolicy_SourcedPackageRepository{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[32]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*EffectiveGuestPolicy_SourcedPackageRepository) ProtoMessage() {}

func (x *EffectiveGuestPolicy_SourcedPackageRepository) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[32]
	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 EffectiveGuestPolicy_SourcedPackageRepository.ProtoReflect.Descriptor instead.
func (*EffectiveGuestPolicy_SourcedPackageRepository) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{16, 1}
}

func (x *EffectiveGuestPolicy_SourcedPackageRepository) GetSource() string {
	if x != nil {
		return x.Source
	}
	return ""
}

func (x *EffectiveGuestPolicy_SourcedPackageRepository) GetPackageRepository() *PackageRepository {
	if x != nil {
		return x.PackageRepository
	}
	return nil
}

// A guest policy recipe including its source.
type EffectiveGuestPolicy_SourcedSoftwareRecipe struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the guest policy providing this config.
	Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
	// A software recipe to configure on the VM instance.
	SoftwareRecipe *SoftwareRecipe `protobuf:"bytes,2,opt,name=software_recipe,json=softwareRecipe,proto3" json:"software_recipe,omitempty"`
}

func (x *EffectiveGuestPolicy_SourcedSoftwareRecipe) Reset() {
	*x = EffectiveGuestPolicy_SourcedSoftwareRecipe{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[33]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*EffectiveGuestPolicy_SourcedSoftwareRecipe) ProtoMessage() {}

func (x *EffectiveGuestPolicy_SourcedSoftwareRecipe) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[33]
	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 EffectiveGuestPolicy_SourcedSoftwareRecipe.ProtoReflect.Descriptor instead.
func (*EffectiveGuestPolicy_SourcedSoftwareRecipe) Descriptor() ([]byte, []int) {
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP(), []int{16, 2}
}

func (x *EffectiveGuestPolicy_SourcedSoftwareRecipe) GetSource() string {
	if x != nil {
		return x.Source
	}
	return ""
}

func (x *EffectiveGuestPolicy_SourcedSoftwareRecipe) GetSoftwareRecipe() *SoftwareRecipe {
	if x != nil {
		return x.SoftwareRecipe
	}
	return nil
}

var File_google_cloud_osconfig_v1beta_guest_policies_proto protoreflect.FileDescriptor

var file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDesc = []byte{
	0x0a, 0x31, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2f, 0x67,
	0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69,
	0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72,
	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66,
	0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x22, 0xf9, 0x04, 0x0a, 0x0b, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
	0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
	0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x63,
	0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
	0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41,
	0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a,
	0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03,
	0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,
	0x4d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
	0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x03, 0xe0,
	0x41, 0x02, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x41,
	0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
	0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e,
	0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
	0x73, 0x12, 0x62, 0x0a, 0x14, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70,
	0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x50,
	0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
	0x52, 0x13, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
	0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x69, 0x70, 0x65, 0x73,
	0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65,
	0x63, 0x69, 0x70, 0x65, 0x52, 0x07, 0x72, 0x65, 0x63, 0x69, 0x70, 0x65, 0x73, 0x12, 0x12, 0x0a,
	0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61,
	0x67, 0x3a, 0x59, 0xea, 0x41, 0x56, 0x0a, 0x23, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
	0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x70, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f,
	0x67, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x67,
	0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x22, 0xb3, 0x04, 0x0a,
	0x0a, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x56, 0x0a, 0x0c, 0x67,
	0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x72, 0x6f, 0x75,
	0x70, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x61, 0x62,
	0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x73,
	0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e,
	0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61,
	0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65,
	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63,
	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x4a, 0x0a,
	0x08, 0x6f, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x41,
	0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65,
	0x52, 0x07, 0x6f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0xa0, 0x01, 0x0a, 0x0a, 0x47, 0x72,
	0x6f, 0x75, 0x70, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x57, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65,
	0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65,
	0x6e, 0x74, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x4c, 0x61,
	0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c,
	0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 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, 0x1a, 0x74, 0x0a, 0x06,
	0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6f, 0x73, 0x5f, 0x73, 0x68, 0x6f,
	0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f,
	0x73, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x73,
	0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
	0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x73, 0x5f,
	0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0e, 0x6f, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75,
	0x72, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x17,
	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
	0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72,
	0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x44, 0x65,
	0x73, 0x69, 0x72, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69,
	0x72, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x6d, 0x61, 0x6e, 0x61,
	0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
	0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65,
	0x72, 0x22, 0x52, 0x0a, 0x07, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x13,
	0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
	0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x07,
	0x0a, 0x03, 0x41, 0x50, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x55, 0x4d, 0x10, 0x03,
	0x12, 0x0a, 0x0a, 0x06, 0x5a, 0x59, 0x50, 0x50, 0x45, 0x52, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03,
	0x47, 0x4f, 0x4f, 0x10, 0x05, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x41, 0x70, 0x74, 0x52, 0x65, 0x70,
	0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x5a, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69,
	0x76, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x74,
	0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69,
	0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x27, 0x0a, 0x0c, 0x64, 0x69,
	0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
	0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,
	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x63, 0x6f,
	0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x70, 0x67, 0x5f,
	0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x70, 0x67, 0x4b, 0x65,
	0x79, 0x22, 0x41, 0x0a, 0x0b, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65,
	0x12, 0x1c, 0x0a, 0x18, 0x41, 0x52, 0x43, 0x48, 0x49, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45,
	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07,
	0x0a, 0x03, 0x44, 0x45, 0x42, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x42, 0x5f, 0x53,
	0x52, 0x43, 0x10, 0x02, 0x22, 0x82, 0x01, 0x0a, 0x0d, 0x59, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x6f,
	0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64,
	0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e,
	0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x62, 0x61, 0x73, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19,
	0x0a, 0x08, 0x67, 0x70, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x07, 0x67, 0x70, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x10, 0x5a, 0x79,
	0x70, 0x70, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x13,
	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
	0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c,
	0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75,
	0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x62,
	0x61, 0x73, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x70, 0x67, 0x5f, 0x6b, 0x65,
	0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x67, 0x70, 0x67, 0x4b, 0x65, 0x79,
	0x73, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x6f, 0x6f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
	0x72, 0x79, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x75,
	0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x03, 0x75,
	0x72, 0x6c, 0x22, 0xae, 0x02, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65,
	0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x03, 0x61, 0x70, 0x74, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
	0x72, 0x79, 0x48, 0x00, 0x52, 0x03, 0x61, 0x70, 0x74, 0x12, 0x3f, 0x0a, 0x03, 0x79, 0x75, 0x6d,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x59, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
	0x6f, 0x72, 0x79, 0x48, 0x00, 0x52, 0x03, 0x79, 0x75, 0x6d, 0x12, 0x48, 0x0a, 0x06, 0x7a, 0x79,
	0x70, 0x70, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x5a, 0x79, 0x70, 0x70, 0x65, 0x72,
	0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, 0x7a, 0x79,
	0x70, 0x70, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x03, 0x67, 0x6f, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x2e, 0x47, 0x6f, 0x6f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x48, 0x00,
	0x52, 0x03, 0x67, 0x6f, 0x6f, 0x42, 0x0c, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
	0x6f, 0x72, 0x79, 0x22, 0xdf, 0x14, 0x0a, 0x0e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
	0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
	0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x61, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74,
	0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66,
	0x61, 0x63, 0x74, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x56,
	0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18,
	0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63,
	0x69, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
	0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x54, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
	0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74,
	0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52,
	0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x4f, 0x0a, 0x0d,
	0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
	0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
	0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x88, 0x03,
	0x0a, 0x08, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12,
	0x56, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53,
	0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x41, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52,
	0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
	0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62,
	0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69,
	0x70, 0x65, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x2e, 0x47, 0x63, 0x73, 0x48,
	0x00, 0x52, 0x03, 0x67, 0x63, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f,
	0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d,
	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x1a, 0x36, 0x0a,
	0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x65,
	0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x65,
	0x63, 0x6b, 0x73, 0x75, 0x6d, 0x1a, 0x55, 0x0a, 0x03, 0x47, 0x63, 0x73, 0x12, 0x16, 0x0a, 0x06,
	0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a,
	0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
	0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08,
	0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x1a, 0xba, 0x0e, 0x0a, 0x04, 0x53, 0x74, 0x65,
	0x70, 0x12, 0x59, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
	0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62,
	0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69,
	0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65,
	0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x71, 0x0a, 0x12,
	0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
	0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x45, 0x78, 0x74, 0x72,
	0x61, 0x63, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x48, 0x00, 0x52, 0x11, 0x61, 0x72,
	0x63, 0x68, 0x69, 0x76, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
	0x69, 0x0a, 0x10, 0x6d, 0x73, 0x69, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x49, 0x6e, 0x73,
	0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x73, 0x69, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x73, 0x69, 0x49, 0x6e,
	0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6c, 0x0a, 0x11, 0x64, 0x70,
	0x6b, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63,
	0x69, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
	0x44, 0x70, 0x6b, 0x67, 0x48, 0x00, 0x52, 0x10, 0x64, 0x70, 0x6b, 0x67, 0x49, 0x6e, 0x73, 0x74,
	0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x10, 0x72, 0x70, 0x6d, 0x5f,
	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65,
	0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x70, 0x6d,
	0x48, 0x00, 0x52, 0x0f, 0x72, 0x70, 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63,
	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65,
	0x63, 0x69, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x46, 0x69,
	0x6c, 0x65, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x65, 0x63, 0x12, 0x5c,
	0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65,
	0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x48,
	0x00, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x75, 0x6e, 0x1a, 0x97, 0x01, 0x0a,
	0x08, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
	0xe0, 0x41, 0x02, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x12,
	0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69,
	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72,
	0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77,
	0x72, 0x69, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,
	0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69,
	0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xb4, 0x02, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x72, 0x61,
	0x63, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
	0xe0, 0x41, 0x02, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x12,
	0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x65, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53,
	0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x53, 0x74,
	0x65, 0x70, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76,
	0x65, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0,
	0x41, 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x73, 0x0a, 0x0b, 0x41, 0x72, 0x63, 0x68,
	0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x52, 0x43, 0x48, 0x49,
	0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
	0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x52, 0x10, 0x01, 0x12, 0x0c,
	0x0a, 0x08, 0x54, 0x41, 0x52, 0x5f, 0x47, 0x5a, 0x49, 0x50, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08,
	0x54, 0x41, 0x52, 0x5f, 0x42, 0x5a, 0x49, 0x50, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x41,
	0x52, 0x5f, 0x4c, 0x5a, 0x4d, 0x41, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x52, 0x5f,
	0x58, 0x5a, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x49, 0x50, 0x10, 0x0b, 0x1a, 0x76, 0x0a,
	0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x73, 0x69, 0x12, 0x24, 0x0a, 0x0b, 0x61,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49,
	0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
	0x65, 0x64, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20,
	0x03, 0x28, 0x05, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x78, 0x69, 0x74,
	0x43, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0x33, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
	0x44, 0x70, 0x6b, 0x67, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a,
	0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x1a, 0x32, 0x0a, 0x0a, 0x49, 0x6e,
	0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x70, 0x6d, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69,
	0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
	0x41, 0x02, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x1a, 0xa1,
	0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x61,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x48, 0x00, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1f,
	0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12,
	0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61,
	0x72, 0x67, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x65,
	0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52,
	0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65,
	0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79,
	0x70, 0x65, 0x1a, 0x88, 0x02, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74,
	0x12, 0x1b, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x2c, 0x0a,
	0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f,
	0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
	0x65, 0x64, 0x45, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0b, 0x69,
	0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x47, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
	0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e,
	0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2e, 0x53,
	0x74, 0x65, 0x70, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x49, 0x6e,
	0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72,
	0x70, 0x72, 0x65, 0x74, 0x65, 0x72, 0x22, 0x45, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70,
	0x72, 0x65, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x50, 0x52,
	0x45, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x0e, 0x0a,
	0x0a, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x10, 0x03, 0x42, 0x06, 0x0a,
	0x04, 0x73, 0x74, 0x65, 0x70, 0x22, 0xdf, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
	0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x43, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x42, 0x2b, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x12, 0x23, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,
	0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52,
	0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x0f, 0x67, 0x75, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x67, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69,
	0x63, 0x79, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0c, 0x67, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50,
	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x67, 0x75, 0x65, 0x73,
	0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x58, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x75,
	0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b,
	0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
	0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x22, 0x9b, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50,
	0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43,
	0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b,
	0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x12, 0x23, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
	0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72,
	0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
	0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22,
	0x95, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c,
	0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a,
	0x0e, 0x67, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x2e, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
	0x52, 0x0d, 0x67, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12,
	0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b,
	0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61,
	0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61,
	0x74, 0x65, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0c, 0x67, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50,
	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x67, 0x75, 0x65, 0x73,
	0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74,
	0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,
	0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
	0x4d, 0x61, 0x73, 0x6b, 0x22, 0x5b, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75,
	0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b,
	0xe0, 0x41, 0x02, 0xfa, 0x41, 0x25, 0x0a, 0x23, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
	0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x22, 0xb0, 0x01, 0x0a, 0x21, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x66, 0x66, 0x65,
	0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61,
	0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08,
	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6f, 0x73, 0x5f, 0x73,
	0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0b, 0x6f, 0x73, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
	0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6f,
	0x73, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x73, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63,
	0x74, 0x75, 0x72, 0x65, 0x22, 0xf3, 0x05, 0x0a, 0x14, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
	0x76, 0x65, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5d, 0x0a,
	0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x41, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
	0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x45,
	0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c,
	0x69, 0x63, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61,
	0x67, 0x65, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x14,
	0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
	0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74,
	0x69, 0x76, 0x65, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53,
	0x6f, 0x75, 0x72, 0x63, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70,
	0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x13, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
	0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x73, 0x0a, 0x10,
	0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x65, 0x73,
	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47,
	0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63,
	0x65, 0x64, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65,
	0x52, 0x0f, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65,
	0x73, 0x1a, 0x69, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b,
	0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x70,
	0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x61, 0x63, 0x6b,
	0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x92, 0x01, 0x0a,
	0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52,
	0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75,
	0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63,
	0x65, 0x12, 0x5e, 0x0a, 0x12, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70,
	0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x50, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x11,
	0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72,
	0x79, 0x1a, 0x86, 0x01, 0x0a, 0x15, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x64, 0x53, 0x6f, 0x66,
	0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73,
	0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75,
	0x72, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x0f, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f,
	0x72, 0x65, 0x63, 0x69, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x2e, 0x53, 0x6f, 0x66, 0x74,
	0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x52, 0x0e, 0x73, 0x6f, 0x66, 0x74,
	0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x63, 0x69, 0x70, 0x65, 0x2a, 0x56, 0x0a, 0x0c, 0x44, 0x65,
	0x73, 0x69, 0x72, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45,
	0x53, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x53,
	0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, 0x41,
	0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44,
	0x10, 0x03, 0x42, 0x77, 0x0a, 0x20, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x42, 0x0d, 0x47, 0x75, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6c,
	0x69, 0x63, 0x69, 0x65, 0x73, 0x5a, 0x44, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f,
	0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x63, 0x6c, 0x6f,
	0x75, 0x64, 0x2f, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x3b, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescOnce sync.Once
	file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescData = file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDesc
)

func file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescGZIP() []byte {
	file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescOnce.Do(func() {
		file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescData)
	})
	return file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDescData
}

var file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
var file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes = make([]protoimpl.MessageInfo, 34)
var file_google_cloud_osconfig_v1beta_guest_policies_proto_goTypes = []interface{}{
	(DesiredState)(0),                                     // 0: google.cloud.osconfig.v1beta.DesiredState
	(Package_Manager)(0),                                  // 1: google.cloud.osconfig.v1beta.Package.Manager
	(AptRepository_ArchiveType)(0),                        // 2: google.cloud.osconfig.v1beta.AptRepository.ArchiveType
	(SoftwareRecipe_Step_ExtractArchive_ArchiveType)(0),   // 3: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExtractArchive.ArchiveType
	(SoftwareRecipe_Step_RunScript_Interpreter)(0),        // 4: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.RunScript.Interpreter
	(*GuestPolicy)(nil),                                   // 5: google.cloud.osconfig.v1beta.GuestPolicy
	(*Assignment)(nil),                                    // 6: google.cloud.osconfig.v1beta.Assignment
	(*Package)(nil),                                       // 7: google.cloud.osconfig.v1beta.Package
	(*AptRepository)(nil),                                 // 8: google.cloud.osconfig.v1beta.AptRepository
	(*YumRepository)(nil),                                 // 9: google.cloud.osconfig.v1beta.YumRepository
	(*ZypperRepository)(nil),                              // 10: google.cloud.osconfig.v1beta.ZypperRepository
	(*GooRepository)(nil),                                 // 11: google.cloud.osconfig.v1beta.GooRepository
	(*PackageRepository)(nil),                             // 12: google.cloud.osconfig.v1beta.PackageRepository
	(*SoftwareRecipe)(nil),                                // 13: google.cloud.osconfig.v1beta.SoftwareRecipe
	(*CreateGuestPolicyRequest)(nil),                      // 14: google.cloud.osconfig.v1beta.CreateGuestPolicyRequest
	(*GetGuestPolicyRequest)(nil),                         // 15: google.cloud.osconfig.v1beta.GetGuestPolicyRequest
	(*ListGuestPoliciesRequest)(nil),                      // 16: google.cloud.osconfig.v1beta.ListGuestPoliciesRequest
	(*ListGuestPoliciesResponse)(nil),                     // 17: google.cloud.osconfig.v1beta.ListGuestPoliciesResponse
	(*UpdateGuestPolicyRequest)(nil),                      // 18: google.cloud.osconfig.v1beta.UpdateGuestPolicyRequest
	(*DeleteGuestPolicyRequest)(nil),                      // 19: google.cloud.osconfig.v1beta.DeleteGuestPolicyRequest
	(*LookupEffectiveGuestPolicyRequest)(nil),             // 20: google.cloud.osconfig.v1beta.LookupEffectiveGuestPolicyRequest
	(*EffectiveGuestPolicy)(nil),                          // 21: google.cloud.osconfig.v1beta.EffectiveGuestPolicy
	(*Assignment_GroupLabel)(nil),                         // 22: google.cloud.osconfig.v1beta.Assignment.GroupLabel
	(*Assignment_OsType)(nil),                             // 23: google.cloud.osconfig.v1beta.Assignment.OsType
	nil,                                                   // 24: google.cloud.osconfig.v1beta.Assignment.GroupLabel.LabelsEntry
	(*SoftwareRecipe_Artifact)(nil),                       // 25: google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact
	(*SoftwareRecipe_Step)(nil),                           // 26: google.cloud.osconfig.v1beta.SoftwareRecipe.Step
	(*SoftwareRecipe_Artifact_Remote)(nil),                // 27: google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact.Remote
	(*SoftwareRecipe_Artifact_Gcs)(nil),                   // 28: google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact.Gcs
	(*SoftwareRecipe_Step_CopyFile)(nil),                  // 29: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.CopyFile
	(*SoftwareRecipe_Step_ExtractArchive)(nil),            // 30: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExtractArchive
	(*SoftwareRecipe_Step_InstallMsi)(nil),                // 31: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.InstallMsi
	(*SoftwareRecipe_Step_InstallDpkg)(nil),               // 32: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.InstallDpkg
	(*SoftwareRecipe_Step_InstallRpm)(nil),                // 33: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.InstallRpm
	(*SoftwareRecipe_Step_ExecFile)(nil),                  // 34: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExecFile
	(*SoftwareRecipe_Step_RunScript)(nil),                 // 35: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.RunScript
	(*EffectiveGuestPolicy_SourcedPackage)(nil),           // 36: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedPackage
	(*EffectiveGuestPolicy_SourcedPackageRepository)(nil), // 37: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedPackageRepository
	(*EffectiveGuestPolicy_SourcedSoftwareRecipe)(nil),    // 38: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedSoftwareRecipe
	(*timestamp.Timestamp)(nil),                           // 39: google.protobuf.Timestamp
	(*field_mask.FieldMask)(nil),                          // 40: google.protobuf.FieldMask
}
var file_google_cloud_osconfig_v1beta_guest_policies_proto_depIdxs = []int32{
	39, // 0: google.cloud.osconfig.v1beta.GuestPolicy.create_time:type_name -> google.protobuf.Timestamp
	39, // 1: google.cloud.osconfig.v1beta.GuestPolicy.update_time:type_name -> google.protobuf.Timestamp
	6,  // 2: google.cloud.osconfig.v1beta.GuestPolicy.assignment:type_name -> google.cloud.osconfig.v1beta.Assignment
	7,  // 3: google.cloud.osconfig.v1beta.GuestPolicy.packages:type_name -> google.cloud.osconfig.v1beta.Package
	12, // 4: google.cloud.osconfig.v1beta.GuestPolicy.package_repositories:type_name -> google.cloud.osconfig.v1beta.PackageRepository
	13, // 5: google.cloud.osconfig.v1beta.GuestPolicy.recipes:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe
	22, // 6: google.cloud.osconfig.v1beta.Assignment.group_labels:type_name -> google.cloud.osconfig.v1beta.Assignment.GroupLabel
	23, // 7: google.cloud.osconfig.v1beta.Assignment.os_types:type_name -> google.cloud.osconfig.v1beta.Assignment.OsType
	0,  // 8: google.cloud.osconfig.v1beta.Package.desired_state:type_name -> google.cloud.osconfig.v1beta.DesiredState
	1,  // 9: google.cloud.osconfig.v1beta.Package.manager:type_name -> google.cloud.osconfig.v1beta.Package.Manager
	2,  // 10: google.cloud.osconfig.v1beta.AptRepository.archive_type:type_name -> google.cloud.osconfig.v1beta.AptRepository.ArchiveType
	8,  // 11: google.cloud.osconfig.v1beta.PackageRepository.apt:type_name -> google.cloud.osconfig.v1beta.AptRepository
	9,  // 12: google.cloud.osconfig.v1beta.PackageRepository.yum:type_name -> google.cloud.osconfig.v1beta.YumRepository
	10, // 13: google.cloud.osconfig.v1beta.PackageRepository.zypper:type_name -> google.cloud.osconfig.v1beta.ZypperRepository
	11, // 14: google.cloud.osconfig.v1beta.PackageRepository.goo:type_name -> google.cloud.osconfig.v1beta.GooRepository
	25, // 15: google.cloud.osconfig.v1beta.SoftwareRecipe.artifacts:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact
	26, // 16: google.cloud.osconfig.v1beta.SoftwareRecipe.install_steps:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step
	26, // 17: google.cloud.osconfig.v1beta.SoftwareRecipe.update_steps:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step
	0,  // 18: google.cloud.osconfig.v1beta.SoftwareRecipe.desired_state:type_name -> google.cloud.osconfig.v1beta.DesiredState
	5,  // 19: google.cloud.osconfig.v1beta.CreateGuestPolicyRequest.guest_policy:type_name -> google.cloud.osconfig.v1beta.GuestPolicy
	5,  // 20: google.cloud.osconfig.v1beta.ListGuestPoliciesResponse.guest_policies:type_name -> google.cloud.osconfig.v1beta.GuestPolicy
	5,  // 21: google.cloud.osconfig.v1beta.UpdateGuestPolicyRequest.guest_policy:type_name -> google.cloud.osconfig.v1beta.GuestPolicy
	40, // 22: google.cloud.osconfig.v1beta.UpdateGuestPolicyRequest.update_mask:type_name -> google.protobuf.FieldMask
	36, // 23: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.packages:type_name -> google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedPackage
	37, // 24: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.package_repositories:type_name -> google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedPackageRepository
	38, // 25: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.software_recipes:type_name -> google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedSoftwareRecipe
	24, // 26: google.cloud.osconfig.v1beta.Assignment.GroupLabel.labels:type_name -> google.cloud.osconfig.v1beta.Assignment.GroupLabel.LabelsEntry
	27, // 27: google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact.remote:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact.Remote
	28, // 28: google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact.gcs:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Artifact.Gcs
	29, // 29: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.file_copy:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.CopyFile
	30, // 30: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.archive_extraction:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExtractArchive
	31, // 31: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.msi_installation:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.InstallMsi
	32, // 32: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.dpkg_installation:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.InstallDpkg
	33, // 33: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.rpm_installation:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.InstallRpm
	34, // 34: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.file_exec:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExecFile
	35, // 35: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.script_run:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.RunScript
	3,  // 36: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExtractArchive.type:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.ExtractArchive.ArchiveType
	4,  // 37: google.cloud.osconfig.v1beta.SoftwareRecipe.Step.RunScript.interpreter:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe.Step.RunScript.Interpreter
	7,  // 38: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedPackage.package:type_name -> google.cloud.osconfig.v1beta.Package
	12, // 39: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedPackageRepository.package_repository:type_name -> google.cloud.osconfig.v1beta.PackageRepository
	13, // 40: google.cloud.osconfig.v1beta.EffectiveGuestPolicy.SourcedSoftwareRecipe.software_recipe:type_name -> google.cloud.osconfig.v1beta.SoftwareRecipe
	41, // [41:41] is the sub-list for method output_type
	41, // [41:41] is the sub-list for method input_type
	41, // [41:41] is the sub-list for extension type_name
	41, // [41:41] is the sub-list for extension extendee
	0,  // [0:41] is the sub-list for field type_name
}

func init() { file_google_cloud_osconfig_v1beta_guest_policies_proto_init() }
func file_google_cloud_osconfig_v1beta_guest_policies_proto_init() {
	if File_google_cloud_osconfig_v1beta_guest_policies_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GuestPolicy); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Assignment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Package); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AptRepository); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*YumRepository); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ZypperRepository); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GooRepository); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PackageRepository); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreateGuestPolicyRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetGuestPolicyRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListGuestPoliciesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListGuestPoliciesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdateGuestPolicyRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeleteGuestPolicyRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LookupEffectiveGuestPolicyRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EffectiveGuestPolicy); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Assignment_GroupLabel); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Assignment_OsType); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Artifact); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Artifact_Remote); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Artifact_Gcs); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_CopyFile); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_ExtractArchive); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_InstallMsi); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_InstallDpkg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_InstallRpm); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_ExecFile); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SoftwareRecipe_Step_RunScript); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EffectiveGuestPolicy_SourcedPackage); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EffectiveGuestPolicy_SourcedPackageRepository); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EffectiveGuestPolicy_SourcedSoftwareRecipe); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[7].OneofWrappers = []interface{}{
		(*PackageRepository_Apt)(nil),
		(*PackageRepository_Yum)(nil),
		(*PackageRepository_Zypper)(nil),
		(*PackageRepository_Goo)(nil),
	}
	file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[20].OneofWrappers = []interface{}{
		(*SoftwareRecipe_Artifact_Remote_)(nil),
		(*SoftwareRecipe_Artifact_Gcs_)(nil),
	}
	file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[21].OneofWrappers = []interface{}{
		(*SoftwareRecipe_Step_FileCopy)(nil),
		(*SoftwareRecipe_Step_ArchiveExtraction)(nil),
		(*SoftwareRecipe_Step_MsiInstallation)(nil),
		(*SoftwareRecipe_Step_DpkgInstallation)(nil),
		(*SoftwareRecipe_Step_RpmInstallation)(nil),
		(*SoftwareRecipe_Step_FileExec)(nil),
		(*SoftwareRecipe_Step_ScriptRun)(nil),
	}
	file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes[29].OneofWrappers = []interface{}{
		(*SoftwareRecipe_Step_ExecFile_ArtifactId)(nil),
		(*SoftwareRecipe_Step_ExecFile_LocalPath)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDesc,
			NumEnums:      5,
			NumMessages:   34,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_cloud_osconfig_v1beta_guest_policies_proto_goTypes,
		DependencyIndexes: file_google_cloud_osconfig_v1beta_guest_policies_proto_depIdxs,
		EnumInfos:         file_google_cloud_osconfig_v1beta_guest_policies_proto_enumTypes,
		MessageInfos:      file_google_cloud_osconfig_v1beta_guest_policies_proto_msgTypes,
	}.Build()
	File_google_cloud_osconfig_v1beta_guest_policies_proto = out.File
	file_google_cloud_osconfig_v1beta_guest_policies_proto_rawDesc = nil
	file_google_cloud_osconfig_v1beta_guest_policies_proto_goTypes = nil
	file_google_cloud_osconfig_v1beta_guest_policies_proto_depIdxs = nil
}
