diff --git a/go/chromite/api/toolchain.pb.go b/go/chromite/api/toolchain.pb.go
index 1df86fa..91de6b9 100644
--- a/go/chromite/api/toolchain.pb.go
+++ b/go/chromite/api/toolchain.pb.go
@@ -373,6 +373,359 @@
 	return nil
 }
 
+type GetUpdatedFilesRequest struct {
+	UploadedArtifacts    []*GetUpdatedFilesRequest_UploadedArtifacts `protobuf:"bytes,1,rep,name=uploaded_artifacts,json=uploadedArtifacts,proto3" json:"uploaded_artifacts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
+	XXX_unrecognized     []byte                                      `json:"-"`
+	XXX_sizecache        int32                                       `json:"-"`
+}
+
+func (m *GetUpdatedFilesRequest) Reset()         { *m = GetUpdatedFilesRequest{} }
+func (m *GetUpdatedFilesRequest) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesRequest) ProtoMessage()    {}
+func (*GetUpdatedFilesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{5}
+}
+
+func (m *GetUpdatedFilesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesRequest.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesRequest.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesRequest.Merge(m, src)
+}
+func (m *GetUpdatedFilesRequest) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesRequest.Size(m)
+}
+func (m *GetUpdatedFilesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesRequest proto.InternalMessageInfo
+
+func (m *GetUpdatedFilesRequest) GetUploadedArtifacts() []*GetUpdatedFilesRequest_UploadedArtifacts {
+	if m != nil {
+		return m.UploadedArtifacts
+	}
+	return nil
+}
+
+// We need the artifact info from BundleResponse and the profile info
+// as the input of the request.
+type GetUpdatedFilesRequest_UploadedArtifacts struct {
+	ArtifactInfo         *ArtifactInfo                   `protobuf:"bytes,1,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
+	ProfileInfo          *chromiumos.ArtifactProfileInfo `protobuf:"bytes,2,opt,name=profile_info,json=profileInfo,proto3" json:"profile_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) Reset() {
+	*m = GetUpdatedFilesRequest_UploadedArtifacts{}
+}
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesRequest_UploadedArtifacts) ProtoMessage()    {}
+func (*GetUpdatedFilesRequest_UploadedArtifacts) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{5, 0}
+}
+
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts.Merge(m, src)
+}
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts.Size(m)
+}
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts proto.InternalMessageInfo
+
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) GetArtifactInfo() *ArtifactInfo {
+	if m != nil {
+		return m.ArtifactInfo
+	}
+	return nil
+}
+
+func (m *GetUpdatedFilesRequest_UploadedArtifacts) GetProfileInfo() *chromiumos.ArtifactProfileInfo {
+	if m != nil {
+		return m.ProfileInfo
+	}
+	return nil
+}
+
+type GetUpdatedFilesResponse struct {
+	UpdatedFiles []*GetUpdatedFilesResponse_UpdatedFile `protobuf:"bytes,1,rep,name=updated_files,json=updatedFiles,proto3" json:"updated_files,omitempty"`
+	// The commit message to use.
+	CommitMessage string `protobuf:"bytes,2,opt,name=commit_message,json=commitMessage,proto3" json:"commit_message,omitempty"`
+	// Any footers to use.  Formatted to the current standard by Recipes.
+	CommitFooter         []*GetUpdatedFilesResponse_CommitFooter `protobuf:"bytes,3,rep,name=commit_footer,json=commitFooter,proto3" json:"commit_footer,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *GetUpdatedFilesResponse) Reset()         { *m = GetUpdatedFilesResponse{} }
+func (m *GetUpdatedFilesResponse) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesResponse) ProtoMessage()    {}
+func (*GetUpdatedFilesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{6}
+}
+
+func (m *GetUpdatedFilesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesResponse.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesResponse.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesResponse.Merge(m, src)
+}
+func (m *GetUpdatedFilesResponse) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesResponse.Size(m)
+}
+func (m *GetUpdatedFilesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesResponse proto.InternalMessageInfo
+
+func (m *GetUpdatedFilesResponse) GetUpdatedFiles() []*GetUpdatedFilesResponse_UpdatedFile {
+	if m != nil {
+		return m.UpdatedFiles
+	}
+	return nil
+}
+
+func (m *GetUpdatedFilesResponse) GetCommitMessage() string {
+	if m != nil {
+		return m.CommitMessage
+	}
+	return ""
+}
+
+func (m *GetUpdatedFilesResponse) GetCommitFooter() []*GetUpdatedFilesResponse_CommitFooter {
+	if m != nil {
+		return m.CommitFooter
+	}
+	return nil
+}
+
+type GetUpdatedFilesResponse_UpdatedFile struct {
+	// The path to the (uncommitted) file.
+	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetUpdatedFilesResponse_UpdatedFile) Reset()         { *m = GetUpdatedFilesResponse_UpdatedFile{} }
+func (m *GetUpdatedFilesResponse_UpdatedFile) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesResponse_UpdatedFile) ProtoMessage()    {}
+func (*GetUpdatedFilesResponse_UpdatedFile) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{6, 0}
+}
+
+func (m *GetUpdatedFilesResponse_UpdatedFile) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesResponse_UpdatedFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesResponse_UpdatedFile) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile.Merge(m, src)
+}
+func (m *GetUpdatedFilesResponse_UpdatedFile) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile.Size(m)
+}
+func (m *GetUpdatedFilesResponse_UpdatedFile) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile proto.InternalMessageInfo
+
+func (m *GetUpdatedFilesResponse_UpdatedFile) GetPath() string {
+	if m != nil {
+		return m.Path
+	}
+	return ""
+}
+
+// The Cq-Depend footer is used by LUCI (and Chrome OS Recipes) to operate
+// on interdependent changes at various steps.
+type GetUpdatedFilesResponse_CqDependFooter struct {
+	// The gerrit change(s) we depend on.
+	GerritChange         []*chromiumos.GerritChange `protobuf:"bytes,1,rep,name=gerrit_change,json=gerritChange,proto3" json:"gerrit_change,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *GetUpdatedFilesResponse_CqDependFooter) Reset() {
+	*m = GetUpdatedFilesResponse_CqDependFooter{}
+}
+func (m *GetUpdatedFilesResponse_CqDependFooter) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesResponse_CqDependFooter) ProtoMessage()    {}
+func (*GetUpdatedFilesResponse_CqDependFooter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{6, 1}
+}
+
+func (m *GetUpdatedFilesResponse_CqDependFooter) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesResponse_CqDependFooter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesResponse_CqDependFooter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter.Merge(m, src)
+}
+func (m *GetUpdatedFilesResponse_CqDependFooter) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter.Size(m)
+}
+func (m *GetUpdatedFilesResponse_CqDependFooter) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter proto.InternalMessageInfo
+
+func (m *GetUpdatedFilesResponse_CqDependFooter) GetGerritChange() []*chromiumos.GerritChange {
+	if m != nil {
+		return m.GerritChange
+	}
+	return nil
+}
+
+// The Cq-Cl-Tag footer is used by cq-orchestrator to choose quota pools.
+type GetUpdatedFilesResponse_CqClTagFooter struct {
+	// The Cq-Cl-Tag value.
+	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetUpdatedFilesResponse_CqClTagFooter) Reset()         { *m = GetUpdatedFilesResponse_CqClTagFooter{} }
+func (m *GetUpdatedFilesResponse_CqClTagFooter) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesResponse_CqClTagFooter) ProtoMessage()    {}
+func (*GetUpdatedFilesResponse_CqClTagFooter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{6, 2}
+}
+
+func (m *GetUpdatedFilesResponse_CqClTagFooter) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesResponse_CqClTagFooter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesResponse_CqClTagFooter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter.Merge(m, src)
+}
+func (m *GetUpdatedFilesResponse_CqClTagFooter) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter.Size(m)
+}
+func (m *GetUpdatedFilesResponse_CqClTagFooter) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter proto.InternalMessageInfo
+
+func (m *GetUpdatedFilesResponse_CqClTagFooter) GetTag() string {
+	if m != nil {
+		return m.Tag
+	}
+	return ""
+}
+
+type GetUpdatedFilesResponse_CommitFooter struct {
+	// Types that are valid to be assigned to Footer:
+	//	*GetUpdatedFilesResponse_CommitFooter_CqDepend
+	//	*GetUpdatedFilesResponse_CommitFooter_CqClTag
+	Footer               isGetUpdatedFilesResponse_CommitFooter_Footer `protobuf_oneof:"footer"`
+	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
+	XXX_unrecognized     []byte                                        `json:"-"`
+	XXX_sizecache        int32                                         `json:"-"`
+}
+
+func (m *GetUpdatedFilesResponse_CommitFooter) Reset()         { *m = GetUpdatedFilesResponse_CommitFooter{} }
+func (m *GetUpdatedFilesResponse_CommitFooter) String() string { return proto.CompactTextString(m) }
+func (*GetUpdatedFilesResponse_CommitFooter) ProtoMessage()    {}
+func (*GetUpdatedFilesResponse_CommitFooter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7ff43bdb7436d394, []int{6, 3}
+}
+
+func (m *GetUpdatedFilesResponse_CommitFooter) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter.Unmarshal(m, b)
+}
+func (m *GetUpdatedFilesResponse_CommitFooter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter.Marshal(b, m, deterministic)
+}
+func (m *GetUpdatedFilesResponse_CommitFooter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter.Merge(m, src)
+}
+func (m *GetUpdatedFilesResponse_CommitFooter) XXX_Size() int {
+	return xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter.Size(m)
+}
+func (m *GetUpdatedFilesResponse_CommitFooter) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter proto.InternalMessageInfo
+
+type isGetUpdatedFilesResponse_CommitFooter_Footer interface {
+	isGetUpdatedFilesResponse_CommitFooter_Footer()
+}
+
+type GetUpdatedFilesResponse_CommitFooter_CqDepend struct {
+	CqDepend *GetUpdatedFilesResponse_CqDependFooter `protobuf:"bytes,1,opt,name=cq_depend,json=cqDepend,proto3,oneof"`
+}
+
+type GetUpdatedFilesResponse_CommitFooter_CqClTag struct {
+	CqClTag *GetUpdatedFilesResponse_CqClTagFooter `protobuf:"bytes,2,opt,name=cq_cl_tag,json=cqClTag,proto3,oneof"`
+}
+
+func (*GetUpdatedFilesResponse_CommitFooter_CqDepend) isGetUpdatedFilesResponse_CommitFooter_Footer() {
+}
+
+func (*GetUpdatedFilesResponse_CommitFooter_CqClTag) isGetUpdatedFilesResponse_CommitFooter_Footer() {}
+
+func (m *GetUpdatedFilesResponse_CommitFooter) GetFooter() isGetUpdatedFilesResponse_CommitFooter_Footer {
+	if m != nil {
+		return m.Footer
+	}
+	return nil
+}
+
+func (m *GetUpdatedFilesResponse_CommitFooter) GetCqDepend() *GetUpdatedFilesResponse_CqDependFooter {
+	if x, ok := m.GetFooter().(*GetUpdatedFilesResponse_CommitFooter_CqDepend); ok {
+		return x.CqDepend
+	}
+	return nil
+}
+
+func (m *GetUpdatedFilesResponse_CommitFooter) GetCqClTag() *GetUpdatedFilesResponse_CqClTagFooter {
+	if x, ok := m.GetFooter().(*GetUpdatedFilesResponse_CommitFooter_CqClTag); ok {
+		return x.CqClTag
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*GetUpdatedFilesResponse_CommitFooter) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*GetUpdatedFilesResponse_CommitFooter_CqDepend)(nil),
+		(*GetUpdatedFilesResponse_CommitFooter_CqClTag)(nil),
+	}
+}
+
 type VerifyAFDOArtifactsRequest struct {
 	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
 	// The type of AFDO artifact to test.
@@ -386,7 +739,7 @@
 func (m *VerifyAFDOArtifactsRequest) String() string { return proto.CompactTextString(m) }
 func (*VerifyAFDOArtifactsRequest) ProtoMessage()    {}
 func (*VerifyAFDOArtifactsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ff43bdb7436d394, []int{5}
+	return fileDescriptor_7ff43bdb7436d394, []int{7}
 }
 
 func (m *VerifyAFDOArtifactsRequest) XXX_Unmarshal(b []byte) error {
@@ -433,7 +786,7 @@
 func (m *VerifyAFDOArtifactsResponse) String() string { return proto.CompactTextString(m) }
 func (*VerifyAFDOArtifactsResponse) ProtoMessage()    {}
 func (*VerifyAFDOArtifactsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ff43bdb7436d394, []int{6}
+	return fileDescriptor_7ff43bdb7436d394, []int{8}
 }
 
 func (m *VerifyAFDOArtifactsResponse) XXX_Unmarshal(b []byte) error {
@@ -468,6 +821,13 @@
 	proto.RegisterType((*PrepareForToolchainBuildResponse)(nil), "chromite.api.PrepareForToolchainBuildResponse")
 	proto.RegisterType((*BundleToolchainRequest)(nil), "chromite.api.BundleToolchainRequest")
 	proto.RegisterType((*BundleToolchainResponse)(nil), "chromite.api.BundleToolchainResponse")
+	proto.RegisterType((*GetUpdatedFilesRequest)(nil), "chromite.api.GetUpdatedFilesRequest")
+	proto.RegisterType((*GetUpdatedFilesRequest_UploadedArtifacts)(nil), "chromite.api.GetUpdatedFilesRequest.UploadedArtifacts")
+	proto.RegisterType((*GetUpdatedFilesResponse)(nil), "chromite.api.GetUpdatedFilesResponse")
+	proto.RegisterType((*GetUpdatedFilesResponse_UpdatedFile)(nil), "chromite.api.GetUpdatedFilesResponse.UpdatedFile")
+	proto.RegisterType((*GetUpdatedFilesResponse_CqDependFooter)(nil), "chromite.api.GetUpdatedFilesResponse.CqDependFooter")
+	proto.RegisterType((*GetUpdatedFilesResponse_CqClTagFooter)(nil), "chromite.api.GetUpdatedFilesResponse.CqClTagFooter")
+	proto.RegisterType((*GetUpdatedFilesResponse_CommitFooter)(nil), "chromite.api.GetUpdatedFilesResponse.CommitFooter")
 	proto.RegisterType((*VerifyAFDOArtifactsRequest)(nil), "chromite.api.VerifyAFDOArtifactsRequest")
 	proto.RegisterType((*VerifyAFDOArtifactsResponse)(nil), "chromite.api.VerifyAFDOArtifactsResponse")
 }
@@ -475,59 +835,77 @@
 func init() { proto.RegisterFile("chromite/api/toolchain.proto", fileDescriptor_7ff43bdb7436d394) }
 
 var fileDescriptor_7ff43bdb7436d394 = []byte{
-	// 817 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xdd, 0x6e, 0x1b, 0x45,
-	0x14, 0x66, 0xd7, 0xc1, 0xd4, 0x63, 0xc7, 0x5e, 0x46, 0x22, 0x31, 0x4b, 0xab, 0x58, 0x16, 0x48,
-	0x69, 0x25, 0xd6, 0x22, 0xb4, 0x08, 0x71, 0xb7, 0x4e, 0x36, 0x6a, 0x68, 0x6b, 0x47, 0x53, 0x37,
-	0xfc, 0x48, 0x74, 0x35, 0xf6, 0xce, 0x3a, 0x23, 0xd9, 0x3b, 0xcb, 0xcc, 0xb8, 0xc2, 0x12, 0x37,
-	0xdc, 0xf0, 0x12, 0xf0, 0x34, 0x7d, 0x02, 0x5e, 0xa4, 0xe2, 0x15, 0xd0, 0xce, 0xec, 0xaf, 0xe3,
-	0x08, 0x83, 0x10, 0xea, 0x9d, 0xcf, 0x9c, 0xbf, 0x6f, 0xbe, 0xef, 0xec, 0xf1, 0x80, 0xbb, 0xb3,
-	0x6b, 0xce, 0x96, 0x54, 0x92, 0x01, 0x8e, 0xe9, 0x40, 0x32, 0xb6, 0x98, 0x5d, 0x63, 0x1a, 0x39,
-	0x31, 0x67, 0x92, 0xc1, 0x56, 0xe6, 0x75, 0x70, 0x4c, 0xed, 0x6a, 0x2c, 0xe6, 0x92, 0x86, 0x78,
-	0x26, 0x85, 0x8e, 0xdd, 0xf0, 0x4e, 0x57, 0x74, 0x11, 0xf8, 0x38, 0xa6, 0xa9, 0xd7, 0xae, 0x78,
-	0xc5, 0x5a, 0x70, 0xc6, 0x64, 0xea, 0x3b, 0xd2, 0xbe, 0xd5, 0x92, 0x09, 0x9d, 0x47, 0xb8, 0x3f,
-	0x63, 0x51, 0x48, 0xe7, 0x69, 0xc0, 0x61, 0x29, 0x60, 0xc6, 0x96, 0x4b, 0x96, 0xe2, 0xeb, 0xff,
-	0x6e, 0x80, 0x96, 0x9b, 0xe2, 0xb8, 0x88, 0x42, 0x06, 0xaf, 0xc0, 0x7e, 0x86, 0xcb, 0x97, 0xeb,
-	0x98, 0x74, 0x8d, 0x9e, 0x71, 0xdc, 0x3e, 0xf9, 0xcc, 0x29, 0x2a, 0x38, 0x43, 0xdd, 0xe2, 0x54,
-	0x77, 0x70, 0xf3, 0x6b, 0x64, 0xbf, 0x26, 0xeb, 0x98, 0x08, 0xd4, 0xc2, 0x25, 0x13, 0x3e, 0x04,
-	0x8d, 0xfc, 0xbe, 0x5d, 0xb3, 0x57, 0x3b, 0x6e, 0x9e, 0x1c, 0x38, 0x65, 0x72, 0xf2, 0x6c, 0x54,
-	0x04, 0xf6, 0xff, 0xa8, 0x81, 0xa3, 0x4b, 0x4e, 0x62, 0xcc, 0xc9, 0x39, 0xe3, 0x93, 0x8c, 0x5c,
-	0x05, 0x00, 0x91, 0x1f, 0x57, 0x44, 0x48, 0xf8, 0x2d, 0x68, 0x57, 0x10, 0x8b, 0xae, 0xd1, 0xab,
-	0xfd, 0x3b, 0xc8, 0xfb, 0x65, 0xc8, 0x02, 0x3e, 0x00, 0xf5, 0xa4, 0x04, 0x93, 0x5d, 0xb3, 0x67,
-	0x1c, 0x37, 0x4f, 0x60, 0xb9, 0xe2, 0xa9, 0xf2, 0xa0, 0x34, 0x02, 0x0e, 0xc0, 0x7b, 0xa9, 0x26,
-	0xdd, 0x9a, 0x0a, 0xfe, 0xa0, 0x7a, 0xbb, 0xe7, 0xda, 0x89, 0xb2, 0x28, 0xf8, 0x12, 0x74, 0x68,
-	0x14, 0xaf, 0xa4, 0x5f, 0xd0, 0xb2, 0xa7, 0x68, 0x79, 0xb4, 0x0b, 0xee, 0x8b, 0x24, 0xb5, 0x2c,
-	0x1c, 0x6a, 0xd3, 0xf2, 0x91, 0x80, 0x08, 0x74, 0x70, 0x10, 0x50, 0x49, 0x59, 0x84, 0x17, 0x3e,
-	0xe6, 0x73, 0xd1, 0x7d, 0x57, 0x01, 0xbb, 0x5f, 0xae, 0x5f, 0x90, 0xab, 0x3a, 0xb9, 0x79, 0x86,
-	0xcb, 0xe7, 0x02, 0xb5, 0x71, 0xc5, 0x86, 0x43, 0xd0, 0x8a, 0x39, 0x0b, 0xe9, 0x82, 0xf8, 0x34,
-	0x0a, 0x59, 0xb7, 0xae, 0x0a, 0x1e, 0x95, 0x0b, 0x66, 0x00, 0x2e, 0x75, 0x9c, 0x82, 0xd6, 0x8c,
-	0x0b, 0xa3, 0xff, 0x8b, 0x01, 0x7a, 0xb7, 0x4b, 0x2a, 0x62, 0x16, 0x09, 0x02, 0x7f, 0x00, 0x1d,
-	0x3d, 0xff, 0x9c, 0x2c, 0xc8, 0x2b, 0x1c, 0xcd, 0xb2, 0x39, 0x7c, 0x58, 0x65, 0x75, 0x03, 0x7e,
-	0x96, 0xef, 0xa4, 0x56, 0x9a, 0x8b, 0xda, 0xd3, 0x8a, 0xdd, 0xff, 0xb5, 0x06, 0x0e, 0x86, 0xab,
-	0x28, 0x58, 0x90, 0xbc, 0x7f, 0x36, 0x4d, 0x85, 0xe6, 0xc6, 0x3f, 0xd1, 0xdc, 0xdc, 0x49, 0xf3,
-	0x7b, 0x00, 0xb0, 0x95, 0x4c, 0x44, 0x0f, 0x28, 0x57, 0x73, 0xd2, 0x40, 0x0d, 0x7d, 0x72, 0x46,
-	0xf9, 0x96, 0x49, 0xde, 0xfb, 0x8f, 0x26, 0xf9, 0x6d, 0x1d, 0x86, 0x29, 0x38, 0xbc, 0xa1, 0x43,
-	0x3a, 0x02, 0x6e, 0x41, 0x86, 0xd0, 0x0d, 0xf4, 0xd6, 0xb0, 0xb7, 0x6f, 0x0d, 0x55, 0x3b, 0xbf,
-	0xb5, 0x48, 0xcc, 0xaf, 0xf7, 0xee, 0x18, 0x96, 0xd9, 0xff, 0xcd, 0x00, 0xf6, 0x15, 0xe1, 0x34,
-	0x5c, 0xbb, 0xe7, 0x67, 0xe3, 0x9c, 0xb0, 0x4c, 0xf0, 0xaf, 0x40, 0x4b, 0x8f, 0x9a, 0xc4, 0x7c,
-	0x4e, 0x32, 0xd9, 0x0f, 0x6f, 0x50, 0x3e, 0x51, 0x6e, 0xd4, 0x9c, 0x16, 0x06, 0x74, 0x37, 0x97,
-	0xa5, 0xa9, 0x86, 0xf4, 0x6e, 0x85, 0x83, 0x52, 0xd3, 0x44, 0x8c, 0xea, 0x5e, 0xec, 0x3f, 0x02,
-	0x1f, 0x6d, 0x05, 0x97, 0xb2, 0x70, 0x00, 0xea, 0x42, 0x62, 0xb9, 0x12, 0x0a, 0xd7, 0x1d, 0x94,
-	0x5a, 0x0f, 0x42, 0x60, 0x6d, 0x16, 0x86, 0xfb, 0xa0, 0x31, 0x1a, 0x8f, 0x3c, 0x7f, 0xf2, 0xdd,
-	0xa5, 0x67, 0xbd, 0x93, 0x98, 0x63, 0x74, 0xe6, 0xa1, 0xf3, 0x8b, 0xa7, 0x9e, 0x65, 0x40, 0x08,
-	0xda, 0x43, 0x6f, 0x74, 0xfa, 0xf8, 0x99, 0x8b, 0x9e, 0xf8, 0x49, 0xae, 0x65, 0xc2, 0x0e, 0x68,
-	0x3e, 0xf1, 0xd0, 0xc8, 0x7b, 0xaa, 0x0f, 0x6a, 0xc9, 0xc1, 0xe9, 0x63, 0x34, 0x7e, 0xe6, 0xe9,
-	0x83, 0xbd, 0x93, 0x3f, 0x6b, 0xc0, 0xca, 0xb5, 0x79, 0x4e, 0xf8, 0x2b, 0x3a, 0x23, 0xf0, 0x67,
-	0x70, 0xef, 0x45, 0x1c, 0x60, 0x49, 0x3c, 0x45, 0xc6, 0x37, 0x54, 0x5e, 0x57, 0xd0, 0xc3, 0xe3,
-	0xaa, 0x46, 0xb7, 0xb3, 0x6f, 0xdf, 0xdf, 0x21, 0x52, 0x53, 0xd1, 0xaf, 0xbf, 0x7e, 0x63, 0x9b,
-	0x96, 0x01, 0x7f, 0x02, 0x1f, 0xbe, 0x88, 0x17, 0x0c, 0x07, 0x57, 0x44, 0x4a, 0x12, 0xfc, 0x8f,
-	0x9d, 0x63, 0xd0, 0xd9, 0xf8, 0x44, 0xe0, 0xa7, 0xb7, 0xed, 0xa3, 0xad, 0xff, 0x55, 0xb6, 0xb3,
-	0x6b, 0x78, 0x2a, 0xff, 0x4b, 0xd0, 0xd1, 0xdf, 0x47, 0x71, 0xc3, 0x8f, 0xab, 0x25, 0xb6, 0xaf,
-	0x31, 0xfb, 0x93, 0xbf, 0x89, 0xd2, 0xf5, 0xed, 0xf7, 0x5f, 0xbf, 0xb1, 0xf7, 0x41, 0x23, 0x7f,
-	0xb5, 0x58, 0xe6, 0xf0, 0xcb, 0xef, 0xbf, 0x98, 0xb3, 0x7c, 0x80, 0x1d, 0xc6, 0xe7, 0x83, 0xd2,
-	0xe3, 0x81, 0x46, 0x21, 0xc7, 0x03, 0xf5, 0x76, 0x18, 0xcc, 0xd9, 0xa0, 0xfc, 0x26, 0x99, 0xd6,
-	0xd5, 0xf1, 0xe7, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xdc, 0x1e, 0x07, 0x12, 0x09, 0x00,
-	0x00,
+	// 1112 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xdb, 0x6e, 0x1b, 0x45,
+	0x18, 0xee, 0xda, 0xc6, 0x8d, 0x7f, 0x1f, 0x3b, 0x12, 0x89, 0x59, 0x5a, 0x35, 0xb5, 0xa8, 0x94,
+	0x56, 0xc2, 0x56, 0xd3, 0xb4, 0x42, 0x48, 0x08, 0xd9, 0x8e, 0xd3, 0x84, 0x36, 0x07, 0x26, 0x69,
+	0x0a, 0x48, 0x74, 0x35, 0xd9, 0x1d, 0x6f, 0x46, 0x72, 0x76, 0x36, 0xbb, 0xe3, 0x8a, 0x48, 0xdc,
+	0x70, 0xc3, 0x33, 0x20, 0xe0, 0x61, 0x50, 0x6f, 0xb9, 0x80, 0x17, 0xe9, 0x3b, 0xa0, 0x9d, 0x99,
+	0xb5, 0x67, 0x1d, 0x87, 0x9a, 0x0a, 0x21, 0xee, 0xf6, 0x3f, 0x7f, 0xff, 0x61, 0xfe, 0xd9, 0x81,
+	0x9b, 0xee, 0x69, 0xc4, 0xcf, 0x98, 0xa0, 0x1d, 0x12, 0xb2, 0x8e, 0xe0, 0x7c, 0xe4, 0x9e, 0x12,
+	0x16, 0xb4, 0xc3, 0x88, 0x0b, 0x8e, 0x2a, 0xa9, 0xb4, 0x4d, 0x42, 0x66, 0x67, 0x75, 0x49, 0x24,
+	0xd8, 0x90, 0xb8, 0x22, 0x56, 0xba, 0x33, 0xd2, 0x93, 0x31, 0x1b, 0x79, 0x0e, 0x09, 0x99, 0x96,
+	0xda, 0x19, 0x69, 0x7c, 0x11, 0x47, 0x9c, 0x0b, 0x2d, 0xbb, 0xad, 0x64, 0xe3, 0x33, 0x1e, 0x2b,
+	0x3b, 0x1a, 0x39, 0x2e, 0x0f, 0x86, 0xcc, 0xd7, 0x0a, 0x2b, 0x86, 0x82, 0xcb, 0xcf, 0xce, 0xb8,
+	0xc6, 0xd7, 0xfa, 0xd5, 0x82, 0x4a, 0x57, 0xe3, 0xd8, 0x09, 0x86, 0x1c, 0x1d, 0x43, 0x35, 0xc5,
+	0xe5, 0x88, 0x8b, 0x90, 0x36, 0xad, 0x55, 0x6b, 0xad, 0xb6, 0xfe, 0xa0, 0x3d, 0xf5, 0xd0, 0xee,
+	0xa9, 0x10, 0x7d, 0x15, 0xa1, 0x3b, 0x49, 0x23, 0xfd, 0x3a, 0xba, 0x08, 0x69, 0x8c, 0x2b, 0xc4,
+	0x20, 0xd1, 0x06, 0x94, 0x26, 0xf9, 0x36, 0x73, 0xab, 0xf9, 0xb5, 0xf2, 0xfa, 0x72, 0xdb, 0x2c,
+	0xce, 0xc4, 0x1a, 0x4f, 0x15, 0x5b, 0x7f, 0xe6, 0xe1, 0xf6, 0x41, 0x44, 0x43, 0x12, 0xd1, 0x2d,
+	0x1e, 0x1d, 0xa5, 0xc5, 0x95, 0x00, 0x30, 0x3d, 0x1f, 0xd3, 0x58, 0xa0, 0xaf, 0xa0, 0x96, 0x41,
+	0x1c, 0x37, 0xad, 0xd5, 0xfc, 0xbb, 0x41, 0xae, 0x9a, 0x90, 0x63, 0x74, 0x1f, 0x8a, 0x89, 0x0b,
+	0x2e, 0x9a, 0xb9, 0x55, 0x6b, 0xad, 0xbc, 0x8e, 0x4c, 0x8f, 0x7d, 0x29, 0xc1, 0x5a, 0x03, 0x75,
+	0xe0, 0xba, 0xee, 0x49, 0x33, 0x2f, 0x95, 0xdf, 0xcf, 0x66, 0x77, 0xa8, 0x84, 0x38, 0xd5, 0x42,
+	0x2f, 0xa1, 0xce, 0x82, 0x70, 0x2c, 0x9c, 0x69, 0x59, 0x0a, 0xb2, 0x2c, 0x8f, 0x16, 0xc1, 0xbd,
+	0x93, 0x98, 0x9a, 0x8d, 0xc3, 0x35, 0x66, 0xb2, 0x62, 0x84, 0xa1, 0x4e, 0x3c, 0x8f, 0x09, 0xc6,
+	0x03, 0x32, 0x72, 0x48, 0xe4, 0xc7, 0xcd, 0xf7, 0x24, 0xb0, 0x7b, 0xa6, 0xff, 0x69, 0x71, 0x65,
+	0xa4, 0xee, 0xc4, 0xa2, 0x1b, 0xf9, 0x31, 0xae, 0x91, 0x0c, 0x8d, 0x7a, 0x50, 0x09, 0x23, 0x3e,
+	0x64, 0x23, 0xea, 0xb0, 0x60, 0xc8, 0x9b, 0x45, 0xe9, 0xf0, 0xb6, 0xe9, 0x30, 0x05, 0x70, 0xa0,
+	0xf4, 0x24, 0xb4, 0x72, 0x38, 0x25, 0x5a, 0x3f, 0x58, 0xb0, 0x7a, 0x75, 0x4b, 0xe3, 0x90, 0x07,
+	0x31, 0x45, 0xdf, 0x42, 0x5d, 0xcd, 0x7f, 0x44, 0x47, 0xf4, 0x15, 0x09, 0xdc, 0x74, 0x0e, 0x37,
+	0xb2, 0x55, 0x9d, 0x81, 0x9f, 0xda, 0xb7, 0x35, 0xa5, 0x6d, 0x71, 0xed, 0x24, 0x43, 0xb7, 0x7e,
+	0xcc, 0xc3, 0x72, 0x6f, 0x1c, 0x78, 0x23, 0x3a, 0x89, 0x9f, 0x4e, 0xd3, 0xb4, 0xe7, 0xd6, 0x3f,
+	0xe9, 0x79, 0x6e, 0xa1, 0x9e, 0xdf, 0x02, 0xe0, 0x63, 0x91, 0x34, 0xdd, 0x63, 0x91, 0x9c, 0x93,
+	0x12, 0x2e, 0x29, 0xce, 0x26, 0x8b, 0xe6, 0x4c, 0x72, 0xe1, 0x5f, 0x9a, 0xe4, 0xff, 0xeb, 0x30,
+	0x9c, 0xc0, 0xca, 0xa5, 0x3e, 0xe8, 0x11, 0xe8, 0x4e, 0x8b, 0x11, 0xab, 0x00, 0x6a, 0x6b, 0xd8,
+	0xf3, 0xb7, 0x86, 0xf4, 0x3d, 0xc9, 0x3a, 0x4e, 0xc8, 0x2f, 0x0a, 0x4b, 0x56, 0x23, 0xd7, 0xfa,
+	0x39, 0x07, 0xcb, 0x4f, 0xa8, 0x78, 0x1e, 0x7a, 0x44, 0x50, 0x6f, 0x8b, 0x8d, 0x68, 0x9c, 0x36,
+	0x9b, 0x02, 0x1a, 0x87, 0x23, 0x4e, 0x3c, 0xea, 0x19, 0xc7, 0xd0, 0x92, 0x71, 0x1e, 0x67, 0xe3,
+	0xcc, 0xf7, 0xd0, 0x7e, 0xae, 0xcd, 0x27, 0x7d, 0xc0, 0x37, 0xc6, 0xb3, 0x2c, 0xfb, 0x27, 0x0b,
+	0x6e, 0x5c, 0x52, 0x44, 0x9f, 0x1b, 0x9b, 0x56, 0xe6, 0xa7, 0x06, 0xee, 0xef, 0xf2, 0x9b, 0xac,
+	0x54, 0xb9, 0xaa, 0x67, 0x1b, 0x90, 0x7b, 0x87, 0x06, 0xfc, 0x5e, 0x80, 0x95, 0x4b, 0xa9, 0xe9,
+	0x0e, 0x1c, 0x43, 0x75, 0xac, 0xf8, 0x4e, 0xa2, 0x9f, 0x16, 0xe6, 0xc1, 0x5b, 0x0a, 0xa3, 0x8f,
+	0xa0, 0xc1, 0xc4, 0x95, 0xb1, 0xa1, 0x81, 0xee, 0x42, 0x2d, 0xb9, 0x83, 0x98, 0x70, 0xce, 0x68,
+	0x1c, 0x13, 0x9f, 0x4a, 0xe4, 0x25, 0x5c, 0x55, 0xdc, 0x5d, 0xc5, 0x44, 0x2f, 0x40, 0x33, 0x9c,
+	0x21, 0xe7, 0x82, 0x26, 0xe7, 0x25, 0x09, 0xbf, 0xbe, 0x58, 0xf8, 0xbe, 0x34, 0xdd, 0x92, 0x96,
+	0xb8, 0xe2, 0x1a, 0x94, 0x7d, 0x07, 0xca, 0x86, 0x09, 0x42, 0x50, 0x08, 0x89, 0x38, 0x95, 0xe5,
+	0x2f, 0x61, 0xf9, 0x6d, 0xef, 0x43, 0xad, 0x7f, 0xbe, 0x49, 0x43, 0x1a, 0x78, 0xca, 0x08, 0x7d,
+	0x06, 0x55, 0x9f, 0x46, 0x11, 0x13, 0x8e, 0x7b, 0x4a, 0x02, 0x9f, 0xea, 0x62, 0x34, 0xcd, 0x6a,
+	0x3f, 0x91, 0x0a, 0x7d, 0x29, 0xc7, 0x15, 0xdf, 0xa0, 0xec, 0x3b, 0x50, 0xed, 0x9f, 0xf7, 0x47,
+	0x47, 0xc4, 0xd7, 0xfe, 0x1a, 0x90, 0x17, 0xc4, 0xd7, 0x41, 0x93, 0x4f, 0xfb, 0x37, 0x0b, 0x2a,
+	0x26, 0x6a, 0x74, 0x08, 0x25, 0xf7, 0xdc, 0xf1, 0x24, 0x0a, 0x3d, 0x1c, 0x1b, 0x0b, 0x26, 0x9f,
+	0xc1, 0xbe, 0x7d, 0x0d, 0x2f, 0xb9, 0x9a, 0x83, 0xbe, 0x94, 0x4e, 0xdd, 0x91, 0x93, 0x44, 0x57,
+	0x13, 0xf3, 0x70, 0x51, 0xa7, 0x06, 0xfe, 0xed, 0x6b, 0xf8, 0xba, 0xab, 0x18, 0xbd, 0x25, 0x28,
+	0xaa, 0x0e, 0xb5, 0x7e, 0xb1, 0xc0, 0x3e, 0xa6, 0x11, 0x1b, 0x5e, 0x74, 0xb7, 0x36, 0xf7, 0xa7,
+	0x67, 0x42, 0x1f, 0xb7, 0x4f, 0xa1, 0xa2, 0xb6, 0xba, 0x20, 0x91, 0x4f, 0xd3, 0x0d, 0xbb, 0x72,
+	0x69, 0xbb, 0x1d, 0x49, 0x31, 0x2e, 0x9f, 0x4c, 0x09, 0xd4, 0x9d, 0xfd, 0x2f, 0xc9, 0xc9, 0xfb,
+	0xe0, 0x66, 0x66, 0xda, 0x8d, 0xa0, 0xc9, 0xde, 0xcb, 0xfe, 0x82, 0xb4, 0x1e, 0xc1, 0x87, 0x73,
+	0xc1, 0xe9, 0x71, 0x5f, 0x86, 0x62, 0x2c, 0x88, 0x18, 0xc7, 0x12, 0xd7, 0x12, 0xd6, 0xd4, 0xfd,
+	0x21, 0x34, 0x66, 0x1d, 0xa3, 0x2a, 0x94, 0xf6, 0xf6, 0xf7, 0x06, 0xce, 0xd1, 0xd7, 0x07, 0x83,
+	0xc6, 0xb5, 0x84, 0xdc, 0xc7, 0x9b, 0x03, 0xbc, 0xb5, 0xf3, 0x6c, 0xd0, 0xb0, 0x10, 0x82, 0x5a,
+	0x6f, 0xb0, 0xd7, 0xdf, 0xde, 0xed, 0xe2, 0xa7, 0x4e, 0x62, 0xdb, 0xc8, 0xa1, 0x3a, 0x94, 0x9f,
+	0x0e, 0xf0, 0xde, 0xe0, 0x99, 0x62, 0xe4, 0x13, 0x46, 0x7f, 0x1b, 0xef, 0xef, 0x0e, 0x14, 0xa3,
+	0xb0, 0xfe, 0x47, 0x01, 0x1a, 0x93, 0x35, 0x78, 0x48, 0xa3, 0x57, 0xcc, 0xa5, 0xe8, 0x7b, 0xb8,
+	0xa5, 0x9a, 0x31, 0x90, 0xc5, 0x78, 0xc1, 0xc4, 0x69, 0x06, 0x3d, 0x5a, 0xcb, 0x36, 0xef, 0xea,
+	0xea, 0xdb, 0xf7, 0x16, 0xd0, 0x54, 0xa5, 0x68, 0x15, 0x5f, 0xbf, 0xb1, 0x73, 0x0d, 0x0b, 0x7d,
+	0x07, 0x1f, 0xa8, 0xbd, 0x75, 0x4c, 0x85, 0xa0, 0xde, 0x7f, 0x18, 0x39, 0x84, 0xfa, 0xcc, 0x6d,
+	0x84, 0x3e, 0xbe, 0xea, 0xea, 0x9f, 0xfb, 0x5b, 0x68, 0xb7, 0x17, 0x55, 0xd7, 0xed, 0x7f, 0x09,
+	0x75, 0x75, 0x15, 0x4d, 0x33, 0xfc, 0x28, 0xeb, 0x62, 0xfe, 0x1f, 0x83, 0x7d, 0xf7, 0x2d, 0x5a,
+	0x53, 0xff, 0x33, 0x27, 0x6b, 0xd6, 0xff, 0xfc, 0x2b, 0x66, 0xd6, 0xff, 0x15, 0xc7, 0xd3, 0xbe,
+	0xf1, 0xfa, 0x8d, 0x5d, 0x85, 0xd2, 0xe4, 0x01, 0xd2, 0xc8, 0xf5, 0x3e, 0xf9, 0xe6, 0xb1, 0xcf,
+	0x27, 0x07, 0xa4, 0xcd, 0x23, 0xbf, 0x63, 0xbc, 0x03, 0x58, 0x30, 0x8c, 0x48, 0x47, 0x3e, 0x03,
+	0x3a, 0x3e, 0xef, 0x98, 0xcf, 0x8b, 0x93, 0xa2, 0x64, 0x3f, 0xfc, 0x2b, 0x00, 0x00, 0xff, 0xff,
+	0x1d, 0xbb, 0x15, 0xff, 0xdd, 0x0c, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -557,6 +935,7 @@
 	PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error)
 	// Bundle toolchain artifacts.
 	BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error)
+	GetUpdatedFiles(ctx context.Context, in *GetUpdatedFilesRequest, opts ...grpc.CallOption) (*GetUpdatedFilesResponse, error)
 }
 
 type toolchainServiceClient struct {
@@ -603,6 +982,15 @@
 	return out, nil
 }
 
+func (c *toolchainServiceClient) GetUpdatedFiles(ctx context.Context, in *GetUpdatedFilesRequest, opts ...grpc.CallOption) (*GetUpdatedFilesResponse, error) {
+	out := new(GetUpdatedFilesResponse)
+	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/GetUpdatedFiles", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // ToolchainServiceServer is the server API for ToolchainService service.
 type ToolchainServiceServer interface {
 	// DEPRECATED for recipes: used only by legacy toolchain builders.
@@ -620,6 +1008,7 @@
 	PrepareForBuild(context.Context, *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error)
 	// Bundle toolchain artifacts.
 	BundleArtifacts(context.Context, *BundleToolchainRequest) (*BundleToolchainResponse, error)
+	GetUpdatedFiles(context.Context, *GetUpdatedFilesRequest) (*GetUpdatedFilesResponse, error)
 }
 
 // UnimplementedToolchainServiceServer can be embedded to have forward compatible implementations.
@@ -638,6 +1027,9 @@
 func (*UnimplementedToolchainServiceServer) BundleArtifacts(ctx context.Context, req *BundleToolchainRequest) (*BundleToolchainResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method BundleArtifacts not implemented")
 }
+func (*UnimplementedToolchainServiceServer) GetUpdatedFiles(ctx context.Context, req *GetUpdatedFilesRequest) (*GetUpdatedFilesResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetUpdatedFiles not implemented")
+}
 
 func RegisterToolchainServiceServer(s *grpc.Server, srv ToolchainServiceServer) {
 	s.RegisterService(&_ToolchainService_serviceDesc, srv)
@@ -715,6 +1107,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _ToolchainService_GetUpdatedFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetUpdatedFilesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ToolchainServiceServer).GetUpdatedFiles(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/chromite.api.ToolchainService/GetUpdatedFiles",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ToolchainServiceServer).GetUpdatedFiles(ctx, req.(*GetUpdatedFilesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _ToolchainService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "chromite.api.ToolchainService",
 	HandlerType: (*ToolchainServiceServer)(nil),
@@ -735,6 +1145,10 @@
 			MethodName: "BundleArtifacts",
 			Handler:    _ToolchainService_BundleArtifacts_Handler,
 		},
+		{
+			MethodName: "GetUpdatedFiles",
+			Handler:    _ToolchainService_GetUpdatedFiles_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "chromite/api/toolchain.proto",
diff --git a/src/chromite/api/toolchain.proto b/src/chromite/api/toolchain.proto
index 103360c..dfe0b08 100644
--- a/src/chromite/api/toolchain.proto
+++ b/src/chromite/api/toolchain.proto
@@ -76,6 +76,50 @@
   repeated ArtifactInfo artifacts_info = 2;
 }
 
+message GetUpdatedFilesRequest {
+  // We need the artifact info from BundleResponse and the profile info
+  // as the input of the request.
+  message UploadedArtifacts {
+    ArtifactInfo artifact_info = 1;
+    chromiumos.ArtifactProfileInfo profile_info = 2;
+  }
+  repeated UploadedArtifacts uploaded_artifacts = 1;
+}
+
+message GetUpdatedFilesResponse {
+  message UpdatedFile {
+    // The path to the (uncommitted) file.
+    string path = 1;
+  }
+  repeated UpdatedFile updated_files = 1;
+
+  // The commit message to use.
+  string commit_message = 2;
+
+  // The Cq-Depend footer is used by LUCI (and Chrome OS Recipes) to operate
+  // on interdependent changes at various steps.
+  message CqDependFooter {
+    // The gerrit change(s) we depend on.
+    repeated chromiumos.GerritChange gerrit_change = 1;
+  }
+
+  // The Cq-Cl-Tag footer is used by cq-orchestrator to choose quota pools.
+  message CqClTagFooter {
+    // The Cq-Cl-Tag value.
+    string tag = 1;
+  }
+
+  message CommitFooter {
+    oneof footer {
+      CqDependFooter cq_depend = 1;
+      CqClTagFooter cq_cl_tag = 2;
+    }
+  }
+
+  // Any footers to use.  Formatted to the current standard by Recipes.
+  repeated CommitFooter commit_footer = 3;
+}
+
 // TODO(crbug.com/1020615): Drop this once this is live in production and all of
 // the users have migrated to using BuilderConfig.Artifacts.ArtifactType
 // Meanwhile, keep this in sync with chromiumos/builder_config.proto.
@@ -145,4 +189,7 @@
   // Bundle toolchain artifacts.
   rpc BundleArtifacts(BundleToolchainRequest)
     returns (BundleToolchainResponse);
+
+  rpc GetUpdatedFiles(GetUpdatedFilesRequest)
+    returns (GetUpdatedFilesResponse);
 }
