diff --git a/bigquery/storage/managedwriter/adapt/protoconversion.go b/bigquery/storage/managedwriter/adapt/protoconversion.go index 35791f668a9..fc4a4a35c6a 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion.go @@ -286,46 +286,68 @@ func storageSchemaToDescriptorInternal(inSchema *storagepb.TableSchema, scope st // // Messages are always nullable, and repeated fields are as well. func tableFieldSchemaToFieldDescriptorProto(field *storagepb.TableFieldSchema, idx int32, scope string, useProto3 bool) (*descriptorpb.FieldDescriptorProto, error) { + name := strings.ToLower(field.GetName()) + var fdp *descriptorpb.FieldDescriptorProto + if field.GetType() == storagepb.TableFieldSchema_STRUCT { - return &descriptorpb.FieldDescriptorProto{ + fdp = &descriptorpb.FieldDescriptorProto{ Name: proto.String(name), Number: proto.Int32(idx), TypeName: proto.String(scope), Label: convertModeToLabel(field.GetMode(), useProto3), - }, nil - } - - // For (REQUIRED||REPEATED) fields for proto3, or all cases for proto2, we can use the expected scalar types. - if field.GetMode() != storagepb.TableFieldSchema_NULLABLE || !useProto3 { - outType := bqTypeToFieldTypeMap[field.GetType()] - fdp := &descriptorpb.FieldDescriptorProto{ - Name: proto.String(name), - Number: proto.Int32(idx), - Type: outType.Enum(), - Label: convertModeToLabel(field.GetMode(), useProto3), } - // Special case: proto2 repeated fields may benefit from using packed annotation. - if field.GetMode() == storagepb.TableFieldSchema_REPEATED && !useProto3 { - for _, v := range packedTypes { - if outType == v { - fdp.Options = &descriptorpb.FieldOptions{ - Packed: proto.Bool(true), + } else { + // For (REQUIRED||REPEATED) fields for proto3, or all cases for proto2, we can use the expected scalar types. + if field.GetMode() != storagepb.TableFieldSchema_NULLABLE || !useProto3 { + outType := bqTypeToFieldTypeMap[field.GetType()] + fdp = &descriptorpb.FieldDescriptorProto{ + Name: proto.String(name), + Number: proto.Int32(idx), + Type: outType.Enum(), + Label: convertModeToLabel(field.GetMode(), useProto3), + } + + // Special case: proto2 repeated fields may benefit from using packed annotation. + if field.GetMode() == storagepb.TableFieldSchema_REPEATED && !useProto3 { + for _, v := range packedTypes { + if outType == v { + fdp.Options = &descriptorpb.FieldOptions{ + Packed: proto.Bool(true), + } + break } - break } } + } else { + // For NULLABLE proto3 fields, use a wrapper type. + fdp = &descriptorpb.FieldDescriptorProto{ + Name: proto.String(name), + Number: proto.Int32(idx), + Type: descriptorpb.FieldDescriptorProto_TYPE_MESSAGE.Enum(), + TypeName: proto.String(bqTypeToWrapperMap[field.GetType()]), + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(), + } + } + } + if nameRequiresAnnotation(name) { + // Use a prefix + base64 encoded name when annotations bear the actual name. + // Base 64 standard encoding may also contain certain characters (+,/,=) which + // we remove from the generated name. + encoded := strings.Trim(base64.StdEncoding.EncodeToString([]byte(name)), "+/=") + fdp.Name = proto.String(fmt.Sprintf("col_%s", encoded)) + opts := fdp.GetOptions() + if opts == nil { + fdp.Options = &descriptorpb.FieldOptions{} } - return fdp, nil + proto.SetExtension(fdp.Options, storagepb.E_ColumnName, name) } - // For NULLABLE proto3 fields, use a wrapper type. - return &descriptorpb.FieldDescriptorProto{ - Name: proto.String(name), - Number: proto.Int32(idx), - Type: descriptorpb.FieldDescriptorProto_TYPE_MESSAGE.Enum(), - TypeName: proto.String(bqTypeToWrapperMap[field.GetType()]), - Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(), - }, nil + return fdp, nil +} + +// nameRequiresAnnotation determines whether a field name requires unicode-annotation. +func nameRequiresAnnotation(in string) bool { + return !protoreflect.Name(in).IsValid() } // NormalizeDescriptor builds a self-contained DescriptorProto suitable for communicating schema diff --git a/bigquery/storage/managedwriter/adapt/protoconversion_test.go b/bigquery/storage/managedwriter/adapt/protoconversion_test.go index 8444b6f0d38..21cef98e1bb 100644 --- a/bigquery/storage/managedwriter/adapt/protoconversion_test.go +++ b/bigquery/storage/managedwriter/adapt/protoconversion_test.go @@ -413,6 +413,59 @@ func TestSchemaToProtoConversion(t *testing.T) { }, }, }, + { + description: "indirect names", + bq: &storagepb.TableSchema{ + Fields: []*storagepb.TableFieldSchema{ + {Name: "foo", Type: storagepb.TableFieldSchema_STRING, Mode: storagepb.TableFieldSchema_NULLABLE}, + {Name: "火", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_REQUIRED}, + {Name: "水_addict", Type: storagepb.TableFieldSchema_BYTES, Mode: storagepb.TableFieldSchema_REPEATED}, + {Name: "0col", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_NULLABLE}, + {Name: "funny-name", Type: storagepb.TableFieldSchema_INT64, Mode: storagepb.TableFieldSchema_NULLABLE}, + }}, + wantProto2: func() *descriptorpb.DescriptorProto { + dp := &descriptorpb.DescriptorProto{ + Name: proto.String("root"), + Field: []*descriptorpb.FieldDescriptorProto{ + { + Name: proto.String("foo"), + Number: proto.Int32(1), + Type: descriptorpb.FieldDescriptorProto_TYPE_STRING.Enum(), + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, + { + Name: proto.String("col_54Gr"), + Number: proto.Int32(2), + Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_REQUIRED.Enum()}, + { + Name: proto.String("col_5rC0X2FkZGljdA"), + Number: proto.Int32(3), + Type: descriptorpb.FieldDescriptorProto_TYPE_BYTES.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_REPEATED.Enum(), + }, + { + Name: proto.String("col_MGNvbA"), + Number: proto.Int32(4), + Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, + { + Name: proto.String("col_ZnVubnktbmFtZQ"), + Number: proto.Int32(5), + Type: descriptorpb.FieldDescriptorProto_TYPE_INT64.Enum(), + Options: &descriptorpb.FieldOptions{}, + Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum()}, + }, + } + proto.SetExtension(dp.Field[1].Options, storagepb.E_ColumnName, "火") + proto.SetExtension(dp.Field[2].Options, storagepb.E_ColumnName, "水_addict") + proto.SetExtension(dp.Field[3].Options, storagepb.E_ColumnName, "0col") + proto.SetExtension(dp.Field[4].Options, storagepb.E_ColumnName, "funny-name") + return dp + }(), + }, } for _, tc := range testCases { // Proto2 diff --git a/bigquery/storage/managedwriter/testdata/schemas.go b/bigquery/storage/managedwriter/testdata/schemas.go index dfbb7a980d8..a31679d7d48 100644 --- a/bigquery/storage/managedwriter/testdata/schemas.go +++ b/bigquery/storage/managedwriter/testdata/schemas.go @@ -257,4 +257,19 @@ var ( Repeated: true, }, } + + ValidationColumnAnnotations bigquery.Schema = bigquery.Schema{ + { + Name: "first", + Type: bigquery.StringFieldType, + }, + { + Name: "second", + Type: bigquery.StringFieldType, + }, + { + Name: "特別コラム", + Type: bigquery.StringFieldType, + }, + } ) diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go index 5dd87e5403e..463d1e716a8 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.pb.go @@ -16,7 +16,7 @@ // versions: // protoc-gen-go v1.28.0 // protoc v3.17.3 -// source: validation_proto2.proto +// source: testdata/validation_proto2.proto package testdata @@ -24,6 +24,7 @@ import ( reflect "reflect" sync "sync" + _ "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) @@ -71,11 +72,11 @@ func (x Proto2ExampleEnum) String() string { } func (Proto2ExampleEnum) Descriptor() protoreflect.EnumDescriptor { - return file_validation_proto2_proto_enumTypes[0].Descriptor() + return file_testdata_validation_proto2_proto_enumTypes[0].Descriptor() } func (Proto2ExampleEnum) Type() protoreflect.EnumType { - return &file_validation_proto2_proto_enumTypes[0] + return &file_testdata_validation_proto2_proto_enumTypes[0] } func (x Proto2ExampleEnum) Number() protoreflect.EnumNumber { @@ -94,7 +95,7 @@ func (x *Proto2ExampleEnum) UnmarshalJSON(b []byte) error { // Deprecated: Use Proto2ExampleEnum.Descriptor instead. func (Proto2ExampleEnum) EnumDescriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{0} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{0} } // Validation message in proto2 syntax with all @@ -125,7 +126,7 @@ type ValidationP2Required struct { func (x *ValidationP2Required) Reset() { *x = ValidationP2Required{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[0] + mi := &file_testdata_validation_proto2_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -138,7 +139,7 @@ func (x *ValidationP2Required) String() string { func (*ValidationP2Required) ProtoMessage() {} func (x *ValidationP2Required) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[0] + mi := &file_testdata_validation_proto2_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -151,7 +152,7 @@ func (x *ValidationP2Required) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2Required.ProtoReflect.Descriptor instead. func (*ValidationP2Required) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{0} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{0} } func (x *ValidationP2Required) GetDoubleField() float64 { @@ -280,7 +281,7 @@ type ValidationP2Optional struct { func (x *ValidationP2Optional) Reset() { *x = ValidationP2Optional{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[1] + mi := &file_testdata_validation_proto2_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -293,7 +294,7 @@ func (x *ValidationP2Optional) String() string { func (*ValidationP2Optional) ProtoMessage() {} func (x *ValidationP2Optional) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[1] + mi := &file_testdata_validation_proto2_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -306,7 +307,7 @@ func (x *ValidationP2Optional) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2Optional.ProtoReflect.Descriptor instead. func (*ValidationP2Optional) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{1} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{1} } func (x *ValidationP2Optional) GetDoubleField() float64 { @@ -457,7 +458,7 @@ var ( func (x *ValidationP2OptionalWithDefaults) Reset() { *x = ValidationP2OptionalWithDefaults{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[2] + mi := &file_testdata_validation_proto2_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -470,7 +471,7 @@ func (x *ValidationP2OptionalWithDefaults) String() string { func (*ValidationP2OptionalWithDefaults) ProtoMessage() {} func (x *ValidationP2OptionalWithDefaults) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[2] + mi := &file_testdata_validation_proto2_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -483,7 +484,7 @@ func (x *ValidationP2OptionalWithDefaults) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2OptionalWithDefaults.ProtoReflect.Descriptor instead. func (*ValidationP2OptionalWithDefaults) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{2} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{2} } func (x *ValidationP2OptionalWithDefaults) GetDoubleField() float64 { @@ -608,7 +609,7 @@ type ValidationP2UnpackedRepeated struct { func (x *ValidationP2UnpackedRepeated) Reset() { *x = ValidationP2UnpackedRepeated{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[3] + mi := &file_testdata_validation_proto2_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -621,7 +622,7 @@ func (x *ValidationP2UnpackedRepeated) String() string { func (*ValidationP2UnpackedRepeated) ProtoMessage() {} func (x *ValidationP2UnpackedRepeated) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[3] + mi := &file_testdata_validation_proto2_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -634,7 +635,7 @@ func (x *ValidationP2UnpackedRepeated) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2UnpackedRepeated.ProtoReflect.Descriptor instead. func (*ValidationP2UnpackedRepeated) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{3} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{3} } func (x *ValidationP2UnpackedRepeated) GetId() int64 { @@ -752,7 +753,7 @@ type ValidationP2PackedRepeated struct { func (x *ValidationP2PackedRepeated) Reset() { *x = ValidationP2PackedRepeated{} if protoimpl.UnsafeEnabled { - mi := &file_validation_proto2_proto_msgTypes[4] + mi := &file_testdata_validation_proto2_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -765,7 +766,7 @@ func (x *ValidationP2PackedRepeated) String() string { func (*ValidationP2PackedRepeated) ProtoMessage() {} func (x *ValidationP2PackedRepeated) ProtoReflect() protoreflect.Message { - mi := &file_validation_proto2_proto_msgTypes[4] + mi := &file_testdata_validation_proto2_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -778,7 +779,7 @@ func (x *ValidationP2PackedRepeated) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidationP2PackedRepeated.ProtoReflect.Descriptor instead. func (*ValidationP2PackedRepeated) Descriptor() ([]byte, []int) { - return file_validation_proto2_proto_rawDescGZIP(), []int{4} + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{4} } func (x *ValidationP2PackedRepeated) GetId() int64 { @@ -872,227 +873,306 @@ func (x *ValidationP2PackedRepeated) GetEnumRepeated() []Proto2ExampleEnum { return nil } -var File_validation_proto2_proto protoreflect.FileDescriptor - -var file_validation_proto2_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x74, 0x65, 0x73, 0x74, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x02, - 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, - 0x20, 0x02, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x04, 0x20, 0x02, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x02, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, - 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x02, 0x28, 0x12, 0x52, 0x0b, - 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x02, - 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x02, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, +// Validating the behavior of column annotations to remap from a given +// proto field name to a custom BigQuery column name. +type ValidationP2ColumnAnnotations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + First *string `protobuf:"bytes,1,opt,name=first" json:"first,omitempty"` + Second *string `protobuf:"bytes,2,opt,name=second" json:"second,omitempty"` + Third *string `protobuf:"bytes,3,opt,name=third" json:"third,omitempty"` +} + +func (x *ValidationP2ColumnAnnotations) Reset() { + *x = ValidationP2ColumnAnnotations{} + if protoimpl.UnsafeEnabled { + mi := &file_testdata_validation_proto2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidationP2ColumnAnnotations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidationP2ColumnAnnotations) ProtoMessage() {} + +func (x *ValidationP2ColumnAnnotations) ProtoReflect() protoreflect.Message { + mi := &file_testdata_validation_proto2_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 ValidationP2ColumnAnnotations.ProtoReflect.Descriptor instead. +func (*ValidationP2ColumnAnnotations) Descriptor() ([]byte, []int) { + return file_testdata_validation_proto2_proto_rawDescGZIP(), []int{5} +} + +func (x *ValidationP2ColumnAnnotations) GetFirst() string { + if x != nil && x.First != nil { + return *x.First + } + return "" +} + +func (x *ValidationP2ColumnAnnotations) GetSecond() string { + if x != nil && x.Second != nil { + return *x.Second + } + return "" +} + +func (x *ValidationP2ColumnAnnotations) GetThird() string { + if x != nil && x.Third != nil { + return *x.Third + } + return "" +} + +var File_testdata_validation_proto2_proto protoreflect.FileDescriptor + +var file_testdata_validation_proto2_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x08, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x32, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x32, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x01, 0x52, + 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, + 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x02, + 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, + 0x02, 0x28, 0x03, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x05, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x07, 0x20, 0x02, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x02, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, + 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x02, 0x28, 0x07, 0x52, + 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x0b, 0x20, 0x02, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, + 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x02, 0x28, 0x08, 0x52, + 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x02, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x02, + 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, + 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x02, + 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, + 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x97, 0x04, 0x0a, 0x14, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x02, 0x28, 0x10, 0x52, - 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x02, - 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, - 0x02, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x0f, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x10, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, - 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x97, 0x04, - 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, - 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, - 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, - 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, - 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, - 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xff, 0x04, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x57, 0x69, 0x74, 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x01, 0x3a, 0x04, 0x31, 0x2e, 0x31, 0x31, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x32, 0x2e, 0x32, 0x32, - 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x0b, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x3a, 0x01, 0x33, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x22, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x01, 0x34, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x35, 0x52, 0x0b, 0x75, - 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, - 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, - 0x3a, 0x01, 0x37, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x01, 0x38, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, - 0x34, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x26, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, - 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x01, 0x39, - 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, - 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x31, 0x31, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, - 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x66, 0x69, - 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x10, 0x3a, 0x02, 0x31, 0x32, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x09, - 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x3a, - 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, 0x0b, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0c, 0x3a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4a, 0x0a, - 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0e, - 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x52, 0x09, - 0x65, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x1c, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x6f, - 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0d, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, - 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x12, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0f, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, - 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0f, 0x52, + 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, + 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x22, 0xff, 0x04, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x57, 0x69, 0x74, + 0x68, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x3a, + 0x04, 0x31, 0x2e, 0x31, 0x31, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x32, 0x2e, 0x32, 0x32, 0x52, 0x0a, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x01, + 0x33, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, + 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x3a, 0x01, 0x34, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x35, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x3a, 0x01, 0x37, + 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x24, 0x0a, + 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x12, 0x3a, 0x01, 0x38, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x12, 0x26, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x01, 0x39, 0x52, 0x0c, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x31, 0x31, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, + 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, + 0x36, 0x34, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x02, + 0x31, 0x32, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x09, 0x62, 0x6f, 0x6f, + 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x31, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x0e, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x0e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0a, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x4a, 0x0a, 0x0a, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, + 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0e, 0x50, 0x32, 0x5f, + 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x52, 0x09, 0x65, 0x6e, 0x75, + 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, + 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, + 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, + 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, + 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x29, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, - 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, - 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x52, - 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, - 0x6d, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, - 0xe1, 0x04, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, - 0x0a, 0x0f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x66, - 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x02, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x69, - 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, - 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, - 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, - 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x11, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, - 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, 0x42, - 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, 0x10, - 0x01, 0x52, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x02, 0x10, - 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x42, 0x02, 0x10, 0x01, 0x52, - 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, - 0x0d, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, - 0x6d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x2a, 0x5b, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x32, 0x5f, 0x55, - 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x32, - 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x4f, - 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, - 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x03, - 0x42, 0x3d, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, + 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, + 0x03, 0x28, 0x10, 0x52, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x52, 0x0c, 0x62, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0c, + 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0xe1, 0x04, 0x0a, + 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x32, 0x50, 0x61, 0x63, + 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x01, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x61, + 0x74, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x02, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, + 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x29, + 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x75, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0d, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x42, + 0x02, 0x10, 0x01, 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x12, 0x42, 0x02, 0x10, 0x01, + 0x52, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x2d, 0x0a, 0x10, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x07, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0f, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x02, 0x10, 0x01, 0x52, 0x10, + 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x10, 0x42, 0x02, 0x10, 0x01, 0x52, + 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x27, 0x0a, 0x0d, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x08, 0x42, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x62, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x32, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x66, 0x69, 0x72, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xaa, 0x9b, 0xbc, 0xc7, 0x0d, 0x0f, + 0xe7, 0x89, 0xb9, 0xe5, 0x88, 0xa5, 0xe3, 0x82, 0xb3, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0, 0x52, + 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xaa, 0x9b, 0xbc, 0xc7, 0x0d, 0x06, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2a, 0x5b, 0x0a, 0x11, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x32, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x32, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, + 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x42, 0x3d, 0x5a, 0x3b, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, + 0x62, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x74, + 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, } var ( - file_validation_proto2_proto_rawDescOnce sync.Once - file_validation_proto2_proto_rawDescData = file_validation_proto2_proto_rawDesc + file_testdata_validation_proto2_proto_rawDescOnce sync.Once + file_testdata_validation_proto2_proto_rawDescData = file_testdata_validation_proto2_proto_rawDesc ) -func file_validation_proto2_proto_rawDescGZIP() []byte { - file_validation_proto2_proto_rawDescOnce.Do(func() { - file_validation_proto2_proto_rawDescData = protoimpl.X.CompressGZIP(file_validation_proto2_proto_rawDescData) +func file_testdata_validation_proto2_proto_rawDescGZIP() []byte { + file_testdata_validation_proto2_proto_rawDescOnce.Do(func() { + file_testdata_validation_proto2_proto_rawDescData = protoimpl.X.CompressGZIP(file_testdata_validation_proto2_proto_rawDescData) }) - return file_validation_proto2_proto_rawDescData + return file_testdata_validation_proto2_proto_rawDescData } -var file_validation_proto2_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_validation_proto2_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_validation_proto2_proto_goTypes = []interface{}{ +var file_testdata_validation_proto2_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_testdata_validation_proto2_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_testdata_validation_proto2_proto_goTypes = []interface{}{ (Proto2ExampleEnum)(0), // 0: testdata.Proto2ExampleEnum (*ValidationP2Required)(nil), // 1: testdata.ValidationP2Required (*ValidationP2Optional)(nil), // 2: testdata.ValidationP2Optional (*ValidationP2OptionalWithDefaults)(nil), // 3: testdata.ValidationP2OptionalWithDefaults (*ValidationP2UnpackedRepeated)(nil), // 4: testdata.ValidationP2UnpackedRepeated (*ValidationP2PackedRepeated)(nil), // 5: testdata.ValidationP2PackedRepeated + (*ValidationP2ColumnAnnotations)(nil), // 6: testdata.ValidationP2ColumnAnnotations } -var file_validation_proto2_proto_depIdxs = []int32{ +var file_testdata_validation_proto2_proto_depIdxs = []int32{ 0, // 0: testdata.ValidationP2Required.enum_field:type_name -> testdata.Proto2ExampleEnum 0, // 1: testdata.ValidationP2Optional.enum_field:type_name -> testdata.Proto2ExampleEnum 0, // 2: testdata.ValidationP2OptionalWithDefaults.enum_field:type_name -> testdata.Proto2ExampleEnum @@ -1105,13 +1185,13 @@ var file_validation_proto2_proto_depIdxs = []int32{ 0, // [0:5] is the sub-list for field type_name } -func init() { file_validation_proto2_proto_init() } -func file_validation_proto2_proto_init() { - if File_validation_proto2_proto != nil { +func init() { file_testdata_validation_proto2_proto_init() } +func file_testdata_validation_proto2_proto_init() { + if File_testdata_validation_proto2_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_validation_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2Required); i { case 0: return &v.state @@ -1123,7 +1203,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2Optional); i { case 0: return &v.state @@ -1135,7 +1215,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2OptionalWithDefaults); i { case 0: return &v.state @@ -1147,7 +1227,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2UnpackedRepeated); i { case 0: return &v.state @@ -1159,7 +1239,7 @@ func file_validation_proto2_proto_init() { return nil } } - file_validation_proto2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_testdata_validation_proto2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationP2PackedRepeated); i { case 0: return &v.state @@ -1171,24 +1251,36 @@ func file_validation_proto2_proto_init() { return nil } } + file_testdata_validation_proto2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidationP2ColumnAnnotations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_validation_proto2_proto_rawDesc, + RawDescriptor: file_testdata_validation_proto2_proto_rawDesc, NumEnums: 1, - NumMessages: 5, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_validation_proto2_proto_goTypes, - DependencyIndexes: file_validation_proto2_proto_depIdxs, - EnumInfos: file_validation_proto2_proto_enumTypes, - MessageInfos: file_validation_proto2_proto_msgTypes, + GoTypes: file_testdata_validation_proto2_proto_goTypes, + DependencyIndexes: file_testdata_validation_proto2_proto_depIdxs, + EnumInfos: file_testdata_validation_proto2_proto_enumTypes, + MessageInfos: file_testdata_validation_proto2_proto_msgTypes, }.Build() - File_validation_proto2_proto = out.File - file_validation_proto2_proto_rawDesc = nil - file_validation_proto2_proto_goTypes = nil - file_validation_proto2_proto_depIdxs = nil + File_testdata_validation_proto2_proto = out.File + file_testdata_validation_proto2_proto_rawDesc = nil + file_testdata_validation_proto2_proto_goTypes = nil + file_testdata_validation_proto2_proto_depIdxs = nil } diff --git a/bigquery/storage/managedwriter/testdata/validation_proto2.proto b/bigquery/storage/managedwriter/testdata/validation_proto2.proto index 7cf932385a9..160a7c5761a 100644 --- a/bigquery/storage/managedwriter/testdata/validation_proto2.proto +++ b/bigquery/storage/managedwriter/testdata/validation_proto2.proto @@ -15,6 +15,10 @@ syntax = "proto2"; package testdata; + +// Source protos located in github.com/googleapis/googleapis +import "google/cloud/bigquery/storage/v1/annotations.proto"; + option go_package = "cloud.google.com/go/bigquery/storage/managedwriter/testdata"; @@ -120,4 +124,12 @@ message ValidationP2PackedRepeated { repeated sfixed64 sfixed64_repeated = 11 [packed = true]; repeated bool bool_repeated = 12 [packed = true]; repeated Proto2ExampleEnum enum_repeated = 13 [packed = true]; +} + +// Validating the behavior of column annotations to remap from a given +// proto field name to a custom BigQuery column name. +message ValidationP2ColumnAnnotations { + optional string first = 1; + optional string second = 2 [(google.cloud.bigquery.storage.v1.column_name) = "特別コラム"]; + optional string third = 3 [(google.cloud.bigquery.storage.v1.column_name) = "second"]; } \ No newline at end of file diff --git a/bigquery/storage/managedwriter/testutils_test.go b/bigquery/storage/managedwriter/testutils_test.go index 96784e5bad4..97f876776f2 100644 --- a/bigquery/storage/managedwriter/testutils_test.go +++ b/bigquery/storage/managedwriter/testutils_test.go @@ -44,7 +44,7 @@ func validateTableConstraints(ctx context.Context, t *testing.T, client *bigquer var i int for _, c := range vi.constraints { if i > 0 { - sql.WriteString(",") + sql.WriteString(",\n") } sql.WriteString(c.projection) i++ @@ -53,7 +53,7 @@ func validateTableConstraints(ctx context.Context, t *testing.T, client *bigquer q := client.Query(sql.String()) it, err := q.Read(ctx) if err != nil { - t.Errorf("%q: failed to issue validation query: %v", description, err) + t.Errorf("%q: failed to issue validation query: %v\nSQL: %s", description, err, sql.String()) return } var resultrow []bigquery.Value @@ -120,7 +120,7 @@ func withExactRowCount(totalRows int64) constraintOption { return func(vi *validationInfo) { resultCol := "total_rows" vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNT(1) AS %s", resultCol), + projection: fmt.Sprintf("COUNT(1) AS `%s`", resultCol), expectedValue: totalRows, } } @@ -131,7 +131,7 @@ func withNullCount(colname string, nullCount int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("nullcol_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("SUM(IF(%s IS NULL,1,0)) AS %s", colname, resultCol), + projection: fmt.Sprintf("SUM(IF(`%s` IS NULL,1,0)) AS `%s`", colname, resultCol), expectedValue: nullCount, } } @@ -142,7 +142,7 @@ func withNonNullCount(colname string, nonNullCount int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("nonnullcol_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("SUM(IF(%s IS NOT NULL,1,0)) AS %s", colname, resultCol), + projection: fmt.Sprintf("SUM(IF(`%s` IS NOT NULL,1,0)) AS `%s`", colname, resultCol), expectedValue: nonNullCount, } } @@ -153,7 +153,7 @@ func withDistinctValues(colname string, distinctVals int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("distinct_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNT(DISTINCT %s) AS %s", colname, resultCol), + projection: fmt.Sprintf("COUNT(DISTINCT `%s`) AS `%s`", colname, resultCol), expectedValue: distinctVals, } } @@ -164,7 +164,7 @@ func withApproxDistinctValues(colname string, approxValues int64, errorBound int return func(vi *validationInfo) { resultCol := fmt.Sprintf("distinct_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("APPROX_COUNT_DISTINCT(%s) AS %s", colname, resultCol), + projection: fmt.Sprintf("APPROX_COUNT_DISTINCT(`%s`) AS `%s`", colname, resultCol), expectedValue: approxValues, allowedError: errorBound, } @@ -176,7 +176,7 @@ func withIntegerValueCount(colname string, wantValue int64, valueCount int64) co return func(vi *validationInfo) { resultCol := fmt.Sprintf("integer_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = %d) AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = %d) AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -187,7 +187,7 @@ func withStringValueCount(colname string, wantValue string, valueCount int64) co return func(vi *validationInfo) { resultCol := fmt.Sprintf("string_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = \"%s\") AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = \"%s\") AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -198,7 +198,7 @@ func withBoolValueCount(colname string, wantValue bool, valueCount int64) constr return func(vi *validationInfo) { resultCol := fmt.Sprintf("bool_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = %t) AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = %t) AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -209,7 +209,7 @@ func withBytesValueCount(colname string, wantValue []byte, valueCount int64) con return func(vi *validationInfo) { resultCol := fmt.Sprintf("bytes_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(%s = B\"%s\") AS %s", colname, wantValue, resultCol), + projection: fmt.Sprintf("COUNTIF(`%s` = B\"%s\") AS `%s`", colname, wantValue, resultCol), expectedValue: valueCount, } } @@ -220,15 +220,15 @@ func withBytesValueCount(colname string, wantValue []byte, valueCount int64) con func withFloatValueCount(colname string, wantValue float64, valueCount int64) constraintOption { return func(vi *validationInfo) { resultCol := fmt.Sprintf("float_value_count_%s", colname) - projection := fmt.Sprintf("COUNTIF((ABS(%s) - ABS(%f))/ABS(%f) < 0.0001) AS %s", colname, wantValue, wantValue, resultCol) + projection := fmt.Sprintf("COUNTIF((ABS(`%s`) - ABS(%f))/ABS(%f) < 0.0001) AS `%s`", colname, wantValue, wantValue, resultCol) switch wantValue { case math.Inf(0): // special case for infinities. - projection = fmt.Sprintf("COUNTIF(IS_INF(%s)) as %s", colname, resultCol) + projection = fmt.Sprintf("COUNTIF(IS_INF(`%s`)) as `%s`", colname, resultCol) case math.NaN(): - projection = fmt.Sprintf("COUNTIF(IS_NAN(%s)) as %s", colname, resultCol) + projection = fmt.Sprintf("COUNTIF(IS_NAN(%s)) as `%s`", colname, resultCol) case 0: - projection = fmt.Sprintf("COUNTIF(SIGN(%s) = 0) as %s", colname, resultCol) + projection = fmt.Sprintf("COUNTIF(SIGN(`%s`) = 0) as `%s`", colname, resultCol) } vi.constraints[resultCol] = &constraint{ projection: projection, @@ -242,7 +242,7 @@ func withArrayLength(colname string, wantLen int64, wantCount int64) constraintO return func(vi *validationInfo) { resultCol := fmt.Sprintf("arraylength_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(%s) = %d) as %s", colname, wantLen, resultCol), + projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(`%s`) = %d) as `%s`", colname, wantLen, resultCol), expectedValue: wantCount, } } @@ -253,7 +253,7 @@ func withDistinctArrayValues(colname string, distinctVals, wantCount int64) cons return func(vi *validationInfo) { resultCol := fmt.Sprintf("distinct_array_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(ARRAY(SELECT DISTINCT element FROM UNNEST(%s) as element)) = %d) AS %s", colname, distinctVals, resultCol), + projection: fmt.Sprintf("COUNTIF(ARRAY_LENGTH(ARRAY(SELECT DISTINCT element FROM UNNEST(`%s`) as element)) = %d) AS `%s`", colname, distinctVals, resultCol), expectedValue: wantCount, } } @@ -264,7 +264,7 @@ func withIntegerArraySum(colname string, arraySum int64, wantCount int64) constr return func(vi *validationInfo) { resultCol := fmt.Sprintf("arraysum_int64_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF((SELECT SUM(elem) FROM UNNEST(%s) as elem) = %d) as %s", colname, arraySum, resultCol), + projection: fmt.Sprintf("COUNTIF((SELECT SUM(elem) FROM UNNEST(`%s`) as elem) = %d) as `%s`", colname, arraySum, resultCol), expectedValue: wantCount, } } @@ -275,7 +275,7 @@ func withFloatArraySum(colname string, floatSum float64, wantCount int64) constr return func(vi *validationInfo) { resultCol := fmt.Sprintf("arraysum_float_value_count_%s", colname) vi.constraints[resultCol] = &constraint{ - projection: fmt.Sprintf("COUNTIF(((SELECT ABS(SUM(elem)) FROM UNNEST(%s) as elem) - ABS(%f)) / ABS(%f) < 0.0001) as %s", colname, floatSum, floatSum, resultCol), + projection: fmt.Sprintf("COUNTIF(((SELECT ABS(SUM(elem)) FROM UNNEST(`%s`) as elem) - ABS(%f)) / ABS(%f) < 0.0001) as `%s`", colname, floatSum, floatSum, resultCol), expectedValue: wantCount, } } diff --git a/bigquery/storage/managedwriter/validation_test.go b/bigquery/storage/managedwriter/validation_test.go index 24b1ef69448..ab4ce69b8d8 100644 --- a/bigquery/storage/managedwriter/validation_test.go +++ b/bigquery/storage/managedwriter/validation_test.go @@ -388,6 +388,21 @@ func TestValidation_Values(t *testing.T) { withIntegerArraySum("enum_repeated", 7, 1), }, }, + { + description: "proto2 w/column annotations", + tableSchema: testdata.ValidationColumnAnnotations, + inputRow: &testdata.ValidationP2ColumnAnnotations{ + First: proto.String("first_val"), + Second: proto.String("second_val"), + Third: proto.String("third_val"), + }, + constraints: []constraintOption{ + withExactRowCount(1), + withStringValueCount("first", "first_val", 1), + withStringValueCount("second", "third_val", 1), + withStringValueCount("特別コラム", "second_val", 1), + }, + }, } // Common setup. @@ -395,7 +410,7 @@ func TestValidation_Values(t *testing.T) { defer mwClient.Close() defer bqClient.Close() - dataset, cleanup, err := setupTestDataset(context.Background(), t, bqClient, "us-east1") + dataset, cleanup, err := setupTestDataset(context.Background(), t, bqClient, "us-east4") if err != nil { t.Fatalf("failed to init test dataset: %v", err) }