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

package analysis_service

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

// Data about the execution of a step. Fields mirror those of the
// ExecutionResult object returned by a step.
type StepExecutionResult struct {
	Retcode              int32    `protobuf:"varint,1,opt,name=retcode,proto3" json:"retcode,omitempty"`
	HadTimeout           bool     `protobuf:"varint,2,opt,name=had_timeout,json=hadTimeout,proto3" json:"had_timeout,omitempty"`
	HadException         bool     `protobuf:"varint,3,opt,name=had_exception,json=hadException,proto3" json:"had_exception,omitempty"`
	WasCancelled         bool     `protobuf:"varint,4,opt,name=was_cancelled,json=wasCancelled,proto3" json:"was_cancelled,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_StepExecutionResult proto.InternalMessageInfo

func (m *StepExecutionResult) GetRetcode() int32 {
	if m != nil {
		return m.Retcode
	}
	return 0
}

func (m *StepExecutionResult) GetHadTimeout() bool {
	if m != nil {
		return m.HadTimeout
	}
	return false
}

func (m *StepExecutionResult) GetHadException() bool {
	if m != nil {
		return m.HadException
	}
	return false
}

func (m *StepExecutionResult) GetWasCancelled() bool {
	if m != nil {
		return m.WasCancelled
	}
	return false
}

// Requests and responses are sent to the Artifacts Analysis Service on a single
// Pub/Sub topic; thus, the type of the request and response need to be encoded
// in the Pub/Sub message. This is done with this wrapper proto.
//
// This proto should only be used by a recipes module to do the wrapping and a
// layer on the Analysis Server to do the unwrapping.
//
// NEXT ID: 53;
type AnalysisServiceEvent struct {
	// The Buildbucket id for the build doing the request and response.
	BuildId int64 `protobuf:"varint,42,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// The name of the step doing the request and response. Must be the same
	// format as Buildbucket Build proto's step name (i.e. parent and child step
	// names are separated by the "|" character).
	StepName string `protobuf:"bytes,43,opt,name=step_name,json=stepName,proto3" json:"step_name,omitempty"`
	// The time the request and response were sent and recieved by the caller.
	RequestTime  *timestamp.Timestamp `protobuf:"bytes,3,opt,name=request_time,json=requestTime,proto3" json:"request_time,omitempty"`
	ResponseTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=response_time,json=responseTime,proto3" json:"response_time,omitempty"`
	// The stdout and stderr logs for a stage. Either log string may be truncated
	// to ensure individual entries and proto request sizes work well for upload
	// and for later querying.
	Stdout string `protobuf:"bytes,50,opt,name=stdout,proto3" json:"stdout,omitempty"`
	Stderr string `protobuf:"bytes,51,opt,name=stderr,proto3" json:"stderr,omitempty"`
	// Data about the execution of the step doing the request and response.
	StepExecutionResult *StepExecutionResult `protobuf:"bytes,52,opt,name=step_execution_result,json=stepExecutionResult,proto3" json:"step_execution_result,omitempty"`
	// The request to upload.
	//
	// Types that are valid to be assigned to Request:
	//	*AnalysisServiceEvent_InstallPackagesRequest
	//	*AnalysisServiceEvent_BundleRequest
	//	*AnalysisServiceEvent_BundleVmFilesRequest
	//	*AnalysisServiceEvent_BinhostGetRequest
	//	*AnalysisServiceEvent_AclArgsRequest
	//	*AnalysisServiceEvent_PrepareBinhostUploadsRequest
	//	*AnalysisServiceEvent_SetBinhostRequest
	//	*AnalysisServiceEvent_RegenBuildCacheRequest
	//	*AnalysisServiceEvent_GetBuildDependencyGraphRequest
	//	*AnalysisServiceEvent_CreateImageRequest
	//	*AnalysisServiceEvent_TestImageRequest
	//	*AnalysisServiceEvent_CreateRequest
	//	*AnalysisServiceEvent_UpdateRequest
	//	*AnalysisServiceEvent_SysrootCreateRequest
	//	*AnalysisServiceEvent_InstallToolchainRequest
	//	*AnalysisServiceEvent_BuildTargetUnitTestRequest
	//	*AnalysisServiceEvent_ChromiteUnitTestRequest
	//	*AnalysisServiceEvent_DebugInfoTestRequest
	//	*AnalysisServiceEvent_VmTestRequest
	//	*AnalysisServiceEvent_MoblabVmTestRequest
	//	*AnalysisServiceEvent_UprevPackagesRequest
	//	*AnalysisServiceEvent_GetBestVisibleRequest
	//	*AnalysisServiceEvent_GetChromeVersionRequest
	Request isAnalysisServiceEvent_Request `protobuf_oneof:"request"`
	// The response to upload.
	//
	// Types that are valid to be assigned to Response:
	//	*AnalysisServiceEvent_InstallPackagesResponse
	//	*AnalysisServiceEvent_BundleResponse
	//	*AnalysisServiceEvent_BinhostGetResponse
	//	*AnalysisServiceEvent_AclArgsResponse
	//	*AnalysisServiceEvent_PrepareBinhostUploadsResponse
	//	*AnalysisServiceEvent_SetBinhostResponse
	//	*AnalysisServiceEvent_RegenBuildCacheResponse
	//	*AnalysisServiceEvent_GetBuildDependencyGraphResponse
	//	*AnalysisServiceEvent_CreateImageResult
	//	*AnalysisServiceEvent_TestImageResult
	//	*AnalysisServiceEvent_CreateResponse
	//	*AnalysisServiceEvent_UpdateResponse
	//	*AnalysisServiceEvent_SysrootCreateResponse
	//	*AnalysisServiceEvent_InstallToolchainResponse
	//	*AnalysisServiceEvent_BuildTargetUnitTestResponse
	//	*AnalysisServiceEvent_ChromiteUnitTestResponse
	//	*AnalysisServiceEvent_DebugInfoTestResponse
	//	*AnalysisServiceEvent_VmTestResponse
	//	*AnalysisServiceEvent_MoblabVmTestResponse
	//	*AnalysisServiceEvent_UprevPackagesResponse
	//	*AnalysisServiceEvent_GetBestVisibleResponse
	//	*AnalysisServiceEvent_GetChromeVersionResponse
	Response             isAnalysisServiceEvent_Response `protobuf_oneof:"response"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_AnalysisServiceEvent proto.InternalMessageInfo

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

func (m *AnalysisServiceEvent) GetStepName() string {
	if m != nil {
		return m.StepName
	}
	return ""
}

func (m *AnalysisServiceEvent) GetRequestTime() *timestamp.Timestamp {
	if m != nil {
		return m.RequestTime
	}
	return nil
}

func (m *AnalysisServiceEvent) GetResponseTime() *timestamp.Timestamp {
	if m != nil {
		return m.ResponseTime
	}
	return nil
}

func (m *AnalysisServiceEvent) GetStdout() string {
	if m != nil {
		return m.Stdout
	}
	return ""
}

func (m *AnalysisServiceEvent) GetStderr() string {
	if m != nil {
		return m.Stderr
	}
	return ""
}

func (m *AnalysisServiceEvent) GetStepExecutionResult() *StepExecutionResult {
	if m != nil {
		return m.StepExecutionResult
	}
	return nil
}

type isAnalysisServiceEvent_Request interface {
	isAnalysisServiceEvent_Request()
}

type AnalysisServiceEvent_InstallPackagesRequest struct {
	InstallPackagesRequest *api.InstallPackagesRequest `protobuf:"bytes,1,opt,name=install_packages_request,json=installPackagesRequest,proto3,oneof"`
}

type AnalysisServiceEvent_BundleRequest struct {
	BundleRequest *api.BundleRequest `protobuf:"bytes,5,opt,name=bundle_request,json=bundleRequest,proto3,oneof"`
}

type AnalysisServiceEvent_BundleVmFilesRequest struct {
	BundleVmFilesRequest *api.BundleVmFilesRequest `protobuf:"bytes,7,opt,name=bundle_vm_files_request,json=bundleVmFilesRequest,proto3,oneof"`
}

type AnalysisServiceEvent_BinhostGetRequest struct {
	BinhostGetRequest *api.BinhostGetRequest `protobuf:"bytes,8,opt,name=binhost_get_request,json=binhostGetRequest,proto3,oneof"`
}

type AnalysisServiceEvent_AclArgsRequest struct {
	AclArgsRequest *api.AclArgsRequest `protobuf:"bytes,10,opt,name=acl_args_request,json=aclArgsRequest,proto3,oneof"`
}

type AnalysisServiceEvent_PrepareBinhostUploadsRequest struct {
	PrepareBinhostUploadsRequest *api.PrepareBinhostUploadsRequest `protobuf:"bytes,12,opt,name=prepare_binhost_uploads_request,json=prepareBinhostUploadsRequest,proto3,oneof"`
}

type AnalysisServiceEvent_SetBinhostRequest struct {
	SetBinhostRequest *api.SetBinhostRequest `protobuf:"bytes,14,opt,name=set_binhost_request,json=setBinhostRequest,proto3,oneof"`
}

type AnalysisServiceEvent_RegenBuildCacheRequest struct {
	RegenBuildCacheRequest *api.RegenBuildCacheRequest `protobuf:"bytes,16,opt,name=regen_build_cache_request,json=regenBuildCacheRequest,proto3,oneof"`
}

type AnalysisServiceEvent_GetBuildDependencyGraphRequest struct {
	GetBuildDependencyGraphRequest *api.GetBuildDependencyGraphRequest `protobuf:"bytes,18,opt,name=get_build_dependency_graph_request,json=getBuildDependencyGraphRequest,proto3,oneof"`
}

type AnalysisServiceEvent_CreateImageRequest struct {
	CreateImageRequest *api.CreateImageRequest `protobuf:"bytes,20,opt,name=create_image_request,json=createImageRequest,proto3,oneof"`
}

type AnalysisServiceEvent_TestImageRequest struct {
	TestImageRequest *api.TestImageRequest `protobuf:"bytes,22,opt,name=test_image_request,json=testImageRequest,proto3,oneof"`
}

type AnalysisServiceEvent_CreateRequest struct {
	CreateRequest *api.CreateRequest `protobuf:"bytes,24,opt,name=create_request,json=createRequest,proto3,oneof"`
}

type AnalysisServiceEvent_UpdateRequest struct {
	UpdateRequest *api.UpdateRequest `protobuf:"bytes,26,opt,name=update_request,json=updateRequest,proto3,oneof"`
}

type AnalysisServiceEvent_SysrootCreateRequest struct {
	SysrootCreateRequest *api.SysrootCreateRequest `protobuf:"bytes,28,opt,name=sysroot_create_request,json=sysrootCreateRequest,proto3,oneof"`
}

type AnalysisServiceEvent_InstallToolchainRequest struct {
	InstallToolchainRequest *api.InstallToolchainRequest `protobuf:"bytes,30,opt,name=install_toolchain_request,json=installToolchainRequest,proto3,oneof"`
}

type AnalysisServiceEvent_BuildTargetUnitTestRequest struct {
	BuildTargetUnitTestRequest *api.BuildTargetUnitTestRequest `protobuf:"bytes,32,opt,name=build_target_unit_test_request,json=buildTargetUnitTestRequest,proto3,oneof"`
}

type AnalysisServiceEvent_ChromiteUnitTestRequest struct {
	ChromiteUnitTestRequest *api.ChromiteUnitTestRequest `protobuf:"bytes,34,opt,name=chromite_unit_test_request,json=chromiteUnitTestRequest,proto3,oneof"`
}

type AnalysisServiceEvent_DebugInfoTestRequest struct {
	DebugInfoTestRequest *api.DebugInfoTestRequest `protobuf:"bytes,36,opt,name=debug_info_test_request,json=debugInfoTestRequest,proto3,oneof"`
}

type AnalysisServiceEvent_VmTestRequest struct {
	VmTestRequest *api.VmTestRequest `protobuf:"bytes,38,opt,name=vm_test_request,json=vmTestRequest,proto3,oneof"`
}

type AnalysisServiceEvent_MoblabVmTestRequest struct {
	MoblabVmTestRequest *api.MoblabVmTestRequest `protobuf:"bytes,40,opt,name=moblab_vm_test_request,json=moblabVmTestRequest,proto3,oneof"`
}

type AnalysisServiceEvent_UprevPackagesRequest struct {
	UprevPackagesRequest *api.UprevPackagesRequest `protobuf:"bytes,44,opt,name=uprev_packages_request,json=uprevPackagesRequest,proto3,oneof"`
}

type AnalysisServiceEvent_GetBestVisibleRequest struct {
	GetBestVisibleRequest *api.GetBestVisibleRequest `protobuf:"bytes,46,opt,name=get_best_visible_request,json=getBestVisibleRequest,proto3,oneof"`
}

type AnalysisServiceEvent_GetChromeVersionRequest struct {
	GetChromeVersionRequest *api.GetChromeVersionRequest `protobuf:"bytes,48,opt,name=get_chrome_version_request,json=getChromeVersionRequest,proto3,oneof"`
}

func (*AnalysisServiceEvent_InstallPackagesRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_BundleRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_BundleVmFilesRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_BinhostGetRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_AclArgsRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_PrepareBinhostUploadsRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_SetBinhostRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_RegenBuildCacheRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_GetBuildDependencyGraphRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_CreateImageRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_TestImageRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_CreateRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_UpdateRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_SysrootCreateRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_InstallToolchainRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_BuildTargetUnitTestRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_ChromiteUnitTestRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_DebugInfoTestRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_VmTestRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_MoblabVmTestRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_UprevPackagesRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_GetBestVisibleRequest) isAnalysisServiceEvent_Request() {}

func (*AnalysisServiceEvent_GetChromeVersionRequest) isAnalysisServiceEvent_Request() {}

func (m *AnalysisServiceEvent) GetRequest() isAnalysisServiceEvent_Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *AnalysisServiceEvent) GetInstallPackagesRequest() *api.InstallPackagesRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_InstallPackagesRequest); ok {
		return x.InstallPackagesRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBundleRequest() *api.BundleRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_BundleRequest); ok {
		return x.BundleRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBundleVmFilesRequest() *api.BundleVmFilesRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_BundleVmFilesRequest); ok {
		return x.BundleVmFilesRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBinhostGetRequest() *api.BinhostGetRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_BinhostGetRequest); ok {
		return x.BinhostGetRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetAclArgsRequest() *api.AclArgsRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_AclArgsRequest); ok {
		return x.AclArgsRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetPrepareBinhostUploadsRequest() *api.PrepareBinhostUploadsRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_PrepareBinhostUploadsRequest); ok {
		return x.PrepareBinhostUploadsRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetSetBinhostRequest() *api.SetBinhostRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_SetBinhostRequest); ok {
		return x.SetBinhostRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetRegenBuildCacheRequest() *api.RegenBuildCacheRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_RegenBuildCacheRequest); ok {
		return x.RegenBuildCacheRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetGetBuildDependencyGraphRequest() *api.GetBuildDependencyGraphRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_GetBuildDependencyGraphRequest); ok {
		return x.GetBuildDependencyGraphRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetCreateImageRequest() *api.CreateImageRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_CreateImageRequest); ok {
		return x.CreateImageRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetTestImageRequest() *api.TestImageRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_TestImageRequest); ok {
		return x.TestImageRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetCreateRequest() *api.CreateRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_CreateRequest); ok {
		return x.CreateRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetUpdateRequest() *api.UpdateRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_UpdateRequest); ok {
		return x.UpdateRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetSysrootCreateRequest() *api.SysrootCreateRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_SysrootCreateRequest); ok {
		return x.SysrootCreateRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetInstallToolchainRequest() *api.InstallToolchainRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_InstallToolchainRequest); ok {
		return x.InstallToolchainRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBuildTargetUnitTestRequest() *api.BuildTargetUnitTestRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_BuildTargetUnitTestRequest); ok {
		return x.BuildTargetUnitTestRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetChromiteUnitTestRequest() *api.ChromiteUnitTestRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_ChromiteUnitTestRequest); ok {
		return x.ChromiteUnitTestRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetDebugInfoTestRequest() *api.DebugInfoTestRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_DebugInfoTestRequest); ok {
		return x.DebugInfoTestRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetVmTestRequest() *api.VmTestRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_VmTestRequest); ok {
		return x.VmTestRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetMoblabVmTestRequest() *api.MoblabVmTestRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_MoblabVmTestRequest); ok {
		return x.MoblabVmTestRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetUprevPackagesRequest() *api.UprevPackagesRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_UprevPackagesRequest); ok {
		return x.UprevPackagesRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetGetBestVisibleRequest() *api.GetBestVisibleRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_GetBestVisibleRequest); ok {
		return x.GetBestVisibleRequest
	}
	return nil
}

func (m *AnalysisServiceEvent) GetGetChromeVersionRequest() *api.GetChromeVersionRequest {
	if x, ok := m.GetRequest().(*AnalysisServiceEvent_GetChromeVersionRequest); ok {
		return x.GetChromeVersionRequest
	}
	return nil
}

type isAnalysisServiceEvent_Response interface {
	isAnalysisServiceEvent_Response()
}

type AnalysisServiceEvent_InstallPackagesResponse struct {
	InstallPackagesResponse *api.InstallPackagesResponse `protobuf:"bytes,2,opt,name=install_packages_response,json=installPackagesResponse,proto3,oneof"`
}

type AnalysisServiceEvent_BundleResponse struct {
	BundleResponse *api.BundleResponse `protobuf:"bytes,6,opt,name=bundle_response,json=bundleResponse,proto3,oneof"`
}

type AnalysisServiceEvent_BinhostGetResponse struct {
	BinhostGetResponse *api.BinhostGetResponse `protobuf:"bytes,9,opt,name=binhost_get_response,json=binhostGetResponse,proto3,oneof"`
}

type AnalysisServiceEvent_AclArgsResponse struct {
	AclArgsResponse *api.AclArgsResponse `protobuf:"bytes,11,opt,name=acl_args_response,json=aclArgsResponse,proto3,oneof"`
}

type AnalysisServiceEvent_PrepareBinhostUploadsResponse struct {
	PrepareBinhostUploadsResponse *api.PrepareBinhostUploadsResponse `protobuf:"bytes,13,opt,name=prepare_binhost_uploads_response,json=prepareBinhostUploadsResponse,proto3,oneof"`
}

type AnalysisServiceEvent_SetBinhostResponse struct {
	SetBinhostResponse *api.SetBinhostResponse `protobuf:"bytes,15,opt,name=set_binhost_response,json=setBinhostResponse,proto3,oneof"`
}

type AnalysisServiceEvent_RegenBuildCacheResponse struct {
	RegenBuildCacheResponse *api.RegenBuildCacheResponse `protobuf:"bytes,17,opt,name=regen_build_cache_response,json=regenBuildCacheResponse,proto3,oneof"`
}

type AnalysisServiceEvent_GetBuildDependencyGraphResponse struct {
	GetBuildDependencyGraphResponse *api.GetBuildDependencyGraphResponse `protobuf:"bytes,19,opt,name=get_build_dependency_graph_response,json=getBuildDependencyGraphResponse,proto3,oneof"`
}

type AnalysisServiceEvent_CreateImageResult struct {
	CreateImageResult *api.CreateImageResult `protobuf:"bytes,21,opt,name=create_image_result,json=createImageResult,proto3,oneof"`
}

type AnalysisServiceEvent_TestImageResult struct {
	TestImageResult *api.TestImageResult `protobuf:"bytes,23,opt,name=test_image_result,json=testImageResult,proto3,oneof"`
}

type AnalysisServiceEvent_CreateResponse struct {
	CreateResponse *api.CreateResponse `protobuf:"bytes,25,opt,name=create_response,json=createResponse,proto3,oneof"`
}

type AnalysisServiceEvent_UpdateResponse struct {
	UpdateResponse *api.UpdateResponse `protobuf:"bytes,27,opt,name=update_response,json=updateResponse,proto3,oneof"`
}

type AnalysisServiceEvent_SysrootCreateResponse struct {
	SysrootCreateResponse *api.SysrootCreateResponse `protobuf:"bytes,29,opt,name=sysroot_create_response,json=sysrootCreateResponse,proto3,oneof"`
}

type AnalysisServiceEvent_InstallToolchainResponse struct {
	InstallToolchainResponse *api.InstallToolchainResponse `protobuf:"bytes,31,opt,name=install_toolchain_response,json=installToolchainResponse,proto3,oneof"`
}

type AnalysisServiceEvent_BuildTargetUnitTestResponse struct {
	BuildTargetUnitTestResponse *api.BuildTargetUnitTestResponse `protobuf:"bytes,33,opt,name=build_target_unit_test_response,json=buildTargetUnitTestResponse,proto3,oneof"`
}

type AnalysisServiceEvent_ChromiteUnitTestResponse struct {
	ChromiteUnitTestResponse *api.ChromiteUnitTestResponse `protobuf:"bytes,35,opt,name=chromite_unit_test_response,json=chromiteUnitTestResponse,proto3,oneof"`
}

type AnalysisServiceEvent_DebugInfoTestResponse struct {
	DebugInfoTestResponse *api.DebugInfoTestResponse `protobuf:"bytes,37,opt,name=debug_info_test_response,json=debugInfoTestResponse,proto3,oneof"`
}

type AnalysisServiceEvent_VmTestResponse struct {
	VmTestResponse *api.VmTestResponse `protobuf:"bytes,39,opt,name=vm_test_response,json=vmTestResponse,proto3,oneof"`
}

type AnalysisServiceEvent_MoblabVmTestResponse struct {
	MoblabVmTestResponse *api.MoblabVmTestResponse `protobuf:"bytes,41,opt,name=moblab_vm_test_response,json=moblabVmTestResponse,proto3,oneof"`
}

type AnalysisServiceEvent_UprevPackagesResponse struct {
	UprevPackagesResponse *api.UprevPackagesResponse `protobuf:"bytes,45,opt,name=uprev_packages_response,json=uprevPackagesResponse,proto3,oneof"`
}

type AnalysisServiceEvent_GetBestVisibleResponse struct {
	GetBestVisibleResponse *api.GetBestVisibleResponse `protobuf:"bytes,47,opt,name=get_best_visible_response,json=getBestVisibleResponse,proto3,oneof"`
}

type AnalysisServiceEvent_GetChromeVersionResponse struct {
	GetChromeVersionResponse *api.GetChromeVersionResponse `protobuf:"bytes,49,opt,name=get_chrome_version_response,json=getChromeVersionResponse,proto3,oneof"`
}

func (*AnalysisServiceEvent_InstallPackagesResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_BundleResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_BinhostGetResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_AclArgsResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_PrepareBinhostUploadsResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_SetBinhostResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_RegenBuildCacheResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_GetBuildDependencyGraphResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_CreateImageResult) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_TestImageResult) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_CreateResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_UpdateResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_SysrootCreateResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_InstallToolchainResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_BuildTargetUnitTestResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_ChromiteUnitTestResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_DebugInfoTestResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_VmTestResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_MoblabVmTestResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_UprevPackagesResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_GetBestVisibleResponse) isAnalysisServiceEvent_Response() {}

func (*AnalysisServiceEvent_GetChromeVersionResponse) isAnalysisServiceEvent_Response() {}

func (m *AnalysisServiceEvent) GetResponse() isAnalysisServiceEvent_Response {
	if m != nil {
		return m.Response
	}
	return nil
}

func (m *AnalysisServiceEvent) GetInstallPackagesResponse() *api.InstallPackagesResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_InstallPackagesResponse); ok {
		return x.InstallPackagesResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBundleResponse() *api.BundleResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_BundleResponse); ok {
		return x.BundleResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBinhostGetResponse() *api.BinhostGetResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_BinhostGetResponse); ok {
		return x.BinhostGetResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetAclArgsResponse() *api.AclArgsResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_AclArgsResponse); ok {
		return x.AclArgsResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetPrepareBinhostUploadsResponse() *api.PrepareBinhostUploadsResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_PrepareBinhostUploadsResponse); ok {
		return x.PrepareBinhostUploadsResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetSetBinhostResponse() *api.SetBinhostResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_SetBinhostResponse); ok {
		return x.SetBinhostResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetRegenBuildCacheResponse() *api.RegenBuildCacheResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_RegenBuildCacheResponse); ok {
		return x.RegenBuildCacheResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetGetBuildDependencyGraphResponse() *api.GetBuildDependencyGraphResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_GetBuildDependencyGraphResponse); ok {
		return x.GetBuildDependencyGraphResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetCreateImageResult() *api.CreateImageResult {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_CreateImageResult); ok {
		return x.CreateImageResult
	}
	return nil
}

func (m *AnalysisServiceEvent) GetTestImageResult() *api.TestImageResult {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_TestImageResult); ok {
		return x.TestImageResult
	}
	return nil
}

func (m *AnalysisServiceEvent) GetCreateResponse() *api.CreateResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_CreateResponse); ok {
		return x.CreateResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetUpdateResponse() *api.UpdateResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_UpdateResponse); ok {
		return x.UpdateResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetSysrootCreateResponse() *api.SysrootCreateResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_SysrootCreateResponse); ok {
		return x.SysrootCreateResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetInstallToolchainResponse() *api.InstallToolchainResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_InstallToolchainResponse); ok {
		return x.InstallToolchainResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetBuildTargetUnitTestResponse() *api.BuildTargetUnitTestResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_BuildTargetUnitTestResponse); ok {
		return x.BuildTargetUnitTestResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetChromiteUnitTestResponse() *api.ChromiteUnitTestResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_ChromiteUnitTestResponse); ok {
		return x.ChromiteUnitTestResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetDebugInfoTestResponse() *api.DebugInfoTestResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_DebugInfoTestResponse); ok {
		return x.DebugInfoTestResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetVmTestResponse() *api.VmTestResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_VmTestResponse); ok {
		return x.VmTestResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetMoblabVmTestResponse() *api.MoblabVmTestResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_MoblabVmTestResponse); ok {
		return x.MoblabVmTestResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetUprevPackagesResponse() *api.UprevPackagesResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_UprevPackagesResponse); ok {
		return x.UprevPackagesResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetGetBestVisibleResponse() *api.GetBestVisibleResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_GetBestVisibleResponse); ok {
		return x.GetBestVisibleResponse
	}
	return nil
}

func (m *AnalysisServiceEvent) GetGetChromeVersionResponse() *api.GetChromeVersionResponse {
	if x, ok := m.GetResponse().(*AnalysisServiceEvent_GetChromeVersionResponse); ok {
		return x.GetChromeVersionResponse
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AnalysisServiceEvent) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AnalysisServiceEvent_InstallPackagesRequest)(nil),
		(*AnalysisServiceEvent_BundleRequest)(nil),
		(*AnalysisServiceEvent_BundleVmFilesRequest)(nil),
		(*AnalysisServiceEvent_BinhostGetRequest)(nil),
		(*AnalysisServiceEvent_AclArgsRequest)(nil),
		(*AnalysisServiceEvent_PrepareBinhostUploadsRequest)(nil),
		(*AnalysisServiceEvent_SetBinhostRequest)(nil),
		(*AnalysisServiceEvent_RegenBuildCacheRequest)(nil),
		(*AnalysisServiceEvent_GetBuildDependencyGraphRequest)(nil),
		(*AnalysisServiceEvent_CreateImageRequest)(nil),
		(*AnalysisServiceEvent_TestImageRequest)(nil),
		(*AnalysisServiceEvent_CreateRequest)(nil),
		(*AnalysisServiceEvent_UpdateRequest)(nil),
		(*AnalysisServiceEvent_SysrootCreateRequest)(nil),
		(*AnalysisServiceEvent_InstallToolchainRequest)(nil),
		(*AnalysisServiceEvent_BuildTargetUnitTestRequest)(nil),
		(*AnalysisServiceEvent_ChromiteUnitTestRequest)(nil),
		(*AnalysisServiceEvent_DebugInfoTestRequest)(nil),
		(*AnalysisServiceEvent_VmTestRequest)(nil),
		(*AnalysisServiceEvent_MoblabVmTestRequest)(nil),
		(*AnalysisServiceEvent_UprevPackagesRequest)(nil),
		(*AnalysisServiceEvent_GetBestVisibleRequest)(nil),
		(*AnalysisServiceEvent_GetChromeVersionRequest)(nil),
		(*AnalysisServiceEvent_InstallPackagesResponse)(nil),
		(*AnalysisServiceEvent_BundleResponse)(nil),
		(*AnalysisServiceEvent_BinhostGetResponse)(nil),
		(*AnalysisServiceEvent_AclArgsResponse)(nil),
		(*AnalysisServiceEvent_PrepareBinhostUploadsResponse)(nil),
		(*AnalysisServiceEvent_SetBinhostResponse)(nil),
		(*AnalysisServiceEvent_RegenBuildCacheResponse)(nil),
		(*AnalysisServiceEvent_GetBuildDependencyGraphResponse)(nil),
		(*AnalysisServiceEvent_CreateImageResult)(nil),
		(*AnalysisServiceEvent_TestImageResult)(nil),
		(*AnalysisServiceEvent_CreateResponse)(nil),
		(*AnalysisServiceEvent_UpdateResponse)(nil),
		(*AnalysisServiceEvent_SysrootCreateResponse)(nil),
		(*AnalysisServiceEvent_InstallToolchainResponse)(nil),
		(*AnalysisServiceEvent_BuildTargetUnitTestResponse)(nil),
		(*AnalysisServiceEvent_ChromiteUnitTestResponse)(nil),
		(*AnalysisServiceEvent_DebugInfoTestResponse)(nil),
		(*AnalysisServiceEvent_VmTestResponse)(nil),
		(*AnalysisServiceEvent_MoblabVmTestResponse)(nil),
		(*AnalysisServiceEvent_UprevPackagesResponse)(nil),
		(*AnalysisServiceEvent_GetBestVisibleResponse)(nil),
		(*AnalysisServiceEvent_GetChromeVersionResponse)(nil),
	}
}

func init() {
	proto.RegisterType((*StepExecutionResult)(nil), "analysis_service.StepExecutionResult")
	proto.RegisterType((*AnalysisServiceEvent)(nil), "analysis_service.AnalysisServiceEvent")
}

func init() {
	proto.RegisterFile("analysis_service/analysis_service.proto", fileDescriptor_92c22ab0fbdfe575)
}

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