// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: internal/testprotos/required/required_hybrid/required.hybrid.proto

//go:build !protoopaque

package required_hybrid

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	_ "google.golang.org/protobuf/types/gofeaturespb"
	reflect "reflect"
	unsafe "unsafe"
)

type Int32 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *int32                 `protobuf:"varint,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Int32) Reset() {
	*x = Int32{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Int32) ProtoMessage() {}

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

func (x *Int32) GetV() int32 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Int32) SetV(v int32) {
	x.V = &v
}

func (x *Int32) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Int32) ClearV() {
	x.V = nil
}

type Int32_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *int32
}

func (b0 Int32_builder) Build() *Int32 {
	m0 := &Int32{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Int64 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *int64                 `protobuf:"varint,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Int64) Reset() {
	*x = Int64{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Int64) ProtoMessage() {}

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

func (x *Int64) GetV() int64 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Int64) SetV(v int64) {
	x.V = &v
}

func (x *Int64) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Int64) ClearV() {
	x.V = nil
}

type Int64_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *int64
}

func (b0 Int64_builder) Build() *Int64 {
	m0 := &Int64{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Uint32 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *uint32                `protobuf:"varint,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Uint32) Reset() {
	*x = Uint32{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Uint32) ProtoMessage() {}

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

func (x *Uint32) GetV() uint32 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Uint32) SetV(v uint32) {
	x.V = &v
}

func (x *Uint32) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Uint32) ClearV() {
	x.V = nil
}

type Uint32_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *uint32
}

func (b0 Uint32_builder) Build() *Uint32 {
	m0 := &Uint32{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Uint64 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *uint64                `protobuf:"varint,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Uint64) Reset() {
	*x = Uint64{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Uint64) ProtoMessage() {}

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

func (x *Uint64) GetV() uint64 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Uint64) SetV(v uint64) {
	x.V = &v
}

func (x *Uint64) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Uint64) ClearV() {
	x.V = nil
}

type Uint64_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *uint64
}

func (b0 Uint64_builder) Build() *Uint64 {
	m0 := &Uint64{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Sint32 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *int32                 `protobuf:"zigzag32,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Sint32) Reset() {
	*x = Sint32{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Sint32) ProtoMessage() {}

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

func (x *Sint32) GetV() int32 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Sint32) SetV(v int32) {
	x.V = &v
}

func (x *Sint32) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Sint32) ClearV() {
	x.V = nil
}

type Sint32_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *int32
}

func (b0 Sint32_builder) Build() *Sint32 {
	m0 := &Sint32{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Sint64 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *int64                 `protobuf:"zigzag64,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Sint64) Reset() {
	*x = Sint64{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Sint64) ProtoMessage() {}

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

func (x *Sint64) GetV() int64 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Sint64) SetV(v int64) {
	x.V = &v
}

func (x *Sint64) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Sint64) ClearV() {
	x.V = nil
}

type Sint64_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *int64
}

func (b0 Sint64_builder) Build() *Sint64 {
	m0 := &Sint64{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Fixed32 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *uint32                `protobuf:"fixed32,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Fixed32) Reset() {
	*x = Fixed32{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Fixed32) ProtoMessage() {}

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

func (x *Fixed32) GetV() uint32 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Fixed32) SetV(v uint32) {
	x.V = &v
}

func (x *Fixed32) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Fixed32) ClearV() {
	x.V = nil
}

type Fixed32_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *uint32
}

func (b0 Fixed32_builder) Build() *Fixed32 {
	m0 := &Fixed32{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Fixed64 struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *uint64                `protobuf:"fixed64,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Fixed64) Reset() {
	*x = Fixed64{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Fixed64) ProtoMessage() {}

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

func (x *Fixed64) GetV() uint64 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Fixed64) SetV(v uint64) {
	x.V = &v
}

func (x *Fixed64) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Fixed64) ClearV() {
	x.V = nil
}

