// Copyright 2021 The LUCI Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.33.0
// 	protoc        v5.26.1
// source: go.chromium.org/luci/buildbucket/proto/task.proto

package buildbucketpb

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	structpb "google.golang.org/protobuf/types/known/structpb"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// A backend task.
// Next id: 9.
type Task struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Id *TaskID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// (optional) Human-clickable link to the status page for this task.
	// This should be populated as part of the Task response in RunTaskResponse.
	// Any update to this via the Task field in BuildTaskUpdate will override the
	// existing link that was provided in RunTaskResponse.
	Link string `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"`
	// The backend's status for handling this task.
	Status Status `protobuf:"varint,3,opt,name=status,proto3,enum=buildbucket.v2.Status" json:"status,omitempty"`
	// The 'status_details' around handling this task.
	StatusDetails *StatusDetails `protobuf:"bytes,4,opt,name=status_details,json=statusDetails,proto3" json:"status_details,omitempty"`
	// Deprecated. Use summary_markdown instead.
	SummaryHtml string `protobuf:"bytes,5,opt,name=summary_html,json=summaryHtml,proto3" json:"summary_html,omitempty"`
	// Additional backend-specific details about the task.
	//
	// This could be used to indicate things like named-cache status, task
	// startup/end time, etc.
	//
	// This is limited to 10KB (binary PB + gzip(5))
	//
	// This should be populated as part of the Task response in RunTaskResponse.
	// Any update to this via the Task field in BuildTaskUpdate will override the
	// existing details that were provided in RunTaskResponse.
	Details *structpb.Struct `protobuf:"bytes,6,opt,name=details,proto3" json:"details,omitempty"`
	// A monotonically increasing integer set by the backend to track
	// which task is the most up to date when calling UpdateBuildTask.
	// When the build is first created, this will be set to 0.
	// When RunTask is called and returns a task, this should not be 0 or nil.
	// Each UpdateBuildTask call will check this to ensure the latest task is
	// being stored in datastore.
	UpdateId int64 `protobuf:"varint,7,opt,name=update_id,json=updateId,proto3" json:"update_id,omitempty"`
	// Human-readable commentary around the handling of this task.
	SummaryMarkdown string `protobuf:"bytes,8,opt,name=summary_markdown,json=summaryMarkdown,proto3" json:"summary_markdown,omitempty"`
}

func (x *Task) Reset() {
	*x = Task{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Task) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Task) ProtoMessage() {}

func (x *Task) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Task.ProtoReflect.Descriptor instead.
func (*Task) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescGZIP(), []int{0}
}

func (x *Task) GetId() *TaskID {
	if x != nil {
		return x.Id
	}
	return nil
}

func (x *Task) GetLink() string {
	if x != nil {
		return x.Link
	}
	return ""
}

func (x *Task) GetStatus() Status {
	if x != nil {
		return x.Status
	}
	return Status_STATUS_UNSPECIFIED
}

func (x *Task) GetStatusDetails() *StatusDetails {
	if x != nil {
		return x.StatusDetails
	}
	return nil
}

func (x *Task) GetSummaryHtml() string {
	if x != nil {
		return x.SummaryHtml
	}
	return ""
}

func (x *Task) GetDetails() *structpb.Struct {
	if x != nil {
		return x.Details
	}
	return nil
}

func (x *Task) GetUpdateId() int64 {
	if x != nil {
		return x.UpdateId
	}
	return 0
}

func (x *Task) GetSummaryMarkdown() string {
	if x != nil {
		return x.SummaryMarkdown
	}
	return ""
}

// A unique identifier for tasks.
type TaskID struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Target backend. e.g. "swarming://chromium-swarm".
	Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
	// An ID unique to the target used to identify this task. e.g. Swarming task
	// ID.
	Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
}

func (x *TaskID) Reset() {
	*x = TaskID{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TaskID) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TaskID) ProtoMessage() {}

func (x *TaskID) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TaskID.ProtoReflect.Descriptor instead.
func (*TaskID) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescGZIP(), []int{1}
}

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

func (x *TaskID) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

