// Code generated by protoc-gen-go. DO NOT EDIT.
// source: testplans/generate_test_plan.proto

package testplans

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_struct "github.com/golang/protobuf/ptypes/struct"
	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

type GenerateTestPlanRequest struct {
	// Serialized buildbucket Build protos that are part of this orchestrator run.
	// See https://chromium.googlesource.com/infra/luci/luci-go/+/master/buildbucket/proto/build.proto
	BuildbucketProtos []*ProtoBytes `protobuf:"bytes,5,rep,name=buildbucket_protos,json=buildbucketProtos,proto3" json:"buildbucket_protos,omitempty"`
	// The manifest-internal snapshot commit hash that's being used for the current build.
	// Note that manifest_commit will be soon replaced with gitiles_commit below.
	ManifestCommit string `protobuf:"bytes,7,opt,name=manifest_commit,json=manifestCommit,proto3" json:"manifest_commit,omitempty"`
	// Serialized buildbucket GitilesCommit, representing the manifest or
	// manifest-internal commit to which the build is synced.
	GitilesCommit *ProtoBytes `protobuf:"bytes,9,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// Serialized buildbucket GerritChanges, or none if this is a postsubmit run
	// or similar. Explicit proto import is avoided here to prevent a dependency
	// on the luci-go repo.
	// See https://chromium.googlesource.com/infra/luci/luci-go/+/master/buildbucket/proto/common.proto
	GerritChanges        []*ProtoBytes `protobuf:"bytes,8,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_GenerateTestPlanRequest proto.InternalMessageInfo

func (m *GenerateTestPlanRequest) GetBuildbucketProtos() []*ProtoBytes {
	if m != nil {
		return m.BuildbucketProtos
	}
	return nil
}

func (m *GenerateTestPlanRequest) GetManifestCommit() string {
	if m != nil {
		return m.ManifestCommit
	}
	return ""
}

func (m *GenerateTestPlanRequest) GetGitilesCommit() *ProtoBytes {
	if m != nil {
		return m.GitilesCommit
	}
	return nil
}

func (m *GenerateTestPlanRequest) GetGerritChanges() []*ProtoBytes {
	if m != nil {
		return m.GerritChanges
	}
	return nil
}

// The final test plan.
type GenerateTestPlanResponse struct {
	HwTestUnits           []*HwTestUnit       `protobuf:"bytes,3,rep,name=hw_test_units,json=hwTestUnits,proto3" json:"hw_test_units,omitempty"`
	MoblabVmTestUnits     []*MoblabVmTestUnit `protobuf:"bytes,4,rep,name=moblab_vm_test_units,json=moblabVmTestUnits,proto3" json:"moblab_vm_test_units,omitempty"`
	TastVmTestUnits       []*TastVmTestUnit   `protobuf:"bytes,5,rep,name=tast_vm_test_units,json=tastVmTestUnits,proto3" json:"tast_vm_test_units,omitempty"`
	VmTestUnits           []*VmTestUnit       `protobuf:"bytes,6,rep,name=vm_test_units,json=vmTestUnits,proto3" json:"vm_test_units,omitempty"`
	DirectTastVmTestUnits []*TastVmTestUnit   `protobuf:"bytes,7,rep,name=direct_tast_vm_test_units,json=directTastVmTestUnits,proto3" json:"direct_tast_vm_test_units,omitempty"`
	XXX_NoUnkeyedLiteral  struct{}            `json:"-"`
	XXX_unrecognized      []byte              `json:"-"`
	XXX_sizecache         int32               `json:"-"`
}

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

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

var xxx_messageInfo_GenerateTestPlanResponse proto.InternalMessageInfo

func (m *GenerateTestPlanResponse) GetHwTestUnits() []*HwTestUnit {
	if m != nil {
		return m.HwTestUnits
	}
	return nil
}

func (m *GenerateTestPlanResponse) GetMoblabVmTestUnits() []*MoblabVmTestUnit {
	if m != nil {
		return m.MoblabVmTestUnits
	}
	return nil
}

func (m *GenerateTestPlanResponse) GetTastVmTestUnits() []*TastVmTestUnit {
	if m != nil {
		return m.TastVmTestUnits
	}
	return nil
}

func (m *GenerateTestPlanResponse) GetVmTestUnits() []*VmTestUnit {
	if m != nil {
		return m.VmTestUnits
	}
	return nil
}

func (m *GenerateTestPlanResponse) GetDirectTastVmTestUnits() []*TastVmTestUnit {
	if m != nil {
		return m.DirectTastVmTestUnits
	}
	return nil
}

// The files that should be tested in a test plan.
type BuildPayload struct {
	// The GS bucket in which artifacts for the build are stored, e.g.
	// gs://chromeos-image-archive
	ArtifactsGsBucket string `protobuf:"bytes,1,opt,name=artifacts_gs_bucket,json=artifactsGsBucket,proto3" json:"artifacts_gs_bucket,omitempty"`
	// The path in the bucket in which artifacts for the build are stored, e.g.
	// eve-paladin/R73-11588.0.0-rc4
	ArtifactsGsPath string `protobuf:"bytes,2,opt,name=artifacts_gs_path,json=artifactsGsPath,proto3" json:"artifacts_gs_path,omitempty"`
	// Artifact type to files available for that type. e.g.
	// "AUTOTEST_FILES": [ "control_files.tar" ]
	FilesByArtifact      *_struct.Struct `protobuf:"bytes,3,opt,name=files_by_artifact,json=filesByArtifact,proto3" json:"files_by_artifact,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_BuildPayload proto.InternalMessageInfo

func (m *BuildPayload) GetArtifactsGsBucket() string {
	if m != nil {
		return m.ArtifactsGsBucket
	}
	return ""
}

func (m *BuildPayload) GetArtifactsGsPath() string {
	if m != nil {
		return m.ArtifactsGsPath
	}
	return ""
}

func (m *BuildPayload) GetFilesByArtifact() *_struct.Struct {
	if m != nil {
		return m.FilesByArtifact
	}
	return nil
}

// The parts of a TestUnit that are common among all test types.
type TestUnitCommon struct {
	// The build target for this test unit.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// A builder name for this test unit, e.g. eve-arcvm-cq.
	BuilderName string `protobuf:"bytes,4,opt,name=builder_name,json=builderName,proto3" json:"builder_name,omitempty"`
	// The build files provided to run this test unit.
	BuildPayload         *BuildPayload `protobuf:"bytes,3,opt,name=build_payload,json=buildPayload,proto3" json:"build_payload,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_TestUnitCommon proto.InternalMessageInfo

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

func (m *TestUnitCommon) GetBuilderName() string {
	if m != nil {
		return m.BuilderName
	}
	return ""
}

func (m *TestUnitCommon) GetBuildPayload() *BuildPayload {
	if m != nil {
		return m.BuildPayload
	}
	return nil
}

type HwTestUnit struct {
	Common               *TestUnitCommon `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	HwTestCfg            *HwTestCfg      `protobuf:"bytes,2,opt,name=hw_test_cfg,json=hwTestCfg,proto3" json:"hw_test_cfg,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_HwTestUnit proto.InternalMessageInfo

func (m *HwTestUnit) GetCommon() *TestUnitCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *HwTestUnit) GetHwTestCfg() *HwTestCfg {
	if m != nil {
		return m.HwTestCfg
	}
	return nil
}

type MoblabVmTestUnit struct {
	Common               *TestUnitCommon  `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	MoblabVmTestCfg      *MoblabVmTestCfg `protobuf:"bytes,2,opt,name=moblab_vm_test_cfg,json=moblabVmTestCfg,proto3" json:"moblab_vm_test_cfg,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_MoblabVmTestUnit proto.InternalMessageInfo

func (m *MoblabVmTestUnit) GetCommon() *TestUnitCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *MoblabVmTestUnit) GetMoblabVmTestCfg() *MoblabVmTestCfg {
	if m != nil {
		return m.MoblabVmTestCfg
	}
	return nil
}

type TastVmTestUnit struct {
	Common               *TestUnitCommon `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	TastVmTestCfg        *TastVmTestCfg  `protobuf:"bytes,2,opt,name=tast_vm_test_cfg,json=tastVmTestCfg,proto3" json:"tast_vm_test_cfg,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_TastVmTestUnit proto.InternalMessageInfo

func (m *TastVmTestUnit) GetCommon() *TestUnitCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *TastVmTestUnit) GetTastVmTestCfg() *TastVmTestCfg {
	if m != nil {
		return m.TastVmTestCfg
	}
	return nil
}

type VmTestUnit struct {
	Common               *TestUnitCommon `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	VmTestCfg            *VmTestCfg      `protobuf:"bytes,2,opt,name=vm_test_cfg,json=vmTestCfg,proto3" json:"vm_test_cfg,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_VmTestUnit proto.InternalMessageInfo

func (m *VmTestUnit) GetCommon() *TestUnitCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *VmTestUnit) GetVmTestCfg() *VmTestCfg {
	if m != nil {
		return m.VmTestCfg
	}
	return nil
}

func init() {
	proto.RegisterType((*GenerateTestPlanRequest)(nil), "testplans.GenerateTestPlanRequest")
	proto.RegisterType((*GenerateTestPlanResponse)(nil), "testplans.GenerateTestPlanResponse")
	proto.RegisterType((*BuildPayload)(nil), "testplans.BuildPayload")
	proto.RegisterType((*TestUnitCommon)(nil), "testplans.TestUnitCommon")
	proto.RegisterType((*HwTestUnit)(nil), "testplans.HwTestUnit")
	proto.RegisterType((*MoblabVmTestUnit)(nil), "testplans.MoblabVmTestUnit")
	proto.RegisterType((*TastVmTestUnit)(nil), "testplans.TastVmTestUnit")
	proto.RegisterType((*VmTestUnit)(nil), "testplans.VmTestUnit")
}

func init() { proto.RegisterFile("testplans/generate_test_plan.proto", fileDescriptor_e8083f85c67203f6) }

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