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

package analytics

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

// TestPlanRun represents the test request defined by users and its running
// status.
type TestPlanRun struct {
	// A unique name to identify this test plan run, format
	// "testPlanRuns/CTP_BUILD_ID/REQ_KEY", where REQ_KEY is the CTP
	// request’s key in the multiple-request,
	// e.g. "testPlanRuns/8879199769272202448/octopus_ampton"
	// Required field.
	Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"`
	// CTP build ID.
	BuildId int64 `protobuf:"varint,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// Suite name. If the test plan is running an autotest suite,
	// this field is the autotest suite name, e.g. wifi_interop.
	Suite string `protobuf:"bytes,3,opt,name=suite,proto3" json:"suite,omitempty"`
	// Human friendly url to access this run.
	ExecutionUrl string `protobuf:"bytes,4,opt,name=execution_url,json=executionUrl,proto3" json:"execution_url,omitempty"`
	// The dut_pool in which the test plan ran, e.g. "DUT_POOL_QUOTA" or
	// "wificell".
	// It is case sensitive: "WIFICELL" and "wificell" represent different
	// pools.
	// Note that legacy pools "suites", "bvt" and "pcq" have been integrated
	// into "DUT_POOL_QUOTA" and legacy pool "cts" has been renamed to
	// "DUT_POOL_CTS".
	DutPool string `protobuf:"bytes,5,opt,name=dut_pool,json=dutPool,proto3" json:"dut_pool,omitempty"`
	// The build target, a.k.a board name, e.g. "hatch", "octopus".
	BuildTarget string `protobuf:"bytes,6,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// CrOS build version, e.g. "R84/13091.0.0".
	ChromeosBuild string  `protobuf:"bytes,7,opt,name=chromeos_build,json=chromeosBuild,proto3" json:"chromeos_build,omitempty"`
	Status        *Status `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"`
	// Event timestamp of test plan run, e.g. start time, end time.
	Timeline             *Timeline `protobuf:"bytes,9,opt,name=timeline,proto3" json:"timeline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_TestPlanRun proto.InternalMessageInfo

func (m *TestPlanRun) GetUid() string {
	if m != nil {
		return m.Uid
	}
	return ""
}

func (m *TestPlanRun) GetBuildId() int64 {
	if m != nil {
		return m.BuildId
	}
	return 0
}

func (m *TestPlanRun) GetSuite() string {
	if m != nil {
		return m.Suite
	}
	return ""
}

func (m *TestPlanRun) GetExecutionUrl() string {
	if m != nil {
		return m.ExecutionUrl
	}
	return ""
}

func (m *TestPlanRun) GetDutPool() string {
	if m != nil {
		return m.DutPool
	}
	return ""
}

func (m *TestPlanRun) GetBuildTarget() string {
	if m != nil {
		return m.BuildTarget
	}
	return ""
}

func (m *TestPlanRun) GetChromeosBuild() string {
	if m != nil {
		return m.ChromeosBuild
	}
	return ""
}

func (m *TestPlanRun) GetStatus() *Status {
	if m != nil {
		return m.Status
	}
	return nil
}

func (m *TestPlanRun) GetTimeline() *Timeline {
	if m != nil {
		return m.Timeline
	}
	return nil
}

// TestRun contains Skylab task level information.
type TestRun struct {
	// Test runner build ID.
	BuildId int64 `protobuf:"varint,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// The name of the Skylab task corresponding to the test run, e.g.
	// "tast.critical-chrome".
	//
	// For tasks containing a single test case, will generally be the same as the
	// name of that test case, e.g. "provision_AutoUpdate.double".
	// Required field.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Human friendly url to access this run.
	ExecutionUrl string `protobuf:"bytes,3,opt,name=execution_url,json=executionUrl,proto3" json:"execution_url,omitempty"`
	// The TestPlanRun.uid of the parent test plan run.
	ParentUid string `protobuf:"bytes,4,opt,name=parent_uid,json=parentUid,proto3" json:"parent_uid,omitempty"`
	// Model name, e.g. "helios", "mimrock".
	// Note that a single TestPlanRun may be spread across multiple models, if
	// the test plan request did not specify a model to run.
	Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"`
	// Event timestamp of test run, e.g. start time, end time.
	Timeline *Timeline `protobuf:"bytes,6,opt,name=timeline,proto3" json:"timeline,omitempty"`
	Status   *Status   `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"`
	Verdict  *Verdict  `protobuf:"bytes,8,opt,name=verdict,proto3" json:"verdict,omitempty"`
	// The URL for the entire logs of this run.
	FullLogUrl           string          `protobuf:"bytes,9,opt,name=full_log_url,json=fullLogUrl,proto3" json:"full_log_url,omitempty"`
	Prejob               *TestRun_Prejob `protobuf:"bytes,10,opt,name=prejob,proto3" json:"prejob,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_TestRun proto.InternalMessageInfo

func (m *TestRun) GetBuildId() int64 {
	if m != nil {
		return m.BuildId
	}
	return 0
}

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

func (m *TestRun) GetExecutionUrl() string {
	if m != nil {
		return m.ExecutionUrl
	}
	return ""
}

func (m *TestRun) GetParentUid() string {
	if m != nil {
		return m.ParentUid
	}
	return ""
}

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

func (m *TestRun) GetTimeline() *Timeline {
	if m != nil {
		return m.Timeline
	}
	return nil
}

func (m *TestRun) GetStatus() *Status {
	if m != nil {
		return m.Status
	}
	return nil
}

func (m *TestRun) GetVerdict() *Verdict {
	if m != nil {
		return m.Verdict
	}
	return nil
}

func (m *TestRun) GetFullLogUrl() string {
	if m != nil {
		return m.FullLogUrl
	}
	return ""
}

func (m *TestRun) GetPrejob() *TestRun_Prejob {
	if m != nil {
		return m.Prejob
	}
	return nil
}

type TestRun_Prejob struct {
	Verdict              *Verdict `protobuf:"bytes,1,opt,name=verdict,proto3" json:"verdict,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestRun_Prejob proto.InternalMessageInfo

func (m *TestRun_Prejob) GetVerdict() *Verdict {
	if m != nil {
		return m.Verdict
	}
	return nil
}

// TestCaseResult describes the result of an individual test case.
type TestCaseResult struct {
	// A unique name for this test case run,
	// format "testCaseResults/TEST_RUNNER_BUILD_ID/TEST_CASE_NAME", e.g.
	// "testCaseResults/8879199769272202448/provision_AutoUpdate.double".
	// Required field.
	Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"`
	// Test case name as it appears in status.log,
	// e.g. "provision_AutoUpdate.double".
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// The TestRun.build_id of the parent test run.
	ParentBuildId string   `protobuf:"bytes,3,opt,name=parent_build_id,json=parentBuildId,proto3" json:"parent_build_id,omitempty"`
	Verdict       *Verdict `protobuf:"bytes,4,opt,name=verdict,proto3" json:"verdict,omitempty"`
	// A one line human readable description of what happened during test
	// case execution (e.g. error/warning message). Not intended to be machine
	// parseable. There's no guarantee that a given root cause will always
	// resolve to the same summary.
	HumanReadableSummary string   `protobuf:"bytes,5,opt,name=human_readable_summary,json=humanReadableSummary,proto3" json:"human_readable_summary,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestCaseResult proto.InternalMessageInfo

func (m *TestCaseResult) GetUid() string {
	if m != nil {
		return m.Uid
	}
	return ""
}

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

func (m *TestCaseResult) GetParentBuildId() string {
	if m != nil {
		return m.ParentBuildId
	}
	return ""
}

func (m *TestCaseResult) GetVerdict() *Verdict {
	if m != nil {
		return m.Verdict
	}
	return nil
}

func (m *TestCaseResult) GetHumanReadableSummary() string {
	if m != nil {
		return m.HumanReadableSummary
	}
	return ""
}

// The timeline of a task.
type Timeline struct {
	// Time the task was requested.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Time the task began to execute in a bot.
	StartTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// Time the task completed, unset if the task was
	// stopped unexpectedly before its completion.
	EndTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	// Time the task was stopped unexpectedly, unset if
	// task has run to its end.
	AbandonTime          *timestamp.Timestamp `protobuf:"bytes,4,opt,name=abandon_time,json=abandonTime,proto3" json:"abandon_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Timeline proto.InternalMessageInfo

func (m *Timeline) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *Timeline) GetStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *Timeline) GetEndTime() *timestamp.Timestamp {
	if m != nil {
		return m.EndTime
	}
	return nil
}

