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

package test_condition

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	device "go.chromium.org/chromiumos/infra/proto/go/device"
	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

// Represents the condition of device.Config message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type DeviceConfigCondition struct {
	// Condition of device.ConfigId. This condition needs to be satisfied by
	// device.Config.id.
	Id *ConfigIdCondition `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// If this is not FORM_FACTOR_UNSPECIFIED, form_factor and
	// device.Config.form_factor must have same value.
	FormFactor device.Config_FormFactor `protobuf:"varint,2,opt,name=form_factor,json=formFactor,proto3,enum=device.Config_FormFactor" json:"form_factor,omitempty"`
	// If not empty, the value of device.Config.form_factor must not be
	// contained in this field.
	NoFormFactors []device.Config_FormFactor `protobuf:"varint,3,rep,packed,name=no_form_factors,json=noFormFactors,proto3,enum=device.Config_FormFactor" json:"no_form_factors,omitempty"`
	// If not empty, gpu_family and device.Config.gpu_family must have same
	// value.
	GpuFamily string `protobuf:"bytes,4,opt,name=gpu_family,json=gpuFamily,proto3" json:"gpu_family,omitempty"`
	// If not empty, the value of device.Config.gpu_family must not be
	// contained in this field.
	NoGpuFamilies []string `protobuf:"bytes,5,rep,name=no_gpu_families,json=noGpuFamilies,proto3" json:"no_gpu_families,omitempty"`
	// If this is not GRAPHICS_UNSPECIFIED, graphics and device.Config.graphics
	// must have same value.
	Graphics device.Config_Graphics `protobuf:"varint,6,opt,name=graphics,proto3,enum=device.Config_Graphics" json:"graphics,omitempty"`
	// If not empty, the value of device.Config.graphics must not be contained
	// in this field.
	NoGraphics []device.Config_Graphics `protobuf:"varint,7,rep,packed,name=no_graphics,json=noGraphics,proto3,enum=device.Config_Graphics" json:"no_graphics,omitempty"`
	// If not empty, all values in this field must be contained in the
	// device.Config.hardware_features list.
	HardwareFeatures []device.Config_HardwareFeature `protobuf:"varint,8,rep,packed,name=hardware_features,json=hardwareFeatures,proto3,enum=device.Config_HardwareFeature" json:"hardware_features,omitempty"`
	// If not emtpy, any value in device.Config.hardware_features must not be
	// contained in this field.
	NoHardwareFeatures []device.Config_HardwareFeature `protobuf:"varint,9,rep,packed,name=no_hardware_features,json=noHardwareFeatures,proto3,enum=device.Config_HardwareFeature" json:"no_hardware_features,omitempty"`
	// If this is not POWER_SUPPLY_UNSPECIFIED, power and device.Config.power
	// must have same value.
	Power device.Config_PowerSupply `protobuf:"varint,10,opt,name=power,proto3,enum=device.Config_PowerSupply" json:"power,omitempty"`
	// If not empty, the value of device.Config.power must not be contained in
	// this field.
	NoPowers []device.Config_PowerSupply `protobuf:"varint,11,rep,packed,name=no_powers,json=noPowers,proto3,enum=device.Config_PowerSupply" json:"no_powers,omitempty"`
	// If this is not STORAGE_UNSPECIFIED, storage and device.Condition.storage
	// must have same value.
	Storage device.Config_Storage `protobuf:"varint,12,opt,name=storage,proto3,enum=device.Config_Storage" json:"storage,omitempty"`
	// If not empty, the value of device.Config.storage must not be contained
	// in this field.
	NoStorages []device.Config_Storage `protobuf:"varint,13,rep,packed,name=no_storages,json=noStorages,proto3,enum=device.Config_Storage" json:"no_storages,omitempty"`
	// If not empty, all values in this field must be contained in the
	// device.Config.video_accelerator_supports.
	VideoAccelerationSupports []device.Config_VideoAcceleration `protobuf:"varint,14,rep,packed,name=video_acceleration_supports,json=videoAccelerationSupports,proto3,enum=device.Config_VideoAcceleration" json:"video_acceleration_supports,omitempty"`
	// If not empty, any value in device.Config.video_acceleration_supports
	// must not be contained in this field.
	NoVideoAccelerationSupports []device.Config_VideoAcceleration `protobuf:"varint,15,rep,packed,name=no_video_acceleration_supports,json=noVideoAccelerationSupports,proto3,enum=device.Config_VideoAcceleration" json:"no_video_acceleration_supports,omitempty"`
	// If this is not SOC_UNSPECIFIED, soc and device.Config.soc must have same
	// value.
	Soc device.Config_SOC `protobuf:"varint,16,opt,name=soc,proto3,enum=device.Config_SOC" json:"soc,omitempty"`
	// If not empty, the value of device.Config.soc must not be contained in
	// this field.
	NoSocs               []device.Config_SOC `protobuf:"varint,17,rep,packed,name=no_socs,json=noSocs,proto3,enum=device.Config_SOC" json:"no_socs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_DeviceConfigCondition proto.InternalMessageInfo

