// Code generated by protoc-gen-go. DO NOT EDIT.
// source: recipes/fuchsia.proto

package recipes

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

// Fuchsia fully describes how to execute a Fuchsia CI/CQ task:
//
//  * How to fetch the Fuchsia sources.
//  * How to build Fuchsia.
//  * How to test Fuchsia.
//  * How to archive and log outputs to various places.
//
// See the fuchsia.py recipe for full documentation on task execution.
//
// TODO(IN-1102):
//
// * Improve the docs of the fields in this message, since this is the User
//   facing API for the recipe.
// * Use Enums instead of strings where appropriate once we have starlark and
//   support for human-readable constant values. Enums are just int literals in
//   textprotos.
type Fuchsia struct {
	// (required) How to obtain the Fuchsia build inputs. See Checkout docs.
	Checkout *Fuchsia_Checkout `protobuf:"bytes,1,opt,name=checkout,proto3" json:"checkout,omitempty"`
	// (required) How to build Fuchsia. See Build docs.
	Build *Fuchsia_Build `protobuf:"bytes,2,opt,name=build,proto3" json:"build,omitempty"`
	// How to test Fuchsia. See Test docs.
	Test *Fuchsia_Test `protobuf:"bytes,3,opt,name=test,proto3" json:"test,omitempty"`
	// The GCS bucket to upload results to.
	GcsBucket            string   `protobuf:"bytes,4,opt,name=gcs_bucket,json=gcsBucket,proto3" json:"gcs_bucket,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Fuchsia proto.InternalMessageInfo

func (m *Fuchsia) GetCheckout() *Fuchsia_Checkout {
	if m != nil {
		return m.Checkout
	}
	return nil
}

func (m *Fuchsia) GetBuild() *Fuchsia_Build {
	if m != nil {
		return m.Build
	}
	return nil
}

func (m *Fuchsia) GetTest() *Fuchsia_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Fuchsia) GetGcsBucket() string {
	if m != nil {
		return m.GcsBucket
	}
	return ""
}

// Describes how to fetch the Fuchsia build inputs.
type Fuchsia_Checkout struct {
	// Jiri <package> atttribute values indicating additional packages to fetch
	// from the input manifest. By default, packages with attribute tags are
	// skipped unless one or more of the attribute values are specified here.
	Attributes []string `protobuf:"bytes,1,rep,name=attributes,proto3" json:"attributes,omitempty"`
	// Whether to checkout from a Jiri snapshot.
	UseSnapshot bool `protobuf:"varint,2,opt,name=use_snapshot,json=useSnapshot,proto3" json:"use_snapshot,omitempty"`
	// The name of the manifest to import from the integration repository.
	Manifest string `protobuf:"bytes,4,opt,name=manifest,proto3" json:"manifest,omitempty"`
	// Jiri remote manifest project,
	//
	// TODO(IN-1102): This should always be "integration" and is redundant
	// because we can select the proper integration repo using the build input.
	// Delete this in favor of a hard-coded constant since this value will only
	// ever change if we completely restructure our CI/CD model or rename the
	// integration repo, and thus this recipe.
	Project string `protobuf:"bytes,6,opt,name=project,proto3" json:"project,omitempty"`
	// The remote integration manifest repository.
	Remote string `protobuf:"bytes,7,opt,name=remote,proto3" json:"remote,omitempty"`
	// Whether or not checkout is a release version.
	IsReleaseVersion     bool     `protobuf:"varint,8,opt,name=is_release_version,json=isReleaseVersion,proto3" json:"is_release_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Fuchsia_Checkout proto.InternalMessageInfo

func (m *Fuchsia_Checkout) GetAttributes() []string {
	if m != nil {
		return m.Attributes
	}
	return nil
}

func (m *Fuchsia_Checkout) GetUseSnapshot() bool {
	if m != nil {
		return m.UseSnapshot
	}
	return false
}

func (m *Fuchsia_Checkout) GetManifest() string {
	if m != nil {
		return m.Manifest
	}
	return ""
}

func (m *Fuchsia_Checkout) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *Fuchsia_Checkout) GetRemote() string {
	if m != nil {
		return m.Remote
	}
	return ""
}

func (m *Fuchsia_Checkout) GetIsReleaseVersion() bool {
	if m != nil {
		return m.IsReleaseVersion
	}
	return false
}

