浏览代码

encoding/textpb: add support for MessageSet

This only handles compliant MessageSet extension fields where the field
name has to be message_set_extension.

Current C++ lib allows for different message field names, which is a
possible bug as it makes marshal output possibly contain duplicate names
when more than one field extends the same MessageSet, and makes
unmarshaling confusing as to which field to populate.

Change-Id: Ifda828ba794fe7e058ee6004f03001b1031f6d1e
Reviewed-on: https://go-review.googlesource.com/c/156758
Reviewed-by: Damien Neil <dneil@google.com>
Herbie Ong 7 年之前
父节点
当前提交
6470ea6e0f

+ 16 - 1
encoding/textpb/decode.go

@@ -129,7 +129,7 @@ func (o UnmarshalOptions) unmarshalMessage(tmsg [][2]text.Value, m pref.Message)
 			xt := xtTypes.ByName(xtName)
 			if xt == nil {
 				var err error
-				xt, err = o.Resolver.FindExtensionByName(xtName)
+				xt, err = o.findExtension(xtName)
 				if err != nil && err != protoregistry.NotFound {
 					return errors.New("unable to resolve [%v]: %v", xtName, err)
 				}
@@ -183,6 +183,21 @@ func (o UnmarshalOptions) unmarshalMessage(tmsg [][2]text.Value, m pref.Message)
 	return nerr.E
 }
 