func (m *DeviceConfigCondition) GetId() *ConfigIdCondition {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *DeviceConfigCondition) GetFormFactor() device.Config_FormFactor {
	if m != nil {
		return m.FormFactor
	}
	return device.Config_FORM_FACTOR_UNSPECIFIED
}

func (m *DeviceConfigCondition) GetNoFormFactors() []device.Config_FormFactor {
	if m != nil {
		return m.NoFormFactors
	}
	return nil
}

func (m *DeviceConfigCondition) GetGpuFamily() string {
	if m != nil {
		return m.GpuFamily
	}
	return ""
}

func (m *DeviceConfigCondition) GetNoGpuFamilies() []string {
	if m != nil {
		return m.NoGpuFamilies
	}
	return nil
}

func (m *DeviceConfigCondition) GetGraphics() device.Config_Graphics {
	if m != nil {
		return m.Graphics
	}
	return device.Config_GRAPHICS_UNSPECIFIED
}

func (m *DeviceConfigCondition) GetNoGraphics() []device.Config_Graphics {
	if m != nil {
		return m.NoGraphics
	}
	return nil
}

func (m *DeviceConfigCondition) GetHardwareFeatures() []device.Config_HardwareFeature {
	if m != nil {
		return m.HardwareFeatures
	}
	return nil
}

func (m *DeviceConfigCondition) GetNoHardwareFeatures() []device.Config_HardwareFeature {
	if m != nil {
		return m.NoHardwareFeatures
	}
	return nil
}

func (m *DeviceConfigCondition) GetPower() device.Config_PowerSupply {
	if m != nil {
		return m.Power
	}
	return device.Config_POWER_SUPPLY_UNSPECIFIED
}

func (m *DeviceConfigCondition) GetNoPowers() []device.Config_PowerSupply {
	if m != nil {
		return m.NoPowers
	}
	return nil
}

func (m *DeviceConfigCondition) GetStorage() device.Config_Storage {
	if m != nil {
		return m.Storage
	}
	return device.Config_STORAGE_UNSPECIFIED
}

func (m *DeviceConfigCondition) GetNoStorages() []device.Config_Storage {
	if m != nil {
		return m.NoStorages
	}
	return nil
}

func (m *DeviceConfigCondition) GetVideoAccelerationSupports() []device.Config_VideoAcceleration {
	if m != nil {
		return m.VideoAccelerationSupports
	}
	return nil
}

func (m *DeviceConfigCondition) GetNoVideoAccelerationSupports() []device.Config_VideoAcceleration {
	if m != nil {
		return m.NoVideoAccelerationSupports
	}
	return nil
}

func (m *DeviceConfigCondition) GetSoc() device.Config_SOC {
	if m != nil {
		return m.Soc
	}
	return device.Config_SOC_UNSPECIFIED
}

func (m *DeviceConfigCondition) GetNoSocs() []device.Config_SOC {
	if m != nil {
		return m.NoSocs
	}
	return nil
}

