// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/request.proto

package test_platform

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// ManagedPool enumerates the different lab platform-managed pools.
// Devices in these pools are automatically managed by lab platform
// systems and can not be arbitrarily assigned to pools by users.
//
// Managed pool implementations are specific to test platform's scheduling
// backends.
// For Skylab, see
// https://chromium.googlesource.com/infra/infra/+/5566668428c6b286702bf440d9dfd0be7bca1d84/go/src/infra/libs/skylab/inventory/device.proto#173
// For autotest, see
// https://chromium.googlesource.com/chromiumos/third_party/autotest/+/7436c2b6e6bd32ed1f1bd08cf8e0feb40cfe7b89/server/constants.py#18
type Request_Params_Scheduling_ManagedPool int32

const (
	Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED   Request_Params_Scheduling_ManagedPool = 0
	Request_Params_Scheduling_MANAGED_POOL_CQ            Request_Params_Scheduling_ManagedPool = 1
	Request_Params_Scheduling_MANAGED_POOL_BVT           Request_Params_Scheduling_ManagedPool = 2
	Request_Params_Scheduling_MANAGED_POOL_SUITES        Request_Params_Scheduling_ManagedPool = 3
	Request_Params_Scheduling_MANAGED_POOL_CTS           Request_Params_Scheduling_ManagedPool = 4
	Request_Params_Scheduling_MANAGED_POOL_CTS_PERBUILD  Request_Params_Scheduling_ManagedPool = 5
	Request_Params_Scheduling_MANAGED_POOL_CONTINUOUS    Request_Params_Scheduling_ManagedPool = 6
	Request_Params_Scheduling_MANAGED_POOL_ARC_PRESUBMIT Request_Params_Scheduling_ManagedPool = 7
	Request_Params_Scheduling_MANAGED_POOL_QUOTA         Request_Params_Scheduling_ManagedPool = 8
)

var Request_Params_Scheduling_ManagedPool_name = map[int32]string{
	0: "MANAGED_POOL_UNSPECIFIED",
	1: "MANAGED_POOL_CQ",
	2: "MANAGED_POOL_BVT",
	3: "MANAGED_POOL_SUITES",
	4: "MANAGED_POOL_CTS",
	5: "MANAGED_POOL_CTS_PERBUILD",
	6: "MANAGED_POOL_CONTINUOUS",
	7: "MANAGED_POOL_ARC_PRESUBMIT",
	8: "MANAGED_POOL_QUOTA",
}

var Request_Params_Scheduling_ManagedPool_value = map[string]int32{
	"MANAGED_POOL_UNSPECIFIED":   0,
	"MANAGED_POOL_CQ":            1,
	"MANAGED_POOL_BVT":           2,
	"MANAGED_POOL_SUITES":        3,
	"MANAGED_POOL_CTS":           4,
	"MANAGED_POOL_CTS_PERBUILD":  5,
	"MANAGED_POOL_CONTINUOUS":    6,
	"MANAGED_POOL_ARC_PRESUBMIT": 7,
	"MANAGED_POOL_QUOTA":         8,
}

func (x Request_Params_Scheduling_ManagedPool) String() string {
	return proto.EnumName(Request_Params_Scheduling_ManagedPool_name, int32(x))
}

func (Request_Params_Scheduling_ManagedPool) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7f5ab0d1581e8f0c, []int{0, 0, 4, 0}
}