func (m *Timeline) GetAbandonTime() *timestamp.Timestamp {
	if m != nil {
		return m.AbandonTime
	}
	return nil
}

// The latest known status of a task, may change as the run progresses.
type Status struct {
	// All the currently possible values (corresponding to
	// testplatform.Taskstate.LifeCycle enum values):
	//   NORMAL STATUS:
	//
	//     PENDING: task is pending somewhere and does not run.
	//     RUNNING: task is running.
	//     COMPLETED: ran to completion without being cancelled externally,
	//       regardless of whether it succeeded or failed. A task is completed
	//       only if all its sub-tasks have reached the end, either with a normal
	//       or abnormal status.
	//
	//   ABNORMAL STATUS:
	//
	//     CANCELLED: never got a chance to run, cancelled externally.
	//     REJECTED: never got a chance to run, rejected due to unsatisfiable
	//       depenedencies.
	//     ABORTED: started running but was cancelled externally while running.
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Status proto.InternalMessageInfo

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

// The known tokens describe whether a task passed, failed, or had some other
// indefinite verdict.
type Verdict struct {
	// All the currently possible values (corresponding to
	// testplatform.Taskstate.Verdict enum values):
	//
	//   UNSPECIFIED(default): the task produced no usable verdict (possibly
	//     because it never ran, or never finished, or the results were
	//     unparseable).
	//     Under most circumstances, this should be treated as a failure or
	//     an infrastructure failure.
	//   PASSED: test run definitively passed.
	//   FAILED: test run definitively failed.
	//   NO_VERDICT: the task definitively produced no verdict(for instance,
	//     the test is irrelevant in the given environment).
	//     Under most circumstances, this should be treated as a passing
	//     (but uninteresting).
	//   PASSED_ON_RETRY: the task failed, but passed after one or more retries.
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verdict proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*TestPlanRun)(nil), "test_platform.analytics.TestPlanRun")
	proto.RegisterType((*TestRun)(nil), "test_platform.analytics.TestRun")
	proto.RegisterType((*TestRun_Prejob)(nil), "test_platform.analytics.TestRun.Prejob")
	proto.RegisterType((*TestCaseResult)(nil), "test_platform.analytics.TestCaseResult")
	proto.RegisterType((*Timeline)(nil), "test_platform.analytics.Timeline")
	proto.RegisterType((*Status)(nil), "test_platform.analytics.Status")
	proto.RegisterType((*Verdict)(nil), "test_platform.analytics.Verdict")
}

func init() {
	proto.RegisterFile("test_platform/analytics/result.proto", fileDescriptor_ea3c1349f87b947c)
}

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