// Represents the condition of device.ConfigId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
// chromeos/infra/config has similar feature, i.e. disabling tests by DUT
// models. The big difference is; this configuration is provided from tests,
// and specifically it is branched. chromeos/infra/config is not branched.
// The majar use case of chromeos/infra/config is to disable whole tests on
// a specific types DUT due to, e.g., lab/infra issues.
// Example use case of this condition is; if there is a known issue in a
// third_party drive only on some specific board, but it is expected that the
// fix of the issue would take time. This condition can be used to disable
// the test for such a case.
// On the other hand, chromeos/infra/config is expected to be used for
// disabling tests on a specific board, regardless of versions, because of
// temporaly infra/lab issue, for example.
type ConfigIdCondition struct {
	// Condition of device.PlatformId. This condition needs to be satisfied by
	// device.ConfigId.platform_id.
	PlatformId *PlatformIdCondition `protobuf:"bytes,1,opt,name=platform_id,json=platformId,proto3" json:"platform_id,omitempty"`
	// Condition of device.ModelId. This condition needs to be satisfied by
	// device.ConfigId.model_id.
	ModelId *ModelIdCondition `protobuf:"bytes,2,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"`
	// Condition of device.VariantId. This condition needs to be satisfied by
	// device.ConfigId.variant_id.
	VariantId *VariantIdCondition `protobuf:"bytes,3,opt,name=variant_id,json=variantId,proto3" json:"variant_id,omitempty"`
	// Condition of device.BrandId. This condition needs to be satisfied by
	// device.ConfigId.brand_id.
	BrandId              *BrandIdCondition `protobuf:"bytes,4,opt,name=brand_id,json=brandId,proto3" json:"brand_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_ConfigIdCondition proto.InternalMessageInfo

func (m *ConfigIdCondition) GetPlatformId() *PlatformIdCondition {
	if m != nil {
		return m.PlatformId
	}
	return nil
}

func (m *ConfigIdCondition) GetModelId() *ModelIdCondition {
	if m != nil {
		return m.ModelId
	}
	return nil
}

func (m *ConfigIdCondition) GetVariantId() *VariantIdCondition {
	if m != nil {
		return m.VariantId
	}
	return nil
}

func (m *ConfigIdCondition) GetBrandId() *BrandIdCondition {
	if m != nil {
		return m.BrandId
	}
	return nil
}

// Represents the condition of device.PlatformId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type PlatformIdCondition struct {
	// If not empty, value and device.ConfigId.value must have same value.
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// If not empty, the value of device.ConfigId.value must not be contained
	// in this field.
	NoValues             []string `protobuf:"bytes,2,rep,name=no_values,json=noValues,proto3" json:"no_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PlatformIdCondition proto.InternalMessageInfo

func (m *PlatformIdCondition) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *PlatformIdCondition) GetNoValues() []string {
	if m != nil {
		return m.NoValues
	}
	return nil
}

// Represents the condition of device.ModelId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type ModelIdCondition struct {
	// If not empty, value and device.ConfigId.value must have same value.
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// If not empty, the value of device.ConfigId.value must not be contained
	// in this field.
	NoValues             []string `protobuf:"bytes,2,rep,name=no_values,json=noValues,proto3" json:"no_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ModelIdCondition proto.InternalMessageInfo

func (m *ModelIdCondition) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *ModelIdCondition) GetNoValues() []string {
	if m != nil {
		return m.NoValues
	}
	return nil
}

// Represents the condition of device.VariantId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type VariantIdCondition struct {
	// If not empty, value and device.ConfigId.value must have same value.
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// If not empty, the value of device.ConfigId.value must not be contained
	// in this field.
	NoValues             []string `protobuf:"bytes,2,rep,name=no_values,json=noValues,proto3" json:"no_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VariantIdCondition proto.InternalMessageInfo

func (m *VariantIdCondition) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *VariantIdCondition) GetNoValues() []string {
	if m != nil {
		return m.NoValues
	}
	return nil
}

// Represents the condition of device.BrandId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
type BrandIdCondition struct {
	// If not empty, value and device.ConfigId.value must have same value.
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// If not empty, the value of device.ConfigId.value must not be contained
	// in this field.
	NoValues             []string `protobuf:"bytes,2,rep,name=no_values,json=noValues,proto3" json:"no_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BrandIdCondition proto.InternalMessageInfo

func (m *BrandIdCondition) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *BrandIdCondition) GetNoValues() []string {
	if m != nil {
		return m.NoValues
	}
	return nil
}

func init() {
	proto.RegisterType((*DeviceConfigCondition)(nil), "test_condition.DeviceConfigCondition")
	proto.RegisterType((*ConfigIdCondition)(nil), "test_condition.ConfigIdCondition")
	proto.RegisterType((*PlatformIdCondition)(nil), "test_condition.PlatformIdCondition")
	proto.RegisterType((*ModelIdCondition)(nil), "test_condition.ModelIdCondition")
	proto.RegisterType((*VariantIdCondition)(nil), "test_condition.VariantIdCondition")
	proto.RegisterType((*BrandIdCondition)(nil), "test_condition.BrandIdCondition")
}

func init() { proto.RegisterFile("test/device_condition.proto", fileDescriptor_537aa4d3b658c66b) }

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