// Request represents a request to the ChromeOS Test Platform to run a test,
// set of tests, suite of tests, or test plan on a set of devices (eventually
// also: virtual devices) in the ChromeOS Test Lab.
type Request struct {
	Params               *Request_Params   `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"`
	TestPlan             *Request_TestPlan `protobuf:"bytes,5,opt,name=test_plan,json=testPlan,proto3" json:"test_plan,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Request proto.InternalMessageInfo

func (m *Request) GetParams() *Request_Params {
	if m != nil {
		return m.Params
	}
	return nil
}

func (m *Request) GetTestPlan() *Request_TestPlan {
	if m != nil {
		return m.TestPlan
	}
	return nil
}

// Params defines parameters that apply to an entire Request.
//
// NEXT_TAG: 11
type Request_Params struct {
	HardwareAttributes   *Request_Params_HardwareAttributes   `protobuf:"bytes,1,opt,name=hardware_attributes,json=hardwareAttributes,proto3" json:"hardware_attributes,omitempty"`
	SoftwareAttributes   *Request_Params_SoftwareAttributes   `protobuf:"bytes,2,opt,name=software_attributes,json=softwareAttributes,proto3" json:"software_attributes,omitempty"`
	FreeformAttributes   *Request_Params_FreeformAttributes   `protobuf:"bytes,9,opt,name=freeform_attributes,json=freeformAttributes,proto3" json:"freeform_attributes,omitempty"`
	SoftwareDependencies []*Request_Params_SoftwareDependency `protobuf:"bytes,3,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"`
	Scheduling           *Request_Params_Scheduling           `protobuf:"bytes,4,opt,name=scheduling,proto3" json:"scheduling,omitempty"`
	Retry                *Request_Params_Retry                `protobuf:"bytes,5,opt,name=retry,proto3" json:"retry,omitempty"`
	Metadata             *Request_Params_Metadata             `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Time                 *Request_Params_Time                 `protobuf:"bytes,7,opt,name=time,proto3" json:"time,omitempty"`
	Decorations          *Request_Params_Decorations          `protobuf:"bytes,8,opt,name=decorations,proto3" json:"decorations,omitempty"`
	Legacy               *Request_Params_Legacy               `protobuf:"bytes,10,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Notification         *Request_Params_Notification         `protobuf:"bytes,11,opt,name=notification,proto3" json:"notification,omitempty"`
	Migrations           *Request_Params_Migrations           `protobuf:"bytes,12,opt,name=migrations,proto3" json:"migrations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params proto.InternalMessageInfo

func (m *Request_Params) GetHardwareAttributes() *Request_Params_HardwareAttributes {
	if m != nil {
		return m.HardwareAttributes
	}
	return nil
}

func (m *Request_Params) GetSoftwareAttributes() *Request_Params_SoftwareAttributes {
	if m != nil {
		return m.SoftwareAttributes
	}
	return nil
}

func (m *Request_Params) GetFreeformAttributes() *Request_Params_FreeformAttributes {
	if m != nil {
		return m.FreeformAttributes
	}
	return nil
}

func (m *Request_Params) GetSoftwareDependencies() []*Request_Params_SoftwareDependency {
	if m != nil {
		return m.SoftwareDependencies
	}
	return nil
}

func (m *Request_Params) GetScheduling() *Request_Params_Scheduling {
	if m != nil {
		return m.Scheduling
	}
	return nil
}

func (m *Request_Params) GetRetry() *Request_Params_Retry {
	if m != nil {
		return m.Retry
	}
	return nil
}

func (m *Request_Params) GetMetadata() *Request_Params_Metadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *Request_Params) GetTime() *Request_Params_Time {
	if m != nil {
		return m.Time
	}
	return nil
}

func (m *Request_Params) GetDecorations() *Request_Params_Decorations {
	if m != nil {
		return m.Decorations
	}
	return nil
}

func (m *Request_Params) GetLegacy() *Request_Params_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *Request_Params) GetNotification() *Request_Params_Notification {
	if m != nil {
		return m.Notification
	}
	return nil
}

func (m *Request_Params) GetMigrations() *Request_Params_Migrations {
	if m != nil {
		return m.Migrations
	}
	return nil
}

