// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/metadata/v1/metadata.proto

// This package contains the definitions for the test metadata generated as
// build artifacts for all supported tests.
//
// This metadata is used for test execution requests, scheduling decisions and
// results analytics in various Test Lab Environments.
//
// Metadata must be generated for all tests in supported Remote Test Drivers and
// must be respected in all Test Lab Environments.

package metadata

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_struct "github.com/golang/protobuf/ptypes/struct"
	lab "go.chromium.org/chromiumos/infra/proto/go/lab"
	math "math"
	common "test/common"
)

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

// Metadata required for scheduling, invocation and results analysis of tests
// for a Remote Test Driver.
type Metadata struct {
	// The Remote Test Driver this test metadata is for.
	//
	// There may be more than one metadata instance for a Remote Test Driver.
	// Common reasons for multiple instances are:
	// - The test definitions may be split over multiple source locations. Thus,
	//   it may be more convenient to generate metadata for the tests spearately.
	// - The Remote Test Driver metadata may differ for tests in the same Remote
	//   Test Driver.
	RemoteTestDriver *RemoteTestDriver `protobuf:"bytes,1,opt,name=remote_test_driver,json=remoteTestDriver,proto3" json:"remote_test_driver,omitempty"`
	// Metadata for the smallest schedulable test units.
	Test                 []*Test  `protobuf:"bytes,2,rep,name=test,proto3" json:"test,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Metadata proto.InternalMessageInfo

func (m *Metadata) GetRemoteTestDriver() *RemoteTestDriver {
	if m != nil {
		return m.RemoteTestDriver
	}
	return nil
}

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

// The smallest schedulable test unit.
//
// A Test is an atomic schdulable unit. In particular, it is not possible to
// modify the behaviour of a Remote Test Driver execution for a given Test by
// supplying test arguments. See the documentation of
// test.metadata.v1.Informational on how paramaterized tests may be in light of
// this restriction.
//
// A single test platform request or Remote Test Driver invocation may contain
// multiple instances of multiple Tests, but each instance of a Test must
// correspond to exactly one reported result.
//
// See Also:
//    Test Platform request: TODO(pprabhu)
//    Remote Test Driver invocation request: test/rtd/invocation.proto
//    Remote Test Driver progress API: test/rtd/progress.proto
type Test struct {
	// Identifying name for this test.
	//
	// Must be a valid resource per https://aip.dev/122.
	//
	// Name must be unique across all known tests for the test's Remote Test
	// Driver. Thus, the tuple (remote_test_driver.id, name) is globally unique
	// across all test metadata.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Attributes are used to include tests in test plans.
	//
	// See Also:
	//   Test plans: test/plan/plan.proto
	Attributes []*Attribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"`
	// Required condition to be met for each Device Under Test targeted by this
	// test.
	//
	// Condition enforcement is an optional feature for test scheduling, i.e.,
	// some Test Lab Environments may ignore conditions entirely.
	//
	// May be specified multiple times for tests that target more than one Device
	// Under Test, once per required device.
	Conditions []*DUTCondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"`
	// Metadata about the test that doesn't affect scheduling or execution.
	Informational        *Informational `protobuf:"bytes,4,opt,name=informational,proto3" json:"informational,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Test proto.InternalMessageInfo

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

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

func (m *Test) GetConditions() []*DUTCondition {
	if m != nil {
		return m.Conditions
	}
	return nil
}

func (m *Test) GetInformational() *Informational {
	if m != nil {
		return m.Informational
	}
	return nil
}

// Attributes used to include tests in test plans.
type Attribute struct {
	// Opaque name for this attribute.
	//
	// Value must be valid resource names per https://aip.dev/122.
	//
	// Must not be interpreted by Test Lab Environments.
	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 *Attribute) Reset()         { *m = Attribute{} }
func (m *Attribute) String() string { return proto.CompactTextString(m) }
func (*Attribute) ProtoMessage()    {}
func (*Attribute) Descriptor() ([]byte, []int) {
	return fileDescriptor_476fe0680946cd89, []int{2}
}

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

var xxx_messageInfo_Attribute proto.InternalMessageInfo

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

// Condition to be met for each Device Under Test targeted by a test.
type DUTCondition struct {
	// A Common Expression Language (CEL) expression to specify DUT conditions.
	//
	// Test Lab Environments may optionally support targeting test requests to
	// Device Under Test based on DUTConditions. If this feature is supported, the
	// Test Lab Environment must interpret `expression` in the scope of the
	// protobuf message DUTCondition.Scope as defined below.
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	// This API only currently only supports a small sub-set of the CEL features,
	// as described here. Test Lab Environments should validate the expression and
	// reject use of unsupported features.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - A specific characteristic for a hardware feature, e.g.:
	//     scope.device.hardware_topology.screen.milliinch.value == 14000
	// - A specific topology for a hardware feature, e.g.:
	//     scope.device.hardware_topology.form_factor.id == "fancy_clamshell"
	// - Existence of a hardware feature, e.g.:
	//     (scope.device.hardware_features.lte ==
	//      scope.device.hardware_features.PRESENT)
	// - Exclude certain hardware topologies, e.g.:
	//     scope.device.hardware_topology.stylus.id != "pencil"
	//
	// ## CEL support
	//
	// Current support for `expression` evaluation is very restricted due to
	// limitations in the scheduling platform used by Test Platform. Specifying
	// the conditions in CEL will allow gradual lifting of support restrictions.
	//
	// As this API matures, features will be added to the scheduling
	// infrastructure of Test Platform and restrictions here will be lifted based
	// on requirements collected from test authors. See milestones in
	// go/cros-f20-plan for expected feature iterations.
	//
	// ### Evaluation context
	//
	// A CEL expression must be evaluated in some context that provides the basic
	// bindings for name resolution. `expression` must be evaluated in an
	// evaluation context that contains
	//
	// - A variable 'scope' of type DUTCondition.Scope. This variable contains the
	//   information about a particular Device Under Test being tested for
	//   acceptance via `expresssion`.
	// - Protobuf definitions in this git project (i.e., rooted at infra/proto/).
	//
	// ### Syntax
	//
	// See full syntax definition at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#syntax
	//
	// CEL standard syntax allows expressions that evaluate to errors (e.g.,
	// syntax allows negation of lists, which has no semantics in CEL).
	// Thus, this spec does not attempt to restrict the syntax, but specifies what
	// operations are unsupported to aid metadata producers. Ultimately, the
	// reference metadata validator is the authority on what expressions are
	// allowed.
	//
	// Unsupported standard CEL semantics:
	//   - Binary arithmetic operations
	//     e.g.: +, *, /, % ...
	//   - Relational Operators beyond (in)equality are not supported.
	//     e.g.: (>, <, >=, <= ...)
	//   - Logical OR in expressions is not supported.
	//     e.g.: (a || b), !(a && b) ...
	//
	// ### Macros
	//
	// See full macro definition at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#macros
	//
	// Supported macros: has(), e.all()
	// Unsupported macros: e.exists(), e.exists_one(), e.map(), e.filter()
	//
	// ### Standard functions
	//
	// See full list of standard definitions at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#standard-definitions
	//
	// Most standard functions are not supported.
	//
	// - Supported operators: !_, -_, _!=_, _&&_, _=_, _[_]
	//   - All other operators are not supported.
	// - All other standard functions are not supported. In particular take note:
	//   - size() is not supported.
	//   - string functions like endsWith() and contains() are not supported.
	//   - type conversions like int() and string() are not supported.
	//   - reflection with type(), null_type() and dyn() is not supported.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DUTCondition proto.InternalMessageInfo

func (m *DUTCondition) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

// Protocol buffer scope for interpretation of `expression`.
//
// Scope includes the Device Under Test features that can be targeted for test
// targetting.
type DUTCondition_Scope struct {
	// Device Under Test specification.
	Device *common.Device `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"`
	// Peripherals information about the lab deployment of the device.
	LabDut               *lab.DeviceUnderTest `protobuf:"bytes,2,opt,name=lab_dut,json=labDut,proto3" json:"lab_dut,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_DUTCondition_Scope proto.InternalMessageInfo

func (m *DUTCondition_Scope) GetDevice() *common.Device {
	if m != nil {
		return m.Device
	}
	return nil
}

func (m *DUTCondition_Scope) GetLabDut() *lab.DeviceUnderTest {
	if m != nil {
		return m.LabDut
	}
	return nil
}

// Contains metadata about the test that doesn't affect scheduling or execution.
type Informational struct {
	// Contacts for ownership / flakiness notification etc.
	Authors []*Contact `protobuf:"bytes,1,rep,name=authors,proto3" json:"authors,omitempty"`
	// Machine readable test-specific information.
	//
	// Remote Test Drivers should include detailed information to aid analytics.
	// For example, test authors may minimize code duplication by writing
	// paramterized tests. Thus, multiple test metadata may refer to the
	// same test implementation with different arguments. It is useful to include
	// this information as details. An example for Tauto:
	//   {
	//      "test_project": "chromiumos/third_party/autotest",
	//      "control_file": "site_tests/dummy_Pass/control.stress",
	//      "args": {
	//        "run_count": 35
	//      }
	//   }
	//
	// This field must not be interpreted by the Test Lab Environments, but Remote
	// Test Drivers can enrich analytics by using uniform stable schema for
	// details across all their tests.
	Details              *_struct.Struct `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_Informational proto.InternalMessageInfo

func (m *Informational) GetAuthors() []*Contact {
	if m != nil {
		return m.Authors
	}
	return nil
}

func (m *Informational) GetDetails() *_struct.Struct {
	if m != nil {
		return m.Details
	}
	return nil
}

// Contact information of individuals or teams.
type Contact struct {
	// Types that are valid to be assigned to Type:
	//	*Contact_Email
	//	*Contact_MdbGroup
	Type                 isContact_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Contact proto.InternalMessageInfo

type isContact_Type interface {
	isContact_Type()
}

type Contact_Email struct {
	Email string `protobuf:"bytes,1,opt,name=email,proto3,oneof"`
}

type Contact_MdbGroup struct {
	MdbGroup string `protobuf:"bytes,2,opt,name=mdb_group,json=mdbGroup,proto3,oneof"`
}

func (*Contact_Email) isContact_Type() {}

func (*Contact_MdbGroup) isContact_Type() {}

func (m *Contact) GetType() isContact_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *Contact) GetEmail() string {
	if x, ok := m.GetType().(*Contact_Email); ok {
		return x.Email
	}
	return ""
}

func (m *Contact) GetMdbGroup() string {
	if x, ok := m.GetType().(*Contact_MdbGroup); ok {
		return x.MdbGroup
	}
	return ""
}

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

func init() {
	proto.RegisterType((*Metadata)(nil), "test.metadata.v1.Metadata")
	proto.RegisterType((*Test)(nil), "test.metadata.v1.Test")
	proto.RegisterType((*Attribute)(nil), "test.metadata.v1.Attribute")
	proto.RegisterType((*DUTCondition)(nil), "test.metadata.v1.DUTCondition")
	proto.RegisterType((*DUTCondition_Scope)(nil), "test.metadata.v1.DUTCondition.Scope")
	proto.RegisterType((*Informational)(nil), "test.metadata.v1.Informational")
	proto.RegisterType((*Contact)(nil), "test.metadata.v1.Contact")
}

func init() { proto.RegisterFile("test/metadata/v1/metadata.proto", fileDescriptor_476fe0680946cd89) }

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