type Fixed64_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *uint64
}

func (b0 Fixed64_builder) Build() *Fixed64 {
	m0 := &Fixed64{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Float struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *float32               `protobuf:"fixed32,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Float) Reset() {
	*x = Float{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Float) ProtoMessage() {}

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

func (x *Float) GetV() float32 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Float) SetV(v float32) {
	x.V = &v
}

func (x *Float) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Float) ClearV() {
	x.V = nil
}

type Float_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *float32
}

func (b0 Float_builder) Build() *Float {
	m0 := &Float{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Double struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *float64               `protobuf:"fixed64,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Double) Reset() {
	*x = Double{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Double) ProtoMessage() {}

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

func (x *Double) GetV() float64 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Double) SetV(v float64) {
	x.V = &v
}

func (x *Double) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Double) ClearV() {
	x.V = nil
}

type Double_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *float64
}

func (b0 Double_builder) Build() *Double {
	m0 := &Double{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Bool struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *bool                  `protobuf:"varint,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Bool) Reset() {
	*x = Bool{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Bool) ProtoMessage() {}

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

func (x *Bool) GetV() bool {
	if x != nil && x.V != nil {
		return *x.V
	}
	return false
}

func (x *Bool) SetV(v bool) {
	x.V = &v
}

func (x *Bool) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Bool) ClearV() {
	x.V = nil
}

type Bool_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *bool
}

func (b0 Bool_builder) Build() *Bool {
	m0 := &Bool{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type String struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *string                `protobuf:"bytes,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *String) Reset() {
	*x = String{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[11]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*String) ProtoMessage() {}

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

func (x *String) GetV() string {
	if x != nil && x.V != nil {
		return *x.V
	}
	return ""
}

func (x *String) SetV(v string) {
	x.V = &v
}

func (x *String) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *String) ClearV() {
	x.V = nil
}

type String_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *string
}

func (b0 String_builder) Build() *String {
	m0 := &String{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Bytes struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             []byte                 `protobuf:"bytes,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Bytes) Reset() {
	*x = Bytes{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[12]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Bytes) ProtoMessage() {}

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

func (x *Bytes) GetV() []byte {
	if x != nil {
		return x.V
	}
	return nil
}

func (x *Bytes) SetV(v []byte) {
	if v == nil {
		v = []byte{}
	}
	x.V = v
}

func (x *Bytes) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Bytes) ClearV() {
	x.V = nil
}

type Bytes_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V []byte
}

func (b0 Bytes_builder) Build() *Bytes {
	m0 := &Bytes{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Message struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *Message_M             `protobuf:"bytes,1,req,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Message) Reset() {
	*x = Message{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[13]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Message) ProtoMessage() {}

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

func (x *Message) GetV() *Message_M {
	if x != nil {
		return x.V
	}
	return nil
}

func (x *Message) SetV(v *Message_M) {
	x.V = v
}

func (x *Message) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Message) ClearV() {
	x.V = nil
}

type Message_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *Message_M
}