// HardwareAttributes defines the hardware-bound characteristics
// of the devices to run tests on.
type Request_Params_HardwareAttributes struct {
	// Model is the model to run tests against.
	//
	// TODO(akeshet): Re-use device protos instead of defining this
	// independently.
	Model                string   `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_HardwareAttributes proto.InternalMessageInfo

func (m *Request_Params_HardwareAttributes) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// SoftwareAttributes defines software characteristics that are strongly
// associated with a device, though not immutable or hardware-bound.
type Request_Params_SoftwareAttributes struct {
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_SoftwareAttributes proto.InternalMessageInfo

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

// FreeformAttributes defines user-specified device attributes that are
// opaque to the test platform. It is preferrable not to use these, but
// they are provided to cover cases in which the test platform does not
// present a parameter corresponding to the attributes of interest.
type Request_Params_FreeformAttributes struct {
	// SwarmingDimensions are raw swarming bot dimensions, expressed as
	// "key:value" strings.
	SwarmingDimensions   []string `protobuf:"bytes,1,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_FreeformAttributes proto.InternalMessageInfo

func (m *Request_Params_FreeformAttributes) GetSwarmingDimensions() []string {
	if m != nil {
		return m.SwarmingDimensions
	}
	return nil
}

// SoftwareDependency defines mutable software characteristics of the
// devices to run tests on (for instance, the desired version of ChromeOS).
type Request_Params_SoftwareDependency struct {
	// Types that are valid to be assigned to Dep:
	//	*Request_Params_SoftwareDependency_ChromeosBuild
	//	*Request_Params_SoftwareDependency_RoFirmwareBuild
	//	*Request_Params_SoftwareDependency_RwFirmwareBuild
	Dep                  isRequest_Params_SoftwareDependency_Dep `protobuf_oneof:"dep"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_SoftwareDependency proto.InternalMessageInfo

type isRequest_Params_SoftwareDependency_Dep interface {
	isRequest_Params_SoftwareDependency_Dep()
}

type Request_Params_SoftwareDependency_ChromeosBuild struct {
	ChromeosBuild string `protobuf:"bytes,3,opt,name=chromeos_build,json=chromeosBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RoFirmwareBuild struct {
	RoFirmwareBuild string `protobuf:"bytes,4,opt,name=ro_firmware_build,json=roFirmwareBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RwFirmwareBuild struct {
	RwFirmwareBuild string `protobuf:"bytes,5,opt,name=rw_firmware_build,json=rwFirmwareBuild,proto3,oneof"`
}

func (*Request_Params_SoftwareDependency_ChromeosBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RoFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RwFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (m *Request_Params_SoftwareDependency) GetDep() isRequest_Params_SoftwareDependency_Dep {
	if m != nil {
		return m.Dep
	}
	return nil
}

func (m *Request_Params_SoftwareDependency) GetChromeosBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_ChromeosBuild); ok {
		return x.ChromeosBuild
	}
	return ""
}

func (m *Request_Params_SoftwareDependency) GetRoFirmwareBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_RoFirmwareBuild); ok {
		return x.RoFirmwareBuild
	}
	return ""
}

func (m *Request_Params_SoftwareDependency) GetRwFirmwareBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_RwFirmwareBuild); ok {
		return x.RwFirmwareBuild
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Params_SoftwareDependency) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Params_SoftwareDependency_ChromeosBuild)(nil),
		(*Request_Params_SoftwareDependency_RoFirmwareBuild)(nil),
		(*Request_Params_SoftwareDependency_RwFirmwareBuild)(nil),
	}
}

// Scheduling defines parameters that affect how the tests in this
// request are prioritized relative to other requests, and how capacity for
// them is allocated.
type Request_Params_Scheduling struct {
	// Types that are valid to be assigned to Pool:
	//	*Request_Params_Scheduling_ManagedPool_
	//	*Request_Params_Scheduling_UnmanagedPool
	//	*Request_Params_Scheduling_QuotaAccount
	Pool isRequest_Params_Scheduling_Pool `protobuf_oneof:"pool"`
	// Priority corresponds to a swarming task priority; if specified, it
	// should be in the range [50,255]. This priority will be used for
	// any swaming tasks created by this run.
	//
	// Note that the scheduler behavior with a given priority depends on
	// other factors, such as pool. In particular, if requests are run in
	// a quotascheduler-controlled pool, then this priority will be ignored,
	// as priority will be determined by quota account balances.
	Priority int64 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	// It is an error to set both qs_account and priority at the same time.
	// qs_account should be used if the request is scheduled on a pool
	// managed by QuotaScheduler. See go/qs-enabled-pools for details.
	// If qs_account is set for requests on no QuotaScheduler pools,
	// it will be ignored and the request will default to running at
	// the lowest priority.
	QsAccount            string   `protobuf:"bytes,5,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Scheduling proto.InternalMessageInfo

type isRequest_Params_Scheduling_Pool interface {
	isRequest_Params_Scheduling_Pool()
}

type Request_Params_Scheduling_ManagedPool_ struct {
	ManagedPool Request_Params_Scheduling_ManagedPool `protobuf:"varint,1,opt,name=managed_pool,json=managedPool,proto3,enum=test_platform.Request_Params_Scheduling_ManagedPool,oneof"`
}

type Request_Params_Scheduling_UnmanagedPool struct {
	UnmanagedPool string `protobuf:"bytes,2,opt,name=unmanaged_pool,json=unmanagedPool,proto3,oneof"`
}

type Request_Params_Scheduling_QuotaAccount struct {
	QuotaAccount string `protobuf:"bytes,3,opt,name=quota_account,json=quotaAccount,proto3,oneof"`
}

func (*Request_Params_Scheduling_ManagedPool_) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_UnmanagedPool) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_QuotaAccount) isRequest_Params_Scheduling_Pool() {}