+// findExtension returns protoreflect.ExtensionType from the Resolver if found.
+func (o UnmarshalOptions) findExtension(xtName pref.FullName) (pref.ExtensionType, error) {
+	xt, err := o.Resolver.FindExtensionByName(xtName)
+	if err == nil {
+		return xt, nil
+	}
+
+	// Check if this is a MessageSet extension field.
+	xt, err = o.Resolver.FindExtensionByName(xtName + ".message_set_extension")
+	if err == nil && isMessageSetExtension(xt) {
+		return xt, nil
+	}
+	return nil, protoregistry.NotFound
+}
+
 // unmarshalSingular unmarshals given text.Value into the non-repeated field.
 func (o UnmarshalOptions) unmarshalSingular(input text.Value, fd pref.FieldDescriptor, knownFields pref.KnownFields) error {
 	num := fd.Number()

+ 86 - 0
encoding/textpb/decode_test.go

@@ -26,6 +26,7 @@ import (
 )
 
 func init() {
+	// TODO: remove this when generated code registers to V2 global registry.
 	registerExtension(pb2.E_OptExtBool)
 	registerExtension(pb2.E_OptExtString)
 	registerExtension(pb2.E_OptExtEnum)
@@ -40,6 +41,11 @@ func init() {
 	registerExtension(pb2.E_ExtensionsContainer_RptExtString)
 	registerExtension(pb2.E_ExtensionsContainer_RptExtEnum)
 	registerExtension(pb2.E_ExtensionsContainer_RptExtNested)
+	registerExtension(pb2.E_MessageSetExtension)
+	registerExtension(pb2.E_MessageSetExtension_MessageSetExtension)
+	registerExtension(pb2.E_MessageSetExtension_NotMessageSetExtension)
+	registerExtension(pb2.E_MessageSetExtension_ExtNested)
+	registerExtension(pb2.E_FakeMessageSetExtension_MessageSetExtension)
 }
 
 func registerExtension(xd *protoapi.ExtensionDesc) {
@@ -510,6 +516,20 @@ msg: {
 				},
 			},
 		},
+	}, {
+		desc:         "oneof field set to last value",
+		inputMessage: &pb2.Oneofs{},
+		inputText: `
+msg: {
+  opt_string: "nested message"
+}
+str: "wins"
+`,
+		wantMessage: &pb2.Oneofs{
+			Union: &pb2.Oneofs_Str{
+				Str: "wins",
+			},
+		},
 	}, {
 		desc:         "repeated scalar using same field name",
 		inputMessage: &pb2.Repeats{},
@@ -1124,6 +1144,72 @@ opt_int32: 42
 		inputMessage: &pb2.Extensions{},
 		inputText:    "[pb2.invalid_message_field]: true",
 		wantErr:      true,
+	}, {
+		desc:         "MessageSet",
+		inputMessage: &pb2.MessageSet{},
+		inputText: `
+[pb2.MessageSetExtension]: {
+  opt_string: "a messageset extension"
+}
+[pb2.MessageSetExtension.ext_nested]: {
+  opt_string: "just a regular extension"
+}
+[pb2.MessageSetExtension.not_message_set_extension]: {
+  opt_string: "not a messageset extension"
+}
+`,
+		wantMessage: func() proto.Message {
+			m := &pb2.MessageSet{}
+			setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
+				OptString: scalar.String("a messageset extension"),
+			})
+			setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
+				OptString: scalar.String("not a messageset extension"),
+			})
+			setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
+				OptString: scalar.String("just a regular extension"),
+			})
+			return m
+		}(),
+	}, {
+		desc:         "not real MessageSet 1",
+		inputMessage: &pb2.FakeMessageSet{},
+		inputText: `
+[pb2.FakeMessageSetExtension.message_set_extension]: {
+  opt_string: "not a messageset extension"
+}
+`,
+		wantMessage: func() proto.Message {
+			m := &pb2.FakeMessageSet{}
+			setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
+				OptString: scalar.String("not a messageset extension"),
+			})
+			return m
+		}(),
+	}, {
+		desc:         "not real MessageSet 2",
+		inputMessage: &pb2.FakeMessageSet{},
+		inputText: `
+[pb2.FakeMessageSetExtension]: {
+  opt_string: "not a messageset extension"
+}
+`,
+		wantErr: true,
+	}, {
+		desc:         "not real MessageSet 3",
+		inputMessage: &pb2.MessageSet{},
+		inputText: `
+[pb2.message_set_extension]: {
+  opt_string: "another not a messageset extension"
+}
+`,
+		wantMessage: func() proto.Message {
+			m := &pb2.MessageSet{}
+			setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
+				OptString: scalar.String("another not a messageset extension"),
+			})
+			return m
+		}(),
 	}, {
 		desc:         "Any not expanded",
 		inputMessage: &pb2.KnownTypes{},

+ 31 - 4
encoding/textpb/encode.go

@@ -15,6 +15,8 @@ import (
 	"github.com/golang/protobuf/v2/proto"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
 	"github.com/golang/protobuf/v2/reflect/protoregistry"
+
+	descpb "github.com/golang/protobuf/v2/types/descriptor"
 )
 
 // Marshal writes the given proto.Message in textproto format using default options.
@@ -302,14 +304,16 @@ func (o MarshalOptions) appendExtensions(msgFields [][2]text.Value, knownFields
 
 	var err error
 	xtTypes.Range(func(xt pref.ExtensionType) bool {
-		// TODO: Handle MessageSet.  Field name should be message_set_extension
-		// of message type without any fields and has message option
-		// message_set_wire_format=true.
+		name := xt.FullName()
+		// If extended type is a MessageSet, set field name to be the message type name.
+		if isMessageSetExtension(xt) {
+			name = xt.MessageType().FullName()
+		}
 
 		num := xt.Number()
 		if knownFields.Has(num) {
 			// Use string type to produce [name] format.
-			tname := text.ValueOf(string(xt.FullName()))
+			tname := text.ValueOf(string(name))
 			pval := knownFields.Get(num)
 			xtFields, err = o.appendField(xtFields, tname, pval, xt)
 			if err != nil {
@@ -329,6 +333,29 @@ func (o MarshalOptions) appendExtensions(msgFields [][2]text.Value, knownFields
 	return append(msgFields, xtFields...), nerr.E
 }
 
+// isMessageSetExtension reports whether extension extends a message set.
+func isMessageSetExtension(xt pref.ExtensionType) bool {
+	if xt.Name() != "message_set_extension" {
+		return false
+	}
+	mt := xt.MessageType()
+	if mt == nil {
+		return false
+	}
+	if xt.FullName().Parent() != mt.FullName() {
+		return false
+	}
+	xmt := xt.ExtendedType()
+	if xmt.Fields().Len() != 0 {
+		return false
+	}
+	opt := xmt.Options().(*descpb.MessageOptions)
+	if opt == nil {
+		return false
+	}
+	return opt.GetMessageSetWireFormat()
+}
+
 // appendUnknown parses the given []byte and appends field(s) into the given fields slice.
 // This function assumes proper encoding in the given []byte.
 func appendUnknown(fields [][2]text.Value, b []byte) [][2]text.Value {

+ 51 - 27
encoding/textpb/encode_test.go

@@ -959,33 +959,57 @@ opt_int32: 42
 [pb2.ExtensionsContainer.rpt_ext_string]: "hello"
 [pb2.ExtensionsContainer.rpt_ext_string]: "world"
 `,
-		/* TODO: test for MessageSet
-		   	}, {
-		   		desc: "MessageSet",
-		   		input: func() proto.Message {
-		   			m := &pb2.MessageSet{}
-		   			setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
-		   				OptString: scalar.String("a messageset extension"),
-		   			})
-		   			setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
-		   				OptString: scalar.String("not a messageset extension"),
-		   			})
-		   			setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
-		   				OptString: scalar.String("just a regular extension"),
-		   			})
-		   			return m
-		   		}(),
-		   		want: `[pb2.MessageSetExtension]: {
-		     opt_string: "a messageset extension"
-		   }
-		   [pb2.MessageSetExtension.ext_nested]: {
-		     opt_string: "just a regular extension"
-		   }
-		   [pb2.MessageSetExtension.not_message_set_extension]: {
-		     opt_string: "not a messageset extension"
-		   }
-		   `,
-		*/
+	}, {
+		desc: "MessageSet",
+		input: func() proto.Message {
+			m := &pb2.MessageSet{}
+			setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
+				OptString: scalar.String("a messageset extension"),
+			})
+			setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
+				OptString: scalar.String("not a messageset extension"),
+			})
+			setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
+				OptString: scalar.String("just a regular extension"),
+			})
+			return m
+		}(),
+		want: `[pb2.MessageSetExtension]: {
+  opt_string: "a messageset extension"
+}
+[pb2.MessageSetExtension.ext_nested]: {
+  opt_string: "just a regular extension"
+}
+[pb2.MessageSetExtension.not_message_set_extension]: {
+  opt_string: "not a messageset extension"
+}
+`,
+	}, {
+		desc: "not real MessageSet 1",
+		input: func() proto.Message {
+			m := &pb2.FakeMessageSet{}
+			setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
+				OptString: scalar.String("not a messageset extension"),
+			})
+			return m
+		}(),
+		want: `[pb2.FakeMessageSetExtension.message_set_extension]: {
+  opt_string: "not a messageset extension"
+}
+`,
+	}, {
+		desc: "not real MessageSet 2",
+		input: func() proto.Message {
+			m := &pb2.MessageSet{}
+			setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
+				OptString: scalar.String("another not a messageset extension"),
+			})
+			return m
+		}(),
+		want: `[pb2.message_set_extension]: {
+  opt_string: "another not a messageset extension"
+}
+`,
 	}, {
 		desc: "Any message not expanded",
 		mo: textpb.MarshalOptions{

+ 299 - 166
encoding/textpb/testprotos/pb2/test.pb.go

@@ -1201,6 +1201,91 @@ func (m *MessageSetExtension) GetOptString() string {
 	return ""
 }
 
+type FakeMessageSet struct {
+	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
+	proto.XXX_InternalExtensions `json:"-"`
+	XXX_unrecognized             []byte `json:"-"`
+	XXX_sizecache                int32  `json:"-"`
+}
+
+func (m *FakeMessageSet) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[15].MessageOf(m)
+}
+func (m *FakeMessageSet) Reset()         { *m = FakeMessageSet{} }
+func (m *FakeMessageSet) String() string { return proto.CompactTextString(m) }
+func (*FakeMessageSet) ProtoMessage()    {}
+func (*FakeMessageSet) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8d7acc1bcec9a72_gzipped, []int{15}
+}
+
+var extRange_FakeMessageSet = []proto.ExtensionRange{
+	{Start: 4, End: 536870911},
+}
+
+func (*FakeMessageSet) ExtensionRangeArray() []proto.ExtensionRange {
+	return extRange_FakeMessageSet
+}
+
+func (m *FakeMessageSet) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FakeMessageSet.Unmarshal(m, b)
+}
+func (m *FakeMessageSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FakeMessageSet.Marshal(b, m, deterministic)
+}
+func (m *FakeMessageSet) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FakeMessageSet.Merge(m, src)
+}
+func (m *FakeMessageSet) XXX_Size() int {
+	return xxx_messageInfo_FakeMessageSet.Size(m)
+}
+func (m *FakeMessageSet) XXX_DiscardUnknown() {
+	xxx_messageInfo_FakeMessageSet.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FakeMessageSet proto.InternalMessageInfo
+
+type FakeMessageSetExtension struct {
+	OptString            *string  `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FakeMessageSetExtension) ProtoReflect() protoreflect.Message {
+	return xxx_Test_protoFile_messageTypes[16].MessageOf(m)
+}
+func (m *FakeMessageSetExtension) Reset()         { *m = FakeMessageSetExtension{} }
+func (m *FakeMessageSetExtension) String() string { return proto.CompactTextString(m) }
+func (*FakeMessageSetExtension) ProtoMessage()    {}
+func (*FakeMessageSetExtension) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c8d7acc1bcec9a72_gzipped, []int{16}
+}
+
+func (m *FakeMessageSetExtension) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FakeMessageSetExtension.Unmarshal(m, b)
+}
+func (m *FakeMessageSetExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FakeMessageSetExtension.Marshal(b, m, deterministic)
+}
+func (m *FakeMessageSetExtension) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FakeMessageSetExtension.Merge(m, src)
+}
+func (m *FakeMessageSetExtension) XXX_Size() int {
+	return xxx_messageInfo_FakeMessageSetExtension.Size(m)
+}
+func (m *FakeMessageSetExtension) XXX_DiscardUnknown() {
+	xxx_messageInfo_FakeMessageSetExtension.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FakeMessageSetExtension proto.InternalMessageInfo
+
+func (m *FakeMessageSetExtension) GetOptString() string {
+	if m != nil && m.OptString != nil {
+		return *m.OptString
+	}
+	return ""
+}
+
 // Message contains well-known type fields.
 type KnownTypes struct {
 	OptBool              *wrappers.BoolValue   `protobuf:"bytes,1,opt,name=opt_bool,json=optBool" json:"opt_bool,omitempty"`
@@ -1225,13 +1310,13 @@ type KnownTypes struct {
 }
 
 func (m *KnownTypes) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[15].MessageOf(m)
+	return xxx_Test_protoFile_messageTypes[17].MessageOf(m)
 }
 func (m *KnownTypes) Reset()         { *m = KnownTypes{} }
 func (m *KnownTypes) String() string { return proto.CompactTextString(m) }
 func (*KnownTypes) ProtoMessage()    {}
 func (*KnownTypes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c8d7acc1bcec9a72_gzipped, []int{15}
+	return fileDescriptor_c8d7acc1bcec9a72_gzipped, []int{17}
 }
 
 func (m *KnownTypes) XXX_Unmarshal(b []byte) error {
@@ -1375,7 +1460,7 @@ type Nests_OptGroup struct {
 }
 
 func (m *Nests_OptGroup) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[16].MessageOf(m)
+	return xxx_Test_protoFile_messageTypes[18].MessageOf(m)
 }
 func (m *Nests_OptGroup) Reset()         { *m = Nests_OptGroup{} }
 func (m *Nests_OptGroup) String() string { return proto.CompactTextString(m) }
@@ -1438,7 +1523,7 @@ type Nests_RptGroup struct {
 }
 
 func (m *Nests_RptGroup) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[17].MessageOf(m)
+	return xxx_Test_protoFile_messageTypes[19].MessageOf(m)
 }
 func (m *Nests_RptGroup) Reset()         { *m = Nests_RptGroup{} }
 func (m *Nests_RptGroup) String() string { return proto.CompactTextString(m) }
@@ -1480,7 +1565,7 @@ type Nests_OptGroup_OptNestedGroup struct {
 }
 
 func (m *Nests_OptGroup_OptNestedGroup) ProtoReflect() protoreflect.Message {
-	return xxx_Test_protoFile_messageTypes[18].MessageOf(m)
+	return xxx_Test_protoFile_messageTypes[20].MessageOf(m)
 }
 func (m *Nests_OptGroup_OptNestedGroup) Reset()         { *m = Nests_OptGroup_OptNestedGroup{} }
 func (m *Nests_OptGroup_OptNestedGroup) String() string { return proto.CompactTextString(m) }
@@ -1577,6 +1662,15 @@ var E_RptExtNested = &proto.ExtensionDesc{
 	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
 }
 
+var E_MessageSetExtension = &proto.ExtensionDesc{
+	ExtendedType:  (*MessageSet)(nil),
+	ExtensionType: (*FakeMessageSetExtension)(nil),
+	Field:         50,
+	Name:          "pb2.",
+	Tag:           "bytes,50,opt,name=message_set_extension",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
 var E_ExtensionsContainer_OptExtBool = &proto.ExtensionDesc{
 	ExtendedType:  (*Extensions)(nil),
 	ExtensionType: (*bool)(nil),
@@ -1667,6 +1761,15 @@ var E_MessageSetExtension_ExtNested = &proto.ExtensionDesc{
 	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
 }
 
+var E_FakeMessageSetExtension_MessageSetExtension = &proto.ExtensionDesc{
+	ExtendedType:  (*FakeMessageSet)(nil),
+	ExtensionType: (*FakeMessageSetExtension)(nil),
+	Field:         10,
+	Name:          "pb2.FakeMessageSetExtension.message_set_extension",
+	Tag:           "bytes,10,opt,name=message_set_extension",
+	Filename:      "encoding/textpb/testprotos/pb2/test.proto",
+}
+
 func init() {
 	proto.RegisterFile("encoding/textpb/testprotos/pb2/test.proto", fileDescriptor_c8d7acc1bcec9a72_gzipped)
 	proto.RegisterEnum("pb2.Enum", Enum_name, Enum_value)
@@ -1693,6 +1796,8 @@ func init() {
 	proto.RegisterType((*ExtensionsContainer)(nil), "pb2.ExtensionsContainer")
 	proto.RegisterType((*MessageSet)(nil), "pb2.MessageSet")
 	proto.RegisterType((*MessageSetExtension)(nil), "pb2.MessageSetExtension")
+	proto.RegisterType((*FakeMessageSet)(nil), "pb2.FakeMessageSet")
+	proto.RegisterType((*FakeMessageSetExtension)(nil), "pb2.FakeMessageSetExtension")
 	proto.RegisterType((*KnownTypes)(nil), "pb2.KnownTypes")
 	proto.RegisterType((*Nests_OptGroup)(nil), "pb2.Nests.OptGroup")
 	proto.RegisterType((*Nests_RptGroup)(nil), "pb2.Nests.RptGroup")
@@ -1704,6 +1809,7 @@ func init() {
 	proto.RegisterExtension(E_RptExtFixed32)
 	proto.RegisterExtension(E_RptExtEnum)
 	proto.RegisterExtension(E_RptExtNested)
+	proto.RegisterExtension(E_MessageSetExtension)
 	proto.RegisterExtension(E_ExtensionsContainer_OptExtBool)
 	proto.RegisterExtension(E_ExtensionsContainer_OptExtString)
 	proto.RegisterExtension(E_ExtensionsContainer_OptExtEnum)
@@ -1714,10 +1820,11 @@ func init() {
 	proto.RegisterExtension(E_MessageSetExtension_MessageSetExtension)
 	proto.RegisterExtension(E_MessageSetExtension_NotMessageSetExtension)
 	proto.RegisterExtension(E_MessageSetExtension_ExtNested)
+	proto.RegisterExtension(E_FakeMessageSetExtension_MessageSetExtension)
 }
 
 var fileDescriptor_c8d7acc1bcec9a72 = []byte{
-	// 5909 bytes of the wire-encoded FileDescriptorProto
+	// 6198 bytes of the wire-encoded FileDescriptorProto
 	0x0a, 0x29, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x70,
 	0x62, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x70, 0x62, 0x32,
 	0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x70, 0x62, 0x32,
@@ -1994,100 +2101,118 @@ var fileDescriptor_c8d7acc1bcec9a72 = []byte{
 	0x6e, 0x32, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12,
 	0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74,
 	0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x4e, 0x65, 0x73,
-	0x74, 0x65, 0x64, 0x52, 0x09, 0x65, 0x78, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0xa6,
-	0x07, 0x0a, 0x0a, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x35, 0x0a,
-	0x08, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74,
-	0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x33,
-	0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,
-	0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x38,
-	0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08,
-	0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f,
-	0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55,
-	0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x55,
-	0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e,
-	0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74,
-	0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74,
-	0x36, 0x34, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18,
-	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x3b, 0x0a, 0x0a,
-	0x6f, 0x70, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09,
-	0x6f, 0x70, 0x74, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74,
-	0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+	0x74, 0x65, 0x64, 0x52, 0x09, 0x65, 0x78, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x1a,
+	0x0a, 0x0e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74,
+	0x2a, 0x08, 0x08, 0x04, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x46,
+	0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53,
+	0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x65, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13,
+	0x2e, 0x70, 0x62, 0x32, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x53, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x32, 0x2e,
+	0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa6, 0x07, 0x0a,
+	0x0a, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x6f,
+	0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74,
-	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x79,
-	0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65,
-	0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73,
-	0x12, 0x3c, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f,
-	0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
-	0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12,
-	0x36, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x19, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x6f, 0x70,
-	0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x6c,
-	0x69, 0x73, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74,
-	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33,
-	0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x56, 0x61,
-	0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79,
-	0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08,
-	0x6f, 0x70, 0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x5f,
-	0x61, 0x6e, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52,
-	0x06, 0x6f, 0x70, 0x74, 0x41, 0x6e, 0x79, 0x2a, 0x35, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12,
-	0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,
-	0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x43, 0x4f, 0x4e,
-	0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x45, 0x4e, 0x54, 0x48, 0x10, 0x0a, 0x3a, 0x31,
-	0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x0f,
-	0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x42, 0x6f, 0x6f,
-	0x6c, 0x3a, 0x35, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x72,
-	0x69, 0x6e, 0x67, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x45,
-	0x78, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3c, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f,
-	0x65, 0x78, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x09, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45,
-	0x78, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x42, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78,
-	0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x0b, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x6f, 0x70,
-	0x74, 0x45, 0x78, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x3a, 0x37, 0x0a, 0x0f, 0x72, 0x70,
-	0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x0f, 0x2e,
-	0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1f,
-	0x20, 0x03, 0x28, 0x07, 0x52, 0x0d, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x46, 0x69, 0x78, 0x65,
-	0x64, 0x33, 0x32, 0x3a, 0x3c, 0x0a, 0x0c, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x65,
-	0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x32,
-	0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x45, 0x6e, 0x75,
-	0x6d, 0x3a, 0x42, 0x0a, 0x0e, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65, 0x73,
-	0x74, 0x65, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x32,
-	0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x4e,
-	0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
-	0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x2f,
-	0x74, 0x65, 0x78, 0x74, 0x70, 0x62, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x73, 0x2f, 0x70, 0x62, 0x32,
+	0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x42, 0x6f,
+	0x6f, 0x6c, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x38, 0x0a, 0x09,
+	0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70,
+	0x74, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x75, 0x69,
+	0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e,
+	0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x55, 0x69, 0x6e,
+	0x74, 0x33, 0x32, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36,
+	0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34,
+	0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x08, 0x6f, 0x70, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70,
+	0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70,
+	0x74, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73,
+	0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65,
+	0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3c,
+	0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x0b, 0x6f, 0x70, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d,
+	0x6f, 0x70, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x15, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x0c, 0x6f, 0x70, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a,
+	0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53,
+	0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x6c, 0x69, 0x73,
+	0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x09,
+	0x6f, 0x70, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x12, 0x33, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x1e,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x6f, 0x70,
+	0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x5f, 0x61, 0x6e,
+	0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06, 0x6f,
+	0x70, 0x74, 0x41, 0x6e, 0x79, 0x2a, 0x35, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0b, 0x0a,
+	0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x49,
+	0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x10,
+	0x02, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x45, 0x4e, 0x54, 0x48, 0x10, 0x0a, 0x3a, 0x31, 0x0a, 0x0c,
+	0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x0f, 0x2e, 0x70,
+	0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x15, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x3a,
+	0x35, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74,
+	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3c, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78,
+	0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x09, 0x2e,
+	0x70, 0x62, 0x32, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74,
+	0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x42, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f,
+	0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e,
+	0x70, 0x62, 0x32, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x45,
+	0x78, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x3a, 0x37, 0x0a, 0x0f, 0x72, 0x70, 0x74, 0x5f,
+	0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x0f, 0x2e, 0x70, 0x62,
+	0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1f, 0x20, 0x03,
+	0x28, 0x07, 0x52, 0x0d, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33,
+	0x32, 0x3a, 0x3c, 0x0a, 0x0c, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x6e, 0x75,
+	0x6d, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45,
+	0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a,
+	0x42, 0x0a, 0x0e, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65,
+	0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x4e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x4e, 0x65, 0x73,
+	0x74, 0x65, 0x64, 0x3a, 0x61, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73,
+	0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x70,
+	0x62, 0x32, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0x32, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x32, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
+	0x2f, 0x74, 0x65, 0x78, 0x74, 0x70, 0x62, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x73, 0x2f, 0x70, 0x62, 0x32,
 }
 
 var fileDescriptor_c8d7acc1bcec9a72_gzipped = func() []byte {
@@ -2103,7 +2228,7 @@ const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)
 var Test_protoFile protoreflect.FileDescriptor
 
 var xxx_Test_protoFile_enumTypes [2]protoreflect.EnumType
-var xxx_Test_protoFile_messageTypes [26]protoimpl.MessageType
+var xxx_Test_protoFile_messageTypes [28]protoimpl.MessageType
 var xxx_Test_protoFile_goTypes = []interface{}{
 	(Enum)(0),                             // 0: pb2.Enum
 	(Enums_NestedEnum)(0),                 // 1: pb2.Enums.NestedEnum
@@ -2122,33 +2247,35 @@ var xxx_Test_protoFile_goTypes = []interface{}{
 	(*ExtensionsContainer)(nil),           // 14: pb2.ExtensionsContainer
 	(*MessageSet)(nil),                    // 15: pb2.MessageSet
 	(*MessageSetExtension)(nil),           // 16: pb2.MessageSetExtension
-	(*KnownTypes)(nil),                    // 17: pb2.KnownTypes
-	(*Nests_OptGroup)(nil),                // 18: pb2.Nests.OptGroup
-	(*Nests_RptGroup)(nil),                // 19: pb2.Nests.RptGroup
-	(*Nests_OptGroup_OptNestedGroup)(nil), // 20: pb2.Nests.OptGroup.OptNestedGroup
-	nil,                                   // 21: pb2.Maps.Int32ToStrEntry
-	nil,                                   // 22: pb2.Maps.Sfixed64ToBoolEntry
-	nil,                                   // 23: pb2.Maps.BoolToUint32Entry
-	nil,                                   // 24: pb2.Maps.Uint64ToEnumEntry
-	nil,                                   // 25: pb2.Maps.StrToNestedEntry
-	nil,                                   // 26: pb2.Maps.StrToOneofsEntry
-	nil,                                   // 27: pb2.IndirectRequired.StrToNestedEntry
-	(*wrappers.BoolValue)(nil),            // 28: google.protobuf.BoolValue
-	(*wrappers.Int32Value)(nil),           // 29: google.protobuf.Int32Value
-	(*wrappers.Int64Value)(nil),           // 30: google.protobuf.Int64Value
-	(*wrappers.UInt32Value)(nil),          // 31: google.protobuf.UInt32Value
-	(*wrappers.UInt64Value)(nil),          // 32: google.protobuf.UInt64Value
-	(*wrappers.FloatValue)(nil),           // 33: google.protobuf.FloatValue
-	(*wrappers.DoubleValue)(nil),          // 34: google.protobuf.DoubleValue
-	(*wrappers.StringValue)(nil),          // 35: google.protobuf.StringValue
-	(*wrappers.BytesValue)(nil),           // 36: google.protobuf.BytesValue
-	(*duration.Duration)(nil),             // 37: google.protobuf.Duration
-	(*timestamp.Timestamp)(nil),           // 38: google.protobuf.Timestamp
-	(*_struct.Struct)(nil),                // 39: google.protobuf.Struct
-	(*_struct.ListValue)(nil),             // 40: google.protobuf.ListValue
-	(*_struct.Value)(nil),                 // 41: google.protobuf.Value
-	(*empty.Empty)(nil),                   // 42: google.protobuf.Empty
-	(*any.Any)(nil),                       // 43: google.protobuf.Any
+	(*FakeMessageSet)(nil),                // 17: pb2.FakeMessageSet
+	(*FakeMessageSetExtension)(nil),       // 18: pb2.FakeMessageSetExtension
+	(*KnownTypes)(nil),                    // 19: pb2.KnownTypes
+	(*Nests_OptGroup)(nil),                // 20: pb2.Nests.OptGroup
+	(*Nests_RptGroup)(nil),                // 21: pb2.Nests.RptGroup
+	(*Nests_OptGroup_OptNestedGroup)(nil), // 22: pb2.Nests.OptGroup.OptNestedGroup
+	nil,                                   // 23: pb2.Maps.Int32ToStrEntry
+	nil,                                   // 24: pb2.Maps.Sfixed64ToBoolEntry
+	nil,                                   // 25: pb2.Maps.BoolToUint32Entry
+	nil,                                   // 26: pb2.Maps.Uint64ToEnumEntry
+	nil,                                   // 27: pb2.Maps.StrToNestedEntry
+	nil,                                   // 28: pb2.Maps.StrToOneofsEntry
+	nil,                                   // 29: pb2.IndirectRequired.StrToNestedEntry
+	(*wrappers.BoolValue)(nil),            // 30: google.protobuf.BoolValue
+	(*wrappers.Int32Value)(nil),           // 31: google.protobuf.Int32Value
+	(*wrappers.Int64Value)(nil),           // 32: google.protobuf.Int64Value
+	(*wrappers.UInt32Value)(nil),          // 33: google.protobuf.UInt32Value
+	(*wrappers.UInt64Value)(nil),          // 34: google.protobuf.UInt64Value
+	(*wrappers.FloatValue)(nil),           // 35: google.protobuf.FloatValue
+	(*wrappers.DoubleValue)(nil),          // 36: google.protobuf.DoubleValue
+	(*wrappers.StringValue)(nil),          // 37: google.protobuf.StringValue
+	(*wrappers.BytesValue)(nil),           // 38: google.protobuf.BytesValue
+	(*duration.Duration)(nil),             // 39: google.protobuf.Duration
+	(*timestamp.Timestamp)(nil),           // 40: google.protobuf.Timestamp
+	(*_struct.Struct)(nil),                // 41: google.protobuf.Struct
+	(*_struct.ListValue)(nil),             // 42: google.protobuf.ListValue
+	(*_struct.Value)(nil),                 // 43: google.protobuf.Value
+	(*empty.Empty)(nil),                   // 44: google.protobuf.Empty
+	(*any.Any)(nil),                       // 45: google.protobuf.Any
 }
 var xxx_Test_protoFile_depIdxs = []int32{
 	13, // pb2.opt_ext_bool:extendee -> pb2.Extensions
@@ -2158,6 +2285,7 @@ var xxx_Test_protoFile_depIdxs = []int32{
 	13, // pb2.rpt_ext_fixed32:extendee -> pb2.Extensions
 	13, // pb2.rpt_ext_enum:extendee -> pb2.Extensions
 	13, // pb2.rpt_ext_nested:extendee -> pb2.Extensions
+	15, // pb2.message_set_extension:extendee -> pb2.MessageSet
 	13, // pb2.ExtensionsContainer.opt_ext_bool:extendee -> pb2.Extensions
 	13, // pb2.ExtensionsContainer.opt_ext_string:extendee -> pb2.Extensions
 	13, // pb2.ExtensionsContainer.opt_ext_enum:extendee -> pb2.Extensions
@@ -2168,45 +2296,46 @@ var xxx_Test_protoFile_depIdxs = []int32{
 	15, // pb2.MessageSetExtension.message_set_extension:extendee -> pb2.MessageSet
 	15, // pb2.MessageSetExtension.not_message_set_extension:extendee -> pb2.MessageSet
 	15, // pb2.MessageSetExtension.ext_nested:extendee -> pb2.MessageSet
+	17, // pb2.FakeMessageSetExtension.message_set_extension:extendee -> pb2.FakeMessageSet
 	0,  // pb2.Enums.opt_enum:type_name -> pb2.Enum
 	0,  // pb2.Enums.rpt_enum:type_name -> pb2.Enum
 	1,  // pb2.Enums.opt_nested_enum:type_name -> pb2.Enums.NestedEnum
 	1,  // pb2.Enums.rpt_nested_enum:type_name -> pb2.Enums.NestedEnum
 	6,  // pb2.Nests.opt_nested:type_name -> pb2.Nested
-	18, // pb2.Nests.optgroup:type_name -> pb2.Nests.OptGroup
+	20, // pb2.Nests.optgroup:type_name -> pb2.Nests.OptGroup
 	6,  // pb2.Nests.rpt_nested:type_name -> pb2.Nested
-	19, // pb2.Nests.rptgroup:type_name -> pb2.Nests.RptGroup
+	21, // pb2.Nests.rptgroup:type_name -> pb2.Nests.RptGroup
 	6,  // pb2.Nested.opt_nested:type_name -> pb2.Nested
 	0,  // pb2.Requireds.req_enum:type_name -> pb2.Enum
 	6,  // pb2.Requireds.req_nested:type_name -> pb2.Nested
 	6,  // pb2.Oneofs.msg:type_name -> pb2.Nested
-	21, // pb2.Maps.int32_to_str:type_name -> pb2.Maps.Int32ToStrEntry
-	22, // pb2.Maps.sfixed64_to_bool:type_name -> pb2.Maps.Sfixed64ToBoolEntry
-	23, // pb2.Maps.bool_to_uint32:type_name -> pb2.Maps.BoolToUint32Entry
-	24, // pb2.Maps.uint64_to_enum:type_name -> pb2.Maps.Uint64ToEnumEntry
-	25, // pb2.Maps.str_to_nested:type_name -> pb2.Maps.StrToNestedEntry
-	26, // pb2.Maps.str_to_oneofs:type_name -> pb2.Maps.StrToOneofsEntry
+	23, // pb2.Maps.int32_to_str:type_name -> pb2.Maps.Int32ToStrEntry
+	24, // pb2.Maps.sfixed64_to_bool:type_name -> pb2.Maps.Sfixed64ToBoolEntry
+	25, // pb2.Maps.bool_to_uint32:type_name -> pb2.Maps.BoolToUint32Entry
+	26, // pb2.Maps.uint64_to_enum:type_name -> pb2.Maps.Uint64ToEnumEntry
+	27, // pb2.Maps.str_to_nested:type_name -> pb2.Maps.StrToNestedEntry
+	28, // pb2.Maps.str_to_oneofs:type_name -> pb2.Maps.StrToOneofsEntry
 	11, // pb2.IndirectRequired.opt_nested:type_name -> pb2.NestedWithRequired
 	11, // pb2.IndirectRequired.rpt_nested:type_name -> pb2.NestedWithRequired
-	27, // pb2.IndirectRequired.str_to_nested:type_name -> pb2.IndirectRequired.StrToNestedEntry
-	28, // pb2.KnownTypes.opt_bool:type_name -> google.protobuf.BoolValue
-	29, // pb2.KnownTypes.opt_int32:type_name -> google.protobuf.Int32Value
-	30, // pb2.KnownTypes.opt_int64:type_name -> google.protobuf.Int64Value
-	31, // pb2.KnownTypes.opt_uint32:type_name -> google.protobuf.UInt32Value
-	32, // pb2.KnownTypes.opt_uint64:type_name -> google.protobuf.UInt64Value
-	33, // pb2.KnownTypes.opt_float:type_name -> google.protobuf.FloatValue
-	34, // pb2.KnownTypes.opt_double:type_name -> google.protobuf.DoubleValue
-	35, // pb2.KnownTypes.opt_string:type_name -> google.protobuf.StringValue
-	36, // pb2.KnownTypes.opt_bytes:type_name -> google.protobuf.BytesValue
-	37, // pb2.KnownTypes.opt_duration:type_name -> google.protobuf.Duration
-	38, // pb2.KnownTypes.opt_timestamp:type_name -> google.protobuf.Timestamp
-	39, // pb2.KnownTypes.opt_struct:type_name -> google.protobuf.Struct
-	40, // pb2.KnownTypes.opt_list:type_name -> google.protobuf.ListValue
-	41, // pb2.KnownTypes.opt_value:type_name -> google.protobuf.Value
-	42, // pb2.KnownTypes.opt_empty:type_name -> google.protobuf.Empty
-	43, // pb2.KnownTypes.opt_any:type_name -> google.protobuf.Any
+	29, // pb2.IndirectRequired.str_to_nested:type_name -> pb2.IndirectRequired.StrToNestedEntry
+	30, // pb2.KnownTypes.opt_bool:type_name -> google.protobuf.BoolValue
+	31, // pb2.KnownTypes.opt_int32:type_name -> google.protobuf.Int32Value
+	32, // pb2.KnownTypes.opt_int64:type_name -> google.protobuf.Int64Value
+	33, // pb2.KnownTypes.opt_uint32:type_name -> google.protobuf.UInt32Value
+	34, // pb2.KnownTypes.opt_uint64:type_name -> google.protobuf.UInt64Value
+	35, // pb2.KnownTypes.opt_float:type_name -> google.protobuf.FloatValue
+	36, // pb2.KnownTypes.opt_double:type_name -> google.protobuf.DoubleValue
+	37, // pb2.KnownTypes.opt_string:type_name -> google.protobuf.StringValue
+	38, // pb2.KnownTypes.opt_bytes:type_name -> google.protobuf.BytesValue
+	39, // pb2.KnownTypes.opt_duration:type_name -> google.protobuf.Duration
+	40, // pb2.KnownTypes.opt_timestamp:type_name -> google.protobuf.Timestamp
+	41, // pb2.KnownTypes.opt_struct:type_name -> google.protobuf.Struct
+	42, // pb2.KnownTypes.opt_list:type_name -> google.protobuf.ListValue
+	43, // pb2.KnownTypes.opt_value:type_name -> google.protobuf.Value
+	44, // pb2.KnownTypes.opt_empty:type_name -> google.protobuf.Empty
+	45, // pb2.KnownTypes.opt_any:type_name -> google.protobuf.Any
 	6,  // pb2.Nests.OptGroup.opt_nested:type_name -> pb2.Nested
-	20, // pb2.Nests.OptGroup.optnestedgroup:type_name -> pb2.Nests.OptGroup.OptNestedGroup
+	22, // pb2.Nests.OptGroup.optnestedgroup:type_name -> pb2.Nests.OptGroup.OptNestedGroup
 	0,  // pb2.Nests.OptGroup.OptNestedGroup.opt_enum:type_name -> pb2.Enum
 	0,  // pb2.Maps.Uint64ToEnumEntry.value:type_name -> pb2.Enum
 	6,  // pb2.Maps.StrToNestedEntry.value:type_name -> pb2.Nested
@@ -2216,6 +2345,7 @@ var xxx_Test_protoFile_depIdxs = []int32{
 	6,  // pb2.opt_ext_nested:type_name -> pb2.Nested
 	0,  // pb2.rpt_ext_enum:type_name -> pb2.Enum
 	6,  // pb2.rpt_ext_nested:type_name -> pb2.Nested
+	18, // pb2.message_set_extension:type_name -> pb2.FakeMessageSetExtension
 	0,  // pb2.ExtensionsContainer.opt_ext_enum:type_name -> pb2.Enum
 	6,  // pb2.ExtensionsContainer.opt_ext_nested:type_name -> pb2.Nested
 	0,  // pb2.ExtensionsContainer.rpt_ext_enum:type_name -> pb2.Enum
@@ -2223,11 +2353,12 @@ var xxx_Test_protoFile_depIdxs = []int32{
 	16, // pb2.MessageSetExtension.message_set_extension:type_name -> pb2.MessageSetExtension
 	16, // pb2.MessageSetExtension.not_message_set_extension:type_name -> pb2.MessageSetExtension
 	6,  // pb2.MessageSetExtension.ext_nested:type_name -> pb2.Nested
+	18, // pb2.FakeMessageSetExtension.message_set_extension:type_name -> pb2.FakeMessageSetExtension
 }
 
 func init() {
-	var messageTypes [26]protoreflect.MessageType
-	var extensionTypes [17]protoreflect.ExtensionType
+	var messageTypes [28]protoreflect.MessageType
+	var extensionTypes [19]protoreflect.ExtensionType
 	Test_protoFile = protoimpl.FileBuilder{
 		RawDescriptor:        fileDescriptor_c8d7acc1bcec9a72,
 		GoTypes:              xxx_Test_protoFile_goTypes,
@@ -2236,7 +2367,7 @@ func init() {
 		MessageOutputTypes:   messageTypes[:],
 		ExtensionOutputTypes: extensionTypes[:],
 	}.Init()
-	messageGoTypes := xxx_Test_protoFile_goTypes[2:][:26]
+	messageGoTypes := xxx_Test_protoFile_goTypes[2:][:28]
 	for i, mt := range messageTypes[:] {
 		xxx_Test_protoFile_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
 		xxx_Test_protoFile_messageTypes[i].PBType = mt
@@ -2248,16 +2379,18 @@ func init() {
 	E_RptExtFixed32.Type = extensionTypes[4]
 	E_RptExtEnum.Type = extensionTypes[5]
 	E_RptExtNested.Type = extensionTypes[6]
-	E_ExtensionsContainer_OptExtBool.Type = extensionTypes[7]
-	E_ExtensionsContainer_OptExtString.Type = extensionTypes[8]
-	E_ExtensionsContainer_OptExtEnum.Type = extensionTypes[9]
-	E_ExtensionsContainer_OptExtNested.Type = extensionTypes[10]
-	E_ExtensionsContainer_RptExtString.Type = extensionTypes[11]
-	E_ExtensionsContainer_RptExtEnum.Type = extensionTypes[12]
-	E_ExtensionsContainer_RptExtNested.Type = extensionTypes[13]
-	E_MessageSetExtension_MessageSetExtension.Type = extensionTypes[14]
-	E_MessageSetExtension_NotMessageSetExtension.Type = extensionTypes[15]
-	E_MessageSetExtension_ExtNested.Type = extensionTypes[16]
+	E_MessageSetExtension.Type = extensionTypes[7]
+	E_ExtensionsContainer_OptExtBool.Type = extensionTypes[8]
+	E_ExtensionsContainer_OptExtString.Type = extensionTypes[9]
+	E_ExtensionsContainer_OptExtEnum.Type = extensionTypes[10]
+	E_ExtensionsContainer_OptExtNested.Type = extensionTypes[11]
+	E_ExtensionsContainer_RptExtString.Type = extensionTypes[12]
+	E_ExtensionsContainer_RptExtEnum.Type = extensionTypes[13]
+	E_ExtensionsContainer_RptExtNested.Type = extensionTypes[14]
+	E_MessageSetExtension_MessageSetExtension.Type = extensionTypes[15]
+	E_MessageSetExtension_NotMessageSetExtension.Type = extensionTypes[16]
+	E_MessageSetExtension_ExtNested.Type = extensionTypes[17]
+	E_FakeMessageSetExtension_MessageSetExtension.Type = extensionTypes[18]
 	xxx_Test_protoFile_goTypes = nil
 	xxx_Test_protoFile_depIdxs = nil
 }

+ 16 - 0
encoding/textpb/testprotos/pb2/test.proto

@@ -200,6 +200,22 @@ message MessageSetExtension {
   }
 }
 
+message FakeMessageSet {
+  extensions 4 to max;
+}
+
+message FakeMessageSetExtension {
+  optional string opt_string = 1;
+
+  extend FakeMessageSet {
+    optional FakeMessageSetExtension message_set_extension = 10;
+  }
+}
+
+extend MessageSet {
+  optional FakeMessageSetExtension message_set_extension = 50;
+}
+
 // Message contains well-known type fields.
 message KnownTypes {
   optional google.protobuf.BoolValue opt_bool = 1;