// A message sent by task backends as part of the payload to a
// pubsub topic corresponding with that backend. Buildbucket handles these
// pubsub messages with the UpdateBuildTask cloud task.
// Backends must use this proto when sending pubsub updates to buildbucket.
//
// NOTE: If the task has not been registered with buildbucket yet (by means of
// RunTask returning or StartBuild doing an initial associaton of the task to
// the build), then the message will be dropped and lost forever.
// Use with caution.
type BuildTaskUpdate struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A build ID.
	BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// Task
	Task *Task `protobuf:"bytes,2,opt,name=task,proto3" json:"task,omitempty"`
}

func (x *BuildTaskUpdate) Reset() {
	*x = BuildTaskUpdate{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildTaskUpdate) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildTaskUpdate) ProtoMessage() {}

func (x *BuildTaskUpdate) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildTaskUpdate.ProtoReflect.Descriptor instead.
func (*BuildTaskUpdate) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescGZIP(), []int{2}
}

func (x *BuildTaskUpdate) GetBuildId() string {
	if x != nil {
		return x.BuildId
	}
	return ""
}

func (x *BuildTaskUpdate) GetTask() *Task {
	if x != nil {
		return x.Task
	}
	return nil
}

var File_go_chromium_org_luci_buildbucket_proto_task_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDesc = []byte{
	0x0a, 0x31, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
	0x2e, 0x76, 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x1a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63,
	0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x39, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66,
	0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x22, 0xd6, 0x02, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x26, 0x0a, 0x02, 0x69, 0x64,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x52, 0x02,
	0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d,
	0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32, 0x2e,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0d, 0x73,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c,
	0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x68, 0x74, 0x6d, 0x6c, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0b, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x74, 0x6d, 0x6c, 0x12,
	0x31, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
	0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69,
	0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18,
	0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12,
	0x29, 0x0a, 0x10, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x64,
	0x6f, 0x77, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x75, 0x6d, 0x6d, 0x61,
	0x72, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x38, 0x0a, 0x06, 0x54, 0x61,
	0x73, 0x6b, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0x8a, 0xc3, 0x1a, 0x02, 0x08, 0x02, 0x52, 0x06, 0x74, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x73,
	0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x49, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x14, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76,
	0x32, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x42, 0x36, 0x5a, 0x34,
	0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
	0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescData = file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDesc
)

func file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescData)
	})
	return file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDescData
}

var file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_go_chromium_org_luci_buildbucket_proto_task_proto_goTypes = []interface{}{
	(*Task)(nil),            // 0: buildbucket.v2.Task
	(*TaskID)(nil),          // 1: buildbucket.v2.TaskID
	(*BuildTaskUpdate)(nil), // 2: buildbucket.v2.BuildTaskUpdate
	(Status)(0),             // 3: buildbucket.v2.Status
	(*StatusDetails)(nil),   // 4: buildbucket.v2.StatusDetails
	(*structpb.Struct)(nil), // 5: google.protobuf.Struct
}
var file_go_chromium_org_luci_buildbucket_proto_task_proto_depIdxs = []int32{
	1, // 0: buildbucket.v2.Task.id:type_name -> buildbucket.v2.TaskID
	3, // 1: buildbucket.v2.Task.status:type_name -> buildbucket.v2.Status
	4, // 2: buildbucket.v2.Task.status_details:type_name -> buildbucket.v2.StatusDetails
	5, // 3: buildbucket.v2.Task.details:type_name -> google.protobuf.Struct
	0, // 4: buildbucket.v2.BuildTaskUpdate.task:type_name -> buildbucket.v2.Task
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_buildbucket_proto_task_proto_init() }
func file_go_chromium_org_luci_buildbucket_proto_task_proto_init() {
	if File_go_chromium_org_luci_buildbucket_proto_task_proto != nil {
		return
	}
	file_go_chromium_org_luci_buildbucket_proto_common_proto_init()
	file_go_chromium_org_luci_buildbucket_proto_field_option_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Task); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TaskID); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildTaskUpdate); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_buildbucket_proto_task_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_buildbucket_proto_task_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_buildbucket_proto_task_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_buildbucket_proto_task_proto = out.File
	file_go_chromium_org_luci_buildbucket_proto_task_proto_rawDesc = nil
	file_go_chromium_org_luci_buildbucket_proto_task_proto_goTypes = nil
	file_go_chromium_org_luci_buildbucket_proto_task_proto_depIdxs = nil
}