func (m *Request_Params_Scheduling) GetPool() isRequest_Params_Scheduling_Pool {
	if m != nil {
		return m.Pool
	}
	return nil
}

func (m *Request_Params_Scheduling) GetManagedPool() Request_Params_Scheduling_ManagedPool {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_ManagedPool_); ok {
		return x.ManagedPool
	}
	return Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED
}

func (m *Request_Params_Scheduling) GetUnmanagedPool() string {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_UnmanagedPool); ok {
		return x.UnmanagedPool
	}
	return ""
}

// Deprecated: Do not use.
func (m *Request_Params_Scheduling) GetQuotaAccount() string {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_QuotaAccount); ok {
		return x.QuotaAccount
	}
	return ""
}

func (m *Request_Params_Scheduling) GetPriority() int64 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *Request_Params_Scheduling) GetQsAccount() string {
	if m != nil {
		return m.QsAccount
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Params_Scheduling) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Params_Scheduling_ManagedPool_)(nil),
		(*Request_Params_Scheduling_UnmanagedPool)(nil),
		(*Request_Params_Scheduling_QuotaAccount)(nil),
	}
}

// Retry defines parameters that affect how failed tests within
// a request are retried.
type Request_Params_Retry struct {
	// Whether to allow test retries.
	Allow bool `protobuf:"varint,1,opt,name=allow,proto3" json:"allow,omitempty"`
	// Maximum number of retries of tests within this invocation to allow.
	// 0 = unlimited.
	Max                  int32    `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Retry proto.InternalMessageInfo

func (m *Request_Params_Retry) GetAllow() bool {
	if m != nil {
		return m.Allow
	}
	return false
}

func (m *Request_Params_Retry) GetMax() int32 {
	if m != nil {
		return m.Max
	}
	return 0
}

// Metadata defines parameters that determine where test definitions
// and metadata are stored and discovered from.
type Request_Params_Metadata struct {
	// A Google Storage path to the location of test metadata to be used.
	// For example:
	// "gs://chromeos-image-archive/arkham-release/R57-9202.10.11".
	TestMetadataUrl string `protobuf:"bytes,1,opt,name=test_metadata_url,json=testMetadataUrl,proto3" json:"test_metadata_url,omitempty"`
	// A Google Storage path to the location of image archive in which to find
	// debug symbols to be used in post-process symbolication of crashes. This
	// is generally the same as test_metadata_url.
	DebugSymbolsArchiveUrl string   `protobuf:"bytes,2,opt,name=debug_symbols_archive_url,json=debugSymbolsArchiveUrl,proto3" json:"debug_symbols_archive_url,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Metadata proto.InternalMessageInfo

func (m *Request_Params_Metadata) GetTestMetadataUrl() string {
	if m != nil {
		return m.TestMetadataUrl
	}
	return ""
}

func (m *Request_Params_Metadata) GetDebugSymbolsArchiveUrl() string {
	if m != nil {
		return m.DebugSymbolsArchiveUrl
	}
	return ""
}

// Time defines parameters related to timeouts.
type Request_Params_Time struct {
	// Maximum duration for the entire request to be handled.
	MaximumDuration      *duration.Duration `protobuf:"bytes,1,opt,name=maximum_duration,json=maximumDuration,proto3" json:"maximum_duration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Time proto.InternalMessageInfo

func (m *Request_Params_Time) GetMaximumDuration() *duration.Duration {
	if m != nil {
		return m.MaximumDuration
	}
	return nil
}

// Decorations defines parameters that add additional decorations to
// test runs.
type Request_Params_Decorations struct {
	// AutotestKeyvals are (key, value) pairs that will be added to all
	// autotest tasks run.
	AutotestKeyvals map[string]string `protobuf:"bytes,1,rep,name=autotest_keyvals,json=autotestKeyvals,proto3" json:"autotest_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Tags are swarming tags that will be applied to all swarming tasks
	// launched.
	Tags                 []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Decorations proto.InternalMessageInfo

func (m *Request_Params_Decorations) GetAutotestKeyvals() map[string]string {
	if m != nil {
		return m.AutotestKeyvals
	}
	return nil
}

func (m *Request_Params_Decorations) GetTags() []string {
	if m != nil {
		return m.Tags
	}
	return nil
}

// Legacy encodes arguments that relate to migration from legacy backend
// (autotest); support for these arguments will be phased out.
type Request_Params_Legacy struct {
	// If autotest_suite is defined, then if the autotest backend is selected
	// for running this request, the entire enumeration will be ignored, and
	// replaced by a single invocation of this named autotest suite.
	AutotestSuite        string   `protobuf:"bytes,1,opt,name=autotest_suite,json=autotestSuite,proto3" json:"autotest_suite,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Legacy proto.InternalMessageInfo

func (m *Request_Params_Legacy) GetAutotestSuite() string {
	if m != nil {
		return m.AutotestSuite
	}
	return ""
}

// Notification defines parameters for the request to use to notify callers
// of its test's status updates.
type Request_Params_Notification struct {
	// Pubsub topic to broadcast status updates to
	PubsubTopic          string   `protobuf:"bytes,1,opt,name=pubsub_topic,json=pubsubTopic,proto3" json:"pubsub_topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Notification proto.InternalMessageInfo

func (m *Request_Params_Notification) GetPubsubTopic() string {
	if m != nil {
		return m.PubsubTopic
	}
	return ""
}

// Migrations defines parameters that facilitate gradual migrations between
// different implementations of downstream components.
type Request_Params_Migrations struct {
	// If true, schedule individual tests via buildbucket and run them via
	// test_runner recipe.
	// Otherwise, schedule individual tests via raw swarming calls and run
	// them via skylab_swarming_worker.
	// TODO(crbug/1033287): remove when migration is complete.
	UseTestRunner        bool     `protobuf:"varint,1,opt,name=use_test_runner,json=useTestRunner,proto3" json:"use_test_runner,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Migrations proto.InternalMessageInfo

func (m *Request_Params_Migrations) GetUseTestRunner() bool {
	if m != nil {
		return m.UseTestRunner
	}
	return false
}

// SuiteRequest defines an individual named suite.
type Request_Suite struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Suite proto.InternalMessageInfo

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

type Request_Test struct {
	// Types that are valid to be assigned to Harness:
	//	*Request_Test_Autotest_
	Harness              isRequest_Test_Harness `protobuf_oneof:"harness"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_Request_Test proto.InternalMessageInfo

type isRequest_Test_Harness interface {
	isRequest_Test_Harness()
}

type Request_Test_Autotest_ struct {
	Autotest *Request_Test_Autotest `protobuf:"bytes,1,opt,name=autotest,proto3,oneof"`
}

func (*Request_Test_Autotest_) isRequest_Test_Harness() {}

func (m *Request_Test) GetHarness() isRequest_Test_Harness {
	if m != nil {
		return m.Harness
	}
	return nil
}

func (m *Request_Test) GetAutotest() *Request_Test_Autotest {
	if x, ok := m.GetHarness().(*Request_Test_Autotest_); ok {
		return x.Autotest
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Test) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Test_Autotest_)(nil),
	}
}

type Request_Test_Autotest struct {
	Name     string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	TestArgs string `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	// Name to be used to display this test's output artifacts, e.g. logs,
	// results etc. By default display_name is the same as name.
	//
	// display_name is especially useful when using test_args to distinguish
	// between multiple instances of the same test in a request.
	DisplayName          string   `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Test_Autotest proto.InternalMessageInfo

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

func (m *Request_Test_Autotest) GetTestArgs() string {
	if m != nil {
		return m.TestArgs
	}
	return ""
}

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

// Enumeration is a previously enumerated test plan.
//
// This is a copy of test_platform.steps.EnumerationResponse
// Keep in sync.
type Request_Enumeration struct {
	AutotestInvocations  []*Request_Enumeration_AutotestInvocation `protobuf:"bytes,2,rep,name=autotest_invocations,json=autotestInvocations,proto3" json:"autotest_invocations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_Request_Enumeration proto.InternalMessageInfo

func (m *Request_Enumeration) GetAutotestInvocations() []*Request_Enumeration_AutotestInvocation {
	if m != nil {
		return m.AutotestInvocations
	}
	return nil
}

type Request_Enumeration_AutotestInvocation struct {
	Test                 *api.AutotestTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"`
	TestArgs             string            `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	DisplayName          string            `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	ResultKeyvals        map[string]string `protobuf:"bytes,4,rep,name=result_keyvals,json=resultKeyvals,proto3" json:"result_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Request_Enumeration_AutotestInvocation proto.InternalMessageInfo

func (m *Request_Enumeration_AutotestInvocation) GetTest() *api.AutotestTest {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Request_Enumeration_AutotestInvocation) GetTestArgs() string {
	if m != nil {
		return m.TestArgs
	}
	return ""
}

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

func (m *Request_Enumeration_AutotestInvocation) GetResultKeyvals() map[string]string {
	if m != nil {
		return m.ResultKeyvals
	}
	return nil
}

type Request_TestPlan struct {
	Suite                []*Request_Suite     `protobuf:"bytes,1,rep,name=suite,proto3" json:"suite,omitempty"`
	Test                 []*Request_Test      `protobuf:"bytes,2,rep,name=test,proto3" json:"test,omitempty"`
	Enumeration          *Request_Enumeration `protobuf:"bytes,3,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Request_TestPlan proto.InternalMessageInfo

func (m *Request_TestPlan) GetSuite() []*Request_Suite {
	if m != nil {
		return m.Suite
	}
	return nil
}

func (m *Request_TestPlan) GetTest() []*Request_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Request_TestPlan) GetEnumeration() *Request_Enumeration {
	if m != nil {
		return m.Enumeration
	}
	return nil
}

func init() {
	proto.RegisterEnum("test_platform.Request_Params_Scheduling_ManagedPool", Request_Params_Scheduling_ManagedPool_name, Request_Params_Scheduling_ManagedPool_value)
	proto.RegisterType((*Request)(nil), "test_platform.Request")
	proto.RegisterType((*Request_Params)(nil), "test_platform.Request.Params")
	proto.RegisterType((*Request_Params_HardwareAttributes)(nil), "test_platform.Request.Params.HardwareAttributes")
	proto.RegisterType((*Request_Params_SoftwareAttributes)(nil), "test_platform.Request.Params.SoftwareAttributes")
	proto.RegisterType((*Request_Params_FreeformAttributes)(nil), "test_platform.Request.Params.FreeformAttributes")
	proto.RegisterType((*Request_Params_SoftwareDependency)(nil), "test_platform.Request.Params.SoftwareDependency")
	proto.RegisterType((*Request_Params_Scheduling)(nil), "test_platform.Request.Params.Scheduling")
	proto.RegisterType((*Request_Params_Retry)(nil), "test_platform.Request.Params.Retry")
	proto.RegisterType((*Request_Params_Metadata)(nil), "test_platform.Request.Params.Metadata")
	proto.RegisterType((*Request_Params_Time)(nil), "test_platform.Request.Params.Time")
	proto.RegisterType((*Request_Params_Decorations)(nil), "test_platform.Request.Params.Decorations")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.Request.Params.Decorations.AutotestKeyvalsEntry")
	proto.RegisterType((*Request_Params_Legacy)(nil), "test_platform.Request.Params.Legacy")
	proto.RegisterType((*Request_Params_Notification)(nil), "test_platform.Request.Params.Notification")
	proto.RegisterType((*Request_Params_Migrations)(nil), "test_platform.Request.Params.Migrations")
	proto.RegisterType((*Request_Suite)(nil), "test_platform.Request.Suite")
	proto.RegisterType((*Request_Test)(nil), "test_platform.Request.Test")
	proto.RegisterType((*Request_Test_Autotest)(nil), "test_platform.Request.Test.Autotest")
	proto.RegisterType((*Request_Enumeration)(nil), "test_platform.Request.Enumeration")
	proto.RegisterType((*Request_Enumeration_AutotestInvocation)(nil), "test_platform.Request.Enumeration.AutotestInvocation")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.Request.Enumeration.AutotestInvocation.ResultKeyvalsEntry")
	proto.RegisterType((*Request_TestPlan)(nil), "test_platform.Request.TestPlan")
}

func init() { proto.RegisterFile("test_platform/request.proto", fileDescriptor_7f5ab0d1581e8f0c) }

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