func (b0 Message_builder) Build() *Message {
	m0 := &Message{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

type Group struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	Group         *Group_Group           `protobuf:"group,1,req,name=Group,json=group" json:"group,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Group) Reset() {
	*x = Group{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[14]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Group) ProtoMessage() {}

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

func (x *Group) GetGroup() *Group_Group {
	if x != nil {
		return x.Group
	}
	return nil
}

func (x *Group) SetGroup(v *Group_Group) {
	x.Group = v
}

func (x *Group) HasGroup() bool {
	if x == nil {
		return false
	}
	return x.Group != nil
}

func (x *Group) ClearGroup() {
	x.Group = nil
}

type Group_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	Group *Group_Group
}

func (b0 Group_builder) Build() *Group {
	m0 := &Group{}
	b, x := &b0, m0
	_, _ = b, x
	x.Group = b.Group
	return m0
}

type Message_M struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Message_M) Reset() {
	*x = Message_M{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[15]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Message_M) ProtoMessage() {}

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

type Message_M_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

}

func (b0 Message_M_builder) Build() *Message_M {
	m0 := &Message_M{}
	b, x := &b0, m0
	_, _ = b, x
	return m0
}

type Group_Group struct {
	state         protoimpl.MessageState `protogen:"hybrid.v1"`
	V             *int32                 `protobuf:"varint,1,opt,name=v" json:"v,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Group_Group) Reset() {
	*x = Group_Group{}
	mi := &file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes[16]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

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

func (*Group_Group) ProtoMessage() {}

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

func (x *Group_Group) GetV() int32 {
	if x != nil && x.V != nil {
		return *x.V
	}
	return 0
}

func (x *Group_Group) SetV(v int32) {
	x.V = &v
}

func (x *Group_Group) HasV() bool {
	if x == nil {
		return false
	}
	return x.V != nil
}

func (x *Group_Group) ClearV() {
	x.V = nil
}

type Group_Group_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	V *int32
}

func (b0 Group_Group_builder) Build() *Group_Group {
	m0 := &Group_Group{}
	b, x := &b0, m0
	_, _ = b, x
	x.V = b.V
	return m0
}

var File_internal_testprotos_required_required_hybrid_required_hybrid_proto protoreflect.FileDescriptor

const file_internal_testprotos_required_required_hybrid_required_hybrid_proto_rawDesc = "" +
	"\n" +
	"Binternal/testprotos/required/required_hybrid/required.hybrid.proto\x12!hybrid.goproto.proto.testrequired\x1a!google/protobuf/go_features.proto\"\x1c\n" +
	"\x05Int32\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x05B\x05\xaa\x01\x02\b\x03R\x01v\"\x1c\n" +
	"\x05Int64\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x03B\x05\xaa\x01\x02\b\x03R\x01v\"\x1d\n" +
	"\x06Uint32\x12\x13\n" +
	"\x01v\x18\x01 \x01(\rB\x05\xaa\x01\x02\b\x03R\x01v\"\x1d\n" +
	"\x06Uint64\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x04B\x05\xaa\x01\x02\b\x03R\x01v\"\x1d\n" +
	"\x06Sint32\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x11B\x05\xaa\x01\x02\b\x03R\x01v\"\x1d\n" +
	"\x06Sint64\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x12B\x05\xaa\x01\x02\b\x03R\x01v\"\x1e\n" +
	"\aFixed32\x12\x13\n" +
	"\x01v\x18\x01 \x01(\aB\x05\xaa\x01\x02\b\x03R\x01v\"\x1e\n" +
	"\aFixed64\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x06B\x05\xaa\x01\x02\b\x03R\x01v\"\x1c\n" +
	"\x05Float\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x02B\x05\xaa\x01\x02\b\x03R\x01v\"\x1d\n" +
	"\x06Double\x12\x13\n" +
	"\x01v\x18\x01 \x01(\x01B\x05\xaa\x01\x02\b\x03R\x01v\"\x1b\n" +
	"\x04Bool\x12\x13\n" +
	"\x01v\x18\x01 \x01(\bB\x05\xaa\x01\x02\b\x03R\x01v\"\x1d\n" +
	"\x06String\x12\x13\n" +
	"\x01v\x18\x01 \x01(\tB\x05\xaa\x01\x02\b\x03R\x01v\"\x1c\n" +
	"\x05Bytes\x12\x13\n" +
	"\x01v\x18\x01 \x01(\fB\x05\xaa\x01\x02\b\x03R\x01v\"Q\n" +
	"\aMessage\x12A\n" +
	"\x01v\x18\x01 \x01(\v2,.hybrid.goproto.proto.testrequired.Message.MB\x05\xaa\x01\x02\b\x03R\x01v\x1a\x03\n" +
	"\x01M\"m\n" +
	"\x05Group\x12M\n" +
	"\x05group\x18\x01 \x01(\v2..hybrid.goproto.proto.testrequired.Group.GroupB\a\xaa\x01\x04\b\x03(\x02R\x05group\x1a\x15\n" +
	"\x05Group\x12\f\n" +
	"\x01v\x18\x01 \x01(\x05R\x01vBQZGgoogle.golang.org/protobuf/internal/testprotos/required/required_hybrid\x92\x03\x05\xd2>\x02\x10\x02b\beditionsp\xe8\a"

var file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
var file_internal_testprotos_required_required_hybrid_required_hybrid_proto_goTypes = []any{
	(*Int32)(nil),       // 0: hybrid.goproto.proto.testrequired.Int32
	(*Int64)(nil),       // 1: hybrid.goproto.proto.testrequired.Int64
	(*Uint32)(nil),      // 2: hybrid.goproto.proto.testrequired.Uint32
	(*Uint64)(nil),      // 3: hybrid.goproto.proto.testrequired.Uint64
	(*Sint32)(nil),      // 4: hybrid.goproto.proto.testrequired.Sint32
	(*Sint64)(nil),      // 5: hybrid.goproto.proto.testrequired.Sint64
	(*Fixed32)(nil),     // 6: hybrid.goproto.proto.testrequired.Fixed32
	(*Fixed64)(nil),     // 7: hybrid.goproto.proto.testrequired.Fixed64
	(*Float)(nil),       // 8: hybrid.goproto.proto.testrequired.Float
	(*Double)(nil),      // 9: hybrid.goproto.proto.testrequired.Double
	(*Bool)(nil),        // 10: hybrid.goproto.proto.testrequired.Bool
	(*String)(nil),      // 11: hybrid.goproto.proto.testrequired.String
	(*Bytes)(nil),       // 12: hybrid.goproto.proto.testrequired.Bytes
	(*Message)(nil),     // 13: hybrid.goproto.proto.testrequired.Message
	(*Group)(nil),       // 14: hybrid.goproto.proto.testrequired.Group
	(*Message_M)(nil),   // 15: hybrid.goproto.proto.testrequired.Message.M
	(*Group_Group)(nil), // 16: hybrid.goproto.proto.testrequired.Group.Group
}
var file_internal_testprotos_required_required_hybrid_required_hybrid_proto_depIdxs = []int32{
	15, // 0: hybrid.goproto.proto.testrequired.Message.v:type_name -> hybrid.goproto.proto.testrequired.Message.M
	16, // 1: hybrid.goproto.proto.testrequired.Group.group:type_name -> hybrid.goproto.proto.testrequired.Group.Group
	2,  // [2:2] is the sub-list for method output_type
	2,  // [2:2] is the sub-list for method input_type
	2,  // [2:2] is the sub-list for extension type_name
	2,  // [2:2] is the sub-list for extension extendee
	0,  // [0:2] is the sub-list for field type_name
}

func init() { file_internal_testprotos_required_required_hybrid_required_hybrid_proto_init() }
func file_internal_testprotos_required_required_hybrid_required_hybrid_proto_init() {
	if File_internal_testprotos_required_required_hybrid_required_hybrid_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_testprotos_required_required_hybrid_required_hybrid_proto_rawDesc), len(file_internal_testprotos_required_required_hybrid_required_hybrid_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   17,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_required_required_hybrid_required_hybrid_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_required_required_hybrid_required_hybrid_proto_depIdxs,
		MessageInfos:      file_internal_testprotos_required_required_hybrid_required_hybrid_proto_msgTypes,
	}.Build()
	File_internal_testprotos_required_required_hybrid_required_hybrid_proto = out.File
	file_internal_testprotos_required_required_hybrid_required_hybrid_proto_goTypes = nil
	file_internal_testprotos_required_required_hybrid_required_hybrid_proto_depIdxs = nil
}