// Describes how to build Fuchsia.
type Fuchsia_Build struct {
	// The build type
	BuildType string `protobuf:"bytes,1,opt,name=build_type,json=buildType,proto3" json:"build_type,omitempty"`
	// Board to build
	Board string `protobuf:"bytes,2,opt,name=board,proto3" json:"board,omitempty"`
	// GCS bucket for uploading debug symbols.
	DebugSymbolBucket string `protobuf:"bytes,3,opt,name=debug_symbol_bucket,json=debugSymbolBucket,proto3" json:"debug_symbol_bucket,omitempty"`
	// Tags of environments on which the testsharder will key
	EnvironmentTags []string `protobuf:"bytes,4,rep,name=environment_tags,json=environmentTags,proto3" json:"environment_tags,omitempty"`
	// Whether to exclude images during the build.
	ExcludeImages bool `protobuf:"varint,5,opt,name=exclude_images,json=excludeImages,proto3" json:"exclude_images,omitempty"`
	// Extra args to pass to GN.
	GnArgs []string `protobuf:"bytes,6,rep,name=gn_args,json=gnArgs,proto3" json:"gn_args,omitempty"`
	// Whether to generate and upload breakpad symbols as part of this build.
	IncludeBreakpadSymbols bool `protobuf:"varint,7,opt,name=include_breakpad_symbols,json=includeBreakpadSymbols,proto3" json:"include_breakpad_symbols,omitempty"`
	// Whether to build and upload an archive of debug binaries.
	IncludeSymbolArchive bool `protobuf:"varint,8,opt,name=include_symbol_archive,json=includeSymbolArchive,proto3" json:"include_symbol_archive,omitempty"`
	// Extra targets to pass to Ninja.
	NinjaTargets []string `protobuf:"bytes,9,rep,name=ninja_targets,json=ninjaTargets,proto3" json:"ninja_targets,omitempty"`
	// A list of Fuchsia packages to build.
	Packages []string `protobuf:"bytes,10,rep,name=packages,proto3" json:"packages,omitempty"`
	// The product to build.
	Product string `protobuf:"bytes,11,opt,name=product,proto3" json:"product,omitempty"`
	// Whether to run any tests.
	RunTests bool `protobuf:"varint,12,opt,name=run_tests,json=runTests,proto3" json:"run_tests,omitempty"`
	// The target architecture. One of x64 or arm64.
	Target string `protobuf:"bytes,13,opt,name=target,proto3" json:"target,omitempty"`
	// Packages to build and add to the universe set
	UniversePackages []string `protobuf:"bytes,14,rep,name=universe_packages,json=universePackages,proto3" json:"universe_packages,omitempty"`
	// --variant arguments to GN in `select_variant`
	Variants []string `protobuf:"bytes,15,rep,name=variants,proto3" json:"variants,omitempty"`
	// Additional args to pass to zircon build using standard FOO=bar syntax.
	ZirconArgs           []string `protobuf:"bytes,16,rep,name=zircon_args,json=zirconArgs,proto3" json:"zircon_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Fuchsia_Build proto.InternalMessageInfo

func (m *Fuchsia_Build) GetBuildType() string {
	if m != nil {
		return m.BuildType
	}
	return ""
}

func (m *Fuchsia_Build) GetBoard() string {
	if m != nil {
		return m.Board
	}
	return ""
}

func (m *Fuchsia_Build) GetDebugSymbolBucket() string {
	if m != nil {
		return m.DebugSymbolBucket
	}
	return ""
}

func (m *Fuchsia_Build) GetEnvironmentTags() []string {
	if m != nil {
		return m.EnvironmentTags
	}
	return nil
}

func (m *Fuchsia_Build) GetExcludeImages() bool {
	if m != nil {
		return m.ExcludeImages
	}
	return false
}

func (m *Fuchsia_Build) GetGnArgs() []string {
	if m != nil {
		return m.GnArgs
	}
	return nil
}

func (m *Fuchsia_Build) GetIncludeBreakpadSymbols() bool {
	if m != nil {
		return m.IncludeBreakpadSymbols
	}
	return false
}

func (m *Fuchsia_Build) GetIncludeSymbolArchive() bool {
	if m != nil {
		return m.IncludeSymbolArchive
	}
	return false
}

func (m *Fuchsia_Build) GetNinjaTargets() []string {
	if m != nil {
		return m.NinjaTargets
	}
	return nil
}

func (m *Fuchsia_Build) GetPackages() []string {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *Fuchsia_Build) GetProduct() string {
	if m != nil {
		return m.Product
	}
	return ""
}

func (m *Fuchsia_Build) GetRunTests() bool {
	if m != nil {
		return m.RunTests
	}
	return false
}

func (m *Fuchsia_Build) GetTarget() string {
	if m != nil {
		return m.Target
	}
	return ""
}

func (m *Fuchsia_Build) GetUniversePackages() []string {
	if m != nil {
		return m.UniversePackages
	}
	return nil
}

func (m *Fuchsia_Build) GetVariants() []string {
	if m != nil {
		return m.Variants
	}
	return nil
}

func (m *Fuchsia_Build) GetZirconArgs() []string {
	if m != nil {
		return m.ZirconArgs
	}
	return nil
}

// Describes how to test Fuchsia.
type Fuchsia_Test struct {
	// The type of device to execute tests on, if the value is
	// ot QEMU it will be passed to Swarming as the device_type
	// dimension.
	DeviceType string `protobuf:"bytes,1,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"`
	// Whether to pave images the device for testing. (Ignored if
	// device_type == QEMU)
	Pave bool `protobuf:"varint,2,opt,name=pave,proto3" json:"pave,omitempty"`
	// Swarming pool from which a test task will be drawn
	Pool string `protobuf:"bytes,3,opt,name=pool,proto3" json:"pool,omitempty"`
	// Shell-quoted string to add to the runtests commandline
	RuntestsArgs string `protobuf:"bytes,4,opt,name=runtests_args,json=runtestsArgs,proto3" json:"runtests_args,omitempty"`
	// Whether any plaintext needs to be supplied to the tests
	RequiresSecrets bool `protobuf:"varint,5,opt,name=requires_secrets,json=requiresSecrets,proto3" json:"requires_secrets,omitempty"`
	// How long to wait for Swarming to find a bot on which to test
	SwarmingExpirationTimeoutSecs int32 `protobuf:"varint,6,opt,name=swarming_expiration_timeout_secs,json=swarmingExpirationTimeoutSecs,proto3" json:"swarming_expiration_timeout_secs,omitempty"`
	// How long to wait (in seconds) before killing the test
	// swarming task if there\'s no output being produced
	SwarmingIoTimeoutSecs int32 `protobuf:"varint,7,opt,name=swarming_io_timeout_secs,json=swarmingIoTimeoutSecs,proto3" json:"swarming_io_timeout_secs,omitempty"`
	// Whether to run tests as shards.
	TestInShards bool `protobuf:"varint,8,opt,name=test_in_shards,json=testInShards,proto3" json:"test_in_shards,omitempty"`
	// How long to wait until timing out on tests.
	TimeoutSecs int32 `protobuf:"varint,9,opt,name=timeout_secs,json=timeoutSecs,proto3" json:"timeout_secs,omitempty"`
	// Whether to upload perf results to Catapult
	UploadToCatapult     bool     `protobuf:"varint,10,opt,name=upload_to_catapult,json=uploadToCatapult,proto3" json:"upload_to_catapult,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Fuchsia_Test proto.InternalMessageInfo

func (m *Fuchsia_Test) GetDeviceType() string {
	if m != nil {
		return m.DeviceType
	}
	return ""
}

func (m *Fuchsia_Test) GetPave() bool {
	if m != nil {
		return m.Pave
	}
	return false
}

func (m *Fuchsia_Test) GetPool() string {
	if m != nil {
		return m.Pool
	}
	return ""
}

func (m *Fuchsia_Test) GetRuntestsArgs() string {
	if m != nil {
		return m.RuntestsArgs
	}
	return ""
}

func (m *Fuchsia_Test) GetRequiresSecrets() bool {
	if m != nil {
		return m.RequiresSecrets
	}
	return false
}

func (m *Fuchsia_Test) GetSwarmingExpirationTimeoutSecs() int32 {
	if m != nil {
		return m.SwarmingExpirationTimeoutSecs
	}
	return 0
}

func (m *Fuchsia_Test) GetSwarmingIoTimeoutSecs() int32 {
	if m != nil {
		return m.SwarmingIoTimeoutSecs
	}
	return 0
}

func (m *Fuchsia_Test) GetTestInShards() bool {
	if m != nil {
		return m.TestInShards
	}
	return false
}

func (m *Fuchsia_Test) GetTimeoutSecs() int32 {
	if m != nil {
		return m.TimeoutSecs
	}
	return 0
}

func (m *Fuchsia_Test) GetUploadToCatapult() bool {
	if m != nil {
		return m.UploadToCatapult
	}
	return false
}

func init() {
	proto.RegisterType((*Fuchsia)(nil), "infra.fuchsia.Fuchsia")
	proto.RegisterType((*Fuchsia_Checkout)(nil), "infra.fuchsia.Fuchsia.Checkout")
	proto.RegisterType((*Fuchsia_Build)(nil), "infra.fuchsia.Fuchsia.Build")
	proto.RegisterType((*Fuchsia_Test)(nil), "infra.fuchsia.Fuchsia.Test")
}

func init() { proto.RegisterFile("recipes/fuchsia.proto", fileDescriptor_eb93a9da76a97780) }

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