From e40e258805330f96e6fa76074d3c898b886f632c Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 23 Aug 2024 00:30:18 -0600 Subject: [PATCH] Protobuf type updates --- cmd/decompal/main.go | 45 -- genproto.sh | 4 +- handlers/shared.go | 10 +- objdiff/legacy.go | 58 ++- objdiff/report.go | 17 +- objdiff/report.pb.go | 1099 ++++++++++++++++++++++-------------------- 6 files changed, 646 insertions(+), 587 deletions(-) diff --git a/cmd/decompal/main.go b/cmd/decompal/main.go index df6bed9..e7204c8 100644 --- a/cmd/decompal/main.go +++ b/cmd/decompal/main.go @@ -22,51 +22,6 @@ func main() { logger := baseapp.NewLogger(cfg.Logging) zerolog.DefaultContextLogger = &logger - // Configure a temporary directory - //if cfg.App.TmpDir == "" { - // cfg.App.TmpDir, err = os.MkdirTemp(os.TempDir(), "decompal") - // if err != nil { - // logger.Fatal(). - // Err(err). - // Str("path", cfg.App.TmpDir). - // Msg("failed to create temporary directory") - // } - //} - //if _, err := os.Stat(cfg.App.TmpDir); err != nil { - // if os.IsNotExist(err) { - // err := os.MkdirAll(cfg.App.TmpDir, 0755) - // if err != nil { - // logger.Fatal(). - // Err(err). - // Str("path", cfg.App.TmpDir). - // Msg("failed to create temporary directory") - // } - // } else { - // logger.Fatal(). - // Err(err). - // Str("path", cfg.App.TmpDir). - // Msg("failed to stat temporary directory") - // } - //} - //logger.Debug(). - // Str("path", cfg.App.TmpDir). - // Msg("Using temporary directory") - //// Delete the temporary directory on exit - //defer func() { - // if err := os.RemoveAll(cfg.App.TmpDir); err != nil { - // logger.Error(). - // Err(err). - // Str("path", cfg.App.TmpDir). - // Msg("failed to remove temporary directory") - // } - //}() - - // Create a task queue - //queueFactory := memqueue.NewFactory() - //taskQueue := queueFactory.RegisterQueue(&taskq.QueueOptions{ - // Name: "background-tasks", - //}) - // Create the server serverParams := baseapp.DefaultParams(logger, "decompal.") server, err := baseapp.NewServer(cfg.Server, serverParams...) diff --git a/genproto.sh b/genproto.sh index 71d4534..2333a82 100755 --- a/genproto.sh +++ b/genproto.sh @@ -1,6 +1,6 @@ #!/bin/sh -e -SRC_DIR=../objdiff/objdiff-cli/protos +SRC_DIR=../objdiff/objdiff-core/protos protoc -I=$SRC_DIR \ --go_out=paths=source_relative:objdiff \ --go_opt=Mreport.proto=github.com/encounter/decompal/objdiff \ - $SRC_DIR/*.proto + $SRC_DIR/report.proto diff --git a/handlers/shared.go b/handlers/shared.go index ba8a6ee..5204e62 100644 --- a/handlers/shared.go +++ b/handlers/shared.go @@ -183,7 +183,7 @@ func upsertComment( func createChanges(changes *objdiff.Changes) string { out := "### Overall\n\n" - overallTable := changeInfoTable(changes.From, changes.To) + overallTable := measuresTable(changes.From, changes.To) if overallTable == "" { if len(changes.Units) == 0 { return "" @@ -194,7 +194,7 @@ func createChanges(changes *objdiff.Changes) string { } for _, unit := range changes.Units { out += fmt.Sprintf("---\n### `%s`\n\n", unit.Name) - unitTable := changeInfoTable(unit.From, unit.To) + unitTable := measuresTable(unit.From, unit.To) if unitTable != "" { out += unitTable + "\n\n" } @@ -268,15 +268,15 @@ func changeItemInfoRow(item *objdiff.ChangeItem) string { ) } -func changeInfoTable(prev, curr *objdiff.ChangeInfo) string { +func measuresTable(prev, curr *objdiff.Measures) string { if prev == nil && curr == nil { return "" } else if prev == nil { // TODO: added - prev = &objdiff.ChangeInfo{} + prev = &objdiff.Measures{} } else if curr == nil { // TODO: removed - curr = &objdiff.ChangeInfo{} + curr = &objdiff.Measures{} } header := "|Metric|Previous|Current|Change|\n|-|-|-|-|" rows := make([]string, 0) diff --git a/objdiff/legacy.go b/objdiff/legacy.go index b95a994..fd39015 100644 --- a/objdiff/legacy.go +++ b/objdiff/legacy.go @@ -46,17 +46,19 @@ type legacyReportItem struct { func (r *legacyReport) convert() *Report { report := &Report{ - FuzzyMatchPercent: r.FuzzyMatchPercent, - TotalCode: r.TotalCode, - MatchedCode: r.MatchedCode, - MatchedCodePercent: r.MatchedCodePercent, - TotalData: r.TotalData, - MatchedData: r.MatchedData, - MatchedDataPercent: r.MatchedDataPercent, - TotalFunctions: r.TotalFunctions, - MatchedFunctions: r.MatchedFunctions, - MatchedFunctionsPercent: r.MatchedFunctionsPercent, - Units: make([]*ReportUnit, 0, len(r.Units)), + Measures: &Measures{ + FuzzyMatchPercent: r.FuzzyMatchPercent, + TotalCode: r.TotalCode, + MatchedCode: r.MatchedCode, + MatchedCodePercent: r.MatchedCodePercent, + TotalData: r.TotalData, + MatchedData: r.MatchedData, + MatchedDataPercent: r.MatchedDataPercent, + TotalFunctions: r.TotalFunctions, + MatchedFunctions: r.MatchedFunctions, + MatchedFunctionsPercent: r.MatchedFunctionsPercent, + }, + Units: make([]*ReportUnit, 0, len(r.Units)), } for _, unit := range r.Units { report.Units = append(report.Units, unit.convert()) @@ -65,8 +67,7 @@ func (r *legacyReport) convert() *Report { } func (u *legacyReportUnit) convert() *ReportUnit { - unit := &ReportUnit{ - Name: u.Name, + measures := &Measures{ FuzzyMatchPercent: u.FuzzyMatchPercent, TotalCode: u.TotalCode, MatchedCode: u.MatchedCode, @@ -74,11 +75,18 @@ func (u *legacyReportUnit) convert() *ReportUnit { MatchedData: u.MatchedData, TotalFunctions: u.TotalFunctions, MatchedFunctions: u.MatchedFunctions, - Complete: u.Complete, - ModuleName: u.ModuleName, - ModuleId: u.ModuleID, - Sections: make([]*ReportItem, 0, len(u.Sections)), - Functions: make([]*ReportItem, 0, len(u.Functions)), + } + measures.CalcMatchedPercent() + unit := &ReportUnit{ + Name: u.Name, + Measures: measures, + Sections: make([]*ReportItem, 0, len(u.Sections)), + Functions: make([]*ReportItem, 0, len(u.Functions)), + Metadata: &ReportUnitMetadata{ + Complete: u.Complete, + ModuleName: u.ModuleName, + ModuleId: u.ModuleID, + }, } for _, section := range u.Sections { unit.Sections = append(unit.Sections, section.convert()) @@ -90,20 +98,24 @@ func (u *legacyReportUnit) convert() *ReportUnit { } func (i *legacyReportItem) convert() *ReportItem { - var address uint64 + var address *uint64 if i.Address != nil { addressStr := *i.Address if strings.HasPrefix(addressStr, "0x") { - address, _ = strconv.ParseUint(addressStr[2:], 16, 64) + v, _ := strconv.ParseUint(addressStr[2:], 16, 64) + address = &v } else { - address, _ = strconv.ParseUint(addressStr, 10, 64) + v, _ := strconv.ParseUint(addressStr, 10, 64) + address = &v } } return &ReportItem{ Name: i.Name, - DemangledName: i.DemangledName, - Address: &address, Size: i.Size, FuzzyMatchPercent: i.FuzzyMatchPercent, + Metadata: &ReportItemMetadata{ + DemangledName: i.DemangledName, + VirtualAddress: address, + }, } } diff --git a/objdiff/report.go b/objdiff/report.go index 41c3c43..98ca855 100644 --- a/objdiff/report.go +++ b/objdiff/report.go @@ -22,7 +22,7 @@ type ReportFile struct { Report *Report } -var artifactNameRegex = regexp.MustCompile(`^(?P[A-z0-9_\-]+)_report$`) +var artifactNameRegex = regexp.MustCompile(`^(?P[A-z0-9_\-]+)[_-]report(?:[_-].*)?$`) func FetchReportFiles( ctx context.Context, @@ -151,3 +151,18 @@ func parseJson(data []byte, v *Report) error { } return nil } + +func (m *Measures) CalcMatchedPercent() { + m.MatchedCodePercent = 100 + if m.TotalCode != 0 { + m.MatchedCodePercent = float32(m.MatchedCode) / float32(m.TotalCode) * 100 + } + m.MatchedDataPercent = 100 + if m.TotalData != 0 { + m.MatchedDataPercent = float32(m.MatchedData) / float32(m.TotalData) * 100 + } + m.MatchedFunctionsPercent = 100 + if m.TotalFunctions != 0 { + m.MatchedFunctionsPercent = float32(m.MatchedFunctions) / float32(m.TotalFunctions) * 100 + } +} diff --git a/objdiff/report.pb.go b/objdiff/report.pb.go index a51f5cb..32b5e2d 100644 --- a/objdiff/report.pb.go +++ b/objdiff/report.pb.go @@ -20,28 +20,152 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Progress info for a report or unit +type Measures struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Overall match percent, including partially matched functions and data + FuzzyMatchPercent float32 `protobuf:"fixed32,1,opt,name=fuzzy_match_percent,json=fuzzyMatchPercent,proto3" json:"fuzzy_match_percent,omitempty"` + // Total size of code in bytes + TotalCode uint64 `protobuf:"varint,2,opt,name=total_code,json=totalCode,proto3" json:"total_code,omitempty"` + // Fully matched code size in bytes + MatchedCode uint64 `protobuf:"varint,3,opt,name=matched_code,json=matchedCode,proto3" json:"matched_code,omitempty"` + // Fully matched code percent + MatchedCodePercent float32 `protobuf:"fixed32,4,opt,name=matched_code_percent,json=matchedCodePercent,proto3" json:"matched_code_percent,omitempty"` + // Total size of data in bytes + TotalData uint64 `protobuf:"varint,5,opt,name=total_data,json=totalData,proto3" json:"total_data,omitempty"` + // Fully matched data size in bytes + MatchedData uint64 `protobuf:"varint,6,opt,name=matched_data,json=matchedData,proto3" json:"matched_data,omitempty"` + // Fully matched data percent + MatchedDataPercent float32 `protobuf:"fixed32,7,opt,name=matched_data_percent,json=matchedDataPercent,proto3" json:"matched_data_percent,omitempty"` + // Total number of functions + TotalFunctions uint32 `protobuf:"varint,8,opt,name=total_functions,json=totalFunctions,proto3" json:"total_functions,omitempty"` + // Fully matched functions + MatchedFunctions uint32 `protobuf:"varint,9,opt,name=matched_functions,json=matchedFunctions,proto3" json:"matched_functions,omitempty"` + // Fully matched functions percent + MatchedFunctionsPercent float32 `protobuf:"fixed32,10,opt,name=matched_functions_percent,json=matchedFunctionsPercent,proto3" json:"matched_functions_percent,omitempty"` +} + +func (x *Measures) Reset() { + *x = Measures{} + if protoimpl.UnsafeEnabled { + mi := &file_report_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Measures) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Measures) ProtoMessage() {} + +func (x *Measures) ProtoReflect() protoreflect.Message { + mi := &file_report_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 Measures.ProtoReflect.Descriptor instead. +func (*Measures) Descriptor() ([]byte, []int) { + return file_report_proto_rawDescGZIP(), []int{0} +} + +func (x *Measures) GetFuzzyMatchPercent() float32 { + if x != nil { + return x.FuzzyMatchPercent + } + return 0 +} + +func (x *Measures) GetTotalCode() uint64 { + if x != nil { + return x.TotalCode + } + return 0 +} + +func (x *Measures) GetMatchedCode() uint64 { + if x != nil { + return x.MatchedCode + } + return 0 +} + +func (x *Measures) GetMatchedCodePercent() float32 { + if x != nil { + return x.MatchedCodePercent + } + return 0 +} + +func (x *Measures) GetTotalData() uint64 { + if x != nil { + return x.TotalData + } + return 0 +} + +func (x *Measures) GetMatchedData() uint64 { + if x != nil { + return x.MatchedData + } + return 0 +} + +func (x *Measures) GetMatchedDataPercent() float32 { + if x != nil { + return x.MatchedDataPercent + } + return 0 +} + +func (x *Measures) GetTotalFunctions() uint32 { + if x != nil { + return x.TotalFunctions + } + return 0 +} + +func (x *Measures) GetMatchedFunctions() uint32 { + if x != nil { + return x.MatchedFunctions + } + return 0 +} + +func (x *Measures) GetMatchedFunctionsPercent() float32 { + if x != nil { + return x.MatchedFunctionsPercent + } + return 0 +} + +// Project progress report type Report struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FuzzyMatchPercent float32 `protobuf:"fixed32,1,opt,name=fuzzy_match_percent,json=fuzzyMatchPercent,proto3" json:"fuzzy_match_percent,omitempty"` - TotalCode uint64 `protobuf:"varint,2,opt,name=total_code,json=totalCode,proto3" json:"total_code,omitempty"` - MatchedCode uint64 `protobuf:"varint,3,opt,name=matched_code,json=matchedCode,proto3" json:"matched_code,omitempty"` - MatchedCodePercent float32 `protobuf:"fixed32,4,opt,name=matched_code_percent,json=matchedCodePercent,proto3" json:"matched_code_percent,omitempty"` - TotalData uint64 `protobuf:"varint,5,opt,name=total_data,json=totalData,proto3" json:"total_data,omitempty"` - MatchedData uint64 `protobuf:"varint,6,opt,name=matched_data,json=matchedData,proto3" json:"matched_data,omitempty"` - MatchedDataPercent float32 `protobuf:"fixed32,7,opt,name=matched_data_percent,json=matchedDataPercent,proto3" json:"matched_data_percent,omitempty"` - TotalFunctions uint32 `protobuf:"varint,8,opt,name=total_functions,json=totalFunctions,proto3" json:"total_functions,omitempty"` - MatchedFunctions uint32 `protobuf:"varint,9,opt,name=matched_functions,json=matchedFunctions,proto3" json:"matched_functions,omitempty"` - MatchedFunctionsPercent float32 `protobuf:"fixed32,10,opt,name=matched_functions_percent,json=matchedFunctionsPercent,proto3" json:"matched_functions_percent,omitempty"` - Units []*ReportUnit `protobuf:"bytes,11,rep,name=units,proto3" json:"units,omitempty"` + // Overall progress info + Measures *Measures `protobuf:"bytes,1,opt,name=measures,proto3" json:"measures,omitempty"` + // Units within this report + Units []*ReportUnit `protobuf:"bytes,2,rep,name=units,proto3" json:"units,omitempty"` } func (x *Report) Reset() { *x = Report{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[0] + mi := &file_report_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -54,7 +178,7 @@ func (x *Report) String() string { func (*Report) ProtoMessage() {} func (x *Report) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[0] + mi := &file_report_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -67,77 +191,14 @@ func (x *Report) ProtoReflect() protoreflect.Message { // Deprecated: Use Report.ProtoReflect.Descriptor instead. func (*Report) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{0} + return file_report_proto_rawDescGZIP(), []int{1} } -func (x *Report) GetFuzzyMatchPercent() float32 { +func (x *Report) GetMeasures() *Measures { if x != nil { - return x.FuzzyMatchPercent + return x.Measures } - return 0 -} - -func (x *Report) GetTotalCode() uint64 { - if x != nil { - return x.TotalCode - } - return 0 -} - -func (x *Report) GetMatchedCode() uint64 { - if x != nil { - return x.MatchedCode - } - return 0 -} - -func (x *Report) GetMatchedCodePercent() float32 { - if x != nil { - return x.MatchedCodePercent - } - return 0 -} - -func (x *Report) GetTotalData() uint64 { - if x != nil { - return x.TotalData - } - return 0 -} - -func (x *Report) GetMatchedData() uint64 { - if x != nil { - return x.MatchedData - } - return 0 -} - -func (x *Report) GetMatchedDataPercent() float32 { - if x != nil { - return x.MatchedDataPercent - } - return 0 -} - -func (x *Report) GetTotalFunctions() uint32 { - if x != nil { - return x.TotalFunctions - } - return 0 -} - -func (x *Report) GetMatchedFunctions() uint32 { - if x != nil { - return x.MatchedFunctions - } - return 0 -} - -func (x *Report) GetMatchedFunctionsPercent() float32 { - if x != nil { - return x.MatchedFunctionsPercent - } - return 0 + return nil } func (x *Report) GetUnits() []*ReportUnit { @@ -147,30 +208,28 @@ func (x *Report) GetUnits() []*ReportUnit { return nil } +// A unit of the report (usually a translation unit) type ReportUnit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - FuzzyMatchPercent float32 `protobuf:"fixed32,2,opt,name=fuzzy_match_percent,json=fuzzyMatchPercent,proto3" json:"fuzzy_match_percent,omitempty"` - TotalCode uint64 `protobuf:"varint,3,opt,name=total_code,json=totalCode,proto3" json:"total_code,omitempty"` - MatchedCode uint64 `protobuf:"varint,4,opt,name=matched_code,json=matchedCode,proto3" json:"matched_code,omitempty"` - TotalData uint64 `protobuf:"varint,5,opt,name=total_data,json=totalData,proto3" json:"total_data,omitempty"` - MatchedData uint64 `protobuf:"varint,6,opt,name=matched_data,json=matchedData,proto3" json:"matched_data,omitempty"` - TotalFunctions uint32 `protobuf:"varint,7,opt,name=total_functions,json=totalFunctions,proto3" json:"total_functions,omitempty"` - MatchedFunctions uint32 `protobuf:"varint,8,opt,name=matched_functions,json=matchedFunctions,proto3" json:"matched_functions,omitempty"` - Complete *bool `protobuf:"varint,9,opt,name=complete,proto3,oneof" json:"complete,omitempty"` - ModuleName *string `protobuf:"bytes,10,opt,name=module_name,json=moduleName,proto3,oneof" json:"module_name,omitempty"` - ModuleId *uint32 `protobuf:"varint,11,opt,name=module_id,json=moduleId,proto3,oneof" json:"module_id,omitempty"` - Sections []*ReportItem `protobuf:"bytes,12,rep,name=sections,proto3" json:"sections,omitempty"` - Functions []*ReportItem `protobuf:"bytes,13,rep,name=functions,proto3" json:"functions,omitempty"` + // The name of the unit + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Progress info for this unit + Measures *Measures `protobuf:"bytes,2,opt,name=measures,proto3" json:"measures,omitempty"` + // Sections within this unit + Sections []*ReportItem `protobuf:"bytes,3,rep,name=sections,proto3" json:"sections,omitempty"` + // Functions within this unit + Functions []*ReportItem `protobuf:"bytes,4,rep,name=functions,proto3" json:"functions,omitempty"` + // Extra metadata for this unit + Metadata *ReportUnitMetadata `protobuf:"bytes,5,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"` } func (x *ReportUnit) Reset() { *x = ReportUnit{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[1] + mi := &file_report_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -183,7 +242,7 @@ func (x *ReportUnit) String() string { func (*ReportUnit) ProtoMessage() {} func (x *ReportUnit) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[1] + mi := &file_report_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -196,7 +255,7 @@ func (x *ReportUnit) ProtoReflect() protoreflect.Message { // Deprecated: Use ReportUnit.ProtoReflect.Descriptor instead. func (*ReportUnit) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{1} + return file_report_proto_rawDescGZIP(), []int{2} } func (x *ReportUnit) GetName() string { @@ -206,74 +265,11 @@ func (x *ReportUnit) GetName() string { return "" } -func (x *ReportUnit) GetFuzzyMatchPercent() float32 { +func (x *ReportUnit) GetMeasures() *Measures { if x != nil { - return x.FuzzyMatchPercent + return x.Measures } - return 0 -} - -func (x *ReportUnit) GetTotalCode() uint64 { - if x != nil { - return x.TotalCode - } - return 0 -} - -func (x *ReportUnit) GetMatchedCode() uint64 { - if x != nil { - return x.MatchedCode - } - return 0 -} - -func (x *ReportUnit) GetTotalData() uint64 { - if x != nil { - return x.TotalData - } - return 0 -} - -func (x *ReportUnit) GetMatchedData() uint64 { - if x != nil { - return x.MatchedData - } - return 0 -} - -func (x *ReportUnit) GetTotalFunctions() uint32 { - if x != nil { - return x.TotalFunctions - } - return 0 -} - -func (x *ReportUnit) GetMatchedFunctions() uint32 { - if x != nil { - return x.MatchedFunctions - } - return 0 -} - -func (x *ReportUnit) GetComplete() bool { - if x != nil && x.Complete != nil { - return *x.Complete - } - return false -} - -func (x *ReportUnit) GetModuleName() string { - if x != nil && x.ModuleName != nil { - return *x.ModuleName - } - return "" -} - -func (x *ReportUnit) GetModuleId() uint32 { - if x != nil && x.ModuleId != nil { - return *x.ModuleId - } - return 0 + return nil } func (x *ReportUnit) GetSections() []*ReportItem { @@ -290,22 +286,109 @@ func (x *ReportUnit) GetFunctions() []*ReportItem { return nil } +func (x *ReportUnit) GetMetadata() *ReportUnitMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +// Extra metadata for a unit +type ReportUnitMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Whether this unit is marked as complete (or "linked") + Complete *bool `protobuf:"varint,1,opt,name=complete,proto3,oneof" json:"complete,omitempty"` + // The name of the module this unit belongs to + ModuleName *string `protobuf:"bytes,2,opt,name=module_name,json=moduleName,proto3,oneof" json:"module_name,omitempty"` + // The ID of the module this unit belongs to + ModuleId *uint32 `protobuf:"varint,3,opt,name=module_id,json=moduleId,proto3,oneof" json:"module_id,omitempty"` + // The path to the source file of this unit + SourcePath *string `protobuf:"bytes,4,opt,name=source_path,json=sourcePath,proto3,oneof" json:"source_path,omitempty"` +} + +func (x *ReportUnitMetadata) Reset() { + *x = ReportUnitMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_report_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReportUnitMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReportUnitMetadata) ProtoMessage() {} + +func (x *ReportUnitMetadata) ProtoReflect() protoreflect.Message { + mi := &file_report_proto_msgTypes[3] + 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 ReportUnitMetadata.ProtoReflect.Descriptor instead. +func (*ReportUnitMetadata) Descriptor() ([]byte, []int) { + return file_report_proto_rawDescGZIP(), []int{3} +} + +func (x *ReportUnitMetadata) GetComplete() bool { + if x != nil && x.Complete != nil { + return *x.Complete + } + return false +} + +func (x *ReportUnitMetadata) GetModuleName() string { + if x != nil && x.ModuleName != nil { + return *x.ModuleName + } + return "" +} + +func (x *ReportUnitMetadata) GetModuleId() uint32 { + if x != nil && x.ModuleId != nil { + return *x.ModuleId + } + return 0 +} + +func (x *ReportUnitMetadata) GetSourcePath() string { + if x != nil && x.SourcePath != nil { + return *x.SourcePath + } + return "" +} + +// A section or function within a unit type ReportItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + // The name of the item + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The size of the item in bytes + Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + // The overall match percent for this item FuzzyMatchPercent float32 `protobuf:"fixed32,3,opt,name=fuzzy_match_percent,json=fuzzyMatchPercent,proto3" json:"fuzzy_match_percent,omitempty"` - DemangledName *string `protobuf:"bytes,4,opt,name=demangled_name,json=demangledName,proto3,oneof" json:"demangled_name,omitempty"` - Address *uint64 `protobuf:"varint,5,opt,name=address,proto3,oneof" json:"address,omitempty"` + // Extra metadata for this item + Metadata *ReportItemMetadata `protobuf:"bytes,4,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"` } func (x *ReportItem) Reset() { *x = ReportItem{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[2] + mi := &file_report_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -318,7 +401,7 @@ func (x *ReportItem) String() string { func (*ReportItem) ProtoMessage() {} func (x *ReportItem) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[2] + mi := &file_report_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -331,7 +414,7 @@ func (x *ReportItem) ProtoReflect() protoreflect.Message { // Deprecated: Use ReportItem.ProtoReflect.Descriptor instead. func (*ReportItem) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{2} + return file_report_proto_rawDescGZIP(), []int{4} } func (x *ReportItem) GetName() string { @@ -355,34 +438,87 @@ func (x *ReportItem) GetFuzzyMatchPercent() float32 { return 0 } -func (x *ReportItem) GetDemangledName() string { +func (x *ReportItem) GetMetadata() *ReportItemMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +// Extra metadata for an item +type ReportItemMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The demangled name of the function + DemangledName *string `protobuf:"bytes,1,opt,name=demangled_name,json=demangledName,proto3,oneof" json:"demangled_name,omitempty"` + // The virtual address of the function or section + VirtualAddress *uint64 `protobuf:"varint,2,opt,name=virtual_address,json=virtualAddress,proto3,oneof" json:"virtual_address,omitempty"` +} + +func (x *ReportItemMetadata) Reset() { + *x = ReportItemMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_report_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReportItemMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReportItemMetadata) ProtoMessage() {} + +func (x *ReportItemMetadata) ProtoReflect() protoreflect.Message { + mi := &file_report_proto_msgTypes[5] + 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 ReportItemMetadata.ProtoReflect.Descriptor instead. +func (*ReportItemMetadata) Descriptor() ([]byte, []int) { + return file_report_proto_rawDescGZIP(), []int{5} +} + +func (x *ReportItemMetadata) GetDemangledName() string { if x != nil && x.DemangledName != nil { return *x.DemangledName } return "" } -func (x *ReportItem) GetAddress() uint64 { - if x != nil && x.Address != nil { - return *x.Address +func (x *ReportItemMetadata) GetVirtualAddress() uint64 { + if x != nil && x.VirtualAddress != nil { + return *x.VirtualAddress } return 0 } -// Used as stdin for the changes command +// A pair of reports to compare and generate changes type ChangesInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The previous report From *Report `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"` - To *Report `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"` + // The current report + To *Report `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"` } func (x *ChangesInput) Reset() { *x = ChangesInput{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[3] + mi := &file_report_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -395,7 +531,7 @@ func (x *ChangesInput) String() string { func (*ChangesInput) ProtoMessage() {} func (x *ChangesInput) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[3] + mi := &file_report_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -408,7 +544,7 @@ func (x *ChangesInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangesInput.ProtoReflect.Descriptor instead. func (*ChangesInput) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{3} + return file_report_proto_rawDescGZIP(), []int{6} } func (x *ChangesInput) GetFrom() *Report { @@ -425,20 +561,24 @@ func (x *ChangesInput) GetTo() *Report { return nil } +// Changes between two reports type Changes struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - From *ChangeInfo `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"` - To *ChangeInfo `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"` + // The progress info for the previous report + From *Measures `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"` + // The progress info for the current report + To *Measures `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"` + // Units that changed Units []*ChangeUnit `protobuf:"bytes,3,rep,name=units,proto3" json:"units,omitempty"` } func (x *Changes) Reset() { *x = Changes{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[4] + mi := &file_report_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -451,7 +591,7 @@ func (x *Changes) String() string { func (*Changes) ProtoMessage() {} func (x *Changes) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[4] + mi := &file_report_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -464,17 +604,17 @@ func (x *Changes) ProtoReflect() protoreflect.Message { // Deprecated: Use Changes.ProtoReflect.Descriptor instead. func (*Changes) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{4} + return file_report_proto_rawDescGZIP(), []int{7} } -func (x *Changes) GetFrom() *ChangeInfo { +func (x *Changes) GetFrom() *Measures { if x != nil { return x.From } return nil } -func (x *Changes) GetTo() *ChangeInfo { +func (x *Changes) GetTo() *Measures { if x != nil { return x.To } @@ -488,141 +628,30 @@ func (x *Changes) GetUnits() []*ChangeUnit { return nil } -type ChangeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FuzzyMatchPercent float32 `protobuf:"fixed32,1,opt,name=fuzzy_match_percent,json=fuzzyMatchPercent,proto3" json:"fuzzy_match_percent,omitempty"` - TotalCode uint64 `protobuf:"varint,2,opt,name=total_code,json=totalCode,proto3" json:"total_code,omitempty"` - MatchedCode uint64 `protobuf:"varint,3,opt,name=matched_code,json=matchedCode,proto3" json:"matched_code,omitempty"` - MatchedCodePercent float32 `protobuf:"fixed32,4,opt,name=matched_code_percent,json=matchedCodePercent,proto3" json:"matched_code_percent,omitempty"` - TotalData uint64 `protobuf:"varint,5,opt,name=total_data,json=totalData,proto3" json:"total_data,omitempty"` - MatchedData uint64 `protobuf:"varint,6,opt,name=matched_data,json=matchedData,proto3" json:"matched_data,omitempty"` - MatchedDataPercent float32 `protobuf:"fixed32,7,opt,name=matched_data_percent,json=matchedDataPercent,proto3" json:"matched_data_percent,omitempty"` - TotalFunctions uint32 `protobuf:"varint,8,opt,name=total_functions,json=totalFunctions,proto3" json:"total_functions,omitempty"` - MatchedFunctions uint32 `protobuf:"varint,9,opt,name=matched_functions,json=matchedFunctions,proto3" json:"matched_functions,omitempty"` - MatchedFunctionsPercent float32 `protobuf:"fixed32,10,opt,name=matched_functions_percent,json=matchedFunctionsPercent,proto3" json:"matched_functions_percent,omitempty"` -} - -func (x *ChangeInfo) Reset() { - *x = ChangeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChangeInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeInfo) ProtoMessage() {} - -func (x *ChangeInfo) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[5] - 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 ChangeInfo.ProtoReflect.Descriptor instead. -func (*ChangeInfo) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{5} -} - -func (x *ChangeInfo) GetFuzzyMatchPercent() float32 { - if x != nil { - return x.FuzzyMatchPercent - } - return 0 -} - -func (x *ChangeInfo) GetTotalCode() uint64 { - if x != nil { - return x.TotalCode - } - return 0 -} - -func (x *ChangeInfo) GetMatchedCode() uint64 { - if x != nil { - return x.MatchedCode - } - return 0 -} - -func (x *ChangeInfo) GetMatchedCodePercent() float32 { - if x != nil { - return x.MatchedCodePercent - } - return 0 -} - -func (x *ChangeInfo) GetTotalData() uint64 { - if x != nil { - return x.TotalData - } - return 0 -} - -func (x *ChangeInfo) GetMatchedData() uint64 { - if x != nil { - return x.MatchedData - } - return 0 -} - -func (x *ChangeInfo) GetMatchedDataPercent() float32 { - if x != nil { - return x.MatchedDataPercent - } - return 0 -} - -func (x *ChangeInfo) GetTotalFunctions() uint32 { - if x != nil { - return x.TotalFunctions - } - return 0 -} - -func (x *ChangeInfo) GetMatchedFunctions() uint32 { - if x != nil { - return x.MatchedFunctions - } - return 0 -} - -func (x *ChangeInfo) GetMatchedFunctionsPercent() float32 { - if x != nil { - return x.MatchedFunctionsPercent - } - return 0 -} - +// A changed unit type ChangeUnit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - From *ChangeInfo `protobuf:"bytes,2,opt,name=from,proto3,oneof" json:"from,omitempty"` - To *ChangeInfo `protobuf:"bytes,3,opt,name=to,proto3,oneof" json:"to,omitempty"` - Sections []*ChangeItem `protobuf:"bytes,4,rep,name=sections,proto3" json:"sections,omitempty"` + // The name of the unit + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The previous progress info (omitted if new) + From *Measures `protobuf:"bytes,2,opt,name=from,proto3,oneof" json:"from,omitempty"` + // The current progress info (omitted if removed) + To *Measures `protobuf:"bytes,3,opt,name=to,proto3,oneof" json:"to,omitempty"` + // Sections that changed + Sections []*ChangeItem `protobuf:"bytes,4,rep,name=sections,proto3" json:"sections,omitempty"` + // Functions that changed Functions []*ChangeItem `protobuf:"bytes,5,rep,name=functions,proto3" json:"functions,omitempty"` + // Extra metadata for this unit + Metadata *ReportUnitMetadata `protobuf:"bytes,6,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"` } func (x *ChangeUnit) Reset() { *x = ChangeUnit{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[6] + mi := &file_report_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -635,7 +664,7 @@ func (x *ChangeUnit) String() string { func (*ChangeUnit) ProtoMessage() {} func (x *ChangeUnit) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[6] + mi := &file_report_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -648,7 +677,7 @@ func (x *ChangeUnit) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeUnit.ProtoReflect.Descriptor instead. func (*ChangeUnit) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{6} + return file_report_proto_rawDescGZIP(), []int{8} } func (x *ChangeUnit) GetName() string { @@ -658,14 +687,14 @@ func (x *ChangeUnit) GetName() string { return "" } -func (x *ChangeUnit) GetFrom() *ChangeInfo { +func (x *ChangeUnit) GetFrom() *Measures { if x != nil { return x.From } return nil } -func (x *ChangeUnit) GetTo() *ChangeInfo { +func (x *ChangeUnit) GetTo() *Measures { if x != nil { return x.To } @@ -686,20 +715,33 @@ func (x *ChangeUnit) GetFunctions() []*ChangeItem { return nil } +func (x *ChangeUnit) GetMetadata() *ReportUnitMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +// A changed section or function type ChangeItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The name of the item + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The previous progress info (omitted if new) From *ChangeItemInfo `protobuf:"bytes,2,opt,name=from,proto3,oneof" json:"from,omitempty"` - To *ChangeItemInfo `protobuf:"bytes,3,opt,name=to,proto3,oneof" json:"to,omitempty"` + // The current progress info (omitted if removed) + To *ChangeItemInfo `protobuf:"bytes,3,opt,name=to,proto3,oneof" json:"to,omitempty"` + // Extra metadata for this item + Metadata *ReportItemMetadata `protobuf:"bytes,4,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"` } func (x *ChangeItem) Reset() { *x = ChangeItem{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[7] + mi := &file_report_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -712,7 +754,7 @@ func (x *ChangeItem) String() string { func (*ChangeItem) ProtoMessage() {} func (x *ChangeItem) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[7] + mi := &file_report_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -725,7 +767,7 @@ func (x *ChangeItem) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeItem.ProtoReflect.Descriptor instead. func (*ChangeItem) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{7} + return file_report_proto_rawDescGZIP(), []int{9} } func (x *ChangeItem) GetName() string { @@ -749,19 +791,29 @@ func (x *ChangeItem) GetTo() *ChangeItemInfo { return nil } +func (x *ChangeItem) GetMetadata() *ReportItemMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +// Progress info for a section or function type ChangeItemInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The overall match percent for this item FuzzyMatchPercent float32 `protobuf:"fixed32,1,opt,name=fuzzy_match_percent,json=fuzzyMatchPercent,proto3" json:"fuzzy_match_percent,omitempty"` - Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + // The size of the item in bytes + Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` } func (x *ChangeItemInfo) Reset() { *x = ChangeItemInfo{} if protoimpl.UnsafeEnabled { - mi := &file_report_proto_msgTypes[8] + mi := &file_report_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -774,7 +826,7 @@ func (x *ChangeItemInfo) String() string { func (*ChangeItemInfo) ProtoMessage() {} func (x *ChangeItemInfo) ProtoReflect() protoreflect.Message { - mi := &file_report_proto_msgTypes[8] + mi := &file_report_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -787,7 +839,7 @@ func (x *ChangeItemInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeItemInfo.ProtoReflect.Descriptor instead. func (*ChangeItemInfo) Descriptor() ([]byte, []int) { - return file_report_proto_rawDescGZIP(), []int{8} + return file_report_proto_rawDescGZIP(), []int{10} } func (x *ChangeItemInfo) GetFuzzyMatchPercent() float32 { @@ -808,156 +860,147 @@ var File_report_proto protoreflect.FileDescriptor var file_report_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, - 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xe4, - 0x03, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x75, 0x7a, - 0x7a, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, + 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xb4, + 0x03, 0x0a, 0x08, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x66, + 0x75, 0x7a, 0x7a, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, + 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x12, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x70, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x52, 0x08, 0x6d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x69, 0x74, + 0x52, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x22, 0x9a, 0x02, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x4d, 0x65, + 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x52, 0x08, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, + 0x12, 0x36, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x05, - 0x75, 0x6e, 0x69, 0x74, 0x73, 0x22, 0xb0, 0x04, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x55, 0x6e, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x75, 0x7a, 0x7a, - 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x08, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x08, 0x73, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, - 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x74, - 0x65, 0x6d, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x22, 0xce, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x2e, 0x0a, 0x13, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, - 0x7a, 0x7a, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, - 0x2a, 0x0a, 0x0e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6d, 0x61, 0x6e, - 0x67, 0x6c, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x64, - 0x65, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x62, 0x0a, 0x0c, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x66, 0x72, 0x6f, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, - 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, - 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x26, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x97, 0x01, - 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, - 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, 0x6e, 0x69, 0x74, - 0x52, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x22, 0xb6, 0x03, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x5f, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x43, - 0x6f, 0x64, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x14, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x27, - 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x22, 0x88, 0x02, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, - 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x48, 0x01, 0x52, 0x02, 0x74, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x08, 0x73, 0x65, 0x63, + 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, + 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, - 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, - 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x74, 0x6f, 0x22, 0x9e, 0x01, 0x0a, 0x0a, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, - 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, - 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, - 0x66, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, - 0x6e, 0x66, 0x6f, 0x48, 0x01, 0x52, 0x02, 0x74, 0x6f, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x74, 0x6f, 0x22, 0x54, 0x0a, 0x0e, + 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x69, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0xde, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, + 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x22, 0xb6, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x2e, 0x0a, 0x13, + 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, 0x7a, 0x7a, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, + 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x95, + 0x01, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x0e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x67, 0x6c, + 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0d, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0e, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, + 0x11, 0x0a, 0x0f, 0x5f, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x62, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x66, 0x72, + 0x6f, 0x6d, 0x12, 0x26, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x93, 0x01, 0x0a, 0x07, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x52, 0x04, + 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x28, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x30, + 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, + 0x22, 0xd6, 0x02, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x48, 0x01, 0x52, 0x02, + 0x74, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, + 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x62, 0x6a, 0x64, + 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x02, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x74, 0x6f, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf0, 0x01, 0x0a, 0x0a, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x04, + 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x62, 0x6a, + 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x66, 0x72, + 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, + 0x6f, 0x48, 0x01, 0x52, 0x02, 0x74, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, + 0x62, 0x6a, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x48, 0x02, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, + 0x07, 0x0a, 0x05, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x74, 0x6f, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x54, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x66, 0x75, 0x7a, @@ -978,38 +1021,46 @@ func file_report_proto_rawDescGZIP() []byte { return file_report_proto_rawDescData } -var file_report_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_report_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_report_proto_goTypes = []any{ - (*Report)(nil), // 0: objdiff.report.Report - (*ReportUnit)(nil), // 1: objdiff.report.ReportUnit - (*ReportItem)(nil), // 2: objdiff.report.ReportItem - (*ChangesInput)(nil), // 3: objdiff.report.ChangesInput - (*Changes)(nil), // 4: objdiff.report.Changes - (*ChangeInfo)(nil), // 5: objdiff.report.ChangeInfo - (*ChangeUnit)(nil), // 6: objdiff.report.ChangeUnit - (*ChangeItem)(nil), // 7: objdiff.report.ChangeItem - (*ChangeItemInfo)(nil), // 8: objdiff.report.ChangeItemInfo + (*Measures)(nil), // 0: objdiff.report.Measures + (*Report)(nil), // 1: objdiff.report.Report + (*ReportUnit)(nil), // 2: objdiff.report.ReportUnit + (*ReportUnitMetadata)(nil), // 3: objdiff.report.ReportUnitMetadata + (*ReportItem)(nil), // 4: objdiff.report.ReportItem + (*ReportItemMetadata)(nil), // 5: objdiff.report.ReportItemMetadata + (*ChangesInput)(nil), // 6: objdiff.report.ChangesInput + (*Changes)(nil), // 7: objdiff.report.Changes + (*ChangeUnit)(nil), // 8: objdiff.report.ChangeUnit + (*ChangeItem)(nil), // 9: objdiff.report.ChangeItem + (*ChangeItemInfo)(nil), // 10: objdiff.report.ChangeItemInfo } var file_report_proto_depIdxs = []int32{ - 1, // 0: objdiff.report.Report.units:type_name -> objdiff.report.ReportUnit - 2, // 1: objdiff.report.ReportUnit.sections:type_name -> objdiff.report.ReportItem - 2, // 2: objdiff.report.ReportUnit.functions:type_name -> objdiff.report.ReportItem - 0, // 3: objdiff.report.ChangesInput.from:type_name -> objdiff.report.Report - 0, // 4: objdiff.report.ChangesInput.to:type_name -> objdiff.report.Report - 5, // 5: objdiff.report.Changes.from:type_name -> objdiff.report.ChangeInfo - 5, // 6: objdiff.report.Changes.to:type_name -> objdiff.report.ChangeInfo - 6, // 7: objdiff.report.Changes.units:type_name -> objdiff.report.ChangeUnit - 5, // 8: objdiff.report.ChangeUnit.from:type_name -> objdiff.report.ChangeInfo - 5, // 9: objdiff.report.ChangeUnit.to:type_name -> objdiff.report.ChangeInfo - 7, // 10: objdiff.report.ChangeUnit.sections:type_name -> objdiff.report.ChangeItem - 7, // 11: objdiff.report.ChangeUnit.functions:type_name -> objdiff.report.ChangeItem - 8, // 12: objdiff.report.ChangeItem.from:type_name -> objdiff.report.ChangeItemInfo - 8, // 13: objdiff.report.ChangeItem.to:type_name -> objdiff.report.ChangeItemInfo - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 0, // 0: objdiff.report.Report.measures:type_name -> objdiff.report.Measures + 2, // 1: objdiff.report.Report.units:type_name -> objdiff.report.ReportUnit + 0, // 2: objdiff.report.ReportUnit.measures:type_name -> objdiff.report.Measures + 4, // 3: objdiff.report.ReportUnit.sections:type_name -> objdiff.report.ReportItem + 4, // 4: objdiff.report.ReportUnit.functions:type_name -> objdiff.report.ReportItem + 3, // 5: objdiff.report.ReportUnit.metadata:type_name -> objdiff.report.ReportUnitMetadata + 5, // 6: objdiff.report.ReportItem.metadata:type_name -> objdiff.report.ReportItemMetadata + 1, // 7: objdiff.report.ChangesInput.from:type_name -> objdiff.report.Report + 1, // 8: objdiff.report.ChangesInput.to:type_name -> objdiff.report.Report + 0, // 9: objdiff.report.Changes.from:type_name -> objdiff.report.Measures + 0, // 10: objdiff.report.Changes.to:type_name -> objdiff.report.Measures + 8, // 11: objdiff.report.Changes.units:type_name -> objdiff.report.ChangeUnit + 0, // 12: objdiff.report.ChangeUnit.from:type_name -> objdiff.report.Measures + 0, // 13: objdiff.report.ChangeUnit.to:type_name -> objdiff.report.Measures + 9, // 14: objdiff.report.ChangeUnit.sections:type_name -> objdiff.report.ChangeItem + 9, // 15: objdiff.report.ChangeUnit.functions:type_name -> objdiff.report.ChangeItem + 3, // 16: objdiff.report.ChangeUnit.metadata:type_name -> objdiff.report.ReportUnitMetadata + 10, // 17: objdiff.report.ChangeItem.from:type_name -> objdiff.report.ChangeItemInfo + 10, // 18: objdiff.report.ChangeItem.to:type_name -> objdiff.report.ChangeItemInfo + 5, // 19: objdiff.report.ChangeItem.metadata:type_name -> objdiff.report.ReportItemMetadata + 20, // [20:20] is the sub-list for method output_type + 20, // [20:20] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_report_proto_init() } @@ -1019,7 +1070,7 @@ func file_report_proto_init() { } if !protoimpl.UnsafeEnabled { file_report_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Report); i { + switch v := v.(*Measures); i { case 0: return &v.state case 1: @@ -1031,7 +1082,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*ReportUnit); i { + switch v := v.(*Report); i { case 0: return &v.state case 1: @@ -1043,7 +1094,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*ReportItem); i { + switch v := v.(*ReportUnit); i { case 0: return &v.state case 1: @@ -1055,7 +1106,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*ChangesInput); i { + switch v := v.(*ReportUnitMetadata); i { case 0: return &v.state case 1: @@ -1067,7 +1118,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*Changes); i { + switch v := v.(*ReportItem); i { case 0: return &v.state case 1: @@ -1079,7 +1130,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*ChangeInfo); i { + switch v := v.(*ReportItemMetadata); i { case 0: return &v.state case 1: @@ -1091,7 +1142,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*ChangeUnit); i { + switch v := v.(*ChangesInput); i { case 0: return &v.state case 1: @@ -1103,7 +1154,7 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*ChangeItem); i { + switch v := v.(*Changes); i { case 0: return &v.state case 1: @@ -1115,6 +1166,30 @@ func file_report_proto_init() { } } file_report_proto_msgTypes[8].Exporter = func(v any, i int) any { + switch v := v.(*ChangeUnit); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_report_proto_msgTypes[9].Exporter = func(v any, i int) any { + switch v := v.(*ChangeItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_report_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*ChangeItemInfo); i { case 0: return &v.state @@ -1127,17 +1202,19 @@ func file_report_proto_init() { } } } - file_report_proto_msgTypes[1].OneofWrappers = []any{} file_report_proto_msgTypes[2].OneofWrappers = []any{} - file_report_proto_msgTypes[6].OneofWrappers = []any{} - file_report_proto_msgTypes[7].OneofWrappers = []any{} + file_report_proto_msgTypes[3].OneofWrappers = []any{} + file_report_proto_msgTypes[4].OneofWrappers = []any{} + file_report_proto_msgTypes[5].OneofWrappers = []any{} + file_report_proto_msgTypes[8].OneofWrappers = []any{} + file_report_proto_msgTypes[9].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_report_proto_rawDesc, NumEnums: 0, - NumMessages: 9, + NumMessages: 11, NumExtensions: 0, NumServices